void get_net_info(char *if_name, NetInfo * netinfo) { struct ifreq ifr; int fd; fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); /* IPv4 */ ifr.ifr_addr.sa_family = AF_INET; strcpy(netinfo->name, if_name); /* MTU */ strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFMTU, &ifr) < 0) { netinfo->mtu = 0; } else { netinfo->mtu = ifr.ifr_mtu; } /* HW Address */ strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { memset(netinfo->mac, 0, 8); } else { memcpy(netinfo->mac, ifr.ifr_ifru.ifru_hwaddr.sa_data, 8); } /* IP Address */ strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) { netinfo->ip[0] = 0; } else { sprintf(netinfo->ip, "%s", inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> sin_addr)); } /* Mask Address */ strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFNETMASK, &ifr) < 0) { netinfo->mask[0] = 0; } else { sprintf(netinfo->mask, "%s", inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> sin_addr)); } /* Broadcast Address */ strcpy(ifr.ifr_name, if_name); if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0) { netinfo->broadcast[0] = 0; } else { sprintf(netinfo->broadcast, "%s", inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)-> sin_addr)); } #ifdef HAS_LINUX_WE get_wireless_info(fd, netinfo); #endif shutdown(fd, 0); close(fd); }
void get_device_info(const char *device, DevInfo *devinfo) { glibtop_netload netload; guint8 *hw; g_assert(device); memset(devinfo, 0, sizeof *devinfo); devinfo->name = g_strdup(device); devinfo->type = DEV_UNKNOWN; glibtop_get_netload(&netload, device); devinfo->tx = netload.bytes_out; devinfo->rx = netload.bytes_in; devinfo->up = (netload.if_flags & (1L << GLIBTOP_IF_FLAGS_UP) ? TRUE : FALSE); devinfo->running = (netload.if_flags & (1L << GLIBTOP_IF_FLAGS_RUNNING) ? TRUE : FALSE); devinfo->ip = format_ipv4(netload.address); devinfo->netmask = format_ipv4(netload.subnet); devinfo->ipv6 = format_ipv6(netload.address6); devinfo->qual = 0; devinfo->essid = NULL; hw = netload.hwaddress; if (hw[6] || hw[7]) { devinfo->hwaddr = g_strdup_printf( "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X", hw[0], hw[1], hw[2], hw[3], hw[4], hw[5], hw[6], hw[7]); } else { devinfo->hwaddr = g_strdup_printf( "%02X:%02X:%02X:%02X:%02X:%02X", hw[0], hw[1], hw[2], hw[3], hw[4], hw[5]); } /* stolen from gnome-applets/multiload/linux-proc.c */ if(netload.if_flags & (1L << GLIBTOP_IF_FLAGS_LOOPBACK)) { devinfo->type = DEV_LO; } #ifdef HAVE_IW else if (netload.if_flags & (1L << GLIBTOP_IF_FLAGS_WIRELESS)) { devinfo->type = DEV_WIRELESS; get_wireless_info (devinfo); } #endif /* HAVE_IW */ else if(netload.if_flags & (1L << GLIBTOP_IF_FLAGS_POINTOPOINT)) { if (g_str_has_prefix(device, "plip")) { devinfo->type = DEV_PLIP; } else if (g_str_has_prefix(device, "sl")) { devinfo->type = DEV_SLIP; } else { devinfo->type = DEV_PPP; } get_ptp_info(devinfo); } else { devinfo->type = DEV_ETHERNET; } }
void print_wireless_info(yajl_gen json_gen, char *buffer, const char *interface, const char *format_up, const char *format_down) { const char *walk; char *outwalk = buffer; wireless_info_t info; INSTANCE(interface); const char *ip_address = get_ip_addr(interface); if (ip_address == NULL) { START_COLOR("color_bad"); outwalk += sprintf(outwalk, "%s", format_down); goto out; } if (get_wireless_info(interface, &info)) { walk = format_up; if (info.flags & WIRELESS_INFO_FLAG_HAS_QUALITY) START_COLOR((info.quality < info.quality_average ? "color_degraded" : "color_good")); else START_COLOR("color_good"); } else { walk = format_down; START_COLOR("color_bad"); } for (; *walk != '\0'; walk++) { if (*walk != '%') { *(outwalk++) = *walk; continue; } if (BEGINS_WITH(walk+1, "quality")) { if (info.flags & WIRELESS_INFO_FLAG_HAS_QUALITY) { if (info.quality_max) outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.quality, info.quality_max)); else outwalk += sprintf(outwalk, "%d", info.quality); } else { *(outwalk++) = '?'; } walk += strlen("quality"); } if (BEGINS_WITH(walk+1, "signal")) { if (info.flags & WIRELESS_INFO_FLAG_HAS_SIGNAL) { if (info.signal_level_max) outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.signal_level, info.signal_level_max)); else outwalk += sprintf(outwalk, "%d dBm", info.signal_level); } else { *(outwalk++) = '?'; } walk += strlen("signal"); } if (BEGINS_WITH(walk+1, "noise")) { if (info.flags & WIRELESS_INFO_FLAG_HAS_NOISE) { if (info.noise_level_max) outwalk += sprintf(outwalk, "%03d%%", PERCENT_VALUE(info.noise_level, info.noise_level_max)); else outwalk += sprintf(outwalk, "%d dBm", info.noise_level); } else { *(outwalk++) = '?'; } walk += strlen("noise"); } if (BEGINS_WITH(walk+1, "essid")) { if (info.flags & WIRELESS_INFO_FLAG_HAS_ESSID) outwalk += sprintf(outwalk, "%s", info.essid); else *(outwalk++) = '?'; walk += strlen("essid"); } if (BEGINS_WITH(walk+1, "ip")) { outwalk += sprintf(outwalk, "%s", ip_address); walk += strlen("ip"); } #ifdef LINUX if (BEGINS_WITH(walk+1, "bitrate")) { char br_buffer[128]; iw_print_bitrate(br_buffer, sizeof(br_buffer), info.bitrate); outwalk += sprintf(outwalk, "%s", br_buffer); walk += strlen("bitrate"); } #endif } out: END_COLOR; OUTPUT_FULL_TEXT(buffer); }