/* $Id$ */ /* * Copyright (c) 2004 Dimitri Sokolyuk * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #include #include #include "main.h" kvm_t *kvmd = NULL; void *ifhead; void *addr = NULL; int if_init(char *ifname) { char *vmunix = NULL; char *core = NULL; char errbuf[_POSIX2_LINE_MAX]; struct ifnet ifnet; struct nlist nl[] = { { "_ifnet" }, { NULL } }; kvmd = kvm_openfiles(vmunix, core, NULL, O_RDONLY, errbuf); if (kvmd == NULL) error(errbuf); if ((kvm_nlist(kvmd, nl)) == -1) error(kvm_geterr(kvmd)); if (kvm_read(kvmd, nl->n_value, &ifhead, sizeof(nl->n_value)) != sizeof(nl->n_value)) error(kvm_geterr(kvmd)); for (; ifhead != NULL; ifhead = (struct ifnet *)ifnet.if_list.tqe_next) { if (kvm_read(kvmd, (unsigned long)ifhead, &ifnet, sizeof(ifnet)) != sizeof(ifnet)) error(kvm_geterr(kvmd)); if (strncmp(ifnet.if_xname, ifname, strlen(ifname)) == NULL) addr = ifhead; } if (addr == NULL) error("interface not found"); } int if_stat(void) { struct ifnet ifnet; extern struct ifdata ifdata; if (kvm_read(kvmd, (unsigned long)addr, &ifnet, sizeof(ifnet)) != sizeof(ifnet)) error(kvm_geterr(kvmd)); strlcpy(ifdata.xname ,ifnet.if_xname, sizeof(ifdata.xname)); ifdata.baudrate = ifnet.if_baudrate; ifdata.ipackets = ifnet.if_ipackets; ifdata.ierrors = ifnet.if_ierrors; ifdata.opackets = ifnet.if_opackets; ifdata.oerrors = ifnet.if_oerrors; ifdata.collisions = ifnet.if_collisions; ifdata.ibytes = ifnet.if_ibytes; ifdata.obytes = ifnet.if_obytes; } int if_fini(void) { kvm_close(kvmd); }