aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2001-11-10 11:22:46 +0000
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2001-11-10 11:22:46 +0000
commit6513e85b61ee36cc5e699122f0edfbe60d0be104 (patch)
tree94163bfef63fec4c2638d5f56be310b7176464d7 /libbb
parent5bf1e9412b3bc8281e5c8cb2a02c5e5b5736c422 (diff)
downloadbusybox-w32-6513e85b61ee36cc5e699122f0edfbe60d0be104.tar.gz
busybox-w32-6513e85b61ee36cc5e699122f0edfbe60d0be104.tar.bz2
busybox-w32-6513e85b61ee36cc5e699122f0edfbe60d0be104.zip
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 git-svn-id: svn://busybox.net/trunk/busybox@3645 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'libbb')
-rw-r--r--libbb/Makefile4
-rw-r--r--libbb/interface.c197
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 \
45 xgetcwd.o xreadlink.o xregcomp.o interface.o remove_file.o last_char_is.o \ 45 xgetcwd.o xreadlink.o xregcomp.o interface.o remove_file.o last_char_is.o \
46 copyfd.o vherror_msg.o herror_msg.o herror_msg_and_die.o xgethostbyname.o \ 46 copyfd.o vherror_msg.o herror_msg.o herror_msg_and_die.o xgethostbyname.o \
47 dirname.o make_directory.o create_icmp_socket.o u_signal_names.o arith.o \ 47 dirname.o make_directory.o create_icmp_socket.o u_signal_names.o arith.o \
48 simplify_path.o $(LIBBB_MOBJS) $(LIBBB_AROBJS) 48 simplify_path.o inet_common.o $(LIBBB_MOBJS) $(LIBBB_AROBJS)
49 49
50 50
51# Hand off to toplevel Rules.mak 51# Hand off to toplevel Rules.mak
@@ -65,5 +65,3 @@ loop.h: mk_loop_h.sh
65 65
66clean: 66clean:
67 rm -f $(L_TARGET) *.o core 67 rm -f $(L_TARGET) *.o core
68
69
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 @@
15 * that either displays or sets the characteristics of 15 * that either displays or sets the characteristics of
16 * one or more of the system's networking interfaces. 16 * one or more of the system's networking interfaces.
17 * 17 *
18 * Version: $Id: interface.c,v 1.6 2001/10/27 03:28:19 andersen Exp $ 18 * Version: $Id: interface.c,v 1.7 2001/11/10 11:22:46 andersen Exp $
19 * 19 *
20 * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> 20 * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
21 * and others. Copyright 1993 MicroWalt Corporation 21 * and others. Copyright 1993 MicroWalt Corporation
@@ -62,26 +62,17 @@
62#undef HAVE_HWSLIP 62#undef HAVE_HWSLIP
63 63
64 64
65#include <features.h> 65#include "inet_common.h"
66#include <sys/types.h>
67#include <sys/socket.h>
68#include <sys/ioctl.h>
69#include <netinet/in.h>
70#include <net/if.h>
71#include <net/if_arp.h>
72#include <stdio.h> 66#include <stdio.h>
73#include <errno.h> 67#include <errno.h>
74#include <fcntl.h>
75#include <ctype.h>
76#include <stdlib.h> 68#include <stdlib.h>
77#include <string.h> 69#include <string.h>
78#include <unistd.h> 70#include <unistd.h>
79#include <netdb.h> 71#include <fcntl.h>
80#include <netinet/in.h> 72#include <ctype.h>
81#include <arpa/inet.h> 73#include <sys/ioctl.h>
82#if 0 74#include <net/if.h>
83#include <arpa/nameser.h> 75#include <net/if_arp.h>
84#endif
85#include "libbb.h" 76#include "libbb.h"
86 77
87#define _(x) x 78#define _(x) x
@@ -91,7 +82,6 @@
91 82
92static int procnetdev_vsn = 1; 83static int procnetdev_vsn = 1;
93 84
94
95/* Ugh. But libc5 doesn't provide POSIX types. */ 85/* Ugh. But libc5 doesn't provide POSIX types. */
96#include <asm/types.h> 86#include <asm/types.h>
97 87
@@ -124,15 +114,6 @@ struct in6_ifreq {
124#include "ipx.h" 114#include "ipx.h"
125#endif 115#endif
126#endif 116#endif
127#if 0
128#include "net-support.h"
129#include "pathnames.h"
130#include "version.h"
131#include "../intl.h"
132#include "interface.h"
133#include "sockets.h"
134#include "util.h"
135#endif
136 117
137/* Defines for glibc2.0 users. */ 118/* Defines for glibc2.0 users. */
138#ifndef SIOCSIFTXQLEN 119#ifndef SIOCSIFTXQLEN
@@ -313,170 +294,6 @@ static struct aftype unix_aftype =
313 294
314#if HAVE_AFINET 295#if HAVE_AFINET
315 296
316#if 0
317extern int h_errno; /* some netdb.h versions don't export this */
318#endif
319
320/* cache */
321struct addr {
322 struct sockaddr_in addr;
323 char *name;
324 int host;
325 struct addr *next;
326};
327
328static struct addr *INET_nn = NULL; /* addr-to-name cache */
329
330#ifdef KEEP_UNUSED
331static int INET_resolve(char *name, struct sockaddr_in *sin, int hostfirst)
332{
333 struct hostent *hp;
334 struct netent *np;
335
336 /* Grmpf. -FvK */
337 sin->sin_family = AF_INET;
338 sin->sin_port = 0;
339
340 /* Default is special, meaning 0.0.0.0. */
341 if (!strcmp(name, "default")) {
342 sin->sin_addr.s_addr = INADDR_ANY;
343 return (1);
344 }
345 /* Look to see if it's a dotted quad. */
346 if (inet_aton(name, &sin->sin_addr)) {
347 return 0;
348 }
349 /* If we expect this to be a hostname, try hostname database first */
350#ifdef DEBUG
351 if (hostfirst) fprintf (stderr, "gethostbyname (%s)\n", name);
352#endif
353 if (hostfirst &&
354 (hp = gethostbyname(name)) != (struct hostent *) NULL) {
355 memcpy((char *) &sin->sin_addr, (char *) hp->h_addr_list[0],
356 sizeof(struct in_addr));
357 return 0;
358 }
359 /* Try the NETWORKS database to see if this is a known network. */
360#ifdef DEBUG
361 fprintf (stderr, "getnetbyname (%s)\n", name);
362#endif
363 if ((np = getnetbyname(name)) != (struct netent *) NULL) {
364 sin->sin_addr.s_addr = htonl(np->n_net);
365 return 1;
366 }
367 if (hostfirst) {
368 /* Don't try again */
369 errno = h_errno;
370 return -1;
371 }
372#ifdef DEBUG
373 res_init();
374 _res.options |= RES_DEBUG;
375#endif
376
377#ifdef DEBUG
378 fprintf (stderr, "gethostbyname (%s)\n", name);
379#endif
380 if ((hp = gethostbyname(name)) == (struct hostent *) NULL) {
381 errno = h_errno;
382 return -1;
383 }
384 memcpy((char *) &sin->sin_addr, (char *) hp->h_addr_list[0],
385 sizeof(struct in_addr));
386
387 return 0;
388}
389#endif /* KEEP_UNUSED */
390
391/* numeric: & 0x8000: default instead of *,
392 * & 0x4000: host instead of net,
393 * & 0x0fff: don't resolve
394 */
395static int INET_rresolve(char *name, size_t len, struct sockaddr_in *s_in,
396 int numeric, unsigned int netmask)
397{
398 struct hostent *ent;
399 struct netent *np;
400 struct addr *pn;
401 unsigned long ad, host_ad;
402 int host = 0;
403
404 /* Grmpf. -FvK */
405 if (s_in->sin_family != AF_INET) {
406#ifdef DEBUG
407 fprintf(stderr, _("rresolve: unsupport address family %d !\n"), s_in->sin_family);
408#endif
409 errno = EAFNOSUPPORT;
410 return (-1);
411 }
412 ad = (unsigned long) s_in->sin_addr.s_addr;
413#ifdef DEBUG
414 fprintf (stderr, "rresolve: %08lx, mask %08x, num %08x \n", ad, netmask, numeric);
415#endif
416 if (ad == INADDR_ANY) {
417 if ((numeric & 0x0FFF) == 0) {
418 if (numeric & 0x8000)
419 safe_strncpy(name, "default", len);
420 else
421 safe_strncpy(name, "*", len);
422 return (0);
423 }
424 }
425 if (numeric & 0x0FFF) {
426 safe_strncpy(name, inet_ntoa(s_in->sin_addr), len);
427 return (0);
428 }
429
430 if ((ad & (~netmask)) != 0 || (numeric & 0x4000))
431 host = 1;
432#if 0
433 INET_nn = NULL;
434#endif
435 pn = INET_nn;
436 while (pn != NULL) {
437 if (pn->addr.sin_addr.s_addr == ad && pn->host == host) {
438 safe_strncpy(name, pn->name, len);
439#ifdef DEBUG
440 fprintf (stderr, "rresolve: found %s %08lx in cache\n", (host? "host": "net"), ad);
441#endif
442 return (0);
443 }
444 pn = pn->next;
445 }
446
447 host_ad = ntohl(ad);
448 np = NULL;
449 ent = NULL;
450 if (host) {
451#ifdef DEBUG
452 fprintf (stderr, "gethostbyaddr (%08lx)\n", ad);
453#endif
454 ent = gethostbyaddr((char *) &ad, 4, AF_INET);
455 if (ent != NULL)
456 safe_strncpy(name, ent->h_name, len);
457 } else {
458#ifdef DEBUG
459 fprintf (stderr, "getnetbyaddr (%08lx)\n", host_ad);
460#endif
461#if 0
462 np = getnetbyaddr(host_ad, AF_INET);
463 if (np != NULL)
464 safe_strncpy(name, np->n_name, len);
465#endif
466 }
467 if ((ent == NULL) && (np == NULL))
468 safe_strncpy(name, inet_ntoa(s_in->sin_addr), len);
469 pn = (struct addr *) xmalloc(sizeof(struct addr));
470 pn->addr = *s_in;
471 pn->next = INET_nn;
472 pn->host = host;
473 pn->name = (char *) xmalloc(strlen(name) + 1);
474 strcpy(pn->name, name);
475 INET_nn = pn;
476
477 return (0);
478}
479
480#ifdef KEEP_UNUSED 297#ifdef KEEP_UNUSED
481static void INET_reserror(char *text) 298static void INET_reserror(char *text)
482{ 299{