Module Name: src
Committed By: chs
Date: Wed Feb 1 20:01:40 UTC 2017
Modified Files:
src/external/bsd/libproc/dist: proc_util.c
Log Message:
implement proc_getlwpstatus() for netbsd using PT_GET_SIGINFO.
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/external/bsd/libproc/dist/proc_util.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/libproc/dist/proc_util.c
diff -u src/external/bsd/libproc/dist/proc_util.c:1.4 src/external/bsd/libproc/dist/proc_util.c:1.5
--- src/external/bsd/libproc/dist/proc_util.c:1.4 Tue Apr 26 14:29:58 2016
+++ src/external/bsd/libproc/dist/proc_util.c Wed Feb 1 20:01:39 2017
@@ -36,6 +36,7 @@
#include <err.h>
#include <errno.h>
#include <signal.h>
+#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include "_libproc.h"
@@ -216,17 +217,39 @@ proc_getlwpstatus(struct proc_handle *ph
struct ptrace_lwpinfo lwpinfo;
lwpstatus_t *psp = &phdl->lwps;
siginfo_t *siginfo;
+ bool have_siginfo, sysentry, sysexit;
if (phdl == NULL)
return (NULL);
- lwpinfo.pl_lwpid = 1;
+ lwpinfo.pl_lwpid = 0;
if (ptrace(PT_LWPINFO, phdl->pid, (void *)&lwpinfo,
sizeof(lwpinfo)) < 0)
return (NULL);
+
+#ifdef PL_FLAG_SI
+ have_siginfo = (lwpinfo.pl_flags & PL_FLAG_SI) != 0;
+ sysentry = (lwpinfo.pl_flags & PL_FLAG_SCE) != 0;
+ sysexit = (lwpinfo.pl_flags & PL_FLAG_SCX) != 0;
+#endif
+#ifdef PT_GET_SIGINFO
+ have_siginfo = 1;
+ sysentry = 0;
+ sysexit = 0;
+#endif
+
+ if (lwpinfo.pl_event == PL_EVENT_SIGNAL && have_siginfo) {
#ifdef PL_FLAG_SI
- siginfo = &lwpinfo.pl_siginfo;
- if (lwpinfo.pl_event == PL_EVENT_SIGNAL &&
- (lwpinfo.pl_flags & PL_FLAG_SI) != 0) {
+ siginfo = &lwpinfo.pl_siginfo;
+#endif
+#ifdef PT_GET_SIGINFO
+ struct ptrace_siginfo si;
+
+ if (ptrace(PT_GET_SIGINFO, phdl->pid, (void *)&si,
+ sizeof(si)) < 0)
+ return (NULL);
+
+ siginfo = &si.psi_siginfo;
+#endif
if (siginfo->si_signo == SIGTRAP &&
(siginfo->si_code == TRAP_BRKPT ||
siginfo->si_code == TRAP_TRACE)) {
@@ -236,12 +259,10 @@ proc_getlwpstatus(struct proc_handle *ph
psp->pr_why = PR_SIGNALLED;
psp->pr_what = siginfo->si_signo;
}
- } else if (lwpinfo.pl_flags & PL_FLAG_SCE) {
+ } else if (sysentry) {
psp->pr_why = PR_SYSENTRY;
- } else if (lwpinfo.pl_flags & PL_FLAG_SCX) {
+ } else if (sysexit) {
psp->pr_why = PR_SYSEXIT;
}
-#endif
-
return (psp);
}