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