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