Skip to content
Browse files

- Update list network interfaces win32 variant

  Some utilities such as netsh require a friendly name when doing
  any administrative tasks such as stop/start network interfaces.
  Currently sigar list network interfaces as 'ethX, lo, laX'. This
  is fine for read only purposes but in order to make further use
  of the network interfaces on windows we need a friendlyname or at
  least the interface description.
  • Loading branch information...
1 parent 8337f13 commit 7041d070f10e2681025e52972afac5bdbdcc6405 Adam Stokes committed with dougm Feb 28, 2011
Showing with 67 additions and 7 deletions.
  1. +8 −4 include/sigar.h
  2. +59 −3 src/os/win32/win32_sigar.c
View
12 include/sigar.h
@@ -23,6 +23,10 @@
#include <limits.h>
+#ifndef MAX_INTERFACE_NAME_LEN
+#define MAX_INTERFACE_NAME_LEN 256
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -529,7 +533,7 @@ typedef struct {
typedef struct {
char default_gateway[SIGAR_INET6_ADDRSTRLEN];
- char default_gateway_interface[16];
+ char default_gateway_interface[MAX_INTERFACE_NAME_LEN];
char host_name[SIGAR_MAXHOSTNAMELEN];
char domain_name[SIGAR_MAXDOMAINNAMELEN];
char primary_dns[SIGAR_INET6_ADDRSTRLEN];
@@ -556,7 +560,7 @@ typedef struct {
mtu,
window,
irtt;
- char ifname[16];
+ char ifname[MAX_INTERFACE_NAME_LEN];
} sigar_net_route_t;
typedef struct {
@@ -602,7 +606,7 @@ SIGAR_DECLARE(int) sigar_net_route_list_destroy(sigar_t *sigar,
#define SIGAR_IPV6_ADDR_COMPATv4 0x0080
typedef struct {
- char name[16];
+ char name[MAX_INTERFACE_NAME_LEN];
char type[64];
char description[256];
sigar_net_address_t hwaddr;
@@ -847,7 +851,7 @@ sigar_net_listen_address_get(sigar_t *sigar,
sigar_net_address_t *address);
typedef struct {
- char ifname[16];
+ char ifname[MAX_INTERFACE_NAME_LEN];
char type[64];
sigar_net_address_t hwaddr;
sigar_net_address_t address;
View
62 src/os/win32/win32_sigar.c
@@ -2671,6 +2671,42 @@ static int netif_hash(char *s)
#define IF_TYPE_IEEE80211 71
#endif
+SIGAR_DECLARE(char *)
+sigar_net_interface_name_get(sigar_t *sigar, MIB_IFROW *ifr)
+{
+ char *match = NULL;
+ PIP_ADAPTER_ADDRESSES address_list, iter;
+ int lpc = 0;
+
+ sigar_t *peek = sigar_new();
+ int status = sigar_get_adapters_addresses(peek, AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, &address_list);
+ if (status != SIGAR_OK) {
+ goto done;
+ }
+
+ for (iter = address_list; iter != NULL; iter = iter->Next) {
+ for(lpc = 0; lpc < iter->PhysicalAddressLength; lpc++) {
+ if(iter->PhysicalAddress[lpc] != ifr->bPhysAddr[lpc]) {
+ break;
+ }
+ }
+
+ if(lpc == iter->PhysicalAddressLength) {
+ match = malloc(MAX_INTERFACE_NAME_LEN);
+ wcstombs(match, iter->FriendlyName, MAX_INTERFACE_NAME_LEN);
+ match[MAX_INTERFACE_NAME_LEN-1] = 0;
+ goto done;
+ }
+ }
+
+ done:
+ sigar_close(peek);
+ if(match == NULL) {
+ fprintf(stderr, "No match found\n");
+ }
+ return match;
+}
+
SIGAR_DECLARE(int)
sigar_net_interface_list_get(sigar_t *sigar,
sigar_net_interface_list_t *iflist)
@@ -2701,22 +2737,42 @@ sigar_net_interface_list_get(sigar_t *sigar,
}
for (i=0; i<ift->dwNumEntries; i++) {
- char name[16];
+ char name[MAX_INTERFACE_NAME_LEN];
int key;
MIB_IFROW *ifr = ift->table + i;
sigar_cache_entry_t *entry;
+ char *friendly = NULL;
if (strEQ(ifr->bDescr, MS_LOOPBACK_ADAPTER)) {
/* special-case */
sprintf(name, NETIF_LA "%d", la++);
}
else if (ifr->dwType == MIB_IF_TYPE_LOOPBACK) {
- sprintf(name, "lo%d", lo++);
+ friendly = sigar_net_interface_name_get(sigar, ifr);
+ if(friendly == NULL) {
+ sprintf(name, "lo%d", lo++);
+ } else {
+ snprintf(name, MAX_INTERFACE_NAME_LEN, "%s", friendly);
+ }
+ name[MAX_INTERFACE_NAME_LEN] = 0;
+ free(friendly);
}
else if ((ifr->dwType == MIB_IF_TYPE_ETHERNET) ||
(ifr->dwType == IF_TYPE_IEEE80211))
{
- sprintf(name, "eth%d", eth++);
+
+ if(strstr(ifr->bDescr, "Scheduler") == NULL
+ && strstr(ifr->bDescr, "Filter") == NULL) {
+ friendly = sigar_net_interface_name_get(sigar, ifr);
+ }
+
+ if(friendly == NULL) {
+ snprintf(name, ifr->dwDescrLen, "%s", ifr->bDescr);
+ } else {
+ snprintf(name, MAX_INTERFACE_NAME_LEN, "%s", friendly);
+ }
+ name[MAX_INTERFACE_NAME_LEN] = 0;
+ free(friendly);
}
else {
continue; /*XXX*/

0 comments on commit 7041d07

Please sign in to comment.
Something went wrong with that request. Please try again.