void read_igmp6(struct ma_info **result_p) { char buf[256]; FILE *fp = fopen("/proc/net/igmp6", "r"); if (!fp) return; while (fgets(buf, sizeof(buf), fp)) { char hexa[256]; struct ma_info m; int len; memset(&m, 0, sizeof(m)); sscanf(buf, "%d%s%s%d", &m.index, m.name, hexa, &m.users); if (filter.dev && strcmp(filter.dev, m.name)) continue; m.addr.family = AF_INET6; len = parse_hex(hexa, (unsigned char*)&m.addr.data); if (len >= 0) { struct ma_info *ma = malloc(sizeof(m)); memcpy(ma, &m, sizeof(m)); ma->addr.bytelen = len; ma->addr.bitlen = len<<3; maddr_ins(result_p, ma); } } fclose(fp); }
void read_igmp(struct ma_info **result_p) { struct ma_info m, *ma = NULL; char buf[256]; FILE *fp = fopen(_PATH_PROCNET_IGMP, "r"); if (!fp) return; memset(&m, 0, sizeof(m)); if (fgets(buf, sizeof(buf), fp)) /* eat line */; m.addr.family = AF_INET; m.addr.bitlen = 32; m.addr.bytelen = 4; while (fgets(buf, sizeof(buf), fp)) { if (buf[0] != '\t') { sscanf(buf, "%d%s", &m.index, m.name); continue; } if (filter_dev[0] && strcmp(filter_dev, m.name)) continue; sscanf(buf, "%08x%d", (__u32*)&m.addr.data, &m.users); ma = xmalloc(sizeof(m)); memcpy(ma, &m, sizeof(m)); maddr_ins(result_p, ma); } fclose(fp); }
void read_igmp(struct ma_info **result_p) { struct ma_info m; char buf[256]; FILE *fp = fopen("/proc/net/igmp", "r"); if (!fp) return; memset(&m, 0, sizeof(m)); fgets(buf, sizeof(buf), fp); m.addr.family = AF_INET; m.addr.bitlen = 32; m.addr.bytelen = 4; while (fgets(buf, sizeof(buf), fp)) { struct ma_info *ma = malloc(sizeof(m)); if (buf[0] != '\t') { sscanf(buf, "%d%s", &m.index, m.name); continue; } if (filter.dev && strcmp(filter.dev, m.name)) continue; sscanf(buf, "%08x%d", (__u32*)&m.addr.data, &m.users); ma = malloc(sizeof(m)); memcpy(ma, &m, sizeof(m)); maddr_ins(result_p, ma); } fclose(fp); }
void read_dev_mcast(struct ma_info **result_p) { char buf[256]; FILE *fp = fopen(_PATH_PROCNET_DEV_MCAST, "r"); if (!fp) return; while (fgets(buf, sizeof(buf), fp)) { char hexa[256]; struct ma_info m; int len; int st; memset(&m, 0, sizeof(m)); sscanf(buf, "%d%s%d%d%s", &m.index, m.name, &m.users, &st, hexa); if (filter_dev[0] && strcmp(filter_dev, m.name)) continue; m.addr.family = AF_PACKET; len = parse_hex(hexa, (unsigned char*)&m.addr.data); if (len >= 0) { struct ma_info *ma = xmalloc(sizeof(m)); memcpy(ma, &m, sizeof(m)); ma->addr.bytelen = len; ma->addr.bitlen = len<<3; if (st) ma->features = "static"; maddr_ins(result_p, ma); } } fclose(fp); }
static void read_dev_mcast(struct ma_info **result_p) { char buf[256]; FILE *fp = fopen("/proc/net/dev_mcast", "r"); if (!fp) return; while (fgets(buf, sizeof(buf), fp)) { char hexa[256]; struct ma_info m = { .addr.family = AF_PACKET }; int len; int st; sscanf(buf, "%d%s%d%d%s", &m.index, m.name, &m.users, &st, hexa); if (filter.dev && strcmp(filter.dev, m.name)) continue; len = parse_hex(hexa, (unsigned char *)&m.addr.data, sizeof(m.addr.data)); if (len >= 0) { struct ma_info *ma = malloc(sizeof(m)); memcpy(ma, &m, sizeof(m)); ma->addr.bytelen = len; ma->addr.bitlen = len<<3; if (st) ma->features = "static"; maddr_ins(result_p, ma); } } fclose(fp); } static void read_igmp(struct ma_info **result_p) { struct ma_info m = { .addr.family = AF_INET, .addr.bitlen = 32, .addr.bytelen = 4, }; char buf[256]; FILE *fp = fopen("/proc/net/igmp", "r"); if (!fp) return; if (!fgets(buf, sizeof(buf), fp)) { fclose(fp); return; } while (fgets(buf, sizeof(buf), fp)) { struct ma_info *ma; size_t len; if (buf[0] != '\t') { sscanf(buf, "%d%s", &m.index, m.name); len = strlen(m.name); if (m.name[len - 1] == ':') len--; continue; } if (filter.dev && strncmp(filter.dev, m.name, len)) continue; sscanf(buf, "%08x%d", (__u32 *)&m.addr.data, &m.users); ma = malloc(sizeof(m)); memcpy(ma, &m, sizeof(m)); maddr_ins(result_p, ma); } fclose(fp); } static void read_igmp6(struct ma_info **result_p) { char buf[256]; FILE *fp = fopen("/proc/net/igmp6", "r"); if (!fp) return; while (fgets(buf, sizeof(buf), fp)) { char hexa[256]; struct ma_info m = { .addr.family = AF_INET6 }; int len; sscanf(buf, "%d%s%s%d", &m.index, m.name, hexa, &m.users); if (filter.dev && strcmp(filter.dev, m.name)) continue; len = parse_hex(hexa, (unsigned char *)&m.addr.data, sizeof(m.addr.data)); if (len >= 0) { struct ma_info *ma = malloc(sizeof(m)); memcpy(ma, &m, sizeof(m)); ma->addr.bytelen = len; ma->addr.bitlen = len<<3; maddr_ins(result_p, ma); } } fclose(fp); } static void print_maddr(FILE *fp, struct ma_info *list) { fprintf(fp, "\t"); if (list->addr.family == AF_PACKET) { SPRINT_BUF(b1); fprintf(fp, "link %s", ll_addr_n2a((unsigned char *)list->addr.data, list->addr.bytelen, 0, b1, sizeof(b1))); } else { switch (list->addr.family) { case AF_INET: fprintf(fp, "inet "); break; case AF_INET6: fprintf(fp, "inet6 "); break; default: fprintf(fp, "family %d ", list->addr.family); break; } fprintf(fp, "%s", format_host(list->addr.family, -1, list->addr.data)); } if (list->users != 1) fprintf(fp, " users %d", list->users); if (list->features) fprintf(fp, " %s", list->features); fprintf(fp, "\n"); } static void print_mlist(FILE *fp, struct ma_info *list) { int cur_index = 0; for (; list; list = list->next) { if (oneline) { cur_index = list->index; fprintf(fp, "%d:\t%s%s", cur_index, list->name, _SL_); } else if (cur_index != list->index) { cur_index = list->index; fprintf(fp, "%d:\t%s\n", cur_index, list->name); } print_maddr(fp, list); } }