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