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 / SWait.c < prev    next >
C/C++ Source or Header  |  2009-12-17  |  5KB  |  240 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. /* 
  7.  * Return zero if the operation timed-out or erred-out, otherwise non-zero.
  8.  */
  9. int
  10. SWaitUntilReadyForReading(const int sfd, const int tlen)
  11. {
  12.     fd_set ss, ss2;
  13.     struct timeval tv;
  14.     int result;
  15.     int tleft;
  16.     time_t now, done;
  17.  
  18.     if (sfd < 0) {
  19.         errno = EBADF;
  20.         return (0);
  21.     }
  22.     errno = 0;
  23.  
  24.     if (tlen < 0) {
  25.         forever {
  26.             MY_FD_ZERO(&ss);
  27. #if defined(__DECC) || defined(__DECCXX)
  28. #pragma message save
  29. #pragma message disable trunclongint
  30. #endif
  31.             MY_FD_SET(sfd, &ss);
  32. #if defined(__DECC) || defined(__DECCXX)
  33. #pragma message restore
  34. #endif
  35.             ss2 = ss;
  36.             result = select(sfd + 1, SELECT_TYPE_ARG234 &ss, NULL, SELECT_TYPE_ARG234 &ss2, NULL);
  37.             if (result >= 1) {
  38.                 /* ready */
  39.                 return (1);
  40.             } else if ((result < 0) && (errno != EINTR)) {
  41.                 /* error */
  42.                 return (0);
  43.             }
  44.             /* else try again */
  45.         }
  46.         /*NOTREACHED*/
  47.     } else if (tlen == 0) {
  48.         forever {
  49.             MY_FD_ZERO(&ss);
  50. #if defined(__DECC) || defined(__DECCXX)
  51. #pragma message save
  52. #pragma message disable trunclongint
  53. #endif
  54.             MY_FD_SET(sfd, &ss);
  55. #if defined(__DECC) || defined(__DECCXX)
  56. #pragma message restore
  57. #endif
  58.             ss2 = ss;
  59.             tv.tv_sec = 0;
  60.             tv.tv_usec = 0;
  61.             result = select(sfd + 1, SELECT_TYPE_ARG234 &ss, NULL, SELECT_TYPE_ARG234 &ss2, &tv);
  62.             if (result >= 1) {
  63.                 /* ready */
  64.                 return (1);
  65.             } else if (result == 0) {
  66.                 /* timed-out */
  67.                 errno = ETIMEDOUT;
  68.                 return (0);
  69.             } else if ((result < 0) && (errno != EINTR)) {
  70.                 /* error */
  71.                 return (0);
  72.             }
  73.             /* else try again */
  74.         }
  75.         /*NOTREACHED*/
  76.     }
  77.     
  78.     time(&now);
  79.     done = now + tlen;
  80.     tleft = tlen;
  81.  
  82.     forever {
  83.         MY_FD_ZERO(&ss);
  84. #if defined(__DECC) || defined(__DECCXX)
  85. #pragma message save
  86. #pragma message disable trunclongint
  87. #endif
  88.         MY_FD_SET(sfd, &ss);
  89. #if defined(__DECC) || defined(__DECCXX)
  90. #pragma message restore
  91. #endif
  92.         ss2 = ss;
  93.         tv.tv_sec = (tv_sec_t) tleft;
  94.         tv.tv_usec = 0;
  95.         result = select(sfd + 1, SELECT_TYPE_ARG234 &ss, NULL, SELECT_TYPE_ARG234 &ss2, &tv);
  96.         if (result >= 1) {
  97.             /* ready */
  98.             return (1);
  99.         } else if (result < 0) {
  100.             if (errno != EINTR) {
  101.                 /* error */
  102.                 break;
  103.             }
  104.             /* try again */
  105.             time(&now);
  106.             if (now > done) {
  107.                 /* timed-out */
  108.                 errno = ETIMEDOUT;
  109.                 break;
  110.             }
  111.             tleft = (int) (done - now);
  112.         } else {
  113.             /* timed-out */
  114.             errno = ETIMEDOUT;
  115.             break;
  116.         }
  117.     }
  118.  
  119.     return (0);
  120. }    /* SWaitUntilReadyForReading */
  121.  
  122.  
  123.  
  124.  
  125. /* 
  126.  * Return zero if the operation timed-out or erred-out, otherwise non-zero.
  127.  */
  128. int
  129. SWaitUntilReadyForWriting(const int sfd, const int tlen)
  130. {
  131.     fd_set ss, ss2;
  132.     struct timeval tv;
  133.     int result;
  134.     int tleft;
  135.     time_t now, done;
  136.  
  137.     if (sfd < 0) {
  138.         errno = EBADF;
  139.         return (0);
  140.     }
  141.     errno = 0;
  142.  
  143.     if (tlen < 0) {
  144.         forever {
  145.             MY_FD_ZERO(&ss);
  146. #if defined(__DECC) || defined(__DECCXX)
  147. #pragma message save
  148. #pragma message disable trunclongint
  149. #endif
  150.             MY_FD_SET(sfd, &ss);
  151. #if defined(__DECC) || defined(__DECCXX)
  152. #pragma message restore
  153. #endif
  154.             ss2 = ss;
  155.             result = select(sfd + 1, NULL, SELECT_TYPE_ARG234 &ss, SELECT_TYPE_ARG234 &ss2, NULL);
  156.             if (result >= 1) {
  157.                 /* ready */
  158.                 return (1);
  159.             } else if ((result < 0) && (errno != EINTR)) {
  160.                 /* error */
  161.                 return (0);
  162.             }
  163.             /* else try again */
  164.         }
  165.         /*NOTREACHED*/
  166.     } else if (tlen == 0) {
  167.         forever {
  168.             MY_FD_ZERO(&ss);
  169. #if defined(__DECC) || defined(__DECCXX)
  170. #pragma message save
  171. #pragma message disable trunclongint
  172. #endif
  173.             MY_FD_SET(sfd, &ss);
  174. #if defined(__DECC) || defined(__DECCXX)
  175. #pragma message restore
  176. #endif
  177.             ss2 = ss;
  178.             tv.tv_sec = 0;
  179.             tv.tv_usec = 0;
  180.             result = select(sfd + 1, NULL, SELECT_TYPE_ARG234 &ss, SELECT_TYPE_ARG234 &ss2, &tv);
  181.             if (result >= 1) {
  182.                 /* ready */
  183.                 return (1);
  184.             } else if (result == 0) {
  185.                 /* timed-out */
  186.                 errno = ETIMEDOUT;
  187.                 return (0);
  188.             } else if ((result < 0) && (errno != EINTR)) {
  189.                 /* error */
  190.                 return (0);
  191.             }
  192.             /* else try again */
  193.         }
  194.         /*NOTREACHED*/
  195.     }
  196.  
  197.     time(&now);
  198.     done = now + tlen;
  199.     tleft = tlen;
  200.  
  201.     forever {
  202.         MY_FD_ZERO(&ss);
  203. #if defined(__DECC) || defined(__DECCXX)
  204. #pragma message save
  205. #pragma message disable trunclongint
  206. #endif
  207.         MY_FD_SET(sfd, &ss);
  208. #if defined(__DECC) || defined(__DECCXX)
  209. #pragma message restore
  210. #endif
  211.         ss2 = ss;
  212.         tv.tv_sec = (tv_sec_t) tleft;
  213.         tv.tv_usec = 0;
  214.         result = select(sfd + 1, NULL, SELECT_TYPE_ARG234 &ss, SELECT_TYPE_ARG234 &ss2, &tv);
  215.         if (result >= 1) {
  216.             /* ready */
  217.             return (1);
  218.         } else if (result < 0) {
  219.             if (errno != EINTR) {
  220.                 /* error */
  221.                 break;
  222.             }
  223.             /* try again */
  224.             time(&now);
  225.             if (now > done) {
  226.                 /* timed-out */
  227.                 errno = ETIMEDOUT;
  228.                 break;
  229.             }
  230.             tleft = (int) (done - now);
  231.         } else {
  232.             /* timed-out */
  233.             errno = ETIMEDOUT;
  234.             break;
  235.         }
  236.     }
  237.  
  238.     return (0);
  239. }    /* SWaitUntilReadyForWriting */
  240.