home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / ncftp / older_versions / ncftp-3.2.2-src.tar.bz2 / ncftp-3.2.2-src.tar / ncftp-3.2.2 / sio / UAccept.c < prev    next >
C/C++ Source or Header  |  2003-08-31  |  1KB  |  74 lines

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