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 / SRecvmsg.c < prev    next >
C/C++ Source or Header  |  2009-12-17  |  2KB  |  103 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. #ifndef HAVE_RECVMSG
  7. int
  8. SRecvmsg(int UNUSED(sfd), void *const UNUSED(msg), int UNUSED(fl), int UNUSED(tlen))
  9. {
  10.     LIBSIO_USE_VAR(sfd);
  11.     LIBSIO_USE_VAR(msg);
  12.     LIBSIO_USE_VAR(fl);
  13.     LIBSIO_USE_VAR(tlen);
  14. #    ifdef ENOSYS
  15.     errno = ENOSYS;
  16. #    endif
  17.     return (-1);
  18. }
  19.  
  20.  
  21. #else
  22.  
  23. int
  24. SRecvmsg(int sfd, void *const msg, int fl, int tlen)
  25. {
  26.     recv_return_t nread;
  27.     int tleft;
  28.     time_t done, now;
  29.     fd_set ss;
  30.     struct timeval tv;
  31.     int result;
  32.     DECL_SIGPIPE_VARS
  33.     
  34.     if (msg == NULL) {
  35.         errno = EINVAL;
  36.         return (-1);
  37.     }
  38.     
  39.     if (tlen <= 0) {
  40.         errno = 0;
  41.         for (;;) {
  42.             nread = recvmsg(sfd, (struct msghdr *) msg, fl);
  43.             if ((nread >= 0) || (errno != EINTR))
  44.                 return ((int) nread);
  45.         }
  46.     }
  47.  
  48.     time(&now);
  49.     done = now + tlen;
  50.     tleft = (done > now) ? ((int) (done - now)) : 0;
  51.     forever {
  52.                 
  53.         for (;;) {
  54.             errno = 0;
  55.             MY_FD_ZERO(&ss);
  56. #if defined(__DECC) || defined(__DECCXX)
  57. #pragma message save
  58. #pragma message disable trunclongint
  59. #endif
  60.             MY_FD_SET(sfd, &ss);
  61. #if defined(__DECC) || defined(__DECCXX)
  62. #pragma message restore
  63. #endif
  64.             tv.tv_sec = (tv_sec_t) tleft;
  65.             tv.tv_usec = 0;
  66.             result = select(sfd + 1, SELECT_TYPE_ARG234 &ss, NULL, NULL, SELECT_TYPE_ARG5 &tv);
  67.             if (result >= 1) {
  68.                 /* ready */
  69.                 break;
  70.             } else if (result == 0) {
  71.                 /* timeout */
  72.                 errno = ETIMEDOUT;
  73.                 SETWSATIMEOUTERR
  74.                 return (kTimeoutErr);
  75.             } else if (errno != EINTR) {
  76.                 return (-1);
  77.             }
  78.         }
  79.  
  80.         IGNORE_SIGPIPE
  81.         nread = recvmsg(sfd, (struct msghdr *) msg, fl);
  82.         RESTORE_SIGPIPE
  83.  
  84.         if (nread >= 0)
  85.             break;
  86.         if (errno != EINTR)
  87.             break;        /* Fatal error. */
  88.         errno = 0;
  89.         time(&now);
  90.         tleft = (done > now) ? ((int) (done - now)) : 0;
  91.         if (tleft < 1) {
  92.             nread = kTimeoutErr;
  93.             errno = ETIMEDOUT;
  94.             SETWSATIMEOUTERR
  95.             break;
  96.         }
  97.     }
  98.  
  99.     return ((int) nread);
  100. }    /* SRecvmsg */
  101.  
  102. #endif
  103.