#include #include int sock1, sock2, n; struct sockaddr_un addr1, addr2, peer; int do_sock1 = 0; int main (int argc, char **argv) { if (!strcmp (argv[1], "1")) { do_sock1 = 1; } addr1.sun_family = AF_UNIX; strcpy (addr1.sun_path, "/tmp/sock1"); #ifndef linux addr1.sun_len = SUN_LEN (&addr1); #endif addr2.sun_family = AF_UNIX; strcpy (addr2.sun_path, "/tmp/sock2"); #ifndef linux addr2.sun_len = SUN_LEN (&addr2); #endif if (do_sock1) { sock1 = socket (AF_UNIX, SOCK_STREAM, 0); if (sock1 < 0) perror ("sock1 socket"); if (bind (sock1, (struct sockaddr*)&addr1, SUN_LEN (&addr1)) < 0) perror ("sock1 bind"); if (connect (sock1, (struct sockaddr*)&addr2, SUN_LEN (&addr2)) < 0) perror ("sock1 connect"); n = sizeof (peer); if (getpeername (sock1, (struct sockaddr*)&peer, &n) == 0) { printf ("sock1's peer = '%s'\n", peer.sun_path); } else { perror ("sock1 getpeername"); } } else { sock2 = socket (AF_UNIX, SOCK_STREAM, 0); if (sock2 < 0) perror ("sock2 socket"); if (bind (sock2, (struct sockaddr*)&addr2, SUN_LEN (&addr2)) < 0) perror ("sock2 bind"); if (listen (sock2, 1)) perror ("sock2 listen"); n = sizeof (peer); sock2 = accept (sock2, (struct sockaddr*)&peer, &n); n = sizeof (peer); if (getpeername (sock2, (struct sockaddr*)&peer, &n) == 0) { printf ("sock2's peer = '%s'\n", peer.sun_path); } /* sleep here so "sun_test 1" has enough time to get * the peer before the socket goes away. FreeBSD seems * to be more sensitive to this than linux. */ sleep (5); } }