* Foundation; either version 2 of the License, or (at
* your option) any later version.
*
- * $Id: route.c,v 1.3 2001/02/14 21:23:06 andersen Exp $
+ * $Id: route.c,v 1.8 2001/03/07 06:33:01 andersen Exp $
*
* displayroute() code added by Vladimir N. Oleynik <dzo@simtreas.ru>
+ * adjustments by Larry Doolittle <LRDoolittle@lbl.gov>
*/
-#include "busybox.h"
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <getopt.h>
#include <unistd.h>
#include <ctype.h>
+#include "busybox.h"
#define _(x) x
sin->sin_port = 0;
/* Default is special, meaning 0.0.0.0. */
- if (!strcmp(name, "default")) {
+ if (strcmp(name, "default")==0) {
sin->sin_addr.s_addr = INADDR_ANY;
- return (1);
+ return 1;
}
/* Look to see if it's a dotted quad. */
if (inet_aton(name, &sin->sin_addr)) {
xflag = 0;
- if (!strcmp(*args, "-net")) {
+ if (strcmp(*args, "-net")==0) {
xflag = 1;
args++;
- } else if (!strcmp(*args, "-host")) {
+ } else if (strcmp(*args, "-host")==0) {
xflag = 2;
args++;
}
if ((isnet = INET_resolve(target, &rt.rt_dst)) < 0) {
- fprintf(stderr, "cant resolve %s\n", target);
- return (1);
+ error_msg(_("can't resolve %s"), target);
+ return EXIT_FAILURE; /* XXX change to E_something */
}
switch (xflag) {
rt.rt_flags &= ~RTF_HOST;
while (*args) {
- if (!strcmp(*args, "metric")) {
+ if (strcmp(*args, "metric")==0) {
int metric;
args++;
#if HAVE_NEW_ADDRT
rt.rt_metric = metric + 1;
#else
- ENOSUPP("inet_setroute", "NEW_ADDRT (metric)");
+ ENOSUPP("inet_setroute", "NEW_ADDRT (metric)"); /* XXX Fixme */
#endif
args++;
continue;
}
- if (!strcmp(*args, "netmask")) {
+ if (strcmp(*args, "netmask")==0) {
struct sockaddr mask;
args++;
show_usage();
safe_strncpy(netmask, *args, (sizeof netmask));
if ((isnet = INET_resolve(netmask, &mask)) < 0) {
- fprintf(stderr, "cant resolve netmask %s\n", netmask);
- return (E_LOOKUP);
+ error_msg(_("can't resolve netmask %s"), netmask);
+ return E_LOOKUP;
}
rt.rt_genmask = full_mask(mask);
args++;
continue;
}
- if (!strcmp(*args, "gw") || !strcmp(*args, "gateway")) {
+ if (strcmp(*args, "gw")==0 || strcmp(*args, "gateway")==0) {
args++;
if (!*args)
show_usage();
show_usage();
safe_strncpy(gateway, *args, (sizeof gateway));
if ((isnet = INET_resolve(gateway, &rt.rt_gateway)) < 0) {
- fprintf(stderr, "cant resolve gw %s\n", gateway);
- return (E_LOOKUP);
+ error_msg(_("can't resolve gw %s"), gateway);
+ return E_LOOKUP;
}
if (isnet) {
- fprintf(stderr,
- _("route: %s: cannot use a NETWORK as gateway!\n"),
+ error_msg(
+ _("%s: cannot use a NETWORK as gateway!"),
gateway);
- return (E_OPTERR);
+ return E_OPTERR;
}
rt.rt_flags |= RTF_GATEWAY;
args++;
continue;
}
- if (!strcmp(*args, "mss")) {
+ if (strcmp(*args, "mss")==0) {
args++;
rt.rt_flags |= RTF_MSS;
if (!*args)
rt.rt_mss = atoi(*args);
args++;
if (rt.rt_mss < 64 || rt.rt_mss > 32768) {
- fprintf(stderr, _("route: Invalid MSS.\n"));
- return (E_OPTERR);
+ error_msg(_("Invalid MSS."));
+ return E_OPTERR;
}
continue;
}
- if (!strcmp(*args, "window")) {
+ if (strcmp(*args, "window")==0) {
args++;
if (!*args)
show_usage();
rt.rt_window = atoi(*args);
args++;
if (rt.rt_window < 128) {
- fprintf(stderr, _("route: Invalid window.\n"));
- return (E_OPTERR);
+ error_msg(_("Invalid window."));
+ return E_OPTERR;
}
continue;
}
- if (!strcmp(*args, "irtt")) {
+ if (strcmp(*args, "irtt")==0) {
args++;
if (!*args)
show_usage();
rt.rt_irtt *= (HZ / 100); /* FIXME */
#if 0 /* FIXME: do we need to check anything of this? */
if (rt.rt_irtt < 1 || rt.rt_irtt > (120 * HZ)) {
- fprintf(stderr, _("route: Invalid initial rtt.\n"));
- return (E_OPTERR);
+ error_msg(_("Invalid initial rtt."));
+ return E_OPTERR;
}
#endif
#else
- ENOSUPP("inet_setroute", "RTF_IRTT");
+ ENOSUPP("inet_setroute", "RTF_IRTT"); /* XXX Fixme */
#endif
continue;
}
- if (!strcmp(*args, "reject")) {
+ if (strcmp(*args, "reject")==0) {
args++;
#if HAVE_RTF_REJECT
rt.rt_flags |= RTF_REJECT;
#else
- ENOSUPP("inet_setroute", "RTF_REJECT");
+ ENOSUPP("inet_setroute", "RTF_REJECT"); /* XXX Fixme */
#endif
continue;
}
- if (!strcmp(*args, "mod")) {
+ if (strcmp(*args, "mod")==0) {
args++;
rt.rt_flags |= RTF_MODIFIED;
continue;
}
- if (!strcmp(*args, "dyn")) {
+ if (strcmp(*args, "dyn")==0) {
args++;
rt.rt_flags |= RTF_DYNAMIC;
continue;
}
- if (!strcmp(*args, "reinstate")) {
+ if (strcmp(*args, "reinstate")==0) {
args++;
rt.rt_flags |= RTF_REINSTATE;
continue;
}
- if (!strcmp(*args, "device") || !strcmp(*args, "dev")) {
+ if (strcmp(*args, "device")==0 || strcmp(*args, "dev")==0) {
args++;
if (rt.rt_dev || *args == NULL)
show_usage();
rt.rt_dev = *args++;
if (*args)
show_usage(); /* must be last to catch typos */
- } else
+ } else {
show_usage();
+ }
}
#if HAVE_RTF_REJECT
unsigned long mask = mask_in_addr(rt);
mask = ~ntohl(mask);
if ((rt.rt_flags & RTF_HOST) && mask != 0xffffffff) {
- fprintf(stderr,
- _("route: netmask %.8x doesn't make sense with host route\n"),
+ error_msg(
+ _("netmask %.8x doesn't make sense with host route"),
(unsigned int)mask);
- return (E_OPTERR);
+ return E_OPTERR;
}
if (mask & (mask + 1)) {
- fprintf(stderr, _("route: bogus netmask %s\n"), netmask);
- return (E_OPTERR);
+ error_msg(_("bogus netmask %s"), netmask);
+ return E_OPTERR;
}
mask = ((struct sockaddr_in *) &rt.rt_dst)->sin_addr.s_addr;
if (mask & ~mask_in_addr(rt)) {
- fprintf(stderr, _("route: netmask doesn't match route address\n"));
- return (E_OPTERR);
+ error_msg(_("netmask doesn't match route address"));
+ return E_OPTERR;
}
}
/* Fill out netmask if still unset */
/* Create a socket to the INET kernel. */
if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
- return (E_SOCK);
+ return E_SOCK;
}
/* Tell the kernel to accept this route. */
if (action == RTACTION_DEL) {
if (ioctl(skfd, SIOCDELRT, &rt) < 0) {
perror("SIOCDELRT");
close(skfd);
- return (E_SOCK);
+ return E_SOCK;
}
} else {
if (ioctl(skfd, SIOCADDRT, &rt) < 0) {
perror("SIOCADDRT");
close(skfd);
- return (E_SOCK);
+ return E_SOCK;
}
}
/* Close the socket. */
(void) close(skfd);
- return (0);
+ return EXIT_SUCCESS;
}
void displayroutes(void)
char sdest[16], sgw[16];
- FILE *fp = fopen("/proc/net/route", "r");
+ FILE *fp = xfopen("/proc/net/route", "r");
- if(fp==0) {
- perror_msg_and_die("/proc/net/route");
- }
while( fgets(buff, sizeof(buff), fp) != NULL ) {
if(nl) {
int ifl = 0;
&d, &g, &flgs, &ref, &use, &metric, &m)!=7) {
error_msg_and_die( "Unsuported kernel route format\n");
}
- dest.s_addr = d;
- gw.s_addr = g;
- mask.s_addr = m;
- if(nl==1)
- printf("Kernel IP routing table\n\
-Destination\tGateway\t\tGenmask\t\tFlags Metric Ref Use Iface\n");
+ if(nl==1) {
+ printf("Kernel IP routing table\n"
+"Destination Gateway Genmask Flags Metric Ref Use Iface\n");
+ }
+
ifl = 0; /* parse flags */
if(flgs&1)
if(flgs&4)
flags[ifl++]='H';
flags[ifl]=0;
+ dest.s_addr = d;
+ gw.s_addr = g;
+ mask.s_addr = m;
strcpy(sdest, (dest.s_addr==0 ? "default" :
inet_ntoa(dest)));
strcpy(sgw, (gw.s_addr==0 ? "*" :
inet_ntoa(gw)));
- printf("%-16s%-16s%-16s%-6s%-7d%-9d%-2d%s\n",
+ printf("%-16s%-16s%-16s%-6s%-6d %-2d %7d %s\n",
sdest, sgw,
inet_ntoa(mask),
flags, metric, ref, use, buff);
if (*argv == NULL) {
displayroutes();
- exit(EXIT_SUCCESS);
+ return EXIT_SUCCESS;
} else {
/* check verb */
- if (!strcmp(*argv, "add"))
+ if (strcmp(*argv, "add")==0)
what = RTACTION_ADD;
- else if (!strcmp(*argv, "del") || !strcmp(*argv, "delete"))
+ else if (strcmp(*argv, "del")==0 || strcmp(*argv, "delete")==0)
what = RTACTION_DEL;
- else if (!strcmp(*argv, "flush"))
+ else if (strcmp(*argv, "flush")==0)
what = RTACTION_FLUSH;
else
show_usage();
}
- INET_setroute(what, 0, ++argv);
-
- exit(EXIT_SUCCESS);
+ return INET_setroute(what, 0, ++argv);
}