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 39int 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 */ 68