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 / SSendtoByName.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  4KB  |  162 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. #ifndef NO_SIGNALS
  12.  
  13. int
  14. SSendtoByName(int sfd, const char *const buf, size_t size, int fl, const char *const toAddrStr, int tlen)
  15. {
  16.     send_return_t nwrote;
  17.     alarm_time_t tleft;
  18.     int result;
  19.     vsio_sigproc_t sigalrm, sigpipe;
  20.     time_t done, now;
  21.     struct sockaddr_in toAddr;
  22.  
  23.     if ((result = AddrStrToAddr(toAddrStr, &toAddr, -1)) < 0) {
  24.         return (result);
  25.     }
  26.  
  27.     if (SSetjmp(gNetTimeoutJmp) != 0) {
  28.         alarm(0);
  29.         (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
  30.         (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  31.         errno = ETIMEDOUT;
  32.         return (kTimeoutErr);
  33.     }
  34.  
  35.     if (SSetjmp(gPipeJmp) != 0) {
  36.         alarm(0);
  37.         (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
  38.         (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  39.         errno = EPIPE;
  40.         return (kBrokenPipeErr);
  41.     }
  42.  
  43.     sigalrm = (vsio_sigproc_t) SSignal(SIGALRM, SIOHandler);
  44.     sigpipe = (vsio_sigproc_t) SSignal(SIGPIPE, SIOHandler);
  45.  
  46.     time(&now);
  47.     done = now + tlen;
  48.     tleft = (done < now) ? ((alarm_time_t) (done - now)) : 0;
  49.     forever {
  50.         (void) alarm(tleft);
  51.         nwrote = sendto(sfd, buf, (send_size_t) size, fl,
  52.                 (struct sockaddr *) &toAddr,
  53.                 (sockaddr_size_t) sizeof(struct sockaddr_in));
  54.         (void) alarm(0);
  55.         if (nwrote >= 0)
  56.             break;
  57.         if (errno != EINTR)
  58.             break;        /* Fatal error. */
  59.         errno = 0;
  60.         time(&now);
  61.         tleft = (done < now) ? ((alarm_time_t) (done - now)) : 0;
  62.         if (tleft < 1) {
  63.             nwrote = kTimeoutErr;
  64.             errno = ETIMEDOUT;
  65.             break;
  66.         }
  67.     }
  68.  
  69.     (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
  70.     (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  71.  
  72.     return ((int) nwrote);
  73. }    /* SSendtoByName */
  74.  
  75. #else
  76.  
  77. int
  78. SSendtoByName(int sfd, const char *const buf, size_t size, int fl, const char *const toAddrStr, int tlen)
  79. {
  80.     send_return_t nwrote;
  81.     int tleft, result;
  82.     time_t done, now;
  83.     fd_set ss;
  84.     struct timeval tv;
  85.     struct sockaddr_in toAddr;
  86.  
  87.     if ((result = AddrStrToAddr(toAddrStr, &toAddr, -1)) < 0) {
  88.         return (result);
  89.     }
  90.  
  91.     time(&now);
  92.     done = now + tlen;
  93.     nwrote = 0;
  94.     forever {
  95.         forever {
  96.             if (now >= done) {
  97.                 errno = ETIMEDOUT;
  98.                 return (kTimeoutErr);
  99.             }
  100.             tleft = (int) (done - now);
  101.             errno = 0;
  102.             MY_FD_ZERO(&ss);
  103. #if defined(__DECC) || defined(__DECCXX)
  104. #pragma message save
  105. #pragma message disable trunclongint
  106. #endif
  107.             MY_FD_SET(sfd, &ss);
  108. #if defined(__DECC) || defined(__DECCXX)
  109. #pragma message restore
  110. #endif
  111.             tv.tv_sec = (tv_sec_t) tleft;
  112.             tv.tv_usec = 0;
  113.             result = select(sfd + 1, NULL, SELECT_TYPE_ARG234 &ss, NULL, SELECT_TYPE_ARG5 &tv);
  114.             if (result == 1) {
  115.                 /* ready */
  116.                 break;
  117.             } else if (result == 0) {
  118.                 /* timeout */        
  119.                 errno = ETIMEDOUT;
  120.                 return (kTimeoutErr);
  121.             } else if (errno != EINTR) {
  122.                 return (-1);
  123.             }
  124.             time(&now);
  125.         }
  126.  
  127.         nwrote = sendto(sfd, buf, (send_size_t) size, fl,
  128.             (struct sockaddr *) &toAddr,
  129.             (sockaddr_size_t) sizeof(struct sockaddr_in));
  130.  
  131.         if (nwrote >= 0)
  132.             break;
  133.         if (errno != EINTR)
  134.             break;        /* Fatal error. */
  135.     }
  136.  
  137.     return ((int) nwrote);
  138. }    /* SSendto */
  139.  
  140. #endif
  141.  
  142.  
  143.  
  144. int
  145. SendtoByName(int sfd, const char *const buf, size_t size, const char *const toAddrStr)
  146. {
  147.     int result;
  148.     struct sockaddr_in toAddr;
  149.  
  150.     if ((result = AddrStrToAddr(toAddrStr, &toAddr, -1)) < 0) {
  151.         return (result);
  152.     }
  153.  
  154.     do {
  155.         result = (int) sendto(sfd, buf, (send_size_t) size, 0,
  156.                 (struct sockaddr *) &toAddr,
  157.                 (sockaddr_size_t) sizeof(struct sockaddr_in));
  158.     } while ((result < 0) && (errno == EINTR));
  159.  
  160.     return (result);
  161. }    /* SendtoByName */
  162.