]> arthur.barton.de Git - netatalk.git/blob - etc/atalkd/route.c
94ee92c3bca20648f7d4cda6926bfb06ccb04660
[netatalk.git] / etc / atalkd / route.c
1 /*
2  * Copyright (c) 1990,1996 Regents of The University of Michigan.
3  * All Rights Reserved. See COPYRIGHT.
4  */
5
6 #include <sys/param.h>
7 #include <sys/types.h>
8 #include <sys/socket.h>
9 #include <net/route.h>
10
11 #include <netatalk/at.h>
12
13 #include "rtmp.h"
14
15 #ifndef BSD4_4
16 route( message, dst, gate, flags )
17     int                 message;
18     struct sockaddr     *dst, *gate;
19     int                 flags;
20 {
21     struct rtentry      rtent;
22
23     bzero( &rtent, sizeof( struct rtentry ));
24     rtent.rt_dst = *dst;
25     rtent.rt_gateway = *gate;
26     rtent.rt_flags = flags;
27     return( ioctl( rtfd, message, &rtent ));
28 }
29
30 #else BSD4_4
31
32 struct sockaddr_m {
33     u_char      sam_len;
34     u_char      sam_family;
35     u_short     sam_pad;
36     u_short     sam_mask;
37 } mask = { sizeof( struct sockaddr_m ), 0, 0, 0xffff };
38
39 struct rt_msg_at {
40     struct rt_msghdr    rtma_rtm;
41     struct sockaddr_at  rtma_dst;
42     struct sockaddr_at  rtma_gate;
43     struct sockaddr_m   rtma_mask;
44 } rtma;
45
46 route( message, dst, gate, flags )
47     int                 message;
48     struct sockaddr_at  *dst, *gate;
49     int                 flags;
50 {
51     int                 rc;
52
53     bzero( &rtma, sizeof( struct rt_msg_at ));
54     rtma.rtma_rtm.rtm_msglen = sizeof( struct rt_msg_at );
55     rtma.rtma_rtm.rtm_version = RTM_VERSION;
56     rtma.rtma_rtm.rtm_type = message;
57     rtma.rtma_rtm.rtm_pid = getpid();
58     rtma.rtma_rtm.rtm_addrs = RTA_DST|RTA_GATEWAY;
59     if ( flags & RTF_HOST ) {
60         rtma.rtma_rtm.rtm_msglen = sizeof( struct rt_msg_at ) -
61                 sizeof( struct sockaddr_m );
62     } else {
63         rtma.rtma_rtm.rtm_msglen = sizeof( struct rt_msg_at );
64         rtma.rtma_rtm.rtm_addrs |= RTA_NETMASK;
65         rtma.rtma_mask = mask;
66     }
67
68     rtma.rtma_rtm.rtm_flags = flags;
69     rtma.rtma_dst = *dst;
70     rtma.rtma_gate = *gate;
71     if (( rc = write( rtfd, &rtma, rtma.rtma_rtm.rtm_msglen )) !=
72             rtma.rtma_rtm.rtm_msglen ) {
73         return( -1 );
74     }
75     return( 0 );
76 }
77 #endif BSD4_4