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 / USendto.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  3KB  |  131 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. #ifndef NO_SIGNALS
  7.  
  8. extern Sjmp_buf gNetTimeoutJmp;
  9. extern Sjmp_buf gPipeJmp;
  10.  
  11. int
  12. USendto(int sfd, const char *const buf, size_t size, int fl, const struct sockaddr_un *const toAddr, int ualen, int tlen)
  13. {
  14.     send_return_t nwrote;
  15.     alarm_time_t tleft;
  16.     vsio_sigproc_t sigalrm, sigpipe;
  17.     time_t done, now;
  18.  
  19.     if (SSetjmp(gNetTimeoutJmp) != 0) {
  20.         alarm(0);
  21.         (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
  22.         (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  23.         errno = ETIMEDOUT;
  24.         return (kTimeoutErr);
  25.     }
  26.  
  27.     if (SSetjmp(gPipeJmp) != 0) {
  28.         alarm(0);
  29.         (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
  30.         (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  31.         errno = EPIPE;
  32.         return (kBrokenPipeErr);
  33.     }
  34.  
  35.     sigalrm = (vsio_sigproc_t) SSignal(SIGALRM, SIOHandler);
  36.     sigpipe = (vsio_sigproc_t) SSignal(SIGPIPE, SIOHandler);
  37.  
  38.     time(&now);
  39.     done = now + tlen;
  40.     tleft = (done < now) ? ((alarm_time_t) (done - now)) : 0;
  41.     forever {
  42.         if (tleft < 1) {
  43.             nwrote = kTimeoutErr;
  44.             errno = ETIMEDOUT;
  45.             break;
  46.         }
  47.         (void) alarm(tleft);
  48.         nwrote = sendto(sfd, buf, (send_size_t) size, fl,
  49.             (const struct sockaddr *) toAddr, (sockaddr_size_t) ualen);
  50.         (void) alarm(0);
  51.         if (nwrote >= 0)
  52.             break;
  53.         if (errno != EINTR)
  54.             break;        /* Fatal error. */
  55.         errno = 0;
  56.         time(&now);
  57.         tleft = (done < now) ? ((alarm_time_t) (done - now)) : 0;
  58.     }
  59.  
  60.     (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
  61.     (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  62.  
  63.     return ((int) nwrote);
  64. }    /* USendto */
  65.  
  66. #else
  67.  
  68. int
  69. USendto(int sfd, const char *const buf, size_t size, int fl, const struct sockaddr_un *const toAddr, int ualen, int tlen)
  70. {
  71.     send_return_t nwrote;
  72.     int tleft;
  73.     time_t done, now;
  74.     fd_set ss;
  75.     struct timeval tv;
  76.     int result;
  77.  
  78.     time(&now);
  79.     done = now + tlen;
  80.     nwrote = 0;
  81.     forever {
  82.         forever {
  83.             if (now >= done) {
  84.                 errno = ETIMEDOUT;
  85.                 SETWSATIMEOUTERR
  86.                 return (kTimeoutErr);
  87.             }
  88.             tleft = (int) (done - now);
  89.             errno = 0;
  90.             MY_FD_ZERO(&ss);
  91. #if defined(__DECC) || defined(__DECCXX)
  92. #pragma message save
  93. #pragma message disable trunclongint
  94. #endif
  95.             MY_FD_SET(sfd, &ss);
  96. #if defined(__DECC) || defined(__DECCXX)
  97. #pragma message restore
  98. #endif
  99.             tv.tv_sec = (tv_sec_t) tleft;
  100.             tv.tv_usec = 0;
  101.             result = select(sfd + 1, NULL, SELECT_TYPE_ARG234 &ss, NULL, SELECT_TYPE_ARG5 &tv);
  102.             if (result == 1) {
  103.                 /* ready */
  104.                 break;
  105.             } else if (result == 0) {
  106.                 /* timeout */        
  107.                 errno = ETIMEDOUT;
  108.                 SETWSATIMEOUTERR
  109.                 return (kTimeoutErr);
  110.             } else if (errno != EINTR) {
  111.                 return (-1);
  112.             }
  113.             time(&now);
  114.         }
  115.  
  116.         nwrote = sendto(sfd, buf, (send_size_t) size, fl,
  117.             (const struct sockaddr *) toAddr,
  118.             (sockaddr_size_t) ualen);
  119.  
  120.         if (nwrote >= 0)
  121.             break;
  122.         if (errno != EINTR)
  123.             break;        /* Fatal error. */
  124.     }
  125.  
  126.     return ((int) nwrote);
  127. }    /* USendto */
  128.  
  129. #endif
  130.  
  131.