diff options
author | Eric Andersen <andersen@codepoet.org> | 2001-11-10 14:22:46 +0300 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2001-11-10 14:22:46 +0300 |
commit | cd8c436d811a5a077a0b61a6616c900173e2dcfb (patch) | |
tree | 94163bfef63fec4c2638d5f56be310b7176464d7 /libbb | |
parent | 94f19a838518293810a0fc0c4dca926ca8caff57 (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')
-rw-r--r-- | libbb/Makefile | 4 | ||||
-rw-r--r-- | libbb/interface.c | 197 |
2 files changed, 8 insertions, 193 deletions
diff --git a/libbb/Makefile b/libbb/Makefile index f4f2d857f..ef8fef4b7 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 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) { |