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

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