/* * Return stats about a particular network interface. * References: * http://www.i-scream.org/libstatgrab/ */ static PyObject * psutil_net_if_duplex_speed(PyObject *self, PyObject *args) { char *nic_name; int sock = 0; int ret; int duplex; int speed; struct ifreq ifr; struct ifmediareq ifmed; if (! PyArg_ParseTuple(args, "s", &nic_name)) return NULL; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) goto error; strncpy(ifr.ifr_name, nic_name, sizeof(ifr.ifr_name)); // speed / duplex memset(&ifmed, 0, sizeof(struct ifmediareq)); strlcpy(ifmed.ifm_name, nic_name, sizeof(ifmed.ifm_name)); ret = ioctl(sock, SIOCGIFMEDIA, (caddr_t)&ifmed); if (ret == -1) { speed = 0; duplex = 0; } else { speed = psutil_get_nic_speed(ifmed.ifm_active); if ((ifmed.ifm_active | IFM_FDX) == ifmed.ifm_active) duplex = 2; else if ((ifmed.ifm_active | IFM_HDX) == ifmed.ifm_active) duplex = 1; else duplex = 0; } close(sock); return Py_BuildValue("[ii]", duplex, speed); error: if (sock != 0) close(sock); PyErr_SetFromErrno(PyExc_OSError); return NULL; }
/* * Return stats about a particular network interface. * References: * http://www.i-scream.org/libstatgrab/ */ static PyObject * psutil_net_if_stats(PyObject *self, PyObject *args) { char *nic_name; int sock = 0; int ret; int duplex; int speed; int mtu; struct ifreq ifr; struct ifmediareq ifmed; PyObject *py_is_up = NULL; if (! PyArg_ParseTuple(args, "s", &nic_name)) return NULL; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) goto error; strncpy(ifr.ifr_name, nic_name, sizeof(ifr.ifr_name)); // is up? ret = ioctl(sock, SIOCGIFFLAGS, &ifr); if (ret == -1) goto error; if ((ifr.ifr_flags & IFF_UP) != 0) py_is_up = Py_True; else py_is_up = Py_False; Py_INCREF(py_is_up); // MTU ret = ioctl(sock, SIOCGIFMTU, &ifr); if (ret == -1) goto error; mtu = ifr.ifr_mtu; // speed / duplex memset(&ifmed, 0, sizeof(struct ifmediareq)); strlcpy(ifmed.ifm_name, nic_name, sizeof(ifmed.ifm_name)); ret = ioctl(sock, SIOCGIFMEDIA, (caddr_t)&ifmed); if (ret == -1) { speed = 0; duplex = 0; } else { speed = psutil_get_nic_speed(ifmed.ifm_active); if ((ifmed.ifm_active | IFM_FDX) == ifmed.ifm_active) duplex = 2; else if ((ifmed.ifm_active | IFM_HDX) == ifmed.ifm_active) duplex = 1; else duplex = 0; } close(sock); Py_DECREF(py_is_up); return Py_BuildValue("[Oiii]", py_is_up, duplex, speed, mtu); error: Py_XDECREF(py_is_up); if (sock != 0) close(sock); PyErr_SetFromErrno(PyExc_OSError); return NULL; }