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 / SAccept.c < prev    next >
C/C++ Source or Header  |  2009-12-17  |  1KB  |  71 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. int
  7. SAccept(int sfd, struct sockaddr_in *const addr, int tlen)
  8. {
  9.     int result;
  10.     fd_set ss;
  11.     struct timeval tv;
  12.     sockaddr_size_t size;
  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.             size = (sockaddr_size_t) sizeof(struct sockaddr_in);
  26.             result = accept(sfd, (struct sockaddr *) addr, &size);
  27.             if ((result >= 0) || (errno != EINTR)) {
  28.                 RESTORE_SIGPIPE
  29.                 return (result);
  30.             }
  31.         }
  32.     }
  33.  
  34.     forever {
  35.         errno = 0;
  36.         MY_FD_ZERO(&ss);
  37. #if defined(__DECC) || defined(__DECCXX)
  38. #pragma message save
  39. #pragma message disable trunclongint
  40. #endif
  41.         MY_FD_SET(sfd, &ss);
  42. #if defined(__DECC) || defined(__DECCXX)
  43. #pragma message restore
  44. #endif
  45.         tv.tv_sec = (tv_sec_t) tlen;
  46.         tv.tv_usec = 0;
  47.         result = select(sfd + 1, SELECT_TYPE_ARG234 &ss, NULL, NULL, SELECT_TYPE_ARG5 &tv);
  48.         if (result >= 1) {
  49.             /* ready */
  50.             break;
  51.         } else if (result == 0) {
  52.             /* timeout */
  53.             errno = ETIMEDOUT;
  54.             SETWSATIMEOUTERR
  55.             RESTORE_SIGPIPE
  56.             return (kTimeoutErr);
  57.         } else if (errno != EINTR) {
  58.             RESTORE_SIGPIPE
  59.             return (-1);
  60.         }
  61.     }
  62.  
  63.     do {
  64.         size = (sockaddr_size_t) sizeof(struct sockaddr_in);
  65.         result = accept(sfd, (struct sockaddr *) addr, &size);
  66.     } while ((result < 0) && (errno == EINTR));
  67.  
  68.     RESTORE_SIGPIPE
  69.     return (result);
  70. }    /* SAccept */
  71.