diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2019-02-24 09:55:52 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-24 09:55:52 -0800 |
commit | 7a2572268168e96c8841ca83ab1a89735ec02c3a (patch) | |
tree | 656a58683c5c48308152b302f1a31c4c82e74106 | |
parent | 88beee9e0d169e979a3027bf9e61c59ccc1ad6e3 (diff) | |
download | psutil-7a2572268168e96c8841ca83ab1a89735ec02c3a.tar.gz |
#1428 in case of error, show the C syscall which caused it
-rw-r--r-- | psutil/_psutil_bsd.c | 2 | ||||
-rw-r--r-- | psutil/_psutil_common.c | 27 | ||||
-rw-r--r-- | psutil/_psutil_common.h | 1 | ||||
-rw-r--r-- | psutil/_psutil_linux.c | 7 | ||||
-rw-r--r-- | psutil/_psutil_osx.c | 61 | ||||
-rw-r--r-- | psutil/_psutil_windows.c | 54 | ||||
-rw-r--r-- | psutil/arch/freebsd/specific.c | 138 | ||||
-rw-r--r-- | psutil/arch/osx/process_info.c | 37 | ||||
-rw-r--r-- | psutil/arch/windows/process_info.c | 48 | ||||
-rw-r--r-- | psutil/arch/windows/services.c | 22 | ||||
-rwxr-xr-x | psutil/tests/test_system.py | 4 |
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)]) |