]> arthur.barton.de Git - netatalk.git/blob - libatalk/netddp/netddp_recvfrom.c
Initial revision
[netatalk.git] / libatalk / netddp / netddp_recvfrom.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  * receive data.
7  */
8
9 static int _netddp_recvfrom_dummy;
10
11 #ifndef NO_DDP
12 #include <unistd.h>
13 #include <sys/types.h>
14 #include <sys/socket.h>
15 #include <sys/uio.h>
16 #include <errno.h>
17
18 #ifdef MACOSX_SERVER
19 #include <at/appletalk.h>
20 #include <at/ddp.h>
21 #endif
22
23 #include <netatalk/at.h>
24 #include <netatalk/endian.h>
25 #include <netatalk/ddp.h>
26 #include <atalk/netddp.h>
27
28 #ifndef MAX
29 #define MAX(a, b)  ((a) < (b) ? (b) : (a))
30 #endif
31
32 #ifdef MACOSX_SERVER
33 int netddp_recvfrom(int fd, void *buf, int buflen, unsigned int dummy, 
34                      struct sockaddr *addr, unsigned int *addrlen)
35 {
36     ssize_t i;
37     struct ddpehdr ddphdr;
38     struct sockaddr_at *sat = (struct sockaddr_at *) addr;
39     struct iovec iov[2];
40
41     iov[0].iov_base = (void *) &ddphdr;
42     iov[0].iov_len = sizeof(ddphdr);
43     iov[1].iov_base = buf;
44     iov[1].iov_len = buflen;
45
46     while ((i = readv(fd, iov, 2)) < 0) {
47       if (errno != EINTR)
48         return -1;
49     }
50
51     if (addr) {
52       sat->sat_addr.s_net = ddphdr.deh_snet;
53       sat->sat_addr.s_node = ddphdr.deh_snode;
54       sat->sat_port = ddphdr.deh_sport;
55     }
56
57     return MAX(0, i - sizeof(ddphdr));
58 }
59
60 #endif /* os x server */
61 #endif /* no ddp */