summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2019-02-24 09:55:52 -0800
committerGitHub <noreply@github.com>2019-02-24 09:55:52 -0800
commit7a2572268168e96c8841ca83ab1a89735ec02c3a (patch)
tree656a58683c5c48308152b302f1a31c4c82e74106
parent88beee9e0d169e979a3027bf9e61c59ccc1ad6e3 (diff)
downloadpsutil-7a2572268168e96c8841ca83ab1a89735ec02c3a.tar.gz
#1428 in case of error, show the C syscall which caused it
-rw-r--r--psutil/_psutil_bsd.c2
-rw-r--r--psutil/_psutil_common.c27
-rw-r--r--psutil/_psutil_common.h1
-rw-r--r--psutil/_psutil_linux.c7
-rw-r--r--psutil/_psutil_osx.c61
-rw-r--r--psutil/_psutil_windows.c54
-rw-r--r--psutil/arch/freebsd/specific.c138
-rw-r--r--psutil/arch/osx/process_info.c37
-rw-r--r--psutil/arch/windows/process_info.c48
-rw-r--r--psutil/arch/windows/services.c22
-rwxr-xr-xpsutil/tests/test_system.py4
11 files changed, 239 insertions, 162 deletions
diff --git a/psutil/_psutil_bsd.c b/psutil/_psutil_bsd.c
index dce157f5..073ff02d 100644
--- a/psutil/_psutil_bsd.c
+++ b/psutil/_psutil_bsd.c
@@ -804,7 +804,7 @@ psutil_users(PyObject *self, PyObject *args) {
fp = fopen(_PATH_UTMP, "r");
if (fp == NULL) {
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromErrnoWithFilename(PyExc_OSError, _PATH_UTMP);
goto error;
}
diff --git a/psutil/_psutil_common.c b/psutil/_psutil_common.c
index db1a0460..a4899487 100644
--- a/psutil/_psutil_common.c
+++ b/psutil/_psutil_common.c
@@ -7,8 +7,9 @@
*/
#include <Python.h>
-#include <stdio.h>
-
+#ifdef _WIN32
+#include <windows.h>
+#endif
// Global vars.
int PSUTIL_DEBUG = 0;
@@ -51,6 +52,28 @@ NoSuchProcess(const char *msg) {
/*
+ * Same as PyErr_SetFromErrno(0) but adds the syscall to the exception
+ * message.
+ */
+PyObject *
+PyErr_SetFromOSErrnoWithSyscall(const char *syscall) {
+ char fullmsg[1024];
+
+#ifdef _WIN32
+ sprintf(fullmsg, "originated from %s", syscall);
+ PyErr_SetFromWindowsErrWithFilename(GetLastError(), fullmsg);
+#else
+ PyObject *exc;
+ sprintf(fullmsg, "%s (originated from %s)", strerror(errno), syscall);
+ exc = PyObject_CallFunction(PyExc_OSError, "(is)", errno, fullmsg);
+ PyErr_SetObject(PyExc_OSError, exc);
+ Py_XDECREF(exc);
+#endif
+ return NULL;
+}
+
+
+/*
* Set OSError(errno=EACCES, strerror="Permission denied") Python exception.
* If msg != "" the exception message will change in accordance.
*/
diff --git a/psutil/_psutil_common.h b/psutil/_psutil_common.h
index e107166a..70698107 100644
--- a/psutil/_psutil_common.h
+++ b/psutil/_psutil_common.h
@@ -22,6 +22,7 @@ PyObject* PyUnicode_DecodeFSDefaultAndSize(char *s, Py_ssize_t size);
PyObject* AccessDenied(const char *msg);
PyObject* NoSuchProcess(const char *msg);
+PyObject* PyErr_SetFromOSErrnoWithSyscall(const char *syscall);
PyObject* psutil_set_testing(PyObject *self, PyObject *args);
void psutil_debug(const char* format, ...);
diff --git a/psutil/_psutil_linux.c b/psutil/_psutil_linux.c
index 5b7a56ad..be808633 100644
--- a/psutil/_psutil_linux.c
+++ b/psutil/_psutil_linux.c
@@ -535,7 +535,7 @@ psutil_net_if_duplex_speed(PyObject* self, PyObject* args) {
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
- goto error;
+ return PyErr_SetFromOSErrnoWithSyscall("socket()");
strncpy(ifr.ifr_name, nic_name, sizeof(ifr.ifr_name));
// duplex and speed
@@ -558,20 +558,21 @@ psutil_net_if_duplex_speed(PyObject* self, PyObject* args) {
speed = 0;
}
else {
+ PyErr_SetFromOSErrnoWithSyscall("ioctl(SIOCETHTOOL)");
goto error;
}
}
- close(sock);
py_retlist = Py_BuildValue("[ii]", duplex, speed);
if (!py_retlist)
goto error;
+ close(sock);
return py_retlist;
error:
if (sock != -1)
close(sock);
- return PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
}
diff --git a/psutil/_psutil_osx.c b/psutil/_psutil_osx.c
index be08de55..1b98cc58 100644
--- a/psutil/_psutil_osx.c
+++ b/psutil/_psutil_osx.c
@@ -141,31 +141,22 @@ psutil_pids(PyObject *self, PyObject *args) {
if (py_retlist == NULL)
return NULL;
- if (psutil_get_proc_list(&proclist, &num_processes) != 0) {
- if (errno != 0) {
- PyErr_SetFromErrno(PyExc_OSError);
- }
- else {
- PyErr_SetString(PyExc_RuntimeError,
- "failed to retrieve process list");
- }
+ if (psutil_get_proc_list(&proclist, &num_processes) != 0)
goto error;
- }
- if (num_processes > 0) {
- // save the address of proclist so we can free it later
- orig_address = proclist;
- for (idx = 0; idx < num_processes; idx++) {
- py_pid = Py_BuildValue("i", proclist->kp_proc.p_pid);
- if (! py_pid)
- goto error;
- if (PyList_Append(py_retlist, py_pid))
- goto error;
- Py_DECREF(py_pid);
- proclist++;
- }
- free(orig_address);
+ // save the address of proclist so we can free it later
+ orig_address = proclist;
+ for (idx = 0; idx < num_processes; idx++) {
+ py_pid = Py_BuildValue("i", proclist->kp_proc.p_pid);
+ if (! py_pid)
+ goto error;
+ if (PyList_Append(py_retlist, py_pid))
+ goto error;
+ Py_DECREF(py_pid);
+ proclist++;
}
+ free(orig_address);
+
return py_retlist;
error:
@@ -622,8 +613,10 @@ psutil_proc_memory_uss(PyObject *self, PyObject *args) {
return NULL;
len = sizeof(cpu_type);
- if (sysctlbyname("sysctl.proc_cputype", &cpu_type, &len, NULL, 0) != 0)
- return PyErr_SetFromErrno(PyExc_OSError);
+ if (sysctlbyname("sysctl.proc_cputype", &cpu_type, &len, NULL, 0) != 0) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('sysctl.proc_cputype')");
+ }
// Roughly based on libtop_update_vm_regions in
// http://www.opensource.apple.com/source/top/top-100.1.2/libtop.c
@@ -863,12 +856,18 @@ psutil_cpu_freq(PyObject *self, PyObject *args) {
int64_t max;
size_t size = sizeof(int64_t);
- if (sysctlbyname("hw.cpufrequency", &curr, &size, NULL, 0))
- return PyErr_SetFromErrno(PyExc_OSError);
- if (sysctlbyname("hw.cpufrequency_min", &min, &size, NULL, 0))
- return PyErr_SetFromErrno(PyExc_OSError);
- if (sysctlbyname("hw.cpufrequency_max", &max, &size, NULL, 0))
- return PyErr_SetFromErrno(PyExc_OSError);
+ if (sysctlbyname("hw.cpufrequency", &curr, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('hw.cpufrequency')");
+ }
+ if (sysctlbyname("hw.cpufrequency_min", &min, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('hw.cpufrequency_min')");
+ }
+ if (sysctlbyname("hw.cpufrequency_max", &max, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('hw.cpufrequency_max')");
+ }
return Py_BuildValue(
"KKK",
@@ -1370,7 +1369,7 @@ psutil_proc_connections(PyObject *self, PyObject *args) {
// check for inet_ntop failures
if (errno != 0) {
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("inet_ntop()");
goto error;
}
diff --git a/psutil/_psutil_windows.c b/psutil/_psutil_windows.c
index bcdc3e0b..7dc37ee1 100644
--- a/psutil/_psutil_windows.c
+++ b/psutil/_psutil_windows.c
@@ -286,7 +286,7 @@ psutil_proc_kill(PyObject *self, PyObject *args) {
err = GetLastError();
// See: https://github.com/giampaolo/psutil/issues/1099
if (err != ERROR_ACCESS_DENIED) {
- PyErr_SetFromWindowsErr(err);
+ PyErr_SetFromOSErrnoWithSyscall("TerminateProcess");
CloseHandle(hProcess);
return NULL;
}
@@ -332,7 +332,7 @@ psutil_proc_wait(PyObject *self, PyObject *args) {
// handle return code
if (retVal == WAIT_FAILED) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("WaitForSingleObject");
CloseHandle(hProcess);
return NULL;
}
@@ -354,7 +354,7 @@ psutil_proc_wait(PyObject *self, PyObject *args) {
// process is gone so we can get its process exit code. The PID
// may still stick around though but we'll handle that from Python.
if (GetExitCodeProcess(hProcess, &ExitCode) == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("GetExitCodeProcess");
CloseHandle(hProcess);
return NULL;
}
@@ -652,7 +652,7 @@ psutil_proc_exe(PyObject *self, PyObject *args) {
#if (_WIN32_WINNT >= 0x0600) // Windows >= Vista
memset(exe, 0, MAX_PATH);
if (QueryFullProcessImageNameW(hProcess, 0, exe, &size) == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("QueryFullProcessImageNameW");
CloseHandle(hProcess);
return NULL;
}
@@ -662,7 +662,7 @@ psutil_proc_exe(PyObject *self, PyObject *args) {
if (GetLastError() == 0)
PyErr_SetFromWindowsErr(ERROR_ACCESS_DENIED);
else
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("GetProcessImageFileNameW");
CloseHandle(hProcess);
return NULL;
}
@@ -689,11 +689,11 @@ psutil_proc_name(PyObject *self, PyObject *args) {
return NULL;
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, pid);
if (hSnapShot == INVALID_HANDLE_VALUE)
- return PyErr_SetFromWindowsErr(0);
+ return PyErr_SetFromOSErrnoWithSyscall("CreateToolhelp32Snapshot");
pentry.dwSize = sizeof(PROCESSENTRY32W);
ok = Process32FirstW(hSnapShot, &pentry);
if (! ok) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("Process32FirstW");
CloseHandle(hSnapShot);
return NULL;
}
@@ -944,7 +944,7 @@ psutil_per_cpu_times(PyObject *self, PyObject *args) {
// allocates an array of _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION
// structures, one per processor
sppi = (_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION *) \
- malloc(ncpus * sizeof(_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION));
+ malloc(ncpus * sizeof(_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION));
if (sppi == NULL) {
PyErr_NoMemory();
goto error;
@@ -1046,7 +1046,7 @@ psutil_proc_suspend_or_resume(DWORD pid, int suspend) {
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("CreateToolhelp32Snapshot");
return FALSE;
}
@@ -1054,7 +1054,7 @@ psutil_proc_suspend_or_resume(DWORD pid, int suspend) {
te32.dwSize = sizeof(THREADENTRY32);
if (! Thread32First(hThreadSnap, &te32)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("Thread32First");
CloseHandle(hThreadSnap);
return FALSE;
}
@@ -1067,14 +1067,14 @@ psutil_proc_suspend_or_resume(DWORD pid, int suspend) {
hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE,
te32.th32ThreadID);
if (hThread == NULL) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("OpenThread");
CloseHandle(hThread);
CloseHandle(hThreadSnap);
return FALSE;
}
if (suspend == 1) {
if (SuspendThread(hThread) == (DWORD) - 1) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("SuspendThread");
CloseHandle(hThread);
CloseHandle(hThreadSnap);
return FALSE;
@@ -1082,7 +1082,7 @@ psutil_proc_suspend_or_resume(DWORD pid, int suspend) {
}
else {
if (ResumeThread(hThread) == (DWORD) - 1) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("ResumeThread");
CloseHandle(hThread);
CloseHandle(hThreadSnap);
return FALSE;
@@ -1156,7 +1156,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) {
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("CreateToolhelp32Snapshot");
goto error;
}
@@ -1164,7 +1164,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) {
te32.dwSize = sizeof(THREADENTRY32);
if (! Thread32First(hThreadSnap, &te32)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("Thread32First");
goto error;
}
@@ -1184,7 +1184,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) {
rc = GetThreadTimes(hThread, &ftDummy, &ftDummy, &ftKernel,
&ftUser);
if (rc == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("GetThreadTimes");
goto error;
}
@@ -1311,7 +1311,7 @@ psutil_proc_username(PyObject *self, PyObject *args) {
return NULL;
if (!OpenProcessToken(processHandle, TOKEN_QUERY, &tokenHandle)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("OpenProcessToken");
goto error;
}
@@ -1334,7 +1334,7 @@ psutil_proc_username(PyObject *self, PyObject *args) {
continue;
}
else {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("GetTokenInformation");
goto error;
}
}
@@ -1367,7 +1367,7 @@ psutil_proc_username(PyObject *self, PyObject *args) {
continue;
}
else {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("LookupAccountSidW");
goto error;
}
}
@@ -2570,7 +2570,7 @@ psutil_users(PyObject *self, PyObject *args) {
return NULL;
if (WTSEnumerateSessions(hServer, 0, 1, &sessions, &count) == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("WTSEnumerateSessions");
goto error;
}
@@ -2590,7 +2590,7 @@ psutil_users(PyObject *self, PyObject *args) {
bytes = 0;
if (WTSQuerySessionInformationW(hServer, sessionId, WTSUserName,
&buffer_user, &bytes) == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("WTSQuerySessionInformationW");
goto error;
}
if (bytes <= 2)
@@ -2600,7 +2600,7 @@ psutil_users(PyObject *self, PyObject *args) {
bytes = 0;
if (WTSQuerySessionInformation(hServer, sessionId, WTSClientAddress,
&buffer_addr, &bytes) == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("WTSQuerySessionInformation");
goto error;
}
@@ -2630,6 +2630,7 @@ psutil_users(PyObject *self, PyObject *args) {
sizeof(station_info),
&returnLen))
{
+ PyErr_SetFromOSErrnoWithSyscall("WinStationQueryInformationW");
goto error;
}
@@ -3295,7 +3296,8 @@ psutil_cpu_stats(PyObject *self, PyObject *args) {
ncpus * sizeof(_SYSTEM_PERFORMANCE_INFORMATION),
NULL);
if (status != 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "NtQuerySystemInformation(SYSTEM_PERFORMANCE_INFORMATION)");
goto error;
}
@@ -3313,7 +3315,8 @@ psutil_cpu_stats(PyObject *self, PyObject *args) {
ncpus * sizeof(SYSTEM_INTERRUPT_INFORMATION),
NULL);
if (status != 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "NtQuerySystemInformation(SYSTEM_INTERRUPT_INFORMATION)");
goto error;
}
for (i = 0; i < ncpus; i++) {
@@ -3334,7 +3337,8 @@ psutil_cpu_stats(PyObject *self, PyObject *args) {
ncpus * sizeof(_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION),
NULL);
if (status != 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "NtQuerySystemInformation(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION)");
goto error;
}
diff --git a/psutil/arch/freebsd/specific.c b/psutil/arch/freebsd/specific.c
index 93bf51ff..26b80242 100644
--- a/psutil/arch/freebsd/specific.c
+++ b/psutil/arch/freebsd/specific.c
@@ -54,7 +54,7 @@ psutil_kinfo_proc(const pid_t pid, struct kinfo_proc *proc) {
size = sizeof(struct kinfo_proc);
if (sysctl((int *)mib, 4, proc, &size, NULL, 0) == -1) {
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_PROC_PID)");
return -1;
}
@@ -209,7 +209,7 @@ static char
size = argmax;
if (sysctl(mib, 4, procargs, &size, NULL, 0) == -1) {
free(procargs);
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_PROC_ARGS)");
return NULL;
}
@@ -287,10 +287,13 @@ psutil_proc_exe(PyObject *self, PyObject *args) {
error = sysctl(mib, 4, pathname, &size, NULL, 0);
if (error == -1) {
// see: https://github.com/giampaolo/psutil/issues/907
- if (errno == ENOENT)
+ if (errno == ENOENT) {
return PyUnicode_DecodeFSDefault("");
- else
- return PyErr_SetFromErrno(PyExc_OSError);
+ }
+ else {
+ return \
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_PROC_PATHNAME)");
+ }
}
if (size == 0 || strlen(pathname) == 0) {
ret = psutil_pid_exists(pid);
@@ -350,7 +353,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) {
size = 0;
error = sysctl(mib, 4, NULL, &size, NULL, 0);
if (error == -1) {
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_PROC_INC_THREAD)");
goto error;
}
if (size == 0) {
@@ -366,7 +369,7 @@ psutil_proc_threads(PyObject *self, PyObject *args) {
error = sysctl(mib, 4, kip, &size, NULL, 0);
if (error == -1) {
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_PROC_INC_THREAD)");
goto error;
}
if (size == 0) {
@@ -447,26 +450,38 @@ psutil_virtual_mem(PyObject *self, PyObject *args) {
#endif
size_t buffers_size = sizeof(buffers);
- if (sysctlbyname("hw.physmem", &total, &size, NULL, 0))
- goto error;
- if (sysctlbyname("vm.stats.vm.v_active_count", &active, &size, NULL, 0))
- goto error;
- if (sysctlbyname("vm.stats.vm.v_inactive_count",
- &inactive, &size, NULL, 0))
- goto error;
- if (sysctlbyname("vm.stats.vm.v_wire_count", &wired, &size, NULL, 0))
- goto error;
+ if (sysctlbyname("hw.physmem", &total, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall("sysctlbyname('hw.physmem')");
+ }
+ if (sysctlbyname("vm.stats.vm.v_active_count", &active, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.vm.v_active_count')");
+ }
+ if (sysctlbyname("vm.stats.vm.v_inactive_count", &inactive, &size, NULL, 0))
+ {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.vm.v_inactive_count')");
+ }
+ if (sysctlbyname("vm.stats.vm.v_wire_count", &wired, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.vm.v_wire_count')");
+ }
// https://github.com/giampaolo/psutil/issues/997
- if (sysctlbyname("vm.stats.vm.v_cache_count", &cached, &size, NULL, 0))
+ if (sysctlbyname("vm.stats.vm.v_cache_count", &cached, &size, NULL, 0)) {
cached = 0;
- if (sysctlbyname("vm.stats.vm.v_free_count", &free, &size, NULL, 0))
- goto error;
- if (sysctlbyname("vfs.bufspace", &buffers, &buffers_size, NULL, 0))
- goto error;
+ }
+ if (sysctlbyname("vm.stats.vm.v_free_count", &free, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.vm.v_free_count')");
+ }
+ if (sysctlbyname("vfs.bufspace", &buffers, &buffers_size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall("sysctlbyname('vfs.bufspace')");
+ }
size = sizeof(vm);
- if (sysctl(mib, 2, &vm, &size, NULL, 0) != 0)
- goto error;
+ if (sysctl(mib, 2, &vm, &size, NULL, 0) != 0) {
+ return PyErr_SetFromOSErrnoWithSyscall("sysctl(CTL_VM | VM_METER)");
+ }
return Py_BuildValue("KKKKKKKK",
(unsigned long long) total,
@@ -478,9 +493,6 @@ psutil_virtual_mem(PyObject *self, PyObject *args) {
(unsigned long long) buffers,
(unsigned long long) (vm.t_vmshr + vm.t_rmshr) * pagesize // shared
);
-
-error:
- return PyErr_SetFromErrno(PyExc_OSError);
}
@@ -491,6 +503,7 @@ psutil_swap_mem(PyObject *self, PyObject *args) {
struct kvm_swap kvmsw[1];
unsigned int swapin, swapout, nodein, nodeout;
size_t size = sizeof(unsigned int);
+ int pagesize;
kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open failed");
if (kd == NULL) {
@@ -507,16 +520,28 @@ psutil_swap_mem(PyObject *self, PyObject *args) {
kvm_close(kd);
- if (sysctlbyname("vm.stats.vm.v_swapin", &swapin, &size, NULL, 0) == -1)
- goto error;
- if (sysctlbyname("vm.stats.vm.v_swapout", &swapout, &size, NULL, 0) == -1)
- goto error;
- if (sysctlbyname("vm.stats.vm.v_vnodein", &nodein, &size, NULL, 0) == -1)
- goto error;
- if (sysctlbyname("vm.stats.vm.v_vnodeout", &nodeout, &size, NULL, 0) == -1)
- goto error;
+ if (sysctlbyname("vm.stats.vm.v_swapin", &swapin, &size, NULL, 0) == -1) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.vm.v_swapin)'");
+ }
+ if (sysctlbyname("vm.stats.vm.v_swapout", &swapout, &size, NULL, 0) == -1){
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.vm.v_swapout)'");
+ }
+ if (sysctlbyname("vm.stats.vm.v_vnodein", &nodein, &size, NULL, 0) == -1) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.vm.v_vnodein)'");
+ }
+ if (sysctlbyname("vm.stats.vm.v_vnodeout", &nodeout, &size, NULL, 0) == -1) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.vm.v_vnodeout)'");
+ }
- int pagesize = getpagesize();
+ pagesize = getpagesize();
+ if (pagesize <= 0) {
+ PyErr_SetString(PyExc_ValueError, "invalid getpagesize()");
+ return NULL;
+ }
return Py_BuildValue(
"(KKKII)",
@@ -527,9 +552,6 @@ psutil_swap_mem(PyObject *self, PyObject *args) {
swapin + swapout, // swap in
nodein + nodeout // swap out
);
-
-error:
- return PyErr_SetFromErrno(PyExc_OSError);
}
@@ -629,7 +651,8 @@ psutil_per_cpu_times(PyObject *self, PyObject *args) {
size = sizeof(maxcpus);
if (sysctlbyname("kern.smp.maxcpus", &maxcpus, &size, NULL, 0) < 0) {
Py_DECREF(py_retlist);
- return PyErr_SetFromErrno(PyExc_OSError);
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('kern.smp.maxcpus')");
}
long cpu_time[maxcpus][CPUSTATES];
@@ -638,14 +661,14 @@ psutil_per_cpu_times(PyObject *self, PyObject *args) {
mib[1] = HW_NCPU;
len = sizeof(ncpu);
if (sysctl(mib, 2, &ncpu, &len, NULL, 0) == -1) {
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(HW_NCPU)");
goto error;
}
// per-cpu info
size = sizeof(cpu_time);
if (sysctlbyname("kern.cp_times", &cpu_time, &size, NULL, 0) == -1) {
- PyErr_SetFromErrno(PyExc_OSError);
+ PyErr_SetFromOSErrnoWithSyscall("sysctlbyname('kern.smp.maxcpus')");
goto error;
}
@@ -960,16 +983,26 @@ psutil_cpu_stats(PyObject *self, PyObject *args) {
unsigned int v_swtch;
size_t size = sizeof(v_soft);
- if (sysctlbyname("vm.stats.sys.v_soft", &v_soft, &size, NULL, 0))
- goto error;
- if (sysctlbyname("vm.stats.sys.v_intr", &v_intr, &size, NULL, 0))
- goto error;
- if (sysctlbyname("vm.stats.sys.v_syscall", &v_syscall, &size, NULL, 0))
- goto error;
- if (sysctlbyname("vm.stats.sys.v_trap", &v_trap, &size, NULL, 0))
- goto error;
- if (sysctlbyname("vm.stats.sys.v_swtch", &v_swtch, &size, NULL, 0))
- goto error;
+ if (sysctlbyname("vm.stats.sys.v_soft", &v_soft, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.sys.v_soft')");
+ }
+ if (sysctlbyname("vm.stats.sys.v_intr", &v_intr, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.sys.v_intr')");
+ }
+ if (sysctlbyname("vm.stats.sys.v_syscall", &v_syscall, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.sys.v_syscall')");
+ }
+ if (sysctlbyname("vm.stats.sys.v_trap", &v_trap, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.sys.v_trap')");
+ }
+ if (sysctlbyname("vm.stats.sys.v_swtch", &v_swtch, &size, NULL, 0)) {
+ return PyErr_SetFromOSErrnoWithSyscall(
+ "sysctlbyname('vm.stats.sys.v_swtch')");
+ }
return Py_BuildValue(
"IIIII",
@@ -979,9 +1012,6 @@ psutil_cpu_stats(PyObject *self, PyObject *args) {
v_syscall, // syscalls
v_trap // traps
);
-
-error:
- return PyErr_SetFromErrno(PyExc_OSError);
}
diff --git a/psutil/arch/osx/process_info.c b/psutil/arch/osx/process_info.c
index e5ecbaed..484254d5 100644
--- a/psutil/arch/osx/process_info.c
+++ b/psutil/arch/osx/process_info.c
@@ -59,8 +59,10 @@ psutil_get_proc_list(kinfo_proc **procList, size_t *procCount) {
*/
while (lim-- > 0) {
size = 0;
- if (sysctl((int *)mib3, 3, NULL, &size, NULL, 0) == -1)
- return errno;
+ if (sysctl((int *)mib3, 3, NULL, &size, NULL, 0) == -1) {
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_PROC_ALL)");
+ return 1;
+ }
size2 = size + (size >> 3); // add some
if (size2 > size) {
ptr = malloc(size2);
@@ -72,22 +74,32 @@ psutil_get_proc_list(kinfo_proc **procList, size_t *procCount) {
else {
ptr = malloc(size);
}
- if (ptr == NULL)
- return ENOMEM;
+ if (ptr == NULL) {
+ PyErr_NoMemory();
+ return 1;
+ }
if (sysctl((int *)mib3, 3, ptr, &size, NULL, 0) == -1) {
err = errno;
free(ptr);
- if (err != ENOMEM)
- return err;
+ if (err != ENOMEM) {
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_PROC_ALL)");
+ return 1;
+ }
}
else {
*procList = (kinfo_proc *)ptr;
*procCount = size / sizeof(kinfo_proc);
- return 0;
+ if (procCount <= 0) {
+ PyErr_Format(PyExc_RuntimeError, "no PIDs found");
+ return 1;
+ }
+ return 0; // success
}
}
- return ENOMEM;
+
+ PyErr_Format(PyExc_RuntimeError, "couldn't collect PIDs list");
+ return 1;
}
@@ -100,6 +112,7 @@ psutil_get_argmax() {
if (sysctl(mib, 2, &argmax, &size, NULL, 0) == 0)
return argmax;
+ PyErr_SetFromOSErrnoWithSyscall("sysctl(KERN_ARGMAX)");
return 0;
}
@@ -125,10 +138,8 @@ psutil_get_cmdline(long pid) {
// read argmax and allocate memory for argument space.
argmax = psutil_get_argmax();
- if (! argmax) {
- PyErr_SetFromErrno(PyExc_OSError);
+ if (! argmax)
goto error;
- }
procargs = (char *)malloc(argmax);
if (NULL == procargs) {
@@ -219,10 +230,8 @@ psutil_get_environ(long pid) {
// read argmax and allocate memory for argument space.
argmax = psutil_get_argmax();
- if (! argmax) {
- PyErr_SetFromErrno(PyExc_OSError);
+ if (! argmax)
goto error;
- }
procargs = (char *)malloc(argmax);
if (NULL == procargs) {
diff --git a/psutil/arch/windows/process_info.c b/psutil/arch/windows/process_info.c
index 9a698e42..5e0b9421 100644
--- a/psutil/arch/windows/process_info.c
+++ b/psutil/arch/windows/process_info.c
@@ -227,7 +227,10 @@ psutil_check_phandle(HANDLE hProcess, DWORD pid) {
else if (ret == 0)
return NoSuchProcess("");
else if (ret == -1)
- return PyErr_SetFromWindowsErr(0);
+ if (GetLastError() == ERROR_ACCESS_DENIED)
+ return PyErr_SetFromWindowsErr(0);
+ else
+ return PyErr_SetFromOSErrnoWithSyscall("OpenProcess");
else // -2
return NULL;
}
@@ -358,7 +361,7 @@ psutil_pid_is_running(DWORD pid) {
// Be strict and raise an exception; the caller is supposed
// to take -1 into account.
else {
- PyErr_SetFromWindowsErr(err);
+ PyErr_SetFromOSErrnoWithSyscall("OpenProcess(PROCESS_VM_READ)");
return -1;
}
}
@@ -392,7 +395,7 @@ psutil_pid_is_running(DWORD pid) {
return 1;
}
else {
- PyErr_SetFromWindowsErr(err);
+ PyErr_SetFromOSErrnoWithSyscall("GetExitCodeProcess");
return -1;
}
}
@@ -406,7 +409,7 @@ psutil_get_process_region_size(HANDLE hProcess, LPCVOID src, SIZE_T *psize) {
MEMORY_BASIC_INFORMATION info;
if (!VirtualQueryEx(hProcess, src, &info, sizeof(info))) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("VirtualQueryEx");
return -1;
}
@@ -488,7 +491,8 @@ psutil_get_process_data(long pid,
sizeof(LPVOID),
NULL)))
{
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "NtQueryInformationProcess(ProcessWow64Information)");
goto error;
}
@@ -499,7 +503,7 @@ psutil_get_process_data(long pid,
// read PEB
if (!ReadProcessMemory(hProcess, ppeb32, &peb32, sizeof(peb32), NULL)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("ReadProcessMemory");
goto error;
}
@@ -509,7 +513,8 @@ psutil_get_process_data(long pid,
&procParameters32,
sizeof(procParameters32),
NULL)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "ReadProcessMemory(ProcessParameters)");
goto error;
}
@@ -530,8 +535,8 @@ psutil_get_process_data(long pid,
#else
/* 32 bit case. Check if the target is also 32 bit. */
if (!IsWow64Process(GetCurrentProcess(), &weAreWow64) ||
- !IsWow64Process(hProcess, &theyAreWow64)) {
- PyErr_SetFromWindowsErr(0);
+ !IsWow64Process(hProcess, &theyAreWow64)) {
+ PyErr_SetFromOSErrnoWithSyscall("IsWow64Process");
goto error;
}
@@ -570,7 +575,8 @@ psutil_get_process_data(long pid,
sizeof(pbi64),
NULL)))
{
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "NtWow64QueryInformationProcess64(ProcessBasicInformation)");
goto error;
}
@@ -582,7 +588,7 @@ psutil_get_process_data(long pid,
sizeof(peb64),
NULL)))
{
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("NtWow64ReadVirtualMemory64");
goto error;
}
@@ -594,7 +600,8 @@ psutil_get_process_data(long pid,
sizeof(procParameters64),
NULL)))
{
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "NtWow64ReadVirtualMemory64(ProcessParameters)");
goto error;
}
@@ -626,7 +633,8 @@ psutil_get_process_data(long pid,
sizeof(pbi),
NULL)))
{
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "NtQueryInformationProcess(ProcessBasicInformation)");
goto error;
}
@@ -636,7 +644,7 @@ psutil_get_process_data(long pid,
&peb,
sizeof(peb),
NULL)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("ReadProcessMemory");
goto error;
}
@@ -646,7 +654,8 @@ psutil_get_process_data(long pid,
&procParameters,
sizeof(procParameters),
NULL)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall(
+ "ReadProcessMemory(ProcessParameters)");
goto error;
}
@@ -678,7 +687,6 @@ psutil_get_process_data(long pid,
}
buffer = calloc(size + 2, 1);
-
if (buffer == NULL) {
PyErr_NoMemory();
goto error;
@@ -693,13 +701,13 @@ psutil_get_process_data(long pid,
size,
NULL)))
{
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("NtWow64ReadVirtualMemory64");
goto error;
}
} else
#endif
if (!ReadProcessMemory(hProcess, src, buffer, size, NULL)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("ReadProcessMemory");
goto error;
}
@@ -751,7 +759,7 @@ psutil_get_cmdline_data(long pid, WCHAR **pdata, SIZE_T *psize) {
&ret_length
);
if (! NT_SUCCESS(status)) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("NtQueryInformationProcess");
goto error;
}
@@ -820,7 +828,7 @@ psutil_get_cmdline(long pid, int use_peb) {
// attempt to parse the command line using Win32 API
szArglist = CommandLineToArgvW(data, &nArgs);
if (szArglist == NULL) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("CommandLineToArgvW");
goto out;
}
diff --git a/psutil/arch/windows/services.c b/psutil/arch/windows/services.c
index 62a12861..92458494 100644
--- a/psutil/arch/windows/services.c
+++ b/psutil/arch/windows/services.c
@@ -24,13 +24,13 @@ psutil_get_service_handler(char *service_name, DWORD scm_access, DWORD access)
sc = OpenSCManager(NULL, NULL, scm_access);
if (sc == NULL) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("OpenSCManager");
return NULL;
}
hService = OpenService(sc, service_name, access);
if (hService == NULL) {
+ PyErr_SetFromOSErrnoWithSyscall("OpenService");
CloseServiceHandle(sc);
- PyErr_SetFromWindowsErr(0);
return NULL;
}
CloseServiceHandle(sc);
@@ -113,7 +113,7 @@ psutil_winservice_enumerate(PyObject *self, PyObject *args) {
sc = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if (sc == NULL) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("OpenSCManager");
return NULL;
}
@@ -213,13 +213,13 @@ psutil_winservice_query_config(PyObject *self, PyObject *args) {
bytesNeeded = 0;
QueryServiceConfigW(hService, NULL, 0, &bytesNeeded);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("QueryServiceConfigW");
goto error;
}
qsc = (QUERY_SERVICE_CONFIGW *)malloc(bytesNeeded);
ok = QueryServiceConfigW(hService, qsc, bytesNeeded, &bytesNeeded);
if (ok == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("QueryServiceConfigW");
goto error;
}
@@ -307,7 +307,7 @@ psutil_winservice_query_status(PyObject *self, PyObject *args) {
return Py_BuildValue("s", "");
}
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("QueryServiceStatusEx");
goto error;
}
ssp = (SERVICE_STATUS_PROCESS *)HeapAlloc(
@@ -321,7 +321,7 @@ psutil_winservice_query_status(PyObject *self, PyObject *args) {
ok = QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)ssp,
bytesNeeded, &bytesNeeded);
if (ok == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("QueryServiceStatusEx");
goto error;
}
@@ -381,7 +381,7 @@ psutil_winservice_query_descr(PyObject *self, PyObject *args) {
return Py_BuildValue("s", "");
}
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("QueryServiceConfig2W");
goto error;
}
@@ -389,7 +389,7 @@ psutil_winservice_query_descr(PyObject *self, PyObject *args) {
ok = QueryServiceConfig2W(hService, SERVICE_CONFIG_DESCRIPTION,
(LPBYTE)scd, bytesNeeded, &bytesNeeded);
if (ok == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("QueryServiceConfig2W");
goto error;
}
@@ -435,7 +435,7 @@ psutil_winservice_start(PyObject *self, PyObject *args) {
}
ok = StartService(hService, 0, NULL);
if (ok == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("StartService");
goto error;
}
@@ -471,7 +471,7 @@ psutil_winservice_stop(PyObject *self, PyObject *args) {
ok = ControlService(hService, SERVICE_CONTROL_STOP, &ssp);
Py_END_ALLOW_THREADS
if (ok == 0) {
- PyErr_SetFromWindowsErr(0);
+ PyErr_SetFromOSErrnoWithSyscall("ControlService");
goto error;
}
diff --git a/psutil/tests/test_system.py b/psutil/tests/test_system.py
index 7cc678f0..b0b7e4f0 100755
--- a/psutil/tests/test_system.py
+++ b/psutil/tests/test_system.py
@@ -766,7 +766,9 @@ class TestSystemAPIs(unittest.TestCase):
ls = psutil.cpu_freq(percpu=True)
if TRAVIS and not ls:
- return
+ raise self.skipTest("skipped on Travis")
+ if FREEBSD and not ls:
+ raise self.skipTest("returns empty list on FreeBSD")
assert ls, ls
check_ls([psutil.cpu_freq(percpu=False)])