aboutsummaryrefslogtreecommitdiff
path: root/networking/route.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-11-10 11:22:46 +0000
committerEric Andersen <andersen@codepoet.org>2001-11-10 11:22:46 +0000
commitcd8c436d811a5a077a0b61a6616c900173e2dcfb (patch)
tree94163bfef63fec4c2638d5f56be310b7176464d7 /networking/route.c
parent94f19a838518293810a0fc0c4dca926ca8caff57 (diff)
downloadbusybox-w32-cd8c436d811a5a077a0b61a6616c900173e2dcfb.tar.gz
busybox-w32-cd8c436d811a5a077a0b61a6616c900173e2dcfb.tar.bz2
busybox-w32-cd8c436d811a5a077a0b61a6616c900173e2dcfb.zip
Latest patch from vodz:
-- reverse resolve network name and cache in route and ifconfig applets, fix print nslookup server name if compile without uClibc, fix route crashe 'route add', fix warnings compile networking and pwd_grp applets
Diffstat (limited to 'networking/route.c')
-rw-r--r--networking/route.c69
1 files changed, 29 insertions, 40 deletions
diff --git a/networking/route.c b/networking/route.c
index ee3533100..43180296d 100644
--- a/networking/route.c
+++ b/networking/route.c
@@ -15,7 +15,7 @@
15 * Foundation; either version 2 of the License, or (at 15 * Foundation; either version 2 of the License, or (at
16 * your option) any later version. 16 * your option) any later version.
17 * 17 *
18 * $Id: route.c,v 1.13 2001/09/05 19:32:00 andersen Exp $ 18 * $Id: route.c,v 1.14 2001/11/10 11:22:43 andersen Exp $
19 * 19 *
20 * displayroute() code added by Vladimir N. Oleynik <dzo@simtreas.ru> 20 * displayroute() code added by Vladimir N. Oleynik <dzo@simtreas.ru>
21 * adjustments by Larry Doolittle <LRDoolittle@lbl.gov> 21 * adjustments by Larry Doolittle <LRDoolittle@lbl.gov>
@@ -23,11 +23,9 @@
23 23
24#include <sys/types.h> 24#include <sys/types.h>
25#include <sys/ioctl.h> 25#include <sys/ioctl.h>
26#include <sys/socket.h> 26#include "inet_common.h"
27#include <net/route.h> 27#include <net/route.h>
28#include <linux/param.h> // HZ 28#include <linux/param.h> // HZ
29#include <netinet/in.h>
30#include <arpa/inet.h>
31#include <stdio.h> 29#include <stdio.h>
32#include <errno.h> 30#include <errno.h>
33#include <fcntl.h> 31#include <fcntl.h>
@@ -55,29 +53,6 @@
55#define E_INTERN 2 53#define E_INTERN 2
56#define E_NOSUPP 1 54#define E_NOSUPP 1
57 55
58/* resolve XXX.YYY.ZZZ.QQQ -> binary */
59
60static int
61INET_resolve(char *name, struct sockaddr *sa)
62{
63 struct sockaddr_in *s_in = (struct sockaddr_in *)sa;
64
65 s_in->sin_family = AF_INET;
66 s_in->sin_port = 0;
67
68 /* Default is special, meaning 0.0.0.0. */
69 if (strcmp(name, "default")==0) {
70 s_in->sin_addr.s_addr = INADDR_ANY;
71 return 1;
72 }
73 /* Look to see if it's a dotted quad. */
74 if (inet_aton(name, &s_in->sin_addr)) {
75 return 0;
76 }
77 /* guess not.. */
78 return -1;
79}
80
81#if defined (SIOCADDRTOLD) || defined (RTF_IRTT) /* route */ 56#if defined (SIOCADDRTOLD) || defined (RTF_IRTT) /* route */
82#define HAVE_NEW_ADDRT 1 57#define HAVE_NEW_ADDRT 1
83#endif 58#endif
@@ -96,13 +71,16 @@ INET_resolve(char *name, struct sockaddr *sa)
96#define full_mask(x) (((struct sockaddr_in *)&(x))->sin_addr.s_addr) 71#define full_mask(x) (((struct sockaddr_in *)&(x))->sin_addr.s_addr)
97#endif 72#endif
98 73
74
75
99/* add or delete a route depending on action */ 76/* add or delete a route depending on action */
100 77
101static int 78static int
102INET_setroute(int action, int options, char **args) 79INET_setroute(int action, int options, char **args)
103{ 80{
104 struct rtentry rt; 81 struct rtentry rt;
105 char target[128], gateway[128] = "NONE", netmask[128] = "default"; 82 char target[128], gateway[128] = "NONE";
83 const char *netmask = bb_INET_default;
106 int xflag, isnet; 84 int xflag, isnet;
107 int skfd; 85 int skfd;
108 86
@@ -117,13 +95,15 @@ INET_setroute(int action, int options, char **args)
117 xflag = 2; 95 xflag = 2;
118 args++; 96 args++;
119 } 97 }
98 if (*args == NULL)
99 show_usage();
120 safe_strncpy(target, *args++, (sizeof target)); 100 safe_strncpy(target, *args++, (sizeof target));
121 101
122 /* Clean out the RTREQ structure. */ 102 /* Clean out the RTREQ structure. */
123 memset((char *) &rt, 0, sizeof(struct rtentry)); 103 memset((char *) &rt, 0, sizeof(struct rtentry));
124 104
125 105
126 if ((isnet = INET_resolve(target, &rt.rt_dst)) < 0) { 106 if ((isnet = INET_resolve(target, (struct sockaddr_in *)&rt.rt_dst, xflag!=1)) < 0) {
127 error_msg(_("can't resolve %s"), target); 107 error_msg(_("can't resolve %s"), target);
128 return EXIT_FAILURE; /* XXX change to E_something */ 108 return EXIT_FAILURE; /* XXX change to E_something */
129 } 109 }
@@ -169,8 +149,8 @@ INET_setroute(int action, int options, char **args)
169 args++; 149 args++;
170 if (!*args || mask_in_addr(rt)) 150 if (!*args || mask_in_addr(rt))
171 show_usage(); 151 show_usage();
172 safe_strncpy(netmask, *args, (sizeof netmask)); 152 netmask = *args;
173 if ((isnet = INET_resolve(netmask, &mask)) < 0) { 153 if ((isnet = INET_resolve(netmask, (struct sockaddr_in *)&mask, 0)) < 0) {
174 error_msg(_("can't resolve netmask %s"), netmask); 154 error_msg(_("can't resolve netmask %s"), netmask);
175 return E_LOOKUP; 155 return E_LOOKUP;
176 } 156 }
@@ -186,7 +166,7 @@ INET_setroute(int action, int options, char **args)
186 if (rt.rt_flags & RTF_GATEWAY) 166 if (rt.rt_flags & RTF_GATEWAY)
187 show_usage(); 167 show_usage();
188 safe_strncpy(gateway, *args, (sizeof gateway)); 168 safe_strncpy(gateway, *args, (sizeof gateway));
189 if ((isnet = INET_resolve(gateway, &rt.rt_gateway)) < 0) { 169 if ((isnet = INET_resolve(gateway, (struct sockaddr_in *)&rt.rt_gateway, 1)) < 0) {
190 error_msg(_("can't resolve gw %s"), gateway); 170 error_msg(_("can't resolve gw %s"), gateway);
191 return E_LOOKUP; 171 return E_LOOKUP;
192 } 172 }
@@ -362,7 +342,7 @@ INET_setroute(int action, int options, char **args)
362#define RTF_REJECT 0x0200 /* Reject route */ 342#define RTF_REJECT 0x0200 /* Reject route */
363#endif 343#endif
364 344
365static void displayroutes(void) 345static void displayroutes(int noresolve)
366{ 346{
367 char buff[256]; 347 char buff[256];
368 int nl = 0 ; 348 int nl = 0 ;
@@ -375,12 +355,17 @@ static void displayroutes(void)
375 355
376 char sdest[16], sgw[16]; 356 char sdest[16], sgw[16];
377 357
378
379 FILE *fp = xfopen("/proc/net/route", "r"); 358 FILE *fp = xfopen("/proc/net/route", "r");
380 359
360 if(noresolve)
361 noresolve = 0x0fff;
362
381 while( fgets(buff, sizeof(buff), fp) != NULL ) { 363 while( fgets(buff, sizeof(buff), fp) != NULL ) {
382 if(nl) { 364 if(nl) {
383 int ifl = 0; 365 int ifl = 0;
366 int numeric;
367 struct sockaddr_in s_addr;
368
384 while(buff[ifl]!=' ' && buff[ifl]!='\t' && buff[ifl]!='\0') 369 while(buff[ifl]!=' ' && buff[ifl]!='\t' && buff[ifl]!='\0')
385 ifl++; 370 ifl++;
386 buff[ifl]=0; /* interface */ 371 buff[ifl]=0; /* interface */
@@ -412,10 +397,14 @@ static void displayroutes(void)
412 dest.s_addr = d; 397 dest.s_addr = d;
413 gw.s_addr = g; 398 gw.s_addr = g;
414 mask.s_addr = m; 399 mask.s_addr = m;
415 strcpy(sdest, (dest.s_addr==0 ? "default" : 400 memset(&s_addr, 0, sizeof(struct sockaddr_in));
416 inet_ntoa(dest))); 401 s_addr.sin_family = AF_INET;
417 strcpy(sgw, (gw.s_addr==0 ? "*" : 402 s_addr.sin_addr = dest;
418 inet_ntoa(gw))); 403 numeric = noresolve | 0x8000; /* default instead of * */
404 INET_rresolve(sdest, sizeof(sdest), &s_addr, numeric, m);
405 numeric = noresolve | 0x4000; /* host instead of net */
406 s_addr.sin_addr = gw;
407 INET_rresolve(sgw, sizeof(sgw), &s_addr, numeric, m);
419 printf("%-16s%-16s%-16s%-6s%-6d %-2d %7d %s\n", 408 printf("%-16s%-16s%-16s%-6s%-6d %-2d %7d %s\n",
420 sdest, sgw, 409 sdest, sgw,
421 inet_ntoa(mask), 410 inet_ntoa(mask),
@@ -433,8 +422,8 @@ int route_main(int argc, char **argv)
433 argc--; 422 argc--;
434 argv++; 423 argv++;
435 424
436 if (*argv == NULL) { 425 if (*argv == NULL || (*(argv+1)==NULL && strcmp(*argv, "-n")==0)) {
437 displayroutes(); 426 displayroutes(*argv != NULL);
438 return EXIT_SUCCESS; 427 return EXIT_SUCCESS;
439 } else { 428 } else {
440 /* check verb */ 429 /* check verb */