2
* route This file contains an implementation of the command
3
* that manages the IP routing table in the kernel.
5
* Version: $Id: route.c,v 1.9 2001/04/15 14:41:17 pb Exp $
7
* Maintainer: Bernd 'eckes' Eckenfels, <net-tools@lina.inka.de>
9
* Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
10
* (derived from FvK's 'route.c 1.70 01/04/94')
13
* Johannes Stille: for Net-2Debugged by
14
* <johannes@titan.os.open.de>
15
* Linus Torvalds: Misc Changes
16
* Alan Cox: add the new mtu/window stuff
17
* Miquel van Smoorenburg: rt_add and rt_del
18
* {1.79} Bernd Eckenfels: route_info
19
* {1.80} Bernd Eckenfels: reject, metric, irtt, 1.2.x support.
20
* {1.81} Bernd Eckenfels: reject routes need a dummy device
21
*960127 {1.82} Bernd Eckenfels: 'mod' and 'dyn' 'reinstate' added
22
*960129 {1.83} Bernd Eckenfels: resolve and getsock now in lib/,
23
* REJECT displays '-' as gatway.
24
*960202 {1.84} Bernd Eckenfels: net-features support added
25
*960203 {1.85} Bernd Eckenfels: "#ifdef' in '#if' for net-features
26
* -A (aftrans) support, get_longopts
27
*960206 {1.86} Bernd Eckenfels: route_init();
28
*960218 {1.87} Bernd Eckenfels: netinet/in.h added
29
*960221 {1.88} Bernd Eckenfels: aftrans_dfl support
30
*960222 {1.90} Bernd Eckenfels: moved all AF specific code to lib/.
31
*960413 {1.91} Bernd Eckenfels: new RTACTION support+FLAG_CACHE/FIB
32
*960426 {1.92} Bernd Eckenfels: FLAG_SYM/-N support
33
*960823 {x.xx} Frank Strauss: INET6 stuff
34
*980629 {1.95} Arnaldo Carvalho de Melo: gettext instead of catgets
35
*990101 {1.96} Bernd Eckenfels: fixed usage and FLAG_CACHE Output
36
*20010404 {1.97} Arnaldo Carvalho de Melo: use setlocale
39
#include <sys/types.h>
40
#include <sys/ioctl.h>
41
#include <sys/socket.h>
43
/* #include <net/route.h> realy broken */
44
#include <netinet/in.h>
46
#include <netinet/in.h>
47
#include <arpa/nameser.h>
49
#include <linux/param.h>
58
#include "net-support.h"
61
#include "pathnames.h"
64
#define DFLT_AF "inet"
67
#include "lib/net-features.h" /* needs some of the system includes above! */
69
char *Release = RELEASE, *Version = "route 1.98 (2001-04-15)";
71
int opt_n = 0; /* numerical output flag */
72
int opt_v = 0; /* debugging output flag */
73
int opt_e = 1; /* 1,2,3=type of routetable */
74
int opt_fc = 0; /* routing cache/FIB */
75
int opt_h = 0; /* help selected */
76
struct aftype *ap; /* current address family */
78
static void usage(void)
80
fprintf(stderr, _("Usage: route [-nNvee] [-FC] [<AF>] List kernel routing tables\n"));
81
fprintf(stderr, _(" route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.\n\n"));
83
fprintf(stderr, _(" route {-h|--help} [<AF>] Detailed usage syntax for specified AF.\n"));
84
fprintf(stderr, _(" route {-V|--version} Display version/author and exit.\n\n"));
86
fprintf(stderr, _(" -v, --verbose be verbose\n"));
87
fprintf(stderr, _(" -n, --numeric don't resolve names\n"));
88
fprintf(stderr, _(" -e, --extend display other/more information\n"));
89
fprintf(stderr, _(" -F, --fib display Forwarding Information Base (default)\n"));
90
fprintf(stderr, _(" -C, --cache display routing cache instead of FIB\n\n"));
92
fprintf(stderr, _(" <AF>=Use '-A <af>' or '--<af>'; default: %s\n"), DFLT_AF);
93
fprintf(stderr, _(" List of possible address families (which support routing):\n"));
94
print_aflist(1); /* 1 = routeable */
99
static void version(void)
101
fprintf(stderr, "%s\n%s\n%s\n", Release, Version, Features);
106
int main(int argc, char **argv)
108
int i, lop, what = 0;
109
struct option longopts[] =
112
{"extend", 0, 0, 'e'},
113
{"verbose", 0, 0, 'v'},
114
{"version", 0, 0, 'V'},
115
{"numeric", 0, 0, 'n'},
116
{"symbolic", 0, 0, 'N'},
117
{"protocol", 1, 0, 'A'},
118
{"cache", 0, 0, 'C'},
127
setlocale (LC_ALL, "");
128
bindtextdomain("net-tools", "/usr/share/locale");
129
textdomain("net-tools");
131
getroute_init(); /* Set up AF routing support */
136
/* getopts and -net wont work :-/ */
137
for (tmp = argv; *tmp; tmp++) {
138
if (!strcmp(*tmp, "-net"))
139
strcpy(*tmp, "#net");
140
else if (!strcmp(*tmp, "-host"))
141
strcpy(*tmp, "#host");
144
/* Fetch the command-line arguments. */
145
while ((i = getopt_long(argc, argv, "A:eCFhnNVv?", longopts, &lop)) != EOF)
156
opt_v |= FLAG_VERBOSE;
162
if (lop < 0 || lop >= AFTRANS_CNT) {
163
EINTERN("route.c", "longopts 1 range");
166
if ((i = aftrans_opt(longopts[lop].name)))
170
opt_fc |= FLAG_CACHE;
176
if ((i = aftrans_opt(optarg)))
196
what = RTACTION_HELP;
199
/* this will initialise afname[] */
200
aftrans_def("route", progname, DFLT_AF);
202
/* Do we have to show the contents of the routing table? */
204
what = RTACTION_SHOW;
206
if (!strcmp(*argv, "add"))
208
else if (!strcmp(*argv, "del") || !strcmp(*argv, "delete"))
210
else if (!strcmp(*argv, "flush"))
211
what = RTACTION_FLUSH;
217
options = (opt_e & FLAG_EXT) | opt_n | opt_fc | opt_v;
221
if (what == RTACTION_SHOW)
222
i = route_info(afname, options);
224
i = route_edit(what, afname, options, ++argv);