• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/ap/gpl/timemachine/netatalk-2.2.5/libatalk/netddp/
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