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

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. int
  7. SSend(int sfd, char *buf0, size_t size, int fl, int tlen)
  8. {
  9.     char *buf = buf0;
  10.     send_return_t nwrote;
  11.     send_size_t nleft;
  12.     int tleft;
  13.     time_t done, now;
  14.     fd_set ss;
  15.     struct timeval tv;
  16.     int result;
  17.     DECL_SIGPIPE_VARS
  18.     
  19.     if ((buf == NULL) || (size == 0) || (tlen <= 0)) {
  20.         errno = EINVAL;
  21.         return (-1);
  22.     }
  23.     
  24.     IGNORE_SIGPIPE
  25.  
  26.     nleft = (send_size_t) size;
  27.     time(&now);
  28.     done = now + tlen;
  29.     forever {
  30.         tleft = (done > now) ? ((int) (done - now)) : 0;
  31.         if (tleft < 1) {
  32.             nwrote = (send_return_t) size - (send_return_t) nleft;
  33.             if (nwrote == 0) {
  34.                 nwrote = kTimeoutErr;
  35.                 errno = ETIMEDOUT;
  36.                 SETWSATIMEOUTERR
  37.             }
  38.             goto done;
  39.         }
  40.  
  41.  
  42.         /* Unfortunately this doesn't help when the
  43.          * send buffer fills during the time we're
  44.          * writing to it, so you could still be
  45.          * blocked after breaking this loop and starting
  46.          * the write.
  47.          */
  48.  
  49.         forever {
  50.             errno = 0;
  51.             MY_FD_ZERO(&ss);
  52. #if defined(__DECC) || defined(__DECCXX)
  53. #pragma message save
  54. #pragma message disable trunclongint
  55. #endif
  56.             MY_FD_SET(sfd, &ss);
  57. #if defined(__DECC) || defined(__DECCXX)
  58. #pragma message restore
  59. #endif
  60.             tv.tv_sec = (tv_sec_t) tlen;
  61.             tv.tv_usec = 0;
  62.             result = select(sfd + 1, NULL, SELECT_TYPE_ARG234 &ss, NULL, SELECT_TYPE_ARG5 &tv);
  63.             if (result >= 1) {
  64.                 /* ready */
  65.                 break;
  66.             } else if (result == 0) {
  67.                 /* timeout */        
  68.                 nwrote = (send_return_t) size - (send_return_t) nleft;
  69.                 if (nwrote > 0) {
  70.                     RESTORE_SIGPIPE
  71.                     return ((int) nwrote);
  72.                 }
  73.                 errno = ETIMEDOUT;
  74.                 SETWSATIMEOUTERR
  75.                 RESTORE_SIGPIPE
  76.                 return (kTimeoutErr);
  77.             } else if (errno != EINTR) {
  78.                 RESTORE_SIGPIPE
  79.                 return (-1);
  80.             }
  81.         }
  82.  
  83.         nwrote = send(sfd, buf, nleft, fl);
  84.  
  85.         if (nwrote < 0) {
  86.             if (errno != EINTR) {
  87.                 nwrote = (send_return_t) size - (send_return_t) nleft;
  88.                 if (nwrote == 0)
  89.                     nwrote = (send_return_t) -1;
  90.                 goto done;
  91.             } else {
  92.                 errno = 0;
  93.                 nwrote = 0;
  94.                 /* Try again. */
  95.             }
  96.         }
  97.         nleft -= (send_size_t) nwrote;
  98.         if (nleft == 0)
  99.             break;
  100.         buf += nwrote;
  101.         time(&now);
  102.     }
  103.     nwrote = (send_return_t) size - (send_return_t) nleft;
  104.  
  105. done:
  106.     RESTORE_SIGPIPE
  107.     return ((int) nwrote);
  108. }    /* SSend */
  109.