1/* Machine-independent support for SVR4 /proc (process file system)
2
3   Copyright (C) 1999, 2000, 2004, 2007, 2008, 2009, 2010, 2011
4   Free Software Foundation, Inc.
5
6   Written by Michael Snyder at Cygnus Solutions.
7   Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 3 of the License, or
12   (at your option) any later version.
13
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19   You should have received a copy of the GNU General Public License
20   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
22#include "defs.h"
23
24#ifdef NEW_PROC_API
25#define _STRUCTURED_PROC 1
26#endif
27
28#include <stdio.h>
29#include <sys/types.h>
30#include <sys/procfs.h>
31
32#include "proc-utils.h"
33
34/* Much of the information used in the /proc interface, particularly
35   for printing status information, is kept as tables of structures of
36   the following form.  These tables can be used to map numeric values
37   to their symbolic names and to a string that describes their
38   specific use.  */
39
40struct trans
41{
42  int value;                    /* The numeric value.  */
43  char *name;                   /* The equivalent symbolic value.  */
44  char *desc;                   /* Short description of value.  */
45};
46
47/* Translate values in the pr_why field of a `struct prstatus' or
48   `struct lwpstatus'.  */
49
50static struct trans pr_why_table[] =
51{
52#if defined (PR_REQUESTED)
53  /* All platforms.  */
54  { PR_REQUESTED, "PR_REQUESTED",
55    "Directed to stop by debugger via P(IO)CSTOP or P(IO)CWSTOP" },
56#endif
57#if defined (PR_SIGNALLED)
58  /* All platforms.  */
59  { PR_SIGNALLED, "PR_SIGNALLED", "Receipt of a traced signal" },
60#endif
61#if defined (PR_SYSENTRY)
62  /* All platforms.  */
63  { PR_SYSENTRY, "PR_SYSENTRY", "Entry to a traced system call" },
64#endif
65#if defined (PR_SYSEXIT)
66  /* All platforms.  */
67  { PR_SYSEXIT, "PR_SYSEXIT", "Exit from a traced system call" },
68#endif
69#if defined (PR_JOBCONTROL)
70  /* All platforms.  */
71  { PR_JOBCONTROL, "PR_JOBCONTROL", "Default job control stop signal action" },
72#endif
73#if defined (PR_FAULTED)
74  /* All platforms.  */
75  { PR_FAULTED, "PR_FAULTED", "Incurred a traced hardware fault" },
76#endif
77#if defined (PR_SUSPENDED)
78  /* Solaris and UnixWare.  */
79  { PR_SUSPENDED, "PR_SUSPENDED", "Process suspended" },
80#endif
81#if defined (PR_CHECKPOINT)
82  /* Solaris only.  */
83  { PR_CHECKPOINT, "PR_CHECKPOINT", "Process stopped at checkpoint" },
84#endif
85#if defined (PR_FORKSTOP)
86  /* OSF/1 only.  */
87  { PR_FORKSTOP, "PR_FORKSTOP", "Process stopped at end of fork call" },
88#endif
89#if defined (PR_TCRSTOP)
90  /* OSF/1 only.  */
91  { PR_TCRSTOP, "PR_TCRSTOP", "Process stopped on thread creation" },
92#endif
93#if defined (PR_TTSTOP)
94  /* OSF/1 only.  */
95  { PR_TTSTOP, "PR_TTSTOP", "Process stopped on thread termination" },
96#endif
97#if defined (PR_DEAD)
98  /* OSF/1 only.  */
99  { PR_DEAD, "PR_DEAD", "Process stopped in exit system call" },
100#endif
101};
102
103/* Pretty-print the pr_why field of a `struct prstatus' or `struct
104   lwpstatus'.  */
105
106void
107proc_prettyfprint_why (FILE *file, unsigned long why, unsigned long what,
108		       int verbose)
109{
110  int i;
111
112  if (why == 0)
113    return;
114
115  for (i = 0; i < ARRAY_SIZE (pr_why_table); i++)
116    if (why == pr_why_table[i].value)
117      {
118	fprintf (file, "%s ", pr_why_table[i].name);
119	if (verbose)
120	  fprintf (file, ": %s ", pr_why_table[i].desc);
121
122	switch (why) {
123#ifdef PR_REQUESTED
124	case PR_REQUESTED:
125	  break;		/* Nothing more to print.  */
126#endif
127#ifdef PR_SIGNALLED
128	case PR_SIGNALLED:
129	  proc_prettyfprint_signal (file, what, verbose);
130	  break;
131#endif
132#ifdef PR_FAULTED
133	case PR_FAULTED:
134	  proc_prettyfprint_fault (file, what, verbose);
135	  break;
136#endif
137#ifdef PR_SYSENTRY
138	case PR_SYSENTRY:
139	  fprintf (file, "Entry to ");
140	  proc_prettyfprint_syscall (file, what, verbose);
141	  break;
142#endif
143#ifdef PR_SYSEXIT
144	case PR_SYSEXIT:
145	  fprintf (file, "Exit from ");
146	  proc_prettyfprint_syscall (file, what, verbose);
147	  break;
148#endif
149#ifdef PR_JOBCONTROL
150	case PR_JOBCONTROL:
151	  proc_prettyfprint_signal (file, what, verbose);
152	  break;
153#endif
154#ifdef PR_DEAD
155	case PR_DEAD:
156	  fprintf (file, "Exit status: %ld\n", what);
157	  break;
158#endif
159	default:
160	  fprintf (file, "Unknown why %ld, what %ld\n", why, what);
161	  break;
162	}
163	fprintf (file, "\n");
164
165	return;
166      }
167
168  fprintf (file, "Unknown pr_why.\n");
169}
170
171void
172proc_prettyprint_why (unsigned long why, unsigned long what, int verbose)
173{
174  proc_prettyfprint_why (stdout, why, what, verbose);
175}
176