Lines Matching refs:pctx
72 static void (*pctx_cpc_callback)(cpc_t *cpc, struct __pctx *pctx);
83 pctx_error(pctx_t *pctx, const char *fn, const char *fmt, ...) in pctx_error() argument
88 pctx->errfn(fn, fmt, ap); in pctx_error()
105 pctx_t *pctx; in pctx_create() local
107 pctx = calloc(1, sizeof (*pctx)); in pctx_create()
108 pctx->uarg = arg; in pctx_create()
109 pctx->verbose = verbose; in pctx_create()
110 pctx->terminate = 0; in pctx_create()
111 pctx->errfn = errfn ? errfn : pctx_default_errfn; in pctx_create()
113 if ((pctx->Pr = Pcreate(filename, argv, &err, 0, 0)) == NULL) { in pctx_create()
116 pctx_error(pctx, fn, gettext("cannot trace set-id or " in pctx_create()
120 pctx_error(pctx, fn, gettext("cannot control LP64 " in pctx_create()
124 pctx_error(pctx, fn, gettext("cannot execute " in pctx_create()
128 pctx_error(pctx, fn, gettext("cannot find" in pctx_create()
132 pctx_error(pctx, fn, gettext("cannot fork, " in pctx_create()
136 pctx_error(pctx, fn, gettext("%s, program '%s'\n"), in pctx_create()
140 free(pctx); in pctx_create()
144 if (Psysentry(pctx->Pr, SYS_exit, 1) == -1) { in pctx_create()
145 pctx_error(pctx, fn, in pctx_create()
147 Prelease(pctx->Pr, PRELEASE_KILL); in pctx_create()
148 free(pctx); in pctx_create()
155 pctx->created = 1; in pctx_create()
156 (void) Psetflags(pctx->Pr, PR_KLC); in pctx_create()
157 (void) pctx_set_events(pctx, PCTX_NULL_EVENT); in pctx_create()
159 return (pctx); in pctx_create()
170 pctx_t *pctx; in pctx_capture() local
172 pctx = calloc(1, sizeof (*pctx)); in pctx_capture()
173 pctx->uarg = arg; in pctx_capture()
174 pctx->verbose = verbose; in pctx_capture()
175 pctx->errfn = errfn ? errfn : pctx_default_errfn; in pctx_capture()
177 if ((pctx->Pr = Pgrab(pid, 0, &err)) == NULL) { in pctx_capture()
180 pctx_error(pctx, fn, in pctx_capture()
184 pctx_error(pctx, fn, in pctx_capture()
188 pctx_error(pctx, fn, in pctx_capture()
192 pctx_error(pctx, fn, in pctx_capture()
197 pctx_error(pctx, fn, in pctx_capture()
201 pctx_error(pctx, fn, in pctx_capture()
205 pctx_error(pctx, fn, gettext("cannot control LP64 " in pctx_capture()
209 pctx_error(pctx, fn, gettext("%s: pid %d\n"), in pctx_capture()
213 free(pctx); in pctx_capture()
217 if (Psysentry(pctx->Pr, SYS_exit, 1) == -1) { in pctx_capture()
218 pctx_error(pctx, fn, in pctx_capture()
220 Prelease(pctx->Pr, PRELEASE_CLEAR); in pctx_capture()
221 free(pctx); in pctx_capture()
231 pctx->created = 0; in pctx_capture()
232 (void) Psetflags(pctx->Pr, PR_RLC); in pctx_capture()
233 (void) pctx_set_events(pctx, PCTX_NULL_EVENT); in pctx_capture()
235 return (pctx); in pctx_capture()
240 default_void(pctx_t *pctx) in default_void() argument
245 default_int(pctx_t *pctx) in default_int() argument
251 pctx_set_events(pctx_t *pctx, ...) in pctx_set_events() argument
258 va_start(pvar, pctx); in pctx_set_events()
264 pctx->exec = (pctx_sysc_execfn_t *) in pctx_set_events()
268 pctx->fork = (pctx_sysc_forkfn_t *) in pctx_set_events()
272 pctx->exit = (pctx_sysc_exitfn_t *) in pctx_set_events()
276 pctx->lwp_create = (pctx_sysc_lwp_createfn_t *) in pctx_set_events()
280 pctx->init_lwp = (pctx_init_lwpfn_t *) in pctx_set_events()
284 pctx->fini_lwp = (pctx_fini_lwpfn_t *) in pctx_set_events()
288 pctx->lwp_exit = (pctx_sysc_lwp_exitfn_t *) in pctx_set_events()
292 pctx_error(pctx, fn, in pctx_set_events()
303 if (pctx->exec == NULL) in pctx_set_events()
304 pctx->exec = (pctx_sysc_execfn_t *)default_int; in pctx_set_events()
305 if (pctx->fork == NULL) in pctx_set_events()
306 pctx->fork = (pctx_sysc_forkfn_t *)default_void; in pctx_set_events()
307 if (pctx->exit == NULL) in pctx_set_events()
308 pctx->exit = (pctx_sysc_exitfn_t *)default_void; in pctx_set_events()
309 if (pctx->lwp_create == NULL) in pctx_set_events()
310 pctx->lwp_create = (pctx_sysc_lwp_createfn_t *)default_int; in pctx_set_events()
311 if (pctx->init_lwp == NULL) in pctx_set_events()
312 pctx->init_lwp = (pctx_init_lwpfn_t *)default_int; in pctx_set_events()
313 if (pctx->fini_lwp == NULL) in pctx_set_events()
314 pctx->fini_lwp = (pctx_fini_lwpfn_t *)default_int; in pctx_set_events()
315 if (pctx->lwp_exit == NULL) in pctx_set_events()
316 pctx->lwp_exit = (pctx_sysc_lwp_exitfn_t *)default_int; in pctx_set_events()
318 if (pctx->fork != (pctx_sysc_forkfn_t *)default_void) { in pctx_set_events()
319 (void) Psysexit(pctx->Pr, SYS_vfork, 1); in pctx_set_events()
320 (void) Psysexit(pctx->Pr, SYS_forksys, 1); in pctx_set_events()
321 if (Psetflags(pctx->Pr, PR_FORK) == -1) in pctx_set_events()
324 (void) Psysexit(pctx->Pr, SYS_vfork, 0); in pctx_set_events()
325 (void) Psysexit(pctx->Pr, SYS_forksys, 0); in pctx_set_events()
326 if (Punsetflags(pctx->Pr, PR_FORK) == -1) in pctx_set_events()
334 if (pctx->exec != (pctx_sysc_execfn_t *)default_int || in pctx_set_events()
335 pctx->fini_lwp != (pctx_fini_lwpfn_t *)default_int || in pctx_set_events()
336 pctx->init_lwp != (pctx_init_lwpfn_t *)default_int) { in pctx_set_events()
337 (void) Psysexit(pctx->Pr, SYS_execve, 1); in pctx_set_events()
338 (void) Psysentry(pctx->Pr, SYS_execve, 1); in pctx_set_events()
340 (void) Psysexit(pctx->Pr, SYS_execve, 0); in pctx_set_events()
341 (void) Psysentry(pctx->Pr, SYS_execve, 0); in pctx_set_events()
344 (void) Psysexit(pctx->Pr, SYS_lwp_create, in pctx_set_events()
345 pctx->lwp_create != (pctx_sysc_lwp_createfn_t *)default_int || in pctx_set_events()
346 pctx->init_lwp != (pctx_init_lwpfn_t *)default_int); in pctx_set_events()
348 (void) Psysentry(pctx->Pr, SYS_lwp_exit, in pctx_set_events()
349 pctx->lwp_exit != (pctx_sysc_lwp_exitfn_t *)default_int || in pctx_set_events()
350 pctx->fini_lwp != (pctx_fini_lwpfn_t *)default_int); in pctx_set_events()
374 pctx_begin_syscalls(pctx_t *pctx) in pctx_begin_syscalls() argument
376 if (pctx->Pr == NULL) in pctx_begin_syscalls()
378 if (pctx->sigblocked++ == 0) { in pctx_begin_syscalls()
379 (void) sigprocmask(SIG_BLOCK, &termsig, &pctx->savedset); in pctx_begin_syscalls()
380 (void) Pcreate_agent(pctx->Pr); in pctx_begin_syscalls()
385 pctx_end_syscalls(pctx_t *pctx) in pctx_end_syscalls() argument
387 if (pctx->Pr == NULL) in pctx_end_syscalls()
389 if (--pctx->sigblocked == 0) { in pctx_end_syscalls()
390 (void) Pdestroy_agent(pctx->Pr); in pctx_end_syscalls()
391 (void) sigprocmask(SIG_SETMASK, &pctx->savedset, NULL); in pctx_end_syscalls()
400 pctx_lwpiterate(pctx_t *pctx, int (*action)(pctx_t *, pid_t, id_t, void *)) in pctx_lwpiterate() argument
413 pstatus = Pstatus(pctx->Pr); in pctx_lwpiterate()
415 pctx_begin_syscalls(pctx); in pctx_lwpiterate()
416 ret = action(pctx, pstatus->pr_pid, 1, pctx->uarg); in pctx_lwpiterate()
417 pctx_end_syscalls(pctx); in pctx_lwpiterate()
442 pctx_begin_syscalls(pctx); in pctx_lwpiterate()
444 if (action(pctx, in pctx_lwpiterate()
445 pstatus->pr_pid, lwps->pr_lwpid, pctx->uarg) != 0) in pctx_lwpiterate()
450 pctx_end_syscalls(pctx); in pctx_lwpiterate()
461 pctx_free(pctx_t *pctx) in pctx_free() argument
463 if (pctx->cpc != NULL && pctx_cpc_callback != NULL) in pctx_free()
464 (*pctx_cpc_callback)(pctx->cpc, pctx); in pctx_free()
465 if (pctx->Pr) { in pctx_free()
466 Pfree(pctx->Pr); in pctx_free()
467 pctx->Pr = NULL; in pctx_free()
469 pctx->errfn = pctx_default_errfn; in pctx_free()
476 pctx_release(pctx_t *pctx) in pctx_release() argument
478 if (pctx->Pr) { in pctx_release()
479 Prelease(pctx->Pr, PRELEASE_CLEAR); in pctx_release()
480 pctx->Pr = NULL; in pctx_release()
483 pctx_free(pctx); in pctx_release()
484 bzero(pctx, sizeof (*pctx)); in pctx_release()
485 free(pctx); in pctx_release()
520 pctx_t *pctx, in pctx_run() argument
533 pid_t pid = Pstatus(pctx->Pr)->pr_pid; in pctx_run()
551 if (pctx_lwpiterate(pctx, pctx->init_lwp) != 0) { in pctx_run()
552 if (pctx->verbose) in pctx_run()
553 pctx_error(pctx, fn, in pctx_run()
573 while (running == 1 && !pctx->terminate) { in pctx_run()
575 if (Psetrun(pctx->Pr, 0, 0) != 0) { in pctx_run()
576 if (pctx->verbose) in pctx_run()
577 pctx_error(pctx, fn, in pctx_run()
605 } while (mswait == 0 && !pctx->terminate); in pctx_run()
608 if (pctx->terminate) in pctx_run()
611 (void) Pwait(pctx->Pr, mswait); in pctx_run()
614 switch (pstate = Pstate(pctx->Pr)) { in pctx_run()
619 if (Pstop(pctx->Pr, 5 * MILLISEC) == -1 || in pctx_run()
620 (pstate = Pstate(pctx->Pr)) != PS_STOP) { in pctx_run()
621 pctx_error(pctx, fn, in pctx_run()
633 (void) Preopen(pctx->Pr); in pctx_run()
634 if ((pstate = Pstate(pctx->Pr)) != PS_LOST) in pctx_run()
636 pctx_error(pctx, fn, in pctx_run()
643 if (pctx->verbose) in pctx_run()
644 pctx_error(pctx, fn, in pctx_run()
650 if (pctx->verbose) in pctx_run()
651 pctx_error(pctx, fn, in pctx_run()
660 pstatus = Pstatus(pctx->Pr); in pctx_run()
674 if (pctx_lwpiterate(pctx, tick) != 0) in pctx_run()
682 pctx_begin_syscalls(pctx); in pctx_run()
683 (void) pctx->fini_lwp(pctx, in pctx_run()
684 pid, lwpid, pctx->uarg); in pctx_run()
685 (void) pctx->lwp_exit(pctx, in pctx_run()
686 pid, lwpid, pctx->uarg); in pctx_run()
687 pctx_end_syscalls(pctx); in pctx_run()
690 if (pctx_lwpiterate(pctx, pctx->fini_lwp) in pctx_run()
693 pctx->exit(pctx, pid, lwpid, in pctx_run()
695 pctx->uarg); in pctx_run()
700 (void) pctx_lwpiterate(pctx, pctx->fini_lwp); in pctx_run()
703 pctx_error(pctx, fn, in pctx_run()
718 if (pctx_lwpiterate(pctx, in pctx_run()
719 pctx->init_lwp) == 0) in pctx_run()
725 if (pctx->exec == (pctx_sysc_execfn_t *) in pctx_run()
731 Ppsinfo(pctx->Pr), sizeof (psinfo)); in pctx_run()
733 pctx_begin_syscalls(pctx); in pctx_run()
734 if (pctx->exec(pctx, pid, lwpid, in pctx_run()
735 psinfo.pr_psargs, pctx->uarg) != 0) in pctx_run()
737 if (running == 1 && pctx->init_lwp(pctx, in pctx_run()
738 pid, 1, pctx->uarg) != 0) in pctx_run()
740 pctx_end_syscalls(pctx); in pctx_run()
746 pctx_begin_syscalls(pctx); in pctx_run()
747 if (pctx->init_lwp(pctx, pid, lwpid, in pctx_run()
748 pctx->uarg) != 0) in pctx_run()
750 if (running == 1 && pctx->lwp_create(pctx, in pctx_run()
751 pid, lwpid, pctx->uarg) != 0) in pctx_run()
753 pctx_end_syscalls(pctx); in pctx_run()
767 wascreated = pctx->created; in pctx_run()
768 forkfn = pctx->fork; in pctx_run()
769 pctx_free(pctx); in pctx_run()
770 pctx = pctx_capture(pid, pctx->uarg, in pctx_run()
771 pctx->verbose, pctx->errfn); in pctx_run()
772 if (pctx != NULL) { in pctx_run()
779 pctx->created = 1; in pctx_run()
781 pctx->Pr, PR_KLC); in pctx_run()
783 (*forkfn)(pctx, ppid, pid, in pctx_run()
784 lwpid, pctx->uarg); in pctx_run()
785 pctx_release(pctx); in pctx_run()
792 pctx_error(pctx, fn, in pctx_run()
802 pctx_error(pctx, fn, gettext( in pctx_run()
809 if (pctx->verbose) in pctx_run()
810 pctx_error(pctx, fn, in pctx_run()
814 if (pctx->verbose) in pctx_run()
815 pctx_error(pctx, fn, in pctx_run()
821 if (pctx->verbose) in pctx_run()
822 pctx_error(pctx, fn, in pctx_run()
826 if (pctx->verbose) in pctx_run()
827 pctx_error(pctx, fn, in pctx_run()
831 if (pctx->verbose) in pctx_run()
832 pctx_error(pctx, fn, in pctx_run()
837 if (pctx->verbose) in pctx_run()
838 pctx_error(pctx, fn, in pctx_run()
849 if (pctx->terminate) in pctx_run()
858 pctx_error(pctx, fn, gettext("lost control of pid %d\n"), in pctx_run()
860 pctx_free(pctx); in pctx_run()
870 __pctx_cpc(pctx_t *pctx, cpc_t *cpc, in __pctx_cpc() argument
884 if (pctx->cpc != NULL && pctx->cpc != cpc && pctx_cpc_callback != NULL) in __pctx_cpc()
885 (*pctx_cpc_callback)(pctx->cpc, pctx); in __pctx_cpc()
886 pctx->cpc = cpc; in __pctx_cpc()
974 error = Psyscall(pctx->Pr, &rval, SYS_cpc, 5, &argd[0]); in __pctx_cpc()
997 pctx_terminate(struct __pctx *pctx) in pctx_terminate() argument
999 pctx->terminate = 1; in pctx_terminate()