* support functions for the net-tools.
* (NET-3 base distribution).
*
- * Version: $Id: inet.c,v 1.8 1999/01/05 20:53:33 philip Exp $
+ * Version: $Id: inet.c,v 1.9 1999/03/02 21:09:14 philip Exp $
*
* Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
* Copyright 1993 MicroWalt Corporation
*960219 {1.25} Bernd Eckenfels : extern int h_errno
*960329 {1.26} Bernd Eckenfels : resolve 255.255.255.255
*980101 {1.27} Bernd Eckenfels : resolve raw sockets in /etc/protocols
+ *990302 {1.28} Phil Blundell : add netmask to INET_rresolve
*
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
}
-static int INET_rresolve(char *name, struct sockaddr_in *sin, int numeric)
+static int INET_rresolve(char *name, struct sockaddr_in *sin, int numeric,
+ unsigned int netmask)
{
struct hostent *ent;
struct netent *np;
host_ad = ntohl(ad);
np = NULL;
ent = NULL;
- if ((host_ad & 0xFF) != 0) {
+ if ((ad & (~ netmask)) != 0) {
ent = gethostbyaddr((char *) &ad, 4, AF_INET);
if (ent != NULL)
strcpy(name, ent->h_name);
if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
return safe_strncpy(buff, _("[NONE SET]"), sizeof(buff));
- if (INET_rresolve(buff, (struct sockaddr_in *) sap, numeric) != 0)
+ if (INET_rresolve(buff, (struct sockaddr_in *) sap, numeric,
+ 0xffffff00) != 0)
+ return (NULL);
+ return (buff);
+}
+
+char *INET_sprintmask(struct sockaddr *sap, int numeric,
+ unsigned int netmask)
+{
+ static char buff[128];
+
+ if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
+ return safe_strncpy(buff, _("[NONE SET]"), sizeof(buff));
+ if (INET_rresolve(buff, (struct sockaddr_in *) sap, numeric,
+ netmask) != 0)
return (NULL);
return (buff);
}
/*
- $Id: inet_gr.c,v 1.10 1999/01/05 20:53:43 philip Exp $
+ $Id: inet_gr.c,v 1.11 1999/03/02 21:09:15 philip Exp $
Modifications:
1998-07-01 - Arnaldo Carvalho de Melo - GNU gettext instead of catgets
#include "proc.h"
extern struct aftype inet_aftype;
+extern char *INET_sprintmask(struct sockaddr *sap, int numeric,
+ unsigned int netmask);
int rprint_fib(int ext, int numeric)
{
char buff[1024], iface[16], flags[64];
char gate_addr[128], net_addr[128];
char mask_addr[128];
- struct sockaddr snet;
int num, iflags, metric, refcnt, use, mss, window, irtt;
FILE *fp = fopen(_PATH_PROCNET_ROUTE, "r");
char *fmt;
return 1;
while (fgets(buff, 1023, fp)) {
+ struct sockaddr snet_target, snet_gateway, snet_mask;
+ struct sockaddr_in *sin_netmask;
+
num = sscanf(buff, fmt,
iface, net_addr, gate_addr,
&iflags, &refcnt, &use, &metric, mask_addr,
continue;
/* Fetch and resolve the target address. */
- (void) inet_aftype.input(1, net_addr, &snet);
- strcpy(net_addr, inet_aftype.sprint(&snet, (numeric | 0x8000)));
- net_addr[15] = '\0';
+ (void) inet_aftype.input(1, net_addr, &snet_target);
/* Fetch and resolve the gateway address. */
- (void) inet_aftype.input(1, gate_addr, &snet);
- strcpy(gate_addr, inet_aftype.sprint(&snet, numeric));
- gate_addr[15] = '\0';
+ (void) inet_aftype.input(1, gate_addr, &snet_gateway);
/* Fetch and resolve the genmask. */
- (void) inet_aftype.input(1, mask_addr, &snet);
- strcpy(mask_addr, inet_aftype.sprint(&snet, 1));
+ (void) inet_aftype.input(1, mask_addr, &snet_mask);
+
+ sin_netmask = (struct sockaddr_in *)&snet_mask;
+ strcpy(net_addr, INET_sprintmask(&snet_target,
+ (numeric | 0x8000),
+ sin_netmask->sin_addr.s_addr));
+ net_addr[15] = '\0';
+
+ strcpy(gate_addr, inet_aftype.sprint(&snet_gateway, numeric));
+ gate_addr[15] = '\0';
+
+ strcpy(mask_addr, inet_aftype.sprint(&snet_mask, 1));
mask_addr[15] = '\0';
/* Decode the flags. */