Added ncftp to rosapps
[reactos.git] / rosapps / net / ncftp / sio / USendtoByName.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 USendtoByName(int sfd, const char *const buf, size_t size, int fl, const char *const toAddrStr, int tlen)
10 {
11 int nwrote, tleft;
12 vsio_sigproc_t sigalrm, sigpipe;
13 time_t done, now;
14 struct sockaddr_un toAddr;
15 int ualen;
16
17 ualen = MakeSockAddrUn(&toAddr, toAddrStr);
18
19 if (SSetjmp(gNetTimeoutJmp) != 0) {
20 alarm(0);
21 (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
22 (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
23 errno = ETIMEDOUT;
24 return (kTimeoutErr);
25 }
26
27 if (SSetjmp(gPipeJmp) != 0) {
28 alarm(0);
29 (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
30 (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
31 errno = EPIPE;
32 return (kBrokenPipeErr);
33 }
34
35 sigalrm = (vsio_sigproc_t) SSignal(SIGALRM, SIOHandler);
36 sigpipe = (vsio_sigproc_t) SSignal(SIGPIPE, SIOHandler);
37
38 time(&now);
39 done = now + tlen;
40 tleft = (int) (done - now);
41 forever {
42 (void) alarm((unsigned int) tleft);
43 nwrote = sendto(sfd, buf, size, fl,
44 (struct sockaddr *) &toAddr, ualen);
45 (void) alarm(0);
46 if (nwrote >= 0)
47 break;
48 if (errno != EINTR)
49 break; /* Fatal error. */
50 errno = 0;
51 time(&now);
52 tleft = (int) (done - now);
53 if (tleft < 1) {
54 nwrote = kTimeoutErr;
55 errno = ETIMEDOUT;
56 break;
57 }
58 }
59
60 (void) SSignal(SIGALRM, (sio_sigproc_t) sigalrm);
61 (void) SSignal(SIGPIPE, (sio_sigproc_t) sigpipe);
62
63 return (nwrote);
64 } /* USendtoByName */
65
66 #endif