/*
+ * stolen from net-tools-1.59 and stripped down for busybox by
+ * Erik Andersen <andersee@debian.org>
+ *
+ * Heavily modified by Manuel Novoa III Mar 12, 2001
+ *
+ * Pruned unused code using KEEP_UNUSED define.
+ * Added print_bytes_scaled function to reduce code size.
+ * Added some (potentially) missing defines.
+ * Improved display support for -a and for a named interface.
+ *
+ * -----------------------------------------------------------
+ *
* ifconfig This file contains an implementation of the command
* that either displays or sets the characteristics of
* one or more of the system's networking interfaces.
*
- * Version: $Id: interface.c,v 1.1 2001/04/19 16:55:27 andersen Exp $
+ * Version: $Id: interface.c,v 1.7 2001/11/10 11:22:46 andersen Exp $
*
* Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
* and others. Copyright 1993 MicroWalt Corporation
* 10/1998 - Andi Kleen. Use interface list primitives.
* 20001008 - Bernd Eckenfels, Patch from RH for setting mtu
* (default AF was wrong)
- * stolen from net-tools-1.59 and stripped down for busybox by
- * Erik Andersen <andersee@debian.org>
- */
-
-/*
- * Heavily modified by Manuel Novoa III Mar 12, 2001
- *
- * Pruned unused code using KEEP_UNUSED define.
- * Added print_bytes_scaled function to reduce code size.
- * Added some (potentially) missing defines.
- * Improved display support for -a and for a named interface.
*/
/* #define KEEP_UNUSED */
-#include "libbb.h"
-
/*
*
* Protocol Families.
#undef HAVE_AFNETROM
#undef HAVE_AFX25
#undef HAVE_AFECONET
+#undef HAVE_AFASH
/*
*
#undef HAVE_HWSLIP
-#include <features.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
-#include <netinet/in.h>
-#include <net/if.h>
-#include <net/if_arp.h>
+#include "inet_common.h"
#include <stdio.h>
#include <errno.h>
-#include <fcntl.h>
-#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <net/if_arp.h>
+#include "libbb.h"
#define _(x) x
#define _PATH_PROCNET_DEV "/proc/net/dev"
#define new(p) ((p) = xcalloc(1,sizeof(*(p))))
-#define KRELEASE(maj,min,patch) ((maj) * 10000 + (min)*1000 + (patch))
+#define KRELEASE(maj,min,patch) ((maj) * 65536 + (min)*256 + (patch))
static int procnetdev_vsn = 1;
-
/* Ugh. But libc5 doesn't provide POSIX types. */
#include <asm/types.h>
#include "ipx.h"
#endif
#endif
-#if 0
-#include "net-support.h"
-#include "pathnames.h"
-#include "version.h"
-#include "../intl.h"
-#include "interface.h"
-#include "sockets.h"
-#include "util.h"
-#endif
/* Defines for glibc2.0 users. */
#ifndef SIOCSIFTXQLEN
#ifdef KEEP_UNUSED
static int flag_unx;
+#ifdef HAVE_AFIPX
static int flag_ipx;
+#endif
+#ifdef HAVE_AFX25
static int flag_ax25;
+#endif
+#ifdef HAVE_AFATALK
static int flag_ddp;
+#endif
+#ifdef HAVE_AFNETROM
static int flag_netrom;
+#endif
static int flag_inet;
+#ifdef HAVE_AFINET6
static int flag_inet6;
+#endif
+#ifdef HAVE_AFECONET
static int flag_econet;
+#endif
+#ifdef HAVE_AFX25
static int flag_x25 = 0;
+#endif
+#ifdef HAVE_AFASH
static int flag_ash;
+#endif
static struct aftrans_t {
int *flag;
} aftrans[] = {
+#ifdef HAVE_AFX25
{
"ax25", "ax25", &flag_ax25
},
+#endif
{
"ip", "inet", &flag_inet
},
+#ifdef HAVE_AFINET6
{
"ip6", "inet6", &flag_inet6
},
+#endif
+#ifdef HAVE_AFIPX
{
"ipx", "ipx", &flag_ipx
},
+#endif
+#ifdef HAVE_AFATALK
{
"appletalk", "ddp", &flag_ddp
},
+#endif
+#ifdef HAVE_AFNETROM
{
"netrom", "netrom", &flag_netrom
},
+#endif
{
"inet", "inet", &flag_inet
},
+#ifdef HAVE_AFINET6
{
"inet6", "inet6", &flag_inet6
},
+#endif
+#ifdef HAVE_AFATALK
{
"ddp", "ddp", &flag_ddp
},
+#endif
{
"unix", "unix", &flag_unx
},
{
"tcpip", "inet", &flag_inet
},
+#ifdef HAVE_AFECONET
{
"econet", "ec", &flag_econet
},
+#endif
+#ifdef HAVE_AFX25
{
"x25", "x25", &flag_x25
},
+#endif
+#ifdef HAVE_AFASH
{
"ash", "ash", &flag_ash
},
+#endif
{
0, 0, 0
}
#if HAVE_AFINET
-#if 0
-extern int h_errno; /* some netdb.h versions don't export this */
-#endif
-
-/* cache */
-struct addr {
- struct sockaddr_in addr;
- char *name;
- int host;
- struct addr *next;
-};
-
-static struct addr *INET_nn = NULL; /* addr-to-name cache */
-
-#ifdef KEEP_UNUSED
-static int INET_resolve(char *name, struct sockaddr_in *sin, int hostfirst)
-{
- struct hostent *hp;
- struct netent *np;
-
- /* Grmpf. -FvK */
- sin->sin_family = AF_INET;
- sin->sin_port = 0;
-
- /* Default is special, meaning 0.0.0.0. */
- if (!strcmp(name, "default")) {
- sin->sin_addr.s_addr = INADDR_ANY;
- return (1);
- }
- /* Look to see if it's a dotted quad. */
- if (inet_aton(name, &sin->sin_addr)) {
- return 0;
- }
- /* If we expect this to be a hostname, try hostname database first */
-#ifdef DEBUG
- if (hostfirst) fprintf (stderr, "gethostbyname (%s)\n", name);
-#endif
- if (hostfirst &&
- (hp = gethostbyname(name)) != (struct hostent *) NULL) {
- memcpy((char *) &sin->sin_addr, (char *) hp->h_addr_list[0],
- sizeof(struct in_addr));
- return 0;
- }
- /* Try the NETWORKS database to see if this is a known network. */
-#ifdef DEBUG
- fprintf (stderr, "getnetbyname (%s)\n", name);
-#endif
- if ((np = getnetbyname(name)) != (struct netent *) NULL) {
- sin->sin_addr.s_addr = htonl(np->n_net);
- return 1;
- }
- if (hostfirst) {
- /* Don't try again */
- errno = h_errno;
- return -1;
- }
-#ifdef DEBUG
- res_init();
- _res.options |= RES_DEBUG;
-#endif
-
-#ifdef DEBUG
- fprintf (stderr, "gethostbyname (%s)\n", name);
-#endif
- if ((hp = gethostbyname(name)) == (struct hostent *) NULL) {
- errno = h_errno;
- return -1;
- }
- memcpy((char *) &sin->sin_addr, (char *) hp->h_addr_list[0],
- sizeof(struct in_addr));
-
- return 0;
-}
-#endif /* KEEP_UNUSED */
-
-/* numeric: & 0x8000: default instead of *,
- * & 0x4000: host instead of net,
- * & 0x0fff: don't resolve
- */
-static int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
- int numeric, unsigned int netmask)
-{
- struct hostent *ent;
- struct netent *np;
- struct addr *pn;
- unsigned long ad, host_ad;
- int host = 0;
-
- /* Grmpf. -FvK */
- if (s_in->sin_family != AF_INET) {
-#ifdef DEBUG
- fprintf(stderr, _("rresolve: unsupport address family %d !\n"), s_in->sin_family);
-#endif
- errno = EAFNOSUPPORT;
- return (-1);
- }
- ad = (unsigned long) s_in->sin_addr.s_addr;
-#ifdef DEBUG
- fprintf (stderr, "rresolve: %08lx, mask %08x, num %08x \n", ad, netmask, numeric);
-#endif
- if (ad == INADDR_ANY) {
- if ((numeric & 0x0FFF) == 0) {
- if (numeric & 0x8000)
- safe_strncpy(name, "default", len);
- else
- safe_strncpy(name, "*", len);
- return (0);
- }
- }
- if (numeric & 0x0FFF) {
- safe_strncpy(name, inet_ntoa(s_in->sin_addr), len);
- return (0);
- }
-
- if ((ad & (~netmask)) != 0 || (numeric & 0x4000))
- host = 1;
-#if 0
- INET_nn = NULL;
-#endif
- pn = INET_nn;
- while (pn != NULL) {
- if (pn->addr.sin_addr.s_addr == ad && pn->host == host) {
- safe_strncpy(name, pn->name, len);
-#ifdef DEBUG
- fprintf (stderr, "rresolve: found %s %08lx in cache\n", (host? "host": "net"), ad);
-#endif
- return (0);
- }
- pn = pn->next;
- }
-
- host_ad = ntohl(ad);
- np = NULL;
- ent = NULL;
- if (host) {
-#ifdef DEBUG
- fprintf (stderr, "gethostbyaddr (%08lx)\n", ad);
-#endif
- ent = gethostbyaddr((char *) &ad, 4, AF_INET);
- if (ent != NULL)
- safe_strncpy(name, ent->h_name, len);
- } else {
-#ifdef DEBUG
- fprintf (stderr, "getnetbyaddr (%08lx)\n", host_ad);
-#endif
- np = getnetbyaddr(host_ad, AF_INET);
- if (np != NULL)
- safe_strncpy(name, np->n_name, len);
- }
- if ((ent == NULL) && (np == NULL))
- safe_strncpy(name, inet_ntoa(s_in->sin_addr), len);
- pn = (struct addr *) xmalloc(sizeof(struct addr));
- pn->addr = *s_in;
- pn->next = INET_nn;
- pn->host = host;
- pn->name = (char *) xmalloc(strlen(name) + 1);
- strcpy(pn->name, name);
- INET_nn = pn;
-
- return (0);
-}
-
#ifdef KEEP_UNUSED
static void INET_reserror(char *text)
{
while (tmp1) {
- tmp2 = index(tmp1, ',');
+ tmp2 = strchr(tmp1, ',');
if (tmp2)
*(tmp2++) = '\0';
return (*afp);
afp++;
}
- if (index(name, ','))
+ if (strchr(name, ','))
fprintf(stderr, _("Please don't supply more than one address family.\n"));
return (NULL);
}
struct ifconf ifc;
struct ifreq *ifr;
int n, err = -1;
- /* XXX Should this re-use the global skfd? */
int skfd2;
/* SIOCGIFCONF currently seems to only work properly on AF_INET sockets
printf(_("Interrupt:%d "), ptr->map.irq);
if (ptr->map.base_addr >= 0x100) /* Only print devices using it for
I/O maps */
- printf(_("Base address:0x%x "), ptr->map.base_addr);
+ printf(_("Base address:0x%lx "), (unsigned long)ptr->map.base_addr);
if (ptr->map.mem_start) {
printf(_("Memory:%lx-%lx "), ptr->map.mem_start, ptr->map.mem_end);
}