This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Unix domain accept() and getperrname() doesn't return the client address.


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

Attachment: 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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]