home *** CD-ROM | disk | FTP | other *** search
/ ftp.ncftp.com / ftp.ncftp.com.zip / ftp.ncftp.com / libncftp / older_versions / libncftp-3.1.5-src.tar.gz / libncftp-3.1.5-src.tar / libncftp-3.1.5 / sio / SAcceptA.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  1KB  |  56 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. #ifndef NO_SIGNALS
  7. extern Sjmp_buf gNetTimeoutJmp;
  8. extern Sjmp_buf gPipeJmp;
  9. #endif
  10.  
  11. int
  12. SAcceptA(int sfd, struct sockaddr_in *const addr, int tlen)
  13. {
  14.     int result;
  15. #ifndef NO_SIGNALS
  16.     vsio_sigproc_t sigalrm, sigpipe;
  17. #endif
  18.     sockaddr_size_t size;
  19.  
  20.     if (tlen < 0) {
  21.         errno = 0;
  22.         for (;;) {
  23.             size = (sockaddr_size_t) sizeof(struct sockaddr_in);
  24.             result = accept(sfd, (struct sockaddr *) addr, &size);
  25.             if ((result >= 0) || (errno != EINTR))
  26.                 return (result);
  27.         }
  28.     }
  29. #ifndef NO_SIGNALS
  30.     if (SSetjmp(gNetTimeoutJmp) != 0) {
  31.         alarm(0);
  32.         (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
  33.         (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  34.         errno = ETIMEDOUT;
  35.         return (kTimeoutErr);
  36.     }
  37.  
  38.     sigalrm = (vsio_sigproc_t) SSignal(SIGALRM, SIOHandler);
  39.     sigpipe = (vsio_sigproc_t) SSignal(SIGPIPE, SIG_IGN);
  40.     alarm((alarm_time_t) tlen);
  41.  
  42.     errno = 0;
  43.     do {
  44.         size = (sockaddr_size_t) sizeof(struct sockaddr_in);
  45.         result = accept(sfd, (struct sockaddr *) addr, &size);
  46.     } while ((result < 0) && (errno == EINTR));
  47.  
  48.     alarm(0);
  49.     (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
  50.     (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  51.     return (result);
  52. #else
  53.     return (-1);
  54. #endif
  55. }    /* SAcceptA */
  56.