Unix domain accept() and getperrname() doesn't return the client address.
Tanaka Akira
akr@fsij.org
Mon Mar 4 03:19:00 GMT 2013
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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cygcheck.out
Type: application/octet-stream
Size: 36483 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20130304/5e4bbd02/attachment.obj>
-------------- next part --------------
--
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
More information about the Cygwin
mailing list