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 / PWrite.c < prev    next >
C/C++ Source or Header  |  2001-11-19  |  1KB  |  62 lines

  1. #include "syshdrs.h"
  2. #ifdef PRAGMA_HDRSTOP
  3. #    pragma hdrstop
  4. #endif
  5.  
  6. #if !defined(NO_SIGNALS) && defined(SIGPIPE)
  7. extern Sjmp_buf gPipeJmp;
  8. #endif
  9. int
  10. PWrite(int sfd, const char *const buf0, size_t size)
  11. {
  12.     write_return_t nwrote;
  13. #if defined(NO_SIGNALS) || !defined(SIGPIPE)
  14.     write_size_t nleft;
  15.     const char *buf = buf0;
  16. #else
  17.     volatile write_size_t nleft;
  18.     const char *volatile buf = buf0;
  19.     vsio_sigproc_t sigpipe;
  20.  
  21.     if (SSetjmp(gPipeJmp) != 0) {
  22.         (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  23.         nwrote = (write_return_t) size - (write_return_t) nleft;
  24.         if (nwrote > 0)
  25.             return ((int) nwrote);
  26.         errno = EPIPE;
  27.         return (kBrokenPipeErr);
  28.     }
  29.  
  30.     sigpipe = (vsio_sigproc_t) SSignal(SIGPIPE, SIOHandler);
  31. #endif
  32.  
  33.     nleft = (write_size_t) size;
  34.     forever {
  35.         nwrote = write(sfd, buf, nleft);
  36.         if (nwrote < 0) {
  37.             if (errno != EINTR) {
  38.                 nwrote = (write_return_t) size - (write_return_t) nleft;
  39.                 if (nwrote == 0)
  40.                     nwrote = (write_return_t) -1;
  41.                 goto done;
  42.             } else {
  43.                 errno = 0;
  44.                 nwrote = 0;
  45.                 /* Try again. */
  46.             }
  47.         }
  48.         nleft -= (write_size_t) nwrote;
  49.         if (nleft == 0)
  50.             break;
  51.         buf += nwrote;
  52.     }
  53.     nwrote = (write_return_t) size - (write_return_t) nleft;
  54.  
  55. done:
  56. #if !defined(NO_SIGNALS) && defined(SIGPIPE)
  57.     (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
  58. #endif
  59.  
  60.     return ((int) nwrote);
  61. }    /* PWrite */
  62.