aboutsummaryrefslogtreecommitdiff
path: root/toys/pending/ifconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/pending/ifconfig.c')
-rw-r--r--toys/pending/ifconfig.c54
1 files changed, 22 insertions, 32 deletions
diff --git a/toys/pending/ifconfig.c b/toys/pending/ifconfig.c
index 9bd2e4fd..d96e3a1b 100644
--- a/toys/pending/ifconfig.c
+++ b/toys/pending/ifconfig.c
@@ -108,6 +108,14 @@ void xioctl(int fd, int request, void *data)
if (ioctl(fd, request, data) < 0) perror_exit("ioctl %d", request);
}
+int xsocket(int domain, int type, int protocol)
+{
+ int fd = socket(domain, type, protocol);
+
+ if (fd < 0) perror_exit("socket %x %x", type, protocol);
+ return fd;
+}
+
/*
* verify the host is local unix path.
* if so, set the swl input param accordingly.
@@ -318,17 +326,13 @@ static void set_ipv6_addr(int sockfd, struct ifreq *ifre, char *ipv6_addr, int r
(char *) &(swl->sock_u.sock_in6.sin6_addr),
sizeof(struct in6_addr));
//Create a channel to the NET kernel.
- if( (sockfd6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
- perror_exit("AF_INET6 SOCK_DGRAM", 0);
+ sockfd6 = xsocket(AF_INET6, SOCK_DGRAM, 0);
xioctl(sockfd6, SIOGIFINDEX, ifre);
ifre6.ifrinet6_ifindex = ifre->ifr_ifindex;
ifre6.ifrinet6_prefixlen = plen;
xioctl(sockfd6, request, &ifre6);
- if(swl != NULL) {
- free(swl);
- swl = NULL;
- }
+ free(swl);
}
static void set_address(int sockfd, char *host_name, struct ifreq *ifre, int request, char *req_name)
@@ -467,63 +471,50 @@ static void add_iface_to_list(struct if_list *newnode)
TT.if_list = (void *)head_ref;
}
-static int get_device_info(struct if_list *il)
+static void get_device_info(struct if_list *il)
{
struct ifreq ifre;
char *name = il->name;
int sokfd;
- if ((sokfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return sokfd;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
- if(ioctl(sokfd, SIOCGIFFLAGS, &ifre) < 0) {
- close(sokfd);
- return NO_RANGE;
- }
-
+ sokfd = xsocket(AF_INET, SOCK_DGRAM, 0);
+ xstrncpy(ifre.ifr_name, name, IFNAMSIZ);
+ if(ioctl(sokfd, SIOCGIFFLAGS, &ifre)<0) perror_exit("%s", il->name);
il->flags = ifre.ifr_flags;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
+
if(ioctl(sokfd, SIOCGIFHWADDR, &ifre) >= 0)
memcpy(il->hwaddr.sa_data, ifre.ifr_hwaddr.sa_data, sizeof(il->hwaddr.sa_data));
il->hw_type = ifre.ifr_hwaddr.sa_family;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
if(ioctl(sokfd, SIOCGIFMETRIC, &ifre) >= 0)
il->metric = ifre.ifr_metric;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
if(ioctl(sokfd, SIOCGIFMTU, &ifre) >= 0)
il->mtu = ifre.ifr_mtu;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
if(ioctl(sokfd, SIOCGIFMAP, &ifre) == 0)
il->map = ifre.ifr_map;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
il->txqueuelen = NO_RANGE;
if(ioctl(sokfd, SIOCGIFTXQLEN, &ifre) >= 0)
il->txqueuelen = ifre.ifr_qlen;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
ifre.ifr_addr.sa_family = AF_INET;
if(!ioctl(sokfd, SIOCGIFADDR, &ifre)) {
il->hasaddr = 1;
il->addr = ifre.ifr_addr;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
if(ioctl(sokfd, SIOCGIFDSTADDR, &ifre) >= 0)
il->dstaddr = ifre.ifr_dstaddr;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
if(ioctl(sokfd, SIOCGIFBRDADDR, &ifre) >= 0)
il->broadaddr = ifre.ifr_broadaddr;
- strncpy(ifre.ifr_name, name, IFNAMSIZ);
if(ioctl(sokfd, SIOCGIFNETMASK, &ifre) >= 0)
il->netmask = ifre.ifr_netmask;
}
close(sokfd);
- return 0;
}
static void get_hw_info(int hw_type, HW_INFO *hw_info)
@@ -756,7 +747,7 @@ static void readconf(void)
xstrncpy(il->name, ifre->ifr_name, IFNAMSIZ);
add_iface_to_list(il);
errno = 0;
- if(get_device_info(il) < 0) perror_exit("%s", il->name);
+ get_device_info(il);
}
}
@@ -790,7 +781,7 @@ static void show_iface(char *iface_name)
add_iface_to_list(il);
il->non_virtual_iface = 1;
errno = 0;
- if(get_device_info(il) < 0) perror_exit("%s", il->name);
+ get_device_info(il);
}
fclose(fp);
@@ -806,8 +797,8 @@ static void show_iface(char *iface_name)
il = xzalloc(sizeof(struct if_list));
xstrncpy(il->name, iface_name, IFNAMSIZ);
errno = 0;
- if(get_device_info(il) < 0) perror_exit("%s", iface_name);
- else display_ifconfig(il);
+ get_device_info(il);
+ display_ifconfig(il);
free(il);
}
} else {
@@ -816,6 +807,8 @@ static void show_iface(char *iface_name)
if((il->flags & IFF_UP) || (toys.optflags & FLAG_a))
display_ifconfig(il);
}
+
+ if (CFG_TOYBOX_FREE) llist_traverse(TT.if_list, free);
}
void ifconfig_main(void)
@@ -824,11 +817,8 @@ void ifconfig_main(void)
if(*argv && (strcmp(*argv, "--help") == 0)) show_help();
- //"ifconfig" / "ifconfig eth0"
- if(!argv[0] || !argv[1]) { //one or no argument
+ if(toys.optc < 2) {
show_iface(*argv);
- //free allocated memory.
- llist_traverse(TT.if_list, free);
return;
}