summaryrefslogtreecommitdiffhomepage
path: root/libbb/interface.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 /libbb/interface.c
parent94f19a838518293810a0fc0c4dca926ca8caff57 (diff)
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 'libbb/interface.c')
-rw-r--r--libbb/interface.c197
1 files changed, 7 insertions, 190 deletions
diff --git a/libbb/interface.c b/libbb/interface.c
index 680216a57..9ecb81b9f 100644
--- a/libbb/interface.c
+++ b/libbb/interface.c
@@ -15,7 +15,7 @@
* that either displays or sets the characteristics of
* one or more of the system's networking interfaces.
*
- * Version: $Id: interface.c,v 1.6 2001/10/27 03:28:19 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
@@ -62,26 +62,17 @@
#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>
-#if 0
-#include <arpa/nameser.h>
-#endif
+#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
@@ -91,7 +82,6 @@
static int procnetdev_vsn = 1;
-
/* Ugh. But libc5 doesn't provide POSIX types. */
#include <asm/types.h>
@@ -124,15 +114,6 @@ struct in6_ifreq {
#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
@@ -313,170 +294,6 @@ static struct aftype unix_aftype =
#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
-#if 0
- np = getnetbyaddr(host_ad, AF_INET);
- if (np != NULL)
- safe_strncpy(name, np->n_name, len);
-#endif
- }
- 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)
{