1 #include "syshdrs.h"
2 
3 #if !defined(NO_UNIX_DOMAIN_SOCKETS)
4 
5 int
UAcceptS(int sfd,struct sockaddr_un * const addr,int * ualen,int tlen)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