Updates for move of net apps to rosapps
[reactos.git] / reactos / apps / utils / net / ncftp / sio / PWrite.c
1 #include "syshdrs.h"
2
3 #if !defined(NO_SIGNALS) && defined(SIGPIPE)
4 extern volatile Sjmp_buf gPipeJmp;
5 #endif
6 int
7 PWrite(int sfd, const char *const buf0, size_t size)
8 {
9 volatile int nleft;
10 const char *volatile buf = buf0;
11 int nwrote;
12 #if !defined(NO_SIGNALS) && defined(SIGPIPE)
13 vsio_sigproc_t sigpipe;
14
15 if (SSetjmp(gPipeJmp) != 0) {
16 (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
17 nwrote = size - nleft;
18 if (nwrote > 0)
19 return (nwrote);
20 errno = EPIPE;
21 return (kBrokenPipeErr);
22 }
23
24 sigpipe = (vsio_sigproc_t) SSignal(SIGPIPE, SIOHandler);
25 #endif
26
27 nleft = (int) size;
28 forever {
29 nwrote = write(sfd, buf, nleft);
30 if (nwrote < 0) {
31 if (errno != EINTR) {
32 nwrote = size - nleft;
33 if (nwrote == 0)
34 nwrote = -1;
35 goto done;
36 } else {
37 errno = 0;
38 nwrote = 0;
39 /* Try again. */
40 }
41 }
42 nleft -= nwrote;
43 if (nleft <= 0)
44 break;
45 buf += nwrote;
46 }
47 nwrote = size - nleft;
48
49 done:
50 #if !defined(NO_SIGNALS) && defined(SIGPIPE)
51 (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
52 #endif
53
54 return (nwrote);
55 } /* PWrite */