int psutil_raise_ad_or_nsp(long pid) { // Set exception to AccessDenied if pid exists else NoSuchProcess. if (psutil_pid_exists(pid) == 0) NoSuchProcess(); else AccessDenied(); }
// XXX: This is no longer used as per // https://github.com/giampaolo/psutil/pull/557#issuecomment-171912820 // Current implementation uses /proc instead. // Left here just in case. PyObject * psutil_proc_exe(PyObject *self, PyObject *args) { #if __NetBSD_Version__ >= 799000000 pid_t pid; char pathname[MAXPATHLEN]; int error; int mib[4]; int ret; size_t size; if (! PyArg_ParseTuple(args, "l", &pid)) return NULL; if (pid == 0) { // else returns ENOENT return Py_BuildValue("s", ""); } mib[0] = CTL_KERN; mib[1] = KERN_PROC_ARGS; mib[2] = pid; mib[3] = KERN_PROC_PATHNAME; size = sizeof(pathname); error = sysctl(mib, 4, NULL, &size, NULL, 0); if (error == -1) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } error = sysctl(mib, 4, pathname, &size, NULL, 0); if (error == -1) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } if (size == 0 || strlen(pathname) == 0) { ret = psutil_pid_exists(pid); if (ret == -1) return NULL; else if (ret == 0) return NoSuchProcess(); else strcpy(pathname, ""); } #if PY_MAJOR_VERSION >= 3 return PyUnicode_DecodeFSDefault(pathname); #else return Py_BuildValue("s", pathname); #endif #else return Py_BuildValue("s", ""); #endif }
int psutil_raise_ad_or_nsp(long pid) { // Set exception to AccessDenied if pid exists else NoSuchProcess. int ret; ret = psutil_pid_exists(pid); if (ret == 0) NoSuchProcess(); else if (ret == 1) AccessDenied(); return ret; }
/* * Utility used for those syscalls which do not return a meaningful * error that we can translate into an exception which makes sense. * As such, we'll have to guess. * On UNIX, if errno is set, we return that one (OSError). * Else, if PID does not exist we assume the syscall failed because * of that so we raise NoSuchProcess. * If none of this is true we giveup and raise RuntimeError(msg). * This will always set a Python exception and return NULL. */ int psutil_raise_for_pid(long pid, char *syscall_name) { // Set exception to AccessDenied if pid exists else NoSuchProcess. if (errno != 0) { // Unlikely we get here. PyErr_SetFromErrno(PyExc_OSError); return 0; } else if (psutil_pid_exists(pid) == 0) { psutil_debug("%s syscall failed and PID %i no longer exists; " "assume NoSuchProcess", syscall_name, pid); NoSuchProcess(""); } else { PyErr_Format(PyExc_RuntimeError, "%s syscall failed", syscall_name); } return 0; }
/* * Return process pathname executable. * Thanks to Robert N. M. Watson: * http://fxr.googlebit.com/source/usr.bin/procstat/procstat_bin.c?v=8-CURRENT */ PyObject * psutil_proc_exe(PyObject *self, PyObject *args) { long pid; char pathname[PATH_MAX]; int error; int mib[4]; int ret; size_t size; const char *encoding_errs; if (! PyArg_ParseTuple(args, "l", &pid)) return NULL; mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PATHNAME; mib[3] = pid; size = sizeof(pathname); error = sysctl(mib, 4, pathname, &size, NULL, 0); if (error == -1) { PyErr_SetFromErrno(PyExc_OSError); return NULL; } if (size == 0 || strlen(pathname) == 0) { ret = psutil_pid_exists(pid); if (ret == -1) return NULL; else if (ret == 0) return NoSuchProcess(); else strcpy(pathname, ""); } #if PY_MAJOR_VERSION >= 3 return PyUnicode_DecodeFSDefault(pathname); #else return Py_BuildValue("s", pathname); #endif }