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