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.7 2000/12/19 00:26:16 ecki 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
38 #include <sys/types.h>
39 #include <sys/ioctl.h>
40 #include <sys/socket.h>
42 /* #include <net/route.h> realy broken */
43 #include <netinet/in.h>
45 #include <netinet/in.h>
46 #include <arpa/nameser.h>
48 #include <linux/param.h>
57 #include "net-support.h"
60 #include "pathnames.h"
63 #define DFLT_AF "inet"
66 #include "lib/net-features.h" /* needs some of the system includes above! */
68 char *Release = RELEASE, *Version = "route 1.96 (1999-01-01)";
70 int opt_n = 0; /* numerical output flag */
71 int opt_v = 0; /* debugging output flag */
72 int opt_e = 1; /* 1,2,3=type of routetable */
73 int opt_fc = 0; /* routing cache/FIB */
74 int opt_h = 0; /* help selected */
75 struct aftype *ap; /* current address family */
77 static void usage(void)
79 fprintf(stderr, _("Usage: route [-nNvee] [-FC] [<AF>] List kernel routing tables\n"));
80 fprintf(stderr, _(" route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.\n\n"));
82 fprintf(stderr, _(" route {-h|--help} [<AF>] Detailed usage syntax for specified AF.\n"));
83 fprintf(stderr, _(" route {-V|--version} Display version/author and exit.\n\n"));
85 fprintf(stderr, _(" -v, --verbose be verbose\n"));
86 fprintf(stderr, _(" -n, --numeric dont resolve names\n"));
87 fprintf(stderr, _(" -e, --extend display other/more information\n"));
88 fprintf(stderr, _(" -F, --fib display Forwarding Information Base (default)\n"));
89 fprintf(stderr, _(" -C, --cache display routing cache instead of FIB\n\n"));
91 fprintf(stderr, _(" <AF>=Use '-A <af>' or '--<af>' Default: %s\n"), DFLT_AF);
92 fprintf(stderr, _(" List of possible address families (which support routing):\n"));
93 print_aflist(1); /* 1 = routeable */
98 static void version(void)
100 fprintf(stderr, "%s\n%s\n%s\n", Release, Version, Features);
105 int main(int argc, char **argv)
107 int i, lop, what = 0;
108 struct option longopts[] =
111 {"extend", 0, 0, 'e'},
112 {"verbose", 0, 0, 'v'},
113 {"version", 0, 0, 'V'},
114 {"numeric", 0, 0, 'n'},
115 {"symbolic", 0, 0, 'N'},
116 {"protocol", 1, 0, 'A'},
117 {"cache", 0, 0, 'C'},
126 bindtextdomain("net-tools", "/usr/share/locale");
127 textdomain("net-tools");
129 getroute_init(); /* Set up AF routing support */
134 /* getopts and -net wont work :-/ */
135 for (tmp = argv; *tmp; tmp++) {
136 if (!strcmp(*tmp, "-net"))
137 strcpy(*tmp, "#net");
138 else if (!strcmp(*tmp, "-host"))
139 strcpy(*tmp, "#host");
142 /* Fetch the command-line arguments. */
143 while ((i = getopt_long(argc, argv, "A:eCFhnNVv?", longopts, &lop)) != EOF)
154 opt_v |= FLAG_VERBOSE;
160 if (lop < 0 || lop >= AFTRANS_CNT) {
161 EINTERN("route.c", "longopts 1 range");
164 if ((i = aftrans_opt(longopts[lop].name)))
168 opt_fc |= FLAG_CACHE;
174 if ((i = aftrans_opt(optarg)))
194 what = RTACTION_HELP;
197 /* this will initialise afname[] */
198 aftrans_def("route", progname, DFLT_AF);
200 /* Do we have to show the contents of the routing table? */
202 what = RTACTION_SHOW;
204 if (!strcmp(*argv, "add"))
206 else if (!strcmp(*argv, "del") || !strcmp(*argv, "delete"))
208 else if (!strcmp(*argv, "flush"))
209 what = RTACTION_FLUSH;
215 options = (opt_e & FLAG_EXT) | opt_n | opt_fc | opt_v;
219 if (what == RTACTION_SHOW)
220 i = route_info(afname, options);
222 i = route_edit(what, afname, options, ++argv);