#include "defs.h"
#ifdef NEW_PROC_API
#define _STRUCTURED_PROC 1
#endif
#include <stdio.h>
#include <sys/types.h>
#include <sys/procfs.h>
#include "proc-utils.h"
struct trans
{
int value;
char *name;
char *desc;
};
static struct trans pr_why_table[] =
{
#if defined (PR_REQUESTED)
{ PR_REQUESTED, "PR_REQUESTED",
"Directed to stop by debugger via P(IO)CSTOP or P(IO)CWSTOP" },
#endif
#if defined (PR_SIGNALLED)
{ PR_SIGNALLED, "PR_SIGNALLED", "Receipt of a traced signal" },
#endif
#if defined (PR_SYSENTRY)
{ PR_SYSENTRY, "PR_SYSENTRY", "Entry to a traced system call" },
#endif
#if defined (PR_SYSEXIT)
{ PR_SYSEXIT, "PR_SYSEXIT", "Exit from a traced system call" },
#endif
#if defined (PR_JOBCONTROL)
{ PR_JOBCONTROL, "PR_JOBCONTROL", "Default job control stop signal action" },
#endif
#if defined (PR_FAULTED)
{ PR_FAULTED, "PR_FAULTED", "Incurred a traced hardware fault" },
#endif
#if defined (PR_SUSPENDED)
{ PR_SUSPENDED, "PR_SUSPENDED", "Process suspended" },
#endif
#if defined (PR_CHECKPOINT)
{ PR_CHECKPOINT, "PR_CHECKPOINT", "Process stopped at checkpoint" },
#endif
#if defined (PR_FORKSTOP)
{ PR_FORKSTOP, "PR_FORKSTOP", "Process stopped at end of fork call" },
#endif
#if defined (PR_TCRSTOP)
{ PR_TCRSTOP, "PR_TCRSTOP", "Process stopped on thread creation" },
#endif
#if defined (PR_TTSTOP)
{ PR_TTSTOP, "PR_TTSTOP", "Process stopped on thread termination" },
#endif
#if defined (PR_DEAD)
{ PR_DEAD, "PR_DEAD", "Process stopped in exit system call" },
#endif
};
void
proc_prettyfprint_why (FILE *file, unsigned long why, unsigned long what,
int verbose)
{
int i;
if (why == 0)
return;
for (i = 0; i < ARRAY_SIZE (pr_why_table); i++)
if (why == pr_why_table[i].value)
{
fprintf (file, "%s ", pr_why_table[i].name);
if (verbose)
fprintf (file, ": %s ", pr_why_table[i].desc);
switch (why) {
#ifdef PR_REQUESTED
case PR_REQUESTED:
break;
#endif
#ifdef PR_SIGNALLED
case PR_SIGNALLED:
proc_prettyfprint_signal (file, what, verbose);
break;
#endif
#ifdef PR_FAULTED
case PR_FAULTED:
proc_prettyfprint_fault (file, what, verbose);
break;
#endif
#ifdef PR_SYSENTRY
case PR_SYSENTRY:
fprintf (file, "Entry to ");
proc_prettyfprint_syscall (file, what, verbose);
break;
#endif
#ifdef PR_SYSEXIT
case PR_SYSEXIT:
fprintf (file, "Exit from ");
proc_prettyfprint_syscall (file, what, verbose);
break;
#endif
#ifdef PR_JOBCONTROL
case PR_JOBCONTROL:
proc_prettyfprint_signal (file, what, verbose);
break;
#endif
#ifdef PR_DEAD
case PR_DEAD:
fprintf (file, "Exit status: %ld\n", what);
break;
#endif
default:
fprintf (file, "Unknown why %ld, what %ld\n", why, what);
break;
}
fprintf (file, "\n");
return;
}
fprintf (file, "Unknown pr_why.\n");
}
void
proc_prettyprint_why (unsigned long why, unsigned long what, int verbose)
{
proc_prettyfprint_why (stdout, why, what, verbose);
}