1356290Sjkim/*
2290207Sjkim * Copyright 2001 Jamey Wood
3290207Sjkim *
4290207Sjkim * Redistribution and use in source and binary forms, with or without
5290207Sjkim * modification, are permitted provided that the following conditions
6290207Sjkim * are met:
7290207Sjkim * 1. Redistributions of source code must retain the above copyright
8290207Sjkim *    notice, this list of conditions and the following disclaimer.
9290207Sjkim * 2. Redistributions in binary form must reproduce the above copyright
10290207Sjkim *    notice, this list of conditions and the following disclaimer in the
11290207Sjkim *    documentation and/or other materials provided with the distribution.
12290207Sjkim *
13290207Sjkim * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14290207Sjkim * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15290207Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16290207Sjkim * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17290207Sjkim * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18290207Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19290207Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20290207Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21290207Sjkim * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22290207Sjkim * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23290207Sjkim * SUCH DAMAGE.
24290207Sjkim *
25290207Sjkim * $FreeBSD$
26290207Sjkim */
27290207Sjkim
28290207Sjkim#include <sys/queue.h>
29290207Sjkim
30290207Sjkim#define	FOLLOWFORKS		0x00000001
31290207Sjkim#define	RELATIVETIMESTAMPS	0x00000002
32290207Sjkim#define	ABSOLUTETIMESTAMPS	0x00000004
33290207Sjkim#define	NOSIGS			0x00000008
34290207Sjkim#define	EXECVEARGS		0x00000010
35290207Sjkim#define	EXECVEENVS		0x00000020
36290207Sjkim#define	COUNTONLY		0x00000040
37290207Sjkim
38290207Sjkimstruct threadinfo
39290207Sjkim{
40290207Sjkim	SLIST_ENTRY(threadinfo) entries;
41290207Sjkim	lwpid_t tid;
42290207Sjkim	int in_syscall;
43290207Sjkim	int in_fork;
44290207Sjkim	void *fsc;
45290207Sjkim	struct timespec before;
46290207Sjkim	struct timespec after;
47290207Sjkim};
48290207Sjkim
49312826Sjkimstruct trussinfo
50290207Sjkim{
51290207Sjkim	pid_t pid;
52290207Sjkim	int flags;
53290207Sjkim	int pr_why;
54290207Sjkim	int pr_data;
55290207Sjkim	int strsize;
56290207Sjkim	FILE *outfile;
57344604Sjkim
58344604Sjkim	struct timespec start_time;
59344604Sjkim
60344604Sjkim	struct threadinfo *curthread;
61344604Sjkim
62344604Sjkim	SLIST_HEAD(, threadinfo) threadlist;
63290207Sjkim};
64344604Sjkim
65344604Sjkim#define	timespecsubt(tvp, uvp, vvp)					\
66344604Sjkim	do {								\
67344604Sjkim		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
68290207Sjkim		(vvp)->tv_nsec = (tvp)->tv_nsec - (uvp)->tv_nsec;	\
69290207Sjkim		if ((vvp)->tv_nsec < 0) {				\
70344604Sjkim			(vvp)->tv_sec--;				\
71290207Sjkim			(vvp)->tv_nsec += 1000000000;			\
72290207Sjkim		}							\
73290207Sjkim	} while (0)
74290207Sjkim
75290207Sjkim#define	timespecadd(tvp, uvp, vvp)					\
76290207Sjkim	do {								\
77290207Sjkim		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
78290207Sjkim		(vvp)->tv_nsec = (tvp)->tv_nsec + (uvp)->tv_nsec;	\
79290207Sjkim		if ((vvp)->tv_nsec > 1000000000) {				\
80290207Sjkim			(vvp)->tv_sec++;				\
81290207Sjkim			(vvp)->tv_nsec -= 1000000000;			\
82290207Sjkim		}							\
83290207Sjkim	} while (0)
84290207Sjkim
85290207Sjkim#define	S_NONE	0
86290207Sjkim#define	S_SCE	1
87290207Sjkim#define	S_SCX	2
88290207Sjkim#define	S_EXIT	3
89290207Sjkim#define	S_SIG	4
90290207Sjkim#define	S_EXEC	5
91290207Sjkim#define	S_DETACHED	6
92290207Sjkim