From cd8c436d811a5a077a0b61a6616c900173e2dcfb Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Sat, 10 Nov 2001 11:22:46 +0000 Subject: 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 --- libbb/Makefile | 4 +- libbb/interface.c | 197 ++---------------------------------------------------- 2 files changed, 8 insertions(+), 193 deletions(-) (limited to 'libbb') diff --git a/libbb/Makefile b/libbb/Makefile index f4f2d85..ef8fef4 100644 --- a/libbb/Makefile +++ b/libbb/Makefile @@ -45,7 +45,7 @@ obj-y += ask_confirmation.o chomp.o concat_path_file.o copy_file.o \ xgetcwd.o xreadlink.o xregcomp.o interface.o remove_file.o last_char_is.o \ copyfd.o vherror_msg.o herror_msg.o herror_msg_and_die.o xgethostbyname.o \ dirname.o make_directory.o create_icmp_socket.o u_signal_names.o arith.o \ - simplify_path.o $(LIBBB_MOBJS) $(LIBBB_AROBJS) + simplify_path.o inet_common.o $(LIBBB_MOBJS) $(LIBBB_AROBJS) # Hand off to toplevel Rules.mak @@ -65,5 +65,3 @@ loop.h: mk_loop_h.sh clean: rm -f $(L_TARGET) *.o core - - diff --git a/libbb/interface.c b/libbb/interface.c index 680216a..9ecb81b 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, * and others. Copyright 1993 MicroWalt Corporation @@ -62,26 +62,17 @@ #undef HAVE_HWSLIP -#include -#include -#include -#include -#include -#include -#include +#include "inet_common.h" #include #include -#include -#include #include #include #include -#include -#include -#include -#if 0 -#include -#endif +#include +#include +#include +#include +#include #include "libbb.h" #define _(x) x @@ -91,7 +82,6 @@ static int procnetdev_vsn = 1; - /* Ugh. But libc5 doesn't provide POSIX types. */ #include @@ -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) { -- cgit v1.1