1/*
2 * Copyright 2001 Jamey Wood
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 *
25 * $FreeBSD$
26 */
27
28#include <sys/queue.h>
29
30#define	FOLLOWFORKS		0x00000001
31#define	RELATIVETIMESTAMPS	0x00000002
32#define	ABSOLUTETIMESTAMPS	0x00000004
33#define	NOSIGS			0x00000008
34#define	EXECVEARGS		0x00000010
35#define	EXECVEENVS		0x00000020
36#define	COUNTONLY		0x00000040
37
38struct threadinfo
39{
40	SLIST_ENTRY(threadinfo) entries;
41	lwpid_t tid;
42	int in_syscall;
43	int in_fork;
44	void *fsc;
45	struct timespec before;
46	struct timespec after;
47};
48
49struct trussinfo
50{
51	pid_t pid;
52	int flags;
53	int pr_why;
54	int pr_data;
55	int strsize;
56	FILE *outfile;
57
58	struct timespec start_time;
59
60	struct threadinfo *curthread;
61
62	SLIST_HEAD(, threadinfo) threadlist;
63};
64
65#define	timespecsubt(tvp, uvp, vvp)					\
66	do {								\
67		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
68		(vvp)->tv_nsec = (tvp)->tv_nsec - (uvp)->tv_nsec;	\
69		if ((vvp)->tv_nsec < 0) {				\
70			(vvp)->tv_sec--;				\
71			(vvp)->tv_nsec += 1000000000;			\
72		}							\
73	} while (0)
74
75#define	timespecadd(tvp, uvp, vvp)					\
76	do {								\
77		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
78		(vvp)->tv_nsec = (tvp)->tv_nsec + (uvp)->tv_nsec;	\
79		if ((vvp)->tv_nsec > 1000000000) {				\
80			(vvp)->tv_sec++;				\
81			(vvp)->tv_nsec -= 1000000000;			\
82		}							\
83	} while (0)
84
85#define	S_NONE	0
86#define	S_SCE	1
87#define	S_SCX	2
88#define	S_EXIT	3
89#define	S_SIG	4
90#define	S_EXEC	5
91#define	S_DETACHED	6
92