6358ec43fb4897844e7e69c4c65a52c37af41b4e
[iproute2.git] / ip / ip.c
1 /*
2  * ip.c         "ip" utility frontend.
3  *
4  *              This program is free software; you can redistribute it and/or
5  *              modify it under the terms of the GNU General Public License
6  *              as published by the Free Software Foundation; either version
7  *              2 of the License, or (at your option) any later version.
8  *
9  * Authors:     Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
10  *
11  *
12  * Changes:
13  *
14  * Rani Assaf <rani@magic.metawire.com> 980929: resolve addresses
15  */
16
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <syslog.h>
21 #include <fcntl.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24 #include <string.h>
25
26 #include "SNAPSHOT.h"
27 #include "utils.h"
28 #include "ip_common.h"
29
30 int preferred_family = AF_UNSPEC;
31 int show_stats = 0;
32 int resolve_hosts = 0;
33 int oneline = 0;
34 char * _SL_ = NULL;
35
36 static void usage(void) __attribute__((noreturn));
37
38 static void usage(void)
39 {
40         fprintf(stderr,
41 "Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }\n"
42 "where  OBJECT := { link | addr | route | rule | neigh | tunnel |\n"
43 "                   maddr | mroute | monitor | xfrm }\n"
44 "       OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] |\n"
45 "                    -f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] }\n");
46         exit(-1);
47 }
48
49 int main(int argc, char **argv)
50 {
51         char *basename;
52
53         basename = strrchr(argv[0], '/');
54         if (basename == NULL)
55                 basename = argv[0];
56         else
57                 basename++;
58         
59         while (argc > 1) {
60                 char *opt = argv[1];
61                 if (strcmp(opt,"--") == 0) {
62                         argc--; argv++;
63                         break;
64                 }
65                 if (opt[0] != '-')
66                         break;
67                 if (opt[1] == '-')
68                         opt++;
69                 if (matches(opt, "-family") == 0) {
70                         argc--;
71                         argv++;
72                         if (argc <= 1)
73                                 usage();
74                         if (strcmp(argv[1], "inet") == 0)
75                                 preferred_family = AF_INET;
76                         else if (strcmp(argv[1], "inet6") == 0)
77                                 preferred_family = AF_INET6;
78                         else if (strcmp(argv[1], "dnet") == 0)
79                                 preferred_family = AF_DECnet;
80                         else if (strcmp(argv[1], "link") == 0)
81                                 preferred_family = AF_PACKET;
82                         else if (strcmp(argv[1], "ipx") == 0)
83                                 preferred_family = AF_IPX;
84                         else if (strcmp(argv[1], "help") == 0)
85                                 usage();
86                         else
87                                 invarg(argv[1], "invalid protocol family");
88                 } else if (strcmp(opt, "-4") == 0) {
89                         preferred_family = AF_INET;
90                 } else if (strcmp(opt, "-6") == 0) {
91                         preferred_family = AF_INET6;
92                 } else if (strcmp(opt, "-0") == 0) {
93                         preferred_family = AF_PACKET;
94                 } else if (strcmp(opt, "-I") == 0) {
95                         preferred_family = AF_IPX;
96                 } else if (strcmp(opt, "-D") == 0) {
97                         preferred_family = AF_DECnet;
98                 } else if (matches(opt, "-stats") == 0 ||
99                            matches(opt, "-statistics") == 0) {
100                         ++show_stats;
101                 } else if (matches(opt, "-resolve") == 0) {
102                         ++resolve_hosts;
103                 } else if (matches(opt, "-oneline") == 0) {
104                         ++oneline;
105 #if 0
106                 } else if (matches(opt, "-numeric") == 0) {
107                         rtnl_names_numeric++;
108 #endif
109                 } else if (matches(opt, "-Version") == 0) {
110                         printf("ip utility, iproute2-ss%s\n", SNAPSHOT);
111                         exit(0);
112                 } else if (matches(opt, "-help") == 0) {
113                         usage();
114                 } else {
115                         fprintf(stderr, "Option \"%s\" is unknown, try \"ip -help\".\n", opt);
116                         exit(-1);
117                 }
118                 argc--; argv++;
119         }
120
121         _SL_ = oneline ? "\\" : "\n" ;
122
123         if (strcmp(basename, "ipaddr") == 0)
124                 return do_ipaddr(argc-1, argv+1);
125         if (strcmp(basename, "ipmaddr") == 0)
126                 return do_multiaddr(argc-1, argv+1);
127         if (strcmp(basename, "iproute") == 0)
128                 return do_iproute(argc-1, argv+1);
129         if (strcmp(basename, "iprule") == 0)
130                 return do_iprule(argc-1, argv+1);
131         if (strcmp(basename, "ipneigh") == 0)
132                 return do_ipneigh(argc-1, argv+1);
133         if (strcmp(basename, "iplink") == 0)
134                 return do_iplink(argc-1, argv+1);
135         if (strcmp(basename, "iptunnel") == 0)
136                 return do_iptunnel(argc-1, argv+1);
137         if (strcmp(basename, "ipmonitor") == 0)
138                 return do_ipmonitor(argc-1, argv+1);
139         if (strcmp(basename, "ipxfrm") == 0)
140                 return do_xfrm(argc-1, argv+1);
141
142         if (argc > 1) {
143                 if (matches(argv[1], "address") == 0)
144                         return do_ipaddr(argc-2, argv+2);
145                 if (matches(argv[1], "maddress") == 0)
146                         return do_multiaddr(argc-2, argv+2);
147                 if (matches(argv[1], "route") == 0)
148                         return do_iproute(argc-2, argv+2);
149                 if (matches(argv[1], "rule") == 0)
150                         return do_iprule(argc-2, argv+2);
151                 if (matches(argv[1], "mroute") == 0)
152                         return do_multiroute(argc-2, argv+2);
153                 if (matches(argv[1], "neighbor") == 0 ||
154                     matches(argv[1], "neighbour") == 0)
155                         return do_ipneigh(argc-2, argv+2);
156                 if (matches(argv[1], "link") == 0)
157                         return do_iplink(argc-2, argv+2);
158                 if (matches(argv[1], "tunnel") == 0 ||
159                     strcmp(argv[1], "tunl") == 0)
160                         return do_iptunnel(argc-2, argv+2);
161                 if (matches(argv[1], "monitor") == 0)
162                         return do_ipmonitor(argc-2, argv+2);
163                 if (matches(argv[1], "xfrm") == 0)
164                         return do_xfrm(argc-2, argv+2);
165                 if (matches(argv[1], "help") == 0)
166                         usage();
167                 fprintf(stderr, "Object \"%s\" is unknown, try \"ip help\".\n", argv[1]);
168                 exit(-1);
169         }
170         usage();
171 }