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