home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / libncftp / libncftp-3.2.5-src.zip / libncftp-3.2.5 / sio / UAccept.c < prev    next >
C/C++ Source or Header  |  2009-12-17  |  2KB  |  78 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. #ifdef HAVE_SYS_UN_H
  7.  
  8. int
  9. UAccept(int sfd, struct sockaddr_un *const addr, int *ualen, int tlen)
  10. {
  11.     int result;
  12.     fd_set ss;
  13.     struct timeval tv;
  14.     sockaddr_size_t ualen2;
  15.     DECL_SIGPIPE_VARS
  16.     
  17.     if (addr == NULL) {
  18.         errno = EINVAL;
  19.         return (-1);
  20.     }
  21.     
  22.     IGNORE_SIGPIPE
  23.  
  24.     if (tlen <= 0) {
  25.         errno = 0;
  26.         for (;;) {
  27.             ualen2 = (sockaddr_size_t) sizeof(struct sockaddr_un);
  28.             result = accept(sfd, (struct sockaddr *) addr, &ualen2);
  29.             if (ualen != NULL)
  30.                 *ualen = (int) ualen2;
  31.             if ((result >= 0) || (errno != EINTR)) {
  32.                 RESTORE_SIGPIPE
  33.                 return (result);
  34.             }
  35.         }
  36.     }
  37.  
  38.     for (;;) {
  39.         errno = 0;
  40.         MY_FD_ZERO(&ss);
  41. #if defined(__DECC) || defined(__DECCXX)
  42. #pragma message save
  43. #pragma message disable trunclongint
  44. #endif
  45.         MY_FD_SET(sfd, &ss);
  46. #if defined(__DECC) || defined(__DECCXX)
  47. #pragma message restore
  48. #endif
  49.         tv.tv_sec = (tv_sec_t) tlen;
  50.         tv.tv_usec = 0;
  51.         result = select(sfd + 1, SELECT_TYPE_ARG234 &ss, NULL, NULL, &tv);
  52.         if (result >= 1) {
  53.             /* ready */
  54.             break;
  55.         } else if (result == 0) {
  56.             /* timeout */
  57.             errno = ETIMEDOUT;
  58.             RESTORE_SIGPIPE
  59.             return (kTimeoutErr);
  60.         } else if (errno != EINTR) {
  61.             RESTORE_SIGPIPE
  62.             return (-1);
  63.         }
  64.     }
  65.  
  66.     do {
  67.         ualen2 = (sockaddr_size_t) sizeof(struct sockaddr_un);
  68.         result = accept(sfd, (struct sockaddr *) addr, &ualen2);
  69.         if (ualen != NULL)
  70.             *ualen = (int) ualen2;
  71.     } while ((result < 0) && (errno == EINTR));
  72.  
  73.     RESTORE_SIGPIPE
  74.     return (result);
  75. }    /* UAccept */
  76.  
  77. #endif    /* HAVE_SYS_UN_H */
  78.