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 40int 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 */ 71