1 #include "syshdrs.h" 2 3 #if !defined(NO_UNIX_DOMAIN_SOCKETS) 4 5 int 6 UBind(int sockfd, const char *const astr, const int nTries, const int reuseFlag) 7 { 8 unsigned int i; 9 int on; 10 int onsize; 11 struct sockaddr_un localAddr; 12 int ualen; 13 14 ualen = MakeSockAddrUn(&localAddr, astr); 15 (void) unlink(localAddr.sun_path); 16 17 if (reuseFlag != kReUseAddrNo) { 18 /* This is mostly so you can quit the server and re-run it 19 * again right away. If you don't do this, the OS may complain 20 * that the address is still in use. 21 */ 22 on = 1; 23 onsize = (int) sizeof(on); 24 (void) setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, 25 (char *) &on, onsize); 26 } 27 28 for (i=1; ; i++) { 29 /* Try binding a few times, in case we get Address in Use 30 * errors. 31 */ 32 if (bind(sockfd, (struct sockaddr *) &localAddr, ualen) == 0) { 33 break; 34 } 35 if (i == (unsigned int) nTries) { 36 return (-1); 37 } 38 /* Give the OS time to clean up the old socket, 39 * and then try again. 40 */ 41 sleep(i * 3); 42 } 43 44 return (0); 45 } /* UBind */ 46 47 48 49 50 int 51 UListen(int sfd, int backlog) 52 { 53 return (listen(sfd, backlog)); 54 } /* UListen */ 55 56 #endif 57 58