1 #include "syshdrs.h" 2 3 #if !defined(NO_UNIX_DOMAIN_SOCKETS) 4 5 int 6 UAcceptS(int sfd, struct sockaddr_un *const addr, int *ualen, int tlen) 7 { 8 int result; 9 fd_set ss; 10 struct timeval tv; 11 12 if (tlen < 0) { 13 errno = 0; 14 for (;;) { 15 *ualen = (int) sizeof(struct sockaddr_un); 16 result = accept(sfd, (struct sockaddr *) addr, (int *) ualen); 17 if ((result >= 0) || (errno != EINTR)) 18 return (result); 19 } 20 } 21 22 for (;;) { 23 errno = 0; 24 FD_ZERO(&ss); 25 FD_SET(sfd, &ss); 26 tv.tv_sec = tlen; 27 tv.tv_usec = 0; 28 result = select(sfd + 1, SELECT_TYPE_ARG234 &ss, NULL, NULL, &tv); 29 if (result == 1) { 30 /* ready */ 31 break; 32 } else if (result == 0) { 33 /* timeout */ 34 errno = ETIMEDOUT; 35 return (kTimeoutErr); 36 } else if (errno != EINTR) { 37 return (-1); 38 } 39 } 40 41 do { 42 *ualen = (int) sizeof(struct sockaddr_un); 43 result = accept(sfd, (struct sockaddr *) addr, (int *) ualen); 44 } while ((result < 0) && (errno == EINTR)); 45 46 return (result); 47 } /* UAcceptS */ 48 49 #endif 50 51