1*521fa314SDavid van Moolenbroek
2*521fa314SDavid van Moolenbroek #include "inc.h"
3*521fa314SDavid van Moolenbroek
4*521fa314SDavid van Moolenbroek static TAILQ_HEAD(, trace_proc) proc_root;
5*521fa314SDavid van Moolenbroek static unsigned int nr_procs;
6*521fa314SDavid van Moolenbroek
7*521fa314SDavid van Moolenbroek /*
8*521fa314SDavid van Moolenbroek * Initialize the list of traced processes.
9*521fa314SDavid van Moolenbroek */
10*521fa314SDavid van Moolenbroek void
proc_init(void)11*521fa314SDavid van Moolenbroek proc_init(void)
12*521fa314SDavid van Moolenbroek {
13*521fa314SDavid van Moolenbroek
14*521fa314SDavid van Moolenbroek TAILQ_INIT(&proc_root);
15*521fa314SDavid van Moolenbroek nr_procs = 0;
16*521fa314SDavid van Moolenbroek }
17*521fa314SDavid van Moolenbroek
18*521fa314SDavid van Moolenbroek /*
19*521fa314SDavid van Moolenbroek * Add a new process to the list of traced processes, allocating memory for it
20*521fa314SDavid van Moolenbroek * first. Return the new process structure with its PID assigned and the rest
21*521fa314SDavid van Moolenbroek * zeroed out, or NULL upon allocation failure (with errno set appropriately).
22*521fa314SDavid van Moolenbroek */
23*521fa314SDavid van Moolenbroek struct trace_proc *
proc_add(pid_t pid)24*521fa314SDavid van Moolenbroek proc_add(pid_t pid)
25*521fa314SDavid van Moolenbroek {
26*521fa314SDavid van Moolenbroek struct trace_proc *proc;
27*521fa314SDavid van Moolenbroek
28*521fa314SDavid van Moolenbroek proc = (struct trace_proc *)malloc(sizeof(struct trace_proc));
29*521fa314SDavid van Moolenbroek
30*521fa314SDavid van Moolenbroek if (proc == NULL)
31*521fa314SDavid van Moolenbroek return NULL;
32*521fa314SDavid van Moolenbroek
33*521fa314SDavid van Moolenbroek memset(proc, 0, sizeof(*proc));
34*521fa314SDavid van Moolenbroek
35*521fa314SDavid van Moolenbroek proc->pid = pid;
36*521fa314SDavid van Moolenbroek
37*521fa314SDavid van Moolenbroek TAILQ_INSERT_TAIL(&proc_root, proc, next);
38*521fa314SDavid van Moolenbroek nr_procs++;
39*521fa314SDavid van Moolenbroek
40*521fa314SDavid van Moolenbroek return proc;
41*521fa314SDavid van Moolenbroek }
42*521fa314SDavid van Moolenbroek
43*521fa314SDavid van Moolenbroek /*
44*521fa314SDavid van Moolenbroek * Retrieve the data structure for a traced process based on its PID. Return
45*521fa314SDavid van Moolenbroek * a pointer to the structure, or NULL if no structure exists for this process.
46*521fa314SDavid van Moolenbroek */
47*521fa314SDavid van Moolenbroek struct trace_proc *
proc_get(pid_t pid)48*521fa314SDavid van Moolenbroek proc_get(pid_t pid)
49*521fa314SDavid van Moolenbroek {
50*521fa314SDavid van Moolenbroek struct trace_proc *proc;
51*521fa314SDavid van Moolenbroek
52*521fa314SDavid van Moolenbroek /* Linear search for now; se we can easily add a hashtable later.. */
53*521fa314SDavid van Moolenbroek TAILQ_FOREACH(proc, &proc_root, next) {
54*521fa314SDavid van Moolenbroek if (proc->pid == pid)
55*521fa314SDavid van Moolenbroek return proc;
56*521fa314SDavid van Moolenbroek }
57*521fa314SDavid van Moolenbroek
58*521fa314SDavid van Moolenbroek return NULL;
59*521fa314SDavid van Moolenbroek }
60*521fa314SDavid van Moolenbroek
61*521fa314SDavid van Moolenbroek /*
62*521fa314SDavid van Moolenbroek * Remove a process from the list of traced processes.
63*521fa314SDavid van Moolenbroek */
64*521fa314SDavid van Moolenbroek void
proc_del(struct trace_proc * proc)65*521fa314SDavid van Moolenbroek proc_del(struct trace_proc * proc)
66*521fa314SDavid van Moolenbroek {
67*521fa314SDavid van Moolenbroek
68*521fa314SDavid van Moolenbroek TAILQ_REMOVE(&proc_root, proc, next);
69*521fa314SDavid van Moolenbroek nr_procs--;
70*521fa314SDavid van Moolenbroek
71*521fa314SDavid van Moolenbroek free(proc);
72*521fa314SDavid van Moolenbroek }
73*521fa314SDavid van Moolenbroek
74*521fa314SDavid van Moolenbroek /*
75*521fa314SDavid van Moolenbroek * Iterator for the list of traced processes. If a NULL pointer is given,
76*521fa314SDavid van Moolenbroek * return the first process in the list; otherwise, return the next process in
77*521fa314SDavid van Moolenbroek * the list. Not stable with respect to list modifications.
78*521fa314SDavid van Moolenbroek */
79*521fa314SDavid van Moolenbroek struct trace_proc *
proc_next(struct trace_proc * proc)80*521fa314SDavid van Moolenbroek proc_next(struct trace_proc * proc)
81*521fa314SDavid van Moolenbroek {
82*521fa314SDavid van Moolenbroek
83*521fa314SDavid van Moolenbroek if (proc == NULL)
84*521fa314SDavid van Moolenbroek return TAILQ_FIRST(&proc_root);
85*521fa314SDavid van Moolenbroek else
86*521fa314SDavid van Moolenbroek return TAILQ_NEXT(proc, next);
87*521fa314SDavid van Moolenbroek }
88*521fa314SDavid van Moolenbroek
89*521fa314SDavid van Moolenbroek /*
90*521fa314SDavid van Moolenbroek * Return the number of processes in the list of traced processes.
91*521fa314SDavid van Moolenbroek */
92*521fa314SDavid van Moolenbroek unsigned int
proc_count(void)93*521fa314SDavid van Moolenbroek proc_count(void)
94*521fa314SDavid van Moolenbroek {
95*521fa314SDavid van Moolenbroek
96*521fa314SDavid van Moolenbroek return nr_procs;
97*521fa314SDavid van Moolenbroek }
98