Index: third_party/psutil/psutil/_psutil_osx.c |
diff --git a/third_party/psutil/psutil/_psutil_osx.c b/third_party/psutil/psutil/_psutil_osx.c |
index 29162f20b6f757eef9e692a2b8dfa83cc4c3a7a7..7edc5cadd30cd652e22a8a2a92dba9a93dbd0786 100644 |
--- a/third_party/psutil/psutil/_psutil_osx.c |
+++ b/third_party/psutil/psutil/_psutil_osx.c |
@@ -1,5 +1,5 @@ |
/* |
- * $Id: _psutil_osx.c 1142 2011-10-05 18:45:49Z g.rodola $ |
+ * $Id: _psutil_osx.c 1193 2011-10-22 18:24:53Z g.rodola@gmail.com $ |
* |
* Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved. |
* Use of this source code is governed by a BSD-style license that can be |
@@ -69,8 +69,8 @@ get_pid_list(PyObject* self, PyObject* args) |
Py_XDECREF(pid); |
proclist++; |
} |
+ free(orig_address); |
} |
- free(orig_address); |
return retlist; |
} |
@@ -918,13 +918,19 @@ get_process_connections(PyObject* self, PyObject* args) |
struct proc_fdinfo *fdp_pointer; |
struct socket_fdinfo si; |
- |
PyObject *retList = PyList_New(0); |
PyObject *tuple = NULL; |
PyObject *laddr = NULL; |
PyObject *raddr = NULL; |
+ PyObject *af_filter = NULL; |
+ PyObject *type_filter = NULL; |
- if (! PyArg_ParseTuple(args, "l", &pid)) { |
+ if (! PyArg_ParseTuple(args, "lOO", &pid, &af_filter, &type_filter)) { |
+ return NULL; |
+ } |
+ |
+ if (!PySequence_Check(af_filter) || !PySequence_Check(type_filter)) { |
+ PyErr_SetString(PyExc_TypeError, "arg 2 or 3 is not a sequence"); |
return NULL; |
} |
@@ -982,15 +988,12 @@ get_process_connections(PyObject* self, PyObject* args) |
int fd, family, type, lport, rport; |
char lip[200], rip[200]; |
char *state; |
+ int inseq; |
fd = (int)fdp_pointer->proc_fd; |
family = si.psi.soi_family; |
type = si.psi.soi_kind; |
- if ((family != AF_INET) && (family != AF_INET6)) { |
- continue; |
- } |
- |
if (type == 2) |
type = SOCK_STREAM; |
else if (type == 1) |
@@ -998,12 +1001,18 @@ get_process_connections(PyObject* self, PyObject* args) |
else |
continue; |
+ // apply filters |
+ inseq = PySequence_Contains(af_filter, PyLong_FromLong((long)family)); |
+ if (inseq == 0) |
+ continue; |
+ inseq = PySequence_Contains(type_filter, PyLong_FromLong((long)type)); |
+ if (inseq == 0) |
+ continue; |
+ |
if (errno != 0) { |
- printf("errno 1 = %i\n", errno); |
return PyErr_SetFromErrno(PyExc_OSError); |
} |
- |
if (family == AF_INET) { |
inet_ntop(AF_INET, |
&si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_laddr.ina_46.i46a_addr4, |
@@ -1267,10 +1276,12 @@ get_disk_io_counters(PyObject* self, PyObject* args) |
CFNumberGetValue(number, kCFNumberSInt64Type, &write_time); |
} |
+ // Read/Write time on OS X comes back in nanoseconds and in psutil |
+ // we've standardized on milliseconds so do the conversion. |
py_disk_info = Py_BuildValue("(KKKKKK)", |
reads, writes, |
read_bytes, write_bytes, |
- read_time, write_time); |
+ read_time / 1000, write_time / 1000); |
PyDict_SetItemString(py_retdict, disk_name, py_disk_info); |
Py_XDECREF(py_disk_info); |