]> arthur.barton.de Git - netatalk.git/blob - libatalk/netddp/netddp_sendto.c
3e26e338183e6962f6388cdefbc76cfec9c927f8
[netatalk.git] / libatalk / netddp / netddp_sendto.c
1 /* 
2  * Copyright (c) 1999 Adrian Sun (asun@zoology.washington.edu)
3  * Copyright (c) 1990,1991 Regents of The University of Michigan.
4  * All Rights Reserved. See COPYRIGHT.
5  *
6  * send data.
7  */
8
9 static int _netddp_sendto_dummy;
10
11 #ifndef NO_DDP
12 #include <string.h>
13 #include <unistd.h>
14 #include <sys/types.h>
15 #include <sys/socket.h>
16 #include <sys/uio.h>
17 #include <errno.h>
18
19 #ifdef MACOSX_SERVER
20 #include <at/appletalk.h>
21 #include <at/ddp.h>
22 #endif
23
24 #include <netatalk/at.h>
25 #include <netatalk/endian.h>
26 #include <netatalk/ddp.h>
27 #include <atalk/netddp.h>
28
29 #ifndef MAX
30 #define MAX(a, b)  ((a) < (b) ? (b) : (a))
31 #endif
32
33 #ifdef MACOSX_SERVER
34 int netddp_sendto(int fd, void *buf, int buflen, unsigned int dummy, 
35                   const struct sockaddr *addr, unsigned int addrlen)
36 {
37     ssize_t i;
38     struct ddpehdr ddphdr;
39     const struct sockaddr_at *sat = (const struct sockaddr_at *) addr;
40     struct iovec iov[2];
41
42     iov[0].iov_base = (void *) &ddphdr;
43     iov[0].iov_len = sizeof(ddphdr);
44     iov[1].iov_base = buf;
45     iov[1].iov_len = buflen;
46
47     if (!addr)
48       return -1;
49
50     memset(&ddphdr, 0, sizeof(ddphdr));
51     ddphdr.deh_len = htons(sizeof(ddphdr) + buflen);
52     ddphdr.deh_dnet = sat->sat_addr.s_net;
53     ddphdr.deh_dnode = sat->sat_addr.s_node;
54     ddphdr.deh_dport = sat->sat_port;
55     while ((i = writev(fd, iov, 2)) < 0) {
56       if (errno != EINTR)
57         return -1;
58     }
59
60     return MAX(0, i - sizeof(ddphdr));
61 }
62
63 #endif /* os x server */
64 #endif /* no ddp */