int intf_get_dst(intf_t *intf, struct intf_entry *entry, struct addr *dst) { struct sockaddr_in sin; int n; if (dst->addr_type != ADDR_TYPE_IP) { errno = EINVAL; return (-1); } addr_ntos(dst, (struct sockaddr *)&sin); sin.sin_port = htons(666); if (connect(intf->fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) return (-1); n = sizeof(sin); if (getsockname(intf->fd, (struct sockaddr *)&sin, &n) < 0) return (-1); addr_ston((struct sockaddr *)&sin, &entry->intf_addr); if (intf_loop(intf, _match_intf_src, entry) != 1) return (-1); return (0); }
int arp_get(arp_t *a, struct arp_entry *entry) { struct arpreq ar; memset(&ar, 0, sizeof(ar)); if (addr_ntos(&entry->arp_pa, &ar.arp_pa) < 0) return (-1); #ifdef HAVE_ARPREQ_ARP_DEV if (intf_loop(a->intf, _arp_set_dev, &ar) != 1) { errno = ESRCH; return (-1); } #endif if (ioctl(a->fd, SIOCGARP, &ar) < 0) return (-1); if ((ar.arp_flags & ATF_COM) == 0) { errno = ESRCH; return (-1); } return (addr_ston(&ar.arp_ha, &entry->arp_ha)); }
int intf_get_src(intf_t *intf, struct intf_entry *entry, struct addr *src) { memcpy(&entry->intf_addr, src, sizeof(*src)); if (intf_loop(intf, _match_intf_src, entry) != 1) { errno = ENXIO; return (-1); } return (0); }
static PyObject * interfaces(PyObject *self, PyObject *args) { intf_t *intf; PyObject *dict; struct intf_entry *entry = NULL; dict = PyDict_New(); if (!dict) return NULL; intf = intf_open(); intf_loop( intf, interfaces_callback, (void*) dict ); intf_close(intf); if (!dict) myerror("Could not read any net interfaces"); return dict; }
int arp_add(arp_t *a, const struct arp_entry *entry) { struct arpreq ar; memset(&ar, 0, sizeof(ar)); if (addr_ntos(&entry->arp_pa, &ar.arp_pa) < 0) return (-1); /* XXX - see arp(7) for details... */ #ifdef __linux__ if (addr_ntos(&entry->arp_ha, &ar.arp_ha) < 0) return (-1); ar.arp_ha.sa_family = ARP_HRD_ETH; #else /* XXX - Solaris, HP-UX, IRIX, other Mentat stacks? */ ar.arp_ha.sa_family = AF_UNSPEC; memcpy(ar.arp_ha.sa_data, &entry->arp_ha.addr_eth, ETH_ADDR_LEN); #endif #ifdef HAVE_ARPREQ_ARP_DEV if (intf_loop(a->intf, _arp_set_dev, &ar) != 1) { errno = ESRCH; return (-1); } #endif ar.arp_flags = ATF_PERM | ATF_COM; #ifdef hpux /* XXX - screwy extended arpreq struct */ { struct sockaddr_in *sin; ar.arp_hw_addr_len = ETH_ADDR_LEN; sin = (struct sockaddr_in *)&ar.arp_pa_mask; sin->sin_family = AF_INET; sin->sin_addr.s_addr = IP_ADDR_BROADCAST; } #endif if (ioctl(a->fd, SIOCSARP, &ar) < 0) return (-1); #ifdef HAVE_STREAMS_MIB2 /* XXX - force entry into ipNetToMediaTable. */ { struct sockaddr_in sin; int fd; addr_ntos(&entry->arp_pa, (struct sockaddr *)&sin); sin.sin_port = htons(666); if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return (-1); if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) { close(fd); return (-1); } write(fd, NULL, 0); close(fd); } #endif return (0); }
int intf_main(int argc, char *argv[]) { struct intf_entry *entry; struct addr *ap, addr; char *cmd, buf[1024]; if (argc < 2) usage(); cmd = argv[1]; entry = (struct intf_entry *)buf; memset(entry, 0, sizeof(*entry)); entry->intf_len = sizeof(buf); if ((intf = intf_open()) == NULL) err(1, "intf_open"); if (strcmp(cmd, "show") == 0) { if (intf_loop(intf, print_intf, NULL) < 0) err(1, "intf_loop"); } else if (strcmp(cmd, "get") == 0) { if (argc < 3) usage(); strlcpy(entry->intf_name, argv[2], sizeof(entry->intf_name)); if (intf_get(intf, entry) < 0) err(1, "intf_get"); print_intf(entry, NULL); } else if (strcmp(cmd, "src") == 0) { if (argc < 3 || addr_aton(argv[2], &addr) < 0) usage(); if (intf_get_src(intf, entry, &addr) < 0) err(1, "intf_get_src"); print_intf(entry, NULL); } else if (strcmp(cmd, "dst") == 0) { if (argc < 3 || addr_aton(argv[2], &addr) < 0) usage(); if (intf_get_dst(intf, entry, &addr) < 0) err(1, "intf_get_dst"); print_intf(entry, NULL); } else if (strcmp(cmd, "set") == 0) { if (argc < 4) usage(); strlcpy(entry->intf_name, argv[2], sizeof(entry->intf_name)); for (argv += 3, argc -= 3; argc > 1; argv += 2, argc -= 2) { if (strcmp(argv[0], "alias") == 0) { ap = &entry->intf_alias_addrs [entry->intf_alias_num++]; } else if (strcmp(argv[0], "dst") == 0) { ap = &entry->intf_dst_addr; } else if (strcmp(argv[0], "inet") == 0) { ap = &entry->intf_addr; } else if (strcmp(argv[0], "link") == 0) { ap = &entry->intf_link_addr; } else break; if (addr_pton(argv[1], ap) < 0) err(1, "invalid address: %s", argv[1]); } for ( ; argc > 0; argv++, argc--) { if (strcmp(argv[0], "up") == 0) entry->intf_flags |= INTF_FLAG_UP; else if (strcmp(argv[0], "down") == 0) entry->intf_flags &= ~INTF_FLAG_UP; else if (strcmp(argv[0], "arp") == 0) entry->intf_flags &= ~INTF_FLAG_NOARP; else if (strcmp(argv[0], "noarp") == 0) entry->intf_flags |= INTF_FLAG_NOARP; else usage(); } if (intf_set(intf, entry) < 0) err(1, "intf_set"); } else usage(); intf_close(intf); exit(0); }