- Fix KiDispatchException to unmask KI_EXCEPTION_INTERNAL when setting the exception...
[reactos.git] / rosapps / net / ncftp / sio / USendto.c
1 #include "syshdrs.h"
2
3 #if !defined(NO_UNIX_DOMAIN_SOCKETS) && !defined(NO_SIGNALS)
4
5 extern volatile Sjmp_buf gNetTimeoutJmp;
6 extern volatile Sjmp_buf gPipeJmp;
7
8 int
9 USendto(int sfd, const char *const buf, size_t size, int fl, const struct sockaddr_un *const toAddr, int ualen, int tlen)
10 {
11 int nwrote, tleft;
12 vsio_sigproc_t sigalrm, sigpipe;
13 time_t done, now;
14
15 if (SSetjmp(gNetTimeoutJmp) != 0) {
16 alarm(0);
17 (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
18 (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
19 errno = ETIMEDOUT;
20 return (kTimeoutErr);
21 }
22
23 if (SSetjmp(gPipeJmp) != 0) {
24 alarm(0);
25 (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
26 (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
27 errno = EPIPE;
28 return (kBrokenPipeErr);
29 }
30
31 sigalrm = (vsio_sigproc_t) SSignal(SIGALRM, SIOHandler);
32 sigpipe = (vsio_sigproc_t) SSignal(SIGPIPE, SIOHandler);
33
34 time(&now);
35 done = now + tlen;
36 tleft = (int) (done - now);
37 forever {
38 (void) alarm((unsigned int) tleft);
39 nwrote = sendto(sfd, buf, size, fl,
40 (struct sockaddr *) toAddr, ualen);
41 (void) alarm(0);
42 if (nwrote >= 0)
43 break;
44 if (errno != EINTR)
45 break; /* Fatal error. */
46 errno = 0;
47 time(&now);
48 tleft = (int) (done - now);
49 if (tleft < 1) {
50 nwrote = kTimeoutErr;
51 errno = ETIMEDOUT;
52 break;
53 }
54 }
55
56 (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
57 (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
58
59 return (nwrote);
60 } /* USendto */
61
62 #endif
63