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 / URecvfrom.c < prev    next >
C/C++ Source or Header  |  2009-12-17  |  2KB  |  85 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. URecvfrom(int sfd, char *const buf, size_t size, int fl, struct sockaddr_un *const fromAddr, int *ualen, int tlen)
  10. {
  11.     recv_return_t nread;
  12.     int tleft;
  13.     fd_set ss;
  14.     struct timeval tv;
  15.     int result;
  16.     time_t done, now;
  17.     sockaddr_size_t alen;
  18.     DECL_SIGPIPE_VARS
  19.     
  20.     if ((buf == NULL) || (size == 0) || (fromAddr == NULL) || (tlen <= 0)) {
  21.         errno = EINVAL;
  22.         return (-1);
  23.     }
  24.  
  25.     time(&now);
  26.     done = now + tlen;
  27.     tleft = (done > now) ? ((int) (done - now)) : 0;
  28.     nread = 0;
  29.     forever {
  30.         alen = (sockaddr_size_t) sizeof(struct sockaddr_un);
  31.                 
  32.         forever {
  33.             errno = 0;
  34.             MY_FD_ZERO(&ss);
  35. #if defined(__DECC) || defined(__DECCXX)
  36. #pragma message save
  37. #pragma message disable trunclongint
  38. #endif
  39.             MY_FD_SET(sfd, &ss);
  40. #if defined(__DECC) || defined(__DECCXX)
  41. #pragma message restore
  42. #endif
  43.             tv.tv_sec = (tv_sec_t) tleft;
  44.             tv.tv_usec = 0;
  45.             result = select(sfd + 1, SELECT_TYPE_ARG234 &ss, NULL, NULL, SELECT_TYPE_ARG5 &tv);
  46.             if (result >= 1) {
  47.                 /* ready */
  48.                 break;
  49.             } else if (result == 0) {
  50.                 /* timeout */
  51.                 errno = ETIMEDOUT;
  52.                 SETWSATIMEOUTERR
  53.                 return (kTimeoutErr);
  54.             } else if (errno != EINTR) {
  55.                 return (-1);
  56.             }
  57.         }
  58.  
  59.         IGNORE_SIGPIPE
  60.         nread = recvfrom(sfd, buf, (recv_size_t) size, fl,
  61.             (struct sockaddr *) fromAddr, &alen);
  62.         RESTORE_SIGPIPE
  63.         if (ualen != NULL)
  64.             *ualen = (int) alen;
  65.  
  66.         if (nread >= 0)
  67.             break;
  68.         if (errno != EINTR)
  69.             break;        /* Fatal error. */
  70.         errno = 0;
  71.         time(&now);
  72.         tleft = (done > now) ? ((int) (done - now)) : 0;
  73.         if (tleft < 1) {
  74.             nread = kTimeoutErr;
  75.             errno = ETIMEDOUT;
  76.             SETWSATIMEOUTERR
  77.             break;
  78.         }
  79.     }
  80.  
  81.     return ((int) nread);
  82. }    /* URecvfrom */
  83.  
  84. #endif    /* HAVE_SYS_UN_H */
  85.