Hi. I found that accept() and getperrname() on a Unix domain socket doesn't return the client socket address. The sun_path field of the returned address is empty.
Is it an intentional behavior? % uname -srvm CYGWIN_NT-5.1 1.7.18s(0.263/5/3) 20130301 15:56:19 i686 % ls tst-client.c tst-server.c % cat tst-server.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/un.h> int main(int argc, char *argv[]) { int s, a; int ret; struct sockaddr_un saddr, aaddr, paddr; socklen_t len; socklen_t pathlen; unlink("socket-server"); memset(&saddr, '\0', sizeof(saddr)); saddr.sun_family = AF_UNIX; strcpy(saddr.sun_path, "socket-server"); s = socket(AF_UNIX, SOCK_STREAM, 0); if (s == -1) { perror("socket"); exit(EXIT_FAILURE); } ret = bind(s, (struct sockaddr *)&saddr, sizeof(saddr)); if (ret == -1) { perror("bind"); exit(EXIT_FAILURE); } ret = listen(s, SOMAXCONN); if (ret == -1) { perror("listen"); exit(EXIT_FAILURE); } len = sizeof(aaddr); a = accept(s, (struct sockaddr *)&aaddr, &len); if (a == -1) { perror("accept"); exit(EXIT_FAILURE); } pathlen = (len-offsetof(struct sockaddr_un, sun_path)); printf("accept socklen: %d\n", (int)len); printf("accept pathlen: %d\n", (int)pathlen); printf("accept sun_path: [%.*s]\n", (int)pathlen, aaddr.sun_path); len = sizeof(paddr); ret = getpeername(a, (struct sockaddr *)&paddr, &len); if (ret == -1) { perror("getpeername"); exit(EXIT_FAILURE); } pathlen = (len-offsetof(struct sockaddr_un, sun_path)); printf("getpeername socklen: %d\n", (int)len); printf("getpeername pathlen: %d\n", (int)pathlen); printf("getpeername sun_path: [%.*s]\n", (int)pathlen, paddr.sun_path); return EXIT_SUCCESS; } % cat tst-client.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/un.h> int main(int argc, char *argv[]) { int c; int ret; struct sockaddr_un saddr, caddr; unlink("socket-client"); memset(&saddr, '\0', sizeof(saddr)); saddr.sun_family = AF_UNIX; strcpy(saddr.sun_path, "socket-server"); memset(&caddr, '\0', sizeof(caddr)); caddr.sun_family = AF_UNIX; strcpy(caddr.sun_path, "socket-client"); c = socket(AF_UNIX, SOCK_STREAM, 0); if (c == -1) { perror("socket"); exit(EXIT_FAILURE); } ret = bind(c, (struct sockaddr *)&caddr, sizeof(caddr)); if (ret == -1) { perror("bind"); exit(EXIT_FAILURE); } ret = connect(c, (struct sockaddr *)&saddr, sizeof(saddr)); if (ret == -1) { perror("connect"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } % gcc -Wall tst-server.c -o tst-server % gcc -Wall tst-client.c -o tst-client % (./tst-server & sleep 1; ./tst-client; wait) accept socklen: 2 accept pathlen: 0 accept sun_path: [] getpeername socklen: 2 getpeername pathlen: 0 getpeername sun_path: [] -- Tanaka Akira
cygcheck.out
Description: Binary data
-- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple