QString ClientModel::getNetworkName() const { QString netname(QString::fromStdString(Params().DataDir())); if(netname.isEmpty()) netname = "main"; return netname; }
void conf_print_rtm(FILE *output, struct rt_msghdr *rtm, char *delim, int af) { int i; char *cp, flags[64]; struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL; struct sockaddr *sa; struct sockaddr_in sin; sin.sin_addr.s_addr = htonl(INADDR_BROADCAST); cp = ((char *)rtm + rtm->rtm_hdrlen); for (i = 1; i; i <<= 1) if (i & rtm->rtm_addrs) { sa = (struct sockaddr *)cp; switch (i) { case RTA_DST: /* allow arp to get printed with af==AF_LINK */ if ((sa->sa_family == af) || (af == AF_LINK && sa->sa_family == AF_INET)) { if (rtm->rtm_flags & RTF_REJECT) snprintf(flags, sizeof(flags), " reject"); else flags[0] = '\0'; dst = sa; } break; case RTA_GATEWAY: if (sa->sa_family == af) gate = sa; break; case RTA_NETMASK: /* netmasks will not have a valid sa_family */ mask = sa; break; } ADVANCE(cp, sa); } if (dst && gate && mask && (af == AF_INET || af == AF_INET6)) { /* * Suppress printing IPv4 route if it's the default * route and dhcp (dhclient) is enabled. */ if (!(af == AF_INET && isdefaultroute(dst, mask) && dhclient_isenabled(routename(gate)))) { fprintf(output, "%s%s ", delim, netname(dst, mask)); fprintf(output, "%s%s\n", routename(gate), flags); } } else if (dst && gate && (af == AF_LINK)) { /* print arp */ fprintf(output, "%s%s ", delim, routename(dst)); fprintf(output, "%s\n", routename(gate)); } }
static void dump_rpgrp(FILE *fp, rp_grp_entry_t *rpgrp, int indent) { grp_mask_t *grp = rpgrp->group; if (indent) fprintf(fp, " "); fprintf(fp, "%-18.18s %-8u %-8u\n", netname(grp->group_addr, grp->group_mask), rpgrp->priority, rpgrp->holdtime); }
void conf_print_rtm(FILE *output, struct rt_msghdr *rtm, char *delim, int af) { int i; char *cp; struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL; struct sockaddr *sa; cp = ((char *)rtm + rtm->rtm_hdrlen); for (i = 1; i; i <<= 1) if (i & rtm->rtm_addrs) { sa = (struct sockaddr *)cp; switch (i) { case RTA_DST: /* allow arp to get printed with af==AF_LINK */ if ((sa->sa_family == af) || (af == AF_LINK && sa->sa_family == AF_INET)) dst = sa; break; case RTA_GATEWAY: if (sa->sa_family == af) gate = sa; break; case RTA_NETMASK: /* netmasks will not have a valid sa_family */ mask = sa; break; } ADVANCE(cp, sa); } if (dst && mask && gate && (af == AF_INET || af == AF_INET6)) { /* * suppress printing IP route if it's the default * v4 route and dhcp (dhclient) is enabled */ if (!(isdefaultroute4(dst) && dhclient_isenabled(routename(gate)))) { fprintf(output, "%s%s ", delim, netname(dst, mask)); fprintf(output, "%s\n", routename(gate)); } } else if (dst && gate && (af == AF_LINK)) /* print arp */ fprintf(output, "%s%s %s\n", delim, routename(dst), routename(gate)); }
static const char * fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags) { static char workbuf[128]; const char *cp; if (sa == NULL) return ("null"); switch(sa->sa_family) { case AF_INET: { struct sockaddr_in *sockin = (struct sockaddr_in *)sa; if ((sockin->sin_addr.s_addr == INADDR_ANY) && mask && ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr) ==0L) cp = "default" ; else if (flags & RTF_HOST) cp = routename(sockin->sin_addr.s_addr); else if (mask) cp = netname(sockin->sin_addr.s_addr, ntohl(((struct sockaddr_in *)mask) ->sin_addr.s_addr)); else cp = netname(sockin->sin_addr.s_addr, 0L); break; } #ifdef INET6 case AF_INET6: { struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa; in6_fillscopeid(sa6); if (flags & RTF_HOST) cp = routename6(sa6); else if (mask) cp = netname6(sa6, &((struct sockaddr_in6 *)mask)->sin6_addr); else { cp = netname6(sa6, NULL); } break; } #endif /*INET6*/ case AF_IPX: { struct ipx_addr work = ((struct sockaddr_ipx *)sa)->sipx_addr; if (ipx_nullnet(satoipx_addr(work))) cp = "default"; else cp = ipx_print(sa); break; } case AF_APPLETALK: { if (!(flags & RTF_HOST) && mask) cp = atalk_print2(sa,mask,9); else cp = atalk_print(sa,11); break; } case AF_NETGRAPH: { strlcpy(workbuf, ((struct sockaddr_ng *)sa)->sg_data, sizeof(workbuf)); cp = workbuf; break; } case AF_LINK: { struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa; if (sdl->sdl_nlen == 0 && sdl->sdl_alen == 0 && sdl->sdl_slen == 0) { (void) sprintf(workbuf, "link#%d", sdl->sdl_index); cp = workbuf; } else switch (sdl->sdl_type) { case IFT_ETHER: case IFT_L2VLAN: case IFT_BRIDGE: if (sdl->sdl_alen == ETHER_ADDR_LEN) { cp = ether_ntoa((struct ether_addr *) (sdl->sdl_data + sdl->sdl_nlen)); break; } /* FALLTHROUGH */ default: cp = link_ntoa(sdl); break; } break; } default: { u_char *s = (u_char *)sa->sa_data, *slim; char *cq, *cqlim; cq = workbuf; slim = sa->sa_len + (u_char *) sa; cqlim = cq + sizeof(workbuf) - 6; cq += sprintf(cq, "(%d)", sa->sa_family); while (s < slim && cq < cqlim) { cq += sprintf(cq, " %02x", *s++); if (s < slim) cq += sprintf(cq, "%02x", *s++); } cp = workbuf; } } return (cp); }
/* * Print a description of the network interfaces. */ void intpro(int interval) { oid varname[MAX_OID_LEN], *instance, *ifentry; size_t varname_len; int ifnum, cfg_nnets; oid curifip [4]; struct variable_list *var; struct snmp_pdu *request, *response; int status; int ifindex, oldindex = 0; struct _if_info { int ifindex; char name[128]; char ip[128], route[128]; char ioctets[20], ierrs[20], ooctets[20], oerrs[20], outqueue[20]; int operstatus; u_long netmask; struct in_addr ifip, ifroute; } *if_table, *cur_if; int max_name = 4, max_route = 7, max_ip = 7, max_ioctets = 7, max_ooctets = 7; int i; if (interval) { sidewaysintpr((unsigned)interval); return; } var = getvarbyname(Session, oid_cfg_nnets, sizeof(oid_cfg_nnets) / sizeof(oid)); if (var && var->val.integer) { cfg_nnets = *var->val.integer; snmp_free_var(var); } else { fprintf (stderr, "No response when requesting number of interfaces.\n"); return; } DEBUGMSGTL (("netstat:if", "cfg_nnets = %d\n", cfg_nnets)); memset (curifip, 0, sizeof (curifip)); if_table = (struct _if_info *) calloc (cfg_nnets, sizeof (*if_table)); cur_if = if_table; for (ifnum = 1; ifnum <= cfg_nnets; ifnum++) { register char *cp; request = snmp_pdu_create (SNMP_MSG_GETNEXT); memmove (varname, oid_ipadentaddr, sizeof (oid_ipadentaddr)); varname_len = sizeof (oid_ipadentaddr) / sizeof (oid); instance = varname + 9; memmove (varname + 10, curifip, sizeof (curifip)); *instance = IPIFINDEX; snmp_add_null_var (request, varname, varname_len); *instance = IPADDR; snmp_add_null_var (request, varname, varname_len); *instance = IPNETMASK; snmp_add_null_var (request, varname, varname_len); status = snmp_synch_response (Session, request, &response); if (status != STAT_SUCCESS || response->errstat != SNMP_ERR_NOERROR) { fprintf (stderr, "SNMP request failed for interface %d, variable %ld out of %d interfaces (IP)\n", ifnum, response->errindex, cfg_nnets); cfg_nnets = ifnum; break; } for (var = response->variables; var; var = var->next_variable) { if (snmp_get_do_debugging()) { print_variable (var->name, var->name_length, var); } switch (var->name [9]) { case IPIFINDEX: ifindex = *var->val.integer; for (cur_if = if_table; cur_if->ifindex != ifindex && cur_if->ifindex != 0; cur_if++); cur_if->ifindex = ifindex; break; case IPADDR: memmove (curifip, var->name+10, sizeof (curifip)); memmove (&cur_if->ifip, var->val.string, sizeof (u_long)); break; case IPNETMASK: memmove (&cur_if->netmask, var->val.string, sizeof (u_long)); } } cur_if->ifroute.s_addr = cur_if->ifip.s_addr & cur_if->netmask; if (cur_if->ifroute.s_addr) strcpy(cur_if->route, netname (cur_if->ifroute, cur_if->netmask)); else strcpy(cur_if->route, "none"); if ((i = strlen(cur_if->route)) > max_route) max_route = i; if (cur_if->ifip.s_addr) strcpy(cur_if->ip, routename (cur_if->ifip)); else strcpy(cur_if->ip, "none"); if ((i = strlen(cur_if->ip)) > max_ip) max_ip = i; snmp_free_pdu (response); memmove (varname, oid_ifname, sizeof(oid_ifname)); varname_len = sizeof(oid_ifname) / sizeof(oid); ifentry = varname + 9; instance = varname + 10; request = snmp_pdu_create (SNMP_MSG_GETNEXT); *instance = oldindex; *ifentry = IFINDEX; snmp_add_null_var (request, varname, varname_len); *ifentry = IFNAME; snmp_add_null_var (request, varname, varname_len); *ifentry = IFOPERSTATUS; snmp_add_null_var (request, varname, varname_len); *ifentry = INOCTETS; snmp_add_null_var (request, varname, varname_len); *ifentry = OUTOCTETS; snmp_add_null_var (request, varname, varname_len); while ((status = snmp_synch_response (Session, request, &response)) == STAT_SUCCESS) { if (response->errstat != SNMP_ERR_NOSUCHNAME) break; if ((request = snmp_fix_pdu(response, SNMP_MSG_GETNEXT)) == NULL) break; snmp_free_pdu(response); } if (status != STAT_SUCCESS || response->errstat != SNMP_ERR_NOERROR) { fprintf (stderr, "SNMP request failed for interface %d, variable %ld out of %d interfaces (IF)\n", ifnum, response->errindex, cfg_nnets); cfg_nnets = ifnum; break; } for (var = response->variables; var; var = var->next_variable) { if (snmp_get_do_debugging()) { print_variable (var->name, var->name_length, var); } if (!var->val.integer) continue; switch (var->name [9]) { case IFINDEX: ifindex = *var->val.integer; for (cur_if = if_table; cur_if->ifindex != ifindex && cur_if->ifindex != 0; cur_if++); cur_if->ifindex = ifindex; break; case INOCTETS: sprintf(cur_if->ioctets, "%lu", *var->val.integer); i = strlen(cur_if->ioctets); if (i > max_ioctets) max_ioctets = i; break; case OUTOCTETS: sprintf(cur_if->ooctets, "%lu", *var->val.integer); i = strlen(cur_if->ooctets); if (i > max_ooctets) max_ooctets = i; break; case IFNAME: oldindex = var->name[10]; if (var->val_len >= sizeof(cur_if->name)) var->val_len = sizeof(cur_if->name) - 1; memmove (cur_if->name, var->val.string, var->val_len); cur_if->name [var->val_len] = 0; if ((i = strlen(cur_if->name)+1) > max_name) max_name = i; break; case IFOPERSTATUS: cur_if->operstatus = *var->val.integer; break; } } snmp_free_pdu (response); if (intrface != NULL && strcmp(cur_if->name, intrface) != 0) { cur_if->name [0] = 0; continue; } if (cur_if->operstatus != MIB_IFSTATUS_UP) { cp = strchr(cur_if->name, '\0'); *cp++ = '*'; *cp = '\0'; } } printf("%*.*s %*.*s %*.*s %*.*s %*.*s ", -max_name, max_name, "Name", -max_route, max_route, "Network", -max_ip, max_ip, "Address", max_ioctets, max_ioctets, "Ioctets", max_ooctets, max_ooctets, "Ooctets"); putchar('\n'); for (ifnum = 0, cur_if = if_table; ifnum < cfg_nnets; ifnum++, cur_if++) { if (cur_if->name [0] == 0) continue; printf("%*.*s ", -max_name, max_name, cur_if->name); printf("%*.*s ", -max_route, max_route, cur_if->route); printf("%*.*s ", -max_ip, max_ip, cur_if->ip); printf("%*s %*s", max_ioctets, cur_if->ioctets, max_ioctets, cur_if->ooctets); putchar('\n'); } free(if_table); }
/* * Query the kernel to find network interfaces that are multicast-capable * and install them in the uvifs array. */ void config_vifs_from_kernel(void) { struct ifreq *ifrp, *ifend; struct uvif *v; vifi_t vifi; uint32_t n; uint32_t addr, mask, subnet; short flags; int num_ifreq = 64; struct ifconf ifc; char *newbuf; total_interfaces = 0; /* The total number of physical interfaces */ ifc.ifc_len = num_ifreq * sizeof(struct ifreq); ifc.ifc_buf = calloc(ifc.ifc_len, sizeof(char)); while (ifc.ifc_buf) { if (ioctl(udp_socket, SIOCGIFCONF, (char *)&ifc) < 0) logit(LOG_ERR, errno, "Failed querying kernel network interfaces"); /* * If the buffer was large enough to hold all the addresses * then break out, otherwise increase the buffer size and * try again. * * The only way to know that we definitely had enough space * is to know that there was enough space for at least one * more struct ifreq. ??? */ if ((num_ifreq * sizeof(struct ifreq)) >= ifc.ifc_len + sizeof(struct ifreq)) break; num_ifreq *= 2; ifc.ifc_len = num_ifreq * sizeof(struct ifreq); newbuf = realloc(ifc.ifc_buf, ifc.ifc_len); if (newbuf == NULL) free(ifc.ifc_buf); ifc.ifc_buf = newbuf; } if (ifc.ifc_buf == NULL) logit(LOG_ERR, 0, "config_vifs_from_kernel() ran out of memory"); ifrp = (struct ifreq *)ifc.ifc_buf; ifend = (struct ifreq *)(ifc.ifc_buf + ifc.ifc_len); /* * Loop through all of the interfaces. */ for (; ifrp < ifend; ifrp = (struct ifreq *)((char *)ifrp + n)) { struct ifreq ifr; memset (&ifr, 0, sizeof (ifr)); #ifdef HAVE_SA_LEN n = ifrp->ifr_addr.sa_len + sizeof(ifrp->ifr_name); if (n < sizeof(*ifrp)) n = sizeof(*ifrp); #else n = sizeof(*ifrp); #endif /* HAVE_SA_LEN */ /* * Ignore any interface for an address family other than IP. */ if (ifrp->ifr_addr.sa_family != AF_INET) { total_interfaces++; /* Eventually may have IP address later */ continue; } addr = ((struct sockaddr_in *)&ifrp->ifr_addr)->sin_addr.s_addr; /* * Need a template to preserve address info that is * used below to locate the next entry. (Otherwise, * SIOCGIFFLAGS stomps over it because the requests * are returned in a union.) */ memcpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name)); /* * Ignore loopback interfaces and interfaces that do not * support multicast. */ if (ioctl(udp_socket, SIOCGIFFLAGS, (char *)&ifr) < 0) logit(LOG_ERR, errno, "Failed reading interface flags for phyint %s", ifr.ifr_name); flags = ifr.ifr_flags; if ((flags & (IFF_LOOPBACK | IFF_MULTICAST)) != IFF_MULTICAST) continue; /* * Everyone below is a potential vif interface. * We don't care if it has wrong configuration or not configured * at all. */ total_interfaces++; /* * Ignore any interface whose address and mask do not define a * valid subnet number, or whose address is of the form * {subnet,0} or {subnet,-1}. */ if (ioctl(udp_socket, SIOCGIFNETMASK, (char *)&ifr) < 0) { if (!(flags & IFF_POINTOPOINT)) logit(LOG_ERR, errno, "Failed reading interface netmask for phyint %s", ifr.ifr_name); mask = 0xffffffff; } else { mask = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; } subnet = addr & mask; if ((!inet_valid_subnet(subnet, mask)) || (addr == subnet) || addr == (subnet | ~mask)) { if (!(inet_valid_host(addr) && ((mask == htonl(0xfffffffe)) || (flags & IFF_POINTOPOINT)))) { logit(LOG_WARNING, 0, "Ignoring %s, has invalid address %s and/or netmask %s", ifr.ifr_name, inet_fmt(addr, s1, sizeof(s1)), inet_fmt(mask, s2, sizeof(s2))); continue; } } /* * Ignore any interface that is connected to the same subnet as * one already installed in the uvifs array. */ /* * TODO: XXX: bug or "feature" is to allow only one interface per * subnet? */ for (vifi = 0, v = uvifs; vifi < numvifs; ++vifi, ++v) { if (strcmp(v->uv_name, ifr.ifr_name) == 0) { logit(LOG_DEBUG, 0, "Ignoring %s (%s on subnet %s) (alias for vif#%u?)", v->uv_name, inet_fmt(addr, s1, sizeof(s1)), netname(subnet, mask), vifi); break; } /* we don't care about point-to-point links in same subnet */ if (flags & IFF_POINTOPOINT) continue; if (v->uv_flags & VIFF_POINT_TO_POINT) continue; #if 0 /* * TODO: to allow different interfaces belong to * overlapping subnet addresses, use this version instead */ if (((addr & mask ) == v->uv_subnet) && (v->uv_subnetmask == mask)) { logit(LOG_WARNING, 0, "Ignoring %s, same subnet as %s", ifr.ifr_name, v->uv_name); break; } #else if ((addr & v->uv_subnetmask) == v->uv_subnet || (v->uv_subnet & mask) == subnet) { logit(LOG_WARNING, 0, "Ignoring %s, same subnet as %s", ifr.ifr_name, v->uv_name); break; } #endif /* 0 */ } if (vifi != numvifs) continue; /* * If there is room in the uvifs array, install this interface. */ if (numvifs == MAXVIFS) { logit(LOG_WARNING, 0, "Too many vifs, ignoring %s", ifr.ifr_name); continue; } v = &uvifs[numvifs]; zero_vif(v, FALSE); v->uv_lcl_addr = addr; v->uv_subnet = subnet; v->uv_subnetmask = mask; if (mask != htonl(0xfffffffe)) v->uv_subnetbcast = subnet | ~mask; else v->uv_subnetbcast = 0xffffffff; strlcpy(v->uv_name, ifr.ifr_name, IFNAMSIZ); /* * Figure out MTU of interface, needed as a seed value when * fragmenting PIM register messages. We should really do * a PMTU check on initial PIM register send to a new RP... */ if (ioctl(udp_socket, SIOCGIFMTU, &ifr) < 0) v->uv_mtu = 1500; else v->uv_mtu = ifr.ifr_mtu; if (flags & IFF_POINTOPOINT) { v->uv_flags |= (VIFF_REXMIT_PRUNES | VIFF_POINT_TO_POINT); if (ioctl(udp_socket, SIOCGIFDSTADDR, (char *)&ifr) < 0) logit(LOG_ERR, errno, "Failed reading point-to-point address for %s", v->uv_name); else v->uv_rmt_addr = ((struct sockaddr_in *)(&ifr.ifr_dstaddr))->sin_addr.s_addr; } else if (mask == htonl(0xfffffffe)) { /* * Handle RFC 3021 /31 netmasks as point-to-point links */ v->uv_flags |= (VIFF_REXMIT_PRUNES | VIFF_POINT_TO_POINT); if (addr == subnet) v->uv_rmt_addr = addr + htonl(1); else v->uv_rmt_addr = subnet; } #ifdef __linux__ { struct ifreq ifridx; memset(&ifridx, 0, sizeof(ifridx)); strlcpy(ifridx.ifr_name,v->uv_name, IFNAMSIZ); if (ioctl(udp_socket, SIOGIFINDEX, (char *) &ifridx) < 0) logit(LOG_ERR, errno, "Failed reading interface index for %s", ifridx.ifr_name); v->uv_ifindex = ifridx.ifr_ifindex; } if (v->uv_flags & VIFF_POINT_TO_POINT) { logit(LOG_INFO, 0, "Installing %s (%s -> %s) as vif #%u-%d - rate %d", v->uv_name, inet_fmt(addr, s1, sizeof(s1)), inet_fmt(v->uv_rmt_addr, s2, sizeof(s2)), numvifs, v->uv_ifindex, v->uv_rate_limit); } else { logit(LOG_INFO, 0, "Installing %s (%s on subnet %s) as vif #%u-%d - rate %d", v->uv_name, inet_fmt(addr, s1, sizeof(s1)), netname(subnet, mask), numvifs, v->uv_ifindex, v->uv_rate_limit); } #else /* !__linux__ */ if (v->uv_flags & VIFF_POINT_TO_POINT) { logit(LOG_INFO, 0, "Installing %s (%s -> %s) as vif #%u - rate=%d", v->uv_name, inet_fmt(addr, s1, sizeof(s1)), inet_fmt(v->uv_rmt_addr, s2, sizeof(s2)), numvifs, v->uv_rate_limit); } else { logit(LOG_INFO, 0, "Installing %s (%s on subnet %s) as vif #%u - rate %d", v->uv_name, inet_fmt(addr, s1, sizeof(s1)), netname(subnet, mask), numvifs, v->uv_rate_limit); } #endif /* __linux__ */ ++numvifs; /* * If the interface is not yet up, set the vifs_down flag to * remind us to check again later. */ if (!(flags & IFF_UP)) { v->uv_flags |= VIFF_DOWN; vifs_down = TRUE; } } }
static const char * fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags) { static char buf[128]; const char *cp; if (sa == NULL) return ("null"); switch(sa->sa_family) { #ifdef INET6 case AF_INET6: /* * The sa6->sin6_scope_id must be filled here because * this sockaddr is extracted from kmem(4) directly * and has KAME-specific embedded scope id in * sa6->sin6_addr.s6_addr[2]. */ in6_fillscopeid(satosin6(sa)); /* FALLTHROUGH */ #endif /*INET6*/ case AF_INET: if (flags & RTF_HOST) cp = routename(sa, numeric_addr); else if (mask) cp = netname(sa, mask); else cp = netname(sa, NULL); break; case AF_NETGRAPH: { strlcpy(buf, ((struct sockaddr_ng *)sa)->sg_data, sizeof(buf)); cp = buf; break; } case AF_LINK: { #if 0 struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa; /* Interface route. */ if (sdl->sdl_nlen) cp = sdl->sdl_data; else #endif cp = routename(sa, 1); break; } default: { u_char *s = (u_char *)sa->sa_data, *slim; char *cq, *cqlim; cq = buf; slim = sa->sa_len + (u_char *) sa; cqlim = cq + sizeof(buf) - sizeof(" ffff"); snprintf(cq, sizeof(buf), "(%d)", sa->sa_family); cq += strlen(cq); while (s < slim && cq < cqlim) { snprintf(cq, sizeof(" ff"), " %02x", *s++); cq += strlen(cq); if (s < slim) { snprintf(cq, sizeof("ff"), "%02x", *s++); cq += strlen(cq); } } cp = buf; } } return (cp); }
/* 1 2 3 4 5 6 7 8 012345678901234567890123456789012345678901234567890123456789012345678901234567890 Virtual Interface Table Vif Local-Address Subnet Thresh Flags Neighbors 0 10.0.3.1 10.0.3/24 1 DR NO-NBR 1 172.16.12.254 172.16.12/24 1 DR PIM 172.16.12.2 172.16.12.3 2 192.168.122.147 register_vif0 1 */ void dump_vifs(FILE *fp) { vifi_t vifi; struct uvif *v; pim_nbr_entry_t *n; int width; int i; fprintf(fp, "Virtual Interface Table ======================================================\n"); fprintf(fp, "Vif Local Address Subnet Thresh Flags Neighbors\n"); fprintf(fp, "--- --------------- ------------------ ------ --------- -----------------\n"); for (vifi = 0, v = uvifs; vifi < numvifs; ++vifi, ++v) { int down = 0; fprintf(fp, "%3u %-15s ", vifi, inet_fmt(v->uv_lcl_addr, s1, sizeof(s1))); if (v->uv_flags & VIFF_REGISTER) fprintf(fp, "%-18s ", v->uv_name); else fprintf(fp,"%-18.18s ", netname(v->uv_subnet, v->uv_subnetmask)); fprintf(fp, "%6u ", v->uv_threshold); /* TODO: XXX: Print VIFF_TUNNEL? */ width = 0; if (v->uv_flags & VIFF_DISABLED) { fprintf(fp, " DISABLED"); down = 1; } if (v->uv_flags & VIFF_DOWN) { fprintf(fp, " DOWN"); down = 1; } if (v->uv_flags & VIFF_DR) { fprintf(fp, " DR"); width += 3; } if (v->uv_flags & VIFF_PIM_NBR) { fprintf(fp, " PIM"); width += 4; } if (v->uv_flags & VIFF_DVMRP_NBR) { fprintf(fp, " DVMRP"); width += 6; } if (v->uv_flags & VIFF_NONBRS) { fprintf(fp, " NO-NBR"); width += 6; } n = v->uv_pim_neighbors; if (!down && n) { for (i = width; i <= 11; i++) fprintf(fp, " "); fprintf(fp, "%-15s\n", inet_fmt(n->address, s1, sizeof(s1))); for (n = n->next; n; n = n->next) fprintf(fp, "%61s%-15s\n", "", inet_fmt(n->address, s1, sizeof(s1))); } else { fprintf(fp, "\n"); } } fprintf(fp, "\n"); }
static const char * fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags) { static char workbuf[128]; const char *cp; switch(sa->sa_family) { case AF_INET: { struct sockaddr_in *sockin = (struct sockaddr_in *)sa; if ((sockin->sin_addr.s_addr == INADDR_ANY) && mask && ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr) ==0L) cp = "default" ; else if (flags & RTF_HOST) cp = routename(sockin->sin_addr.s_addr); else if (mask) cp = netname(sockin->sin_addr.s_addr, ntohl(((struct sockaddr_in *)mask) ->sin_addr.s_addr)); else cp = netname(sockin->sin_addr.s_addr, 0L); break; } #ifdef INET6 case AF_INET6: { struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)sa; struct in6_addr *in6 = &sa6->sin6_addr; /* * XXX: This is a special workaround for KAME kernels. * sin6_scope_id field of SA should be set in the future. */ if (IN6_IS_ADDR_LINKLOCAL(in6) || IN6_IS_ADDR_MC_LINKLOCAL(in6) || IN6_IS_ADDR_MC_NODELOCAL(in6)) { /* XXX: override is ok? */ sa6->sin6_scope_id = (u_int32_t)ntohs(*(u_short *)&in6->s6_addr[2]); *(u_short *)&in6->s6_addr[2] = 0; } if (flags & RTF_HOST) cp = routename6(sa6); else if (mask) cp = netname6(sa6, &((struct sockaddr_in6 *)mask)->sin6_addr); else { cp = netname6(sa6, NULL); } break; } #endif /*INET6*/ case AF_IPX: { struct ipx_addr work = ((struct sockaddr_ipx *)sa)->sipx_addr; if (ipx_nullnet(satoipx_addr(work))) cp = "default"; else cp = ipx_print(sa); break; } case AF_APPLETALK: { if (!(flags & RTF_HOST) && mask) cp = atalk_print2(sa,mask,9); else cp = atalk_print(sa,11); break; } case AF_NETGRAPH: { printf("%s", ((struct sockaddr_ng *)sa)->sg_data); break; } case AF_LINK: { struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa; if (sdl->sdl_nlen == 0 && sdl->sdl_alen == 0 && sdl->sdl_slen == 0) { (void) sprintf(workbuf, "link#%d", sdl->sdl_index); cp = workbuf; } else switch (sdl->sdl_type) { case IFT_ETHER: case IFT_L2VLAN: if (sdl->sdl_alen == ETHER_ADDR_LEN) { cp = ether_ntoa((struct ether_addr *) (sdl->sdl_data + sdl->sdl_nlen)); break; } /* FALLTHROUGH */ default: cp = link_ntoa(sdl); break; } break; } default: { u_char *s = (u_char *)sa->sa_data, *slim; char *cq, *cqlim; cq = workbuf; slim = sa->sa_len + (u_char *) sa; cqlim = cq + sizeof(workbuf) - 6; cq += sprintf(cq, "(%d)", sa->sa_family); while (s < slim && cq < cqlim) { cq += sprintf(cq, " %02x", *s++); if (s < slim) cq += sprintf(cq, "%02x", *s++); } cp = workbuf; } } return (cp); }
static int p_sockaddr(struct sockaddr *sa, int flags, int width) { char workbuf[128]; char *cp = workbuf; const char *cplim; int len = sizeof(workbuf); int count; switch(sa->sa_family) { case AF_LINK: { struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa; if (sdl->sdl_nlen == 0 && sdl->sdl_alen == 0 && sdl->sdl_slen == 0) { snprintf(workbuf, sizeof(workbuf), "link#%d", sdl->sdl_index); } else { switch (sdl->sdl_type) { case IFT_ETHER: { int i; u_char *lla = (u_char *)sdl->sdl_data + sdl->sdl_nlen; cplim = ""; for (i = 0; i < sdl->sdl_alen; i++, lla++) { snprintf(cp, len, "%s%x", cplim, *lla); len -= strlen(cp); cp += strlen(cp); if (len <= 0) break; /* overflow */ cplim = ":"; } cp = workbuf; break; } default: cp = link_ntoa(sdl); break; } } break; } case AF_INET: { struct sockaddr_in *in = (struct sockaddr_in *)sa; if (in->sin_addr.s_addr == 0) { /* cp points to workbuf */ strncpy(cp, "default", len); } else cp = (flags & RTF_HOST) ? routename(sa) : netname(sa); break; } #ifdef INET6 case AF_INET6: { struct sockaddr_in6 *in6 = (struct sockaddr_in6 *)sa; if (IN6_IS_ADDR_UNSPECIFIED(&in6->sin6_addr)) { /* cp points to workbuf */ strncpy(cp, "default", len); } else { cp = ((flags & RTF_HOST) ? routename(sa) : netname(sa)); } /* make sure numeric address is not truncated */ if (strchr(cp, ':') != NULL && (width < 0 || strlen(cp) > (size_t)width)) width = strlen(cp); break; } #endif /* INET6 */ default: { u_char *s = (u_char *)sa->sa_data, *slim; slim = sa->sa_len + (u_char *) sa; cplim = cp + sizeof(workbuf) - 6; snprintf(cp, len, "(%d)", sa->sa_family); len -= strlen(cp); cp += strlen(cp); if (len <= 0) { cp = workbuf; break; /* overflow */ } while (s < slim && cp < cplim) { snprintf(cp, len, " %02x", *s++); len -= strlen(cp); cp += strlen(cp); if (len <= 0) break; /* overflow */ if (s < slim) { snprintf(cp, len, "%02x", *s++); len -= strlen(cp); cp += strlen(cp); if (len <= 0) break; /* overflow */ } } cp = workbuf; } } if (width < 0) { count = printf("%s ", cp); } else { if (nflag || wflag) count = printf("%-*s ", width, cp); else count = printf("%-*.*s ", width, width, cp); } return(count); }
/* * Retrieve the interface addressing information * XXX - This could also be extended to handle non-IP interfaces */ void _set_address( struct _if_info *cur_if ) { oid ipaddr_oid[] = { 1,3,6,1,2,1,4,20,1,0 }; size_t ipaddr_len = OID_LENGTH( ipaddr_oid ); static netsnmp_variable_list *addr_if_var =NULL; static netsnmp_variable_list *addr_mask_var=NULL; netsnmp_variable_list *vp, *vp2; union { in_addr_t addr; char data[4]; } tmpAddr; char *cp; in_addr_t ifAddr, mask; /* * Note that this information only needs to be retrieved * once, and can be re-used for subsequent calls. */ if ( addr_if_var == NULL ) { ipaddr_oid[ 9 ] = 2; /* ipAdEntIfIndex */ snmp_varlist_add_variable( &addr_if_var, ipaddr_oid, ipaddr_len, ASN_NULL, NULL, 0); netsnmp_query_walk( addr_if_var, ss ); ipaddr_oid[ 9 ] = 3; /* ipAdEntNetMask */ snmp_varlist_add_variable( &addr_mask_var, ipaddr_oid, ipaddr_len, ASN_NULL, NULL, 0); netsnmp_query_walk( addr_mask_var, ss ); } /* * Find the address row relevant to this interface */ for (vp=addr_if_var, vp2=addr_mask_var; vp; vp=vp->next_variable, vp2=vp2->next_variable) { if ( vp->val.integer && *vp->val.integer == cur_if->ifindex ) break; } if (vp2) { /* * Always want a numeric interface IP address */ snprintf( cur_if->ip, 128, "%lu.%lu.%lu.%lu", vp2->name[10], vp2->name[11], vp2->name[12], vp2->name[13]); /* * But re-use the routing table utilities/code for * displaying the local network information */ cp = tmpAddr.data; cp[0] = vp2->name[ 10 ] & 0xff; cp[1] = vp2->name[ 11 ] & 0xff; cp[2] = vp2->name[ 12 ] & 0xff; cp[3] = vp2->name[ 13 ] & 0xff; ifAddr = tmpAddr.addr; cp = tmpAddr.data; cp[0] = vp2->val.string[ 0 ] & 0xff; cp[1] = vp2->val.string[ 1 ] & 0xff; cp[2] = vp2->val.string[ 2 ] & 0xff; cp[3] = vp2->val.string[ 3 ] & 0xff; mask = tmpAddr.addr; snprintf( cur_if->route, 128, "%s", netname(ifAddr, mask)); } }
static void optim(char net[], char name[]) { char netcomp[BUFSIZ], netstr[STSIZ], xfstr[STSIZ]; register char *cp, *cp2; register int c; if (debug) fprintf(stderr, "optim(%s, %s) called\n", net, name); *netstr = '\0'; cp = net; for (;;) { /* * Rip off next path component into netcomp */ cp2 = netcomp; while (*cp && !any(*cp, metanet)) *cp2++ = *cp++; *cp2 = 0; /* * If we hit null byte, then we just scanned * the destination user name. Go off and optimize * if its so. */ if (*cp == 0) break; if ((c = netlook(netcomp, *cp)) == 0) { printf(gettext("No host named \"%s\"\n"), netcomp); err: nstrcpy(name, BUFSIZ, net); return; } stradd(name, BUFSIZ, c); stradd(name, BUFSIZ, *cp++); /* * If multiple network separators given, * throw away the extras. */ while (any(*cp, metanet)) cp++; } if (strlen(netcomp) == 0) { printf(gettext("net name syntax\n")); goto err; } if (debug) fprintf(stderr, "optim1(%s,%s) called\n", netstr, xfstr); optim1(netstr, xfstr); if (debug) fprintf(stderr, "optim1(%s,%s) returns\n", netstr, xfstr); /* * Convert back to machine names. */ cp = xfstr; *name = '\0'; while (*cp) { if ((cp2 = netname(*cp++)) == NOSTR) { printf(gettext("Made up bad net name\n")); printf(gettext("Machine code %c (0%o)\n"), cp[-1], cp[-1]); printf(gettext("Sorry.\n")); goto err; } nstrcat(name, BUFSIZ, cp2); stradd(name, BUFSIZ, *cp++); } nstrcat(name, BUFSIZ, netcomp); if (debug) fprintf(stderr, "optim returns %s in name\n", name); }