/* Display an Internet socket address. */
static const char *INET_sprint(struct sockaddr *sap, int numeric)
{
- static char buff[128];
+ static char *buff;
+ free(buff);
if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
return "[NONE SET]";
-
- if (INET_rresolve(buff, sizeof(buff), (struct sockaddr_in *) sap,
- numeric, 0xffffff00) != 0)
- return NULL;
-
+ buff = INET_rresolve((struct sockaddr_in *) sap, numeric, 0xffffff00);
return buff;
}
/* dirty! struct sockaddr usually doesn't suffer for inet6 addresses, fst. */
static const char *INET6_sprint(struct sockaddr *sap, int numeric)
{
- static char buff[128];
+ static char *buff;
+ free(buff);
if (sap->sa_family == 0xFFFF || sap->sa_family == 0)
return "[NONE SET]";
- if (INET6_rresolve(buff, sizeof(buff), (struct sockaddr_in6 *) sap, numeric))
- return "[UNKNOWN]";
+ buff = INET6_rresolve((struct sockaddr_in6 *) sap, numeric);
return buff;
}
/* Display an UNSPEC address. */
static char *UNSPEC_print(unsigned char *ptr)
{
- static char buff[sizeof(struct sockaddr) * 3 + 1];
+ static char *buff;
+
char *pos;
unsigned int i;
+ if (!buff);
+ buff = xmalloc(sizeof(struct sockaddr) * 3 + 1);
pos = buff;
for (i = 0; i < sizeof(struct sockaddr); i++) {
/* careful -- not every libc's sprintf returns # bytes written */
};
-int interface_opt_a; /* show all interfaces */
+smallint interface_opt_a; /* show all interfaces */
static struct interface *int_list, *int_last;
ifc.ifc_len = sizeof(struct ifreq) * numreqs;
ifc.ifc_buf = xrealloc(ifc.ifc_buf, ifc.ifc_len);
- if (ioctl(skfd, SIOCGIFCONF, &ifc) < 0) {
- perror("SIOCGIFCONF");
+ if (ioctl_or_warn(skfd, SIOCGIFCONF, &ifc) < 0) {
goto out;
}
if (ifc.ifc_len == sizeof(struct ifreq) * numreqs) {
static int if_readlist_proc(char *target)
{
- static int proc_read;
+ static smallint proc_read;
+
FILE *fh;
char buf[512];
struct interface *ife;
break;
}
if (ferror(fh)) {
- perror(_PATH_PROCNET_DEV);
+ bb_perror_msg(_PATH_PROCNET_DEV);
err = -1;
proc_read = 0;
}
return err;
}
-static int for_all_interfaces(int (*doit) (struct interface *, void *),
- void *cookie)
-{
- struct interface *ife;
-
- if (!int_list && (if_readlist() < 0))
- return -1;
- for (ife = int_list; ife; ife = ife->next) {
- int err = doit(ife, cookie);
-
- if (err)
- return err;
- }
- return 0;
-}
-
/* Fetch the interface configuration from the kernel. */
static int if_fetch(struct interface *ife)
{
/* Display an Ethernet address in readable format. */
static char *pr_ether(unsigned char *ptr)
{
- static char buff[64];
+ static char *buff;
- snprintf(buff, sizeof(buff), "%02X:%02X:%02X:%02X:%02X:%02X",
+ free(buff);
+ buff = xasprintf("%02X:%02X:%02X:%02X:%02X:%02X",
(ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),
(ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)
);
static int in_ether(const char *bufp, struct sockaddr *sap);
-static struct hwtype ether_hwtype = {
+static const struct hwtype ether_hwtype = {
.name = "ether",
.title = "Ethernet",
.type = ARPHRD_ETHER,
.type = ARPHRD_SIT,
.print = UNSPEC_print,
.suppress_null_addr = 1
-} ;
+};
#endif
static const struct hwtype *const hwtypes[] = {
return 1;
}
-static const char TRext[] = "\0\0\0Ki\0Mi\0Gi\0Ti";
+static const char TRext[] ALIGN1 = "\0\0\0Ki\0Mi\0Gi\0Ti";
static void print_bytes_scaled(unsigned long long ull, const char *end)
{
printf("X bytes:%llu (%llu.%u %sB)%s", ull, int_part, frac_part, ext, end);
}
-static const char *const ife_print_flags_strs[] = {
- "UP ",
- "BROADCAST ",
- "DEBUG ",
- "LOOPBACK ",
- "POINTOPOINT ",
- "NOTRAILERS ",
- "RUNNING ",
- "NOARP ",
- "PROMISC ",
- "ALLMULTI ",
- "SLAVE ",
- "MASTER ",
- "MULTICAST ",
-#ifdef HAVE_DYNAMIC
- "DYNAMIC "
-#endif
-};
-
-static const unsigned short ife_print_flags_mask[] = {
- IFF_UP,
- IFF_BROADCAST,
- IFF_DEBUG,
- IFF_LOOPBACK,
- IFF_POINTOPOINT,
- IFF_NOTRAILERS,
- IFF_RUNNING,
- IFF_NOARP,
- IFF_PROMISC,
- IFF_ALLMULTI,
- IFF_SLAVE,
- IFF_MASTER,
- IFF_MULTICAST,
-#ifdef HAVE_DYNAMIC
- IFF_DYNAMIC
-#endif
- 0
-};
-
static void ife_print(struct interface *ptr)
{
const struct aftype *ap;
printf("(auto)");
}
#endif
- puts("");
+ bb_putchar('\n');
if (ptr->has_ip) {
printf(" %s addr:%s ", ap->name,
f = fopen(_PATH_PROCNET_IFINET6, "r");
if (f != NULL) {
while (fscanf
- (f, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n",
+ (f, "%4s%4s%4s%4s%4s%4s%4s%4s %08x %02x %02x %02x %20s\n",
addr6p[0], addr6p[1], addr6p[2], addr6p[3], addr6p[4],
addr6p[5], addr6p[6], addr6p[7], &if_idx, &plen, &scope,
&dad_status, devname) != EOF
(struct sockaddr *) &sap.sin6_addr);
sap.sin6_family = AF_INET6;
printf(" inet6 addr: %s/%d",
- inet6_aftype.sprint((struct sockaddr *) &sap, 1),
+ INET6_sprint((struct sockaddr *) &sap, 1),
plen);
printf(" Scope:");
switch (scope & IPV6_ADDR_SCOPE_MASK) {
case 0:
- printf("Global");
+ puts("Global");
break;
case IPV6_ADDR_LINKLOCAL:
- printf("Link");
+ puts("Link");
break;
case IPV6_ADDR_SITELOCAL:
- printf("Site");
+ puts("Site");
break;
case IPV6_ADDR_COMPATv4:
- printf("Compat");
+ puts("Compat");
break;
case IPV6_ADDR_LOOPBACK:
- printf("Host");
+ puts("Host");
break;
default:
- printf("Unknown");
+ puts("Unknown");
}
- puts("");
}
}
fclose(f);
if (ptr->flags == 0) {
printf("[NO FLAGS] ");
} else {
- int i = 0;
+ static const char ife_print_flags_strs[] ALIGN1 =
+ "UP\0"
+ "BROADCAST\0"
+ "DEBUG\0"
+ "LOOPBACK\0"
+ "POINTOPOINT\0"
+ "NOTRAILERS\0"
+ "RUNNING\0"
+ "NOARP\0"
+ "PROMISC\0"
+ "ALLMULTI\0"
+ "SLAVE\0"
+ "MASTER\0"
+ "MULTICAST\0"
+#ifdef HAVE_DYNAMIC
+ "DYNAMIC\0"
+#endif
+ ;
+ static const unsigned short ife_print_flags_mask[] ALIGN2 = {
+ IFF_UP,
+ IFF_BROADCAST,
+ IFF_DEBUG,
+ IFF_LOOPBACK,
+ IFF_POINTOPOINT,
+ IFF_NOTRAILERS,
+ IFF_RUNNING,
+ IFF_NOARP,
+ IFF_PROMISC,
+ IFF_ALLMULTI,
+ IFF_SLAVE,
+ IFF_MASTER,
+ IFF_MULTICAST
+#ifdef HAVE_DYNAMIC
+ ,IFF_DYNAMIC
+#endif
+ };
+ const unsigned short *mask = ife_print_flags_mask;
+ const char *str = ife_print_flags_strs;
do {
- if (ptr->flags & ife_print_flags_mask[i]) {
- printf(ife_print_flags_strs[i]);
+ if (ptr->flags & *mask) {
+ printf("%s ", str);
}
- } while (ife_print_flags_mask[++i]);
+ mask++;
+ str += strlen(str) + 1;
+ } while (*str);
}
/* DONT FORGET TO ADD THE FLAGS IN ife_print_short */
if (ptr->outfill || ptr->keepalive)
printf(" Outfill:%d Keepalive:%d", ptr->outfill, ptr->keepalive);
#endif
- puts("");
+ bb_putchar('\n');
/* If needed, display the interface statistics. */
}
if (ptr->map.dma)
printf("DMA chan:%x ", ptr->map.dma);
- puts("");
+ bb_putchar('\n');
}
- puts("");
+ bb_putchar('\n');
}
-static int do_if_print(struct interface *ife, void *cookie)
+static int do_if_print(struct interface *ife) /*, int *opt_a)*/
{
- int *opt_a = (int *) cookie;
int res;
res = do_if_fetch(ife);
if (res >= 0) {
- if ((ife->flags & IFF_UP) || *opt_a)
+ if ((ife->flags & IFF_UP) || interface_opt_a)
ife_print(ife);
}
return res;
return ife;
}
+#ifdef UNUSED
+static int for_all_interfaces(int (*doit) (struct interface *, void *),
+ void *cookie)
+{
+ struct interface *ife;
+
+ if (!int_list && (if_readlist() < 0))
+ return -1;
+ for (ife = int_list; ife; ife = ife->next) {
+ int err = doit(ife, cookie);
+
+ if (err)
+ return err;
+ }
+ return 0;
+}
+#endif
+
/* for ipv4 add/del modes */
static int if_print(char *ifname)
{
+ struct interface *ife;
int res;
if (!ifname) {
- res = for_all_interfaces(do_if_print, &interface_opt_a);
- } else {
- struct interface *ife;
-
- ife = lookup_interface(ifname);
- res = do_if_fetch(ife);
- if (res >= 0)
- ife_print(ife);
+ /*res = for_all_interfaces(do_if_print, &interface_opt_a);*/
+ if (!int_list && (if_readlist() < 0))
+ return -1;
+ for (ife = int_list; ife; ife = ife->next) {
+ int err = do_if_print(ife); /*, &interface_opt_a);*/
+ if (err)
+ return err;
+ }
+ return 0;
}
+ ife = lookup_interface(ifname);
+ res = do_if_fetch(ife);
+ if (res >= 0)
+ ife_print(ife);
return res;
}