1*433d6423SLionel Sambuc #include <sys/cdefs.h> 2*433d6423SLionel Sambuc #include "namespace.h" 3*433d6423SLionel Sambuc #include <lib.h> 4*433d6423SLionel Sambuc 5*433d6423SLionel Sambuc #include <string.h> 6*433d6423SLionel Sambuc #include <sys/ptrace.h> 7*433d6423SLionel Sambuc 8*433d6423SLionel Sambuc int ptrace(int req, pid_t pid, void *addr, int data) 9*433d6423SLionel Sambuc { 10*433d6423SLionel Sambuc message m; 11*433d6423SLionel Sambuc 12*433d6423SLionel Sambuc memset(&m, 0, sizeof(m)); 13*433d6423SLionel Sambuc m.m_lc_pm_ptrace.pid = pid; 14*433d6423SLionel Sambuc m.m_lc_pm_ptrace.req = req; 15*433d6423SLionel Sambuc m.m_lc_pm_ptrace.addr = addr; 16*433d6423SLionel Sambuc m.m_lc_pm_ptrace.data = data; 17*433d6423SLionel Sambuc if (_syscall(PM_PROC_NR, PM_PTRACE, &m) < 0) return(-1); 18*433d6423SLionel Sambuc 19*433d6423SLionel Sambuc /* There was no error, but -1 is a legal return value. Clear errno if 20*433d6423SLionel Sambuc * necessary to distinguish this case. _syscall has set errno to nonzero 21*433d6423SLionel Sambuc * for the error case. 22*433d6423SLionel Sambuc */ 23*433d6423SLionel Sambuc if (m.m_pm_lc_ptrace.data == -1) errno = 0; 24*433d6423SLionel Sambuc return(m.m_pm_lc_ptrace.data); 25*433d6423SLionel Sambuc } 26