summaryrefslogtreecommitdiffstats
path: root/usr.bin/truss
diff options
context:
space:
mode:
authorcharnier <charnier@FreeBSD.org>1998-01-05 07:30:26 +0000
committercharnier <charnier@FreeBSD.org>1998-01-05 07:30:26 +0000
commit50a2f19faf04789c616b36d4189518348133defd (patch)
treeed1c8227c4302868a3fab2c3c3407212a3d23ba1 /usr.bin/truss
parentc6e23310826f8815f9a35abdb657254ef4e47d66 (diff)
downloadFreeBSD-src-50a2f19faf04789c616b36d4189518348133defd.zip
FreeBSD-src-50a2f19faf04789c616b36d4189518348133defd.tar.gz
Sort Xrefs. Use err(3). Remove uneeded #include.
Correct usage: one of {-p pid, command} is required. Open output file when command line is fully analyzed: incorrect `truss -o f' command does not create an empty file anymore.
Diffstat (limited to 'usr.bin/truss')
-rw-r--r--usr.bin/truss/amd64-fbsd32.c18
-rw-r--r--usr.bin/truss/amd64-linux32.c19
-rw-r--r--usr.bin/truss/i386-fbsd.c18
-rw-r--r--usr.bin/truss/i386-linux.c19
-rw-r--r--usr.bin/truss/main.c47
-rw-r--r--usr.bin/truss/setup.c22
-rw-r--r--usr.bin/truss/syscalls.c24
-rw-r--r--usr.bin/truss/truss.140
8 files changed, 107 insertions, 100 deletions
diff --git a/usr.bin/truss/amd64-fbsd32.c b/usr.bin/truss/amd64-fbsd32.c
index 57d7d88..e141e2c 100644
--- a/usr.bin/truss/amd64-fbsd32.c
+++ b/usr.bin/truss/amd64-fbsd32.c
@@ -27,9 +27,13 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
*/
+#ifndef lint
+static const char rcsid[] =
+ "$Id$";
+#endif /* not lint */
+
/*
* FreeBSD/386-specific system call handling. This is probably the most
* complex part of the entire truss program, although I've got lots of
@@ -37,17 +41,13 @@
* automatically, thanks to /usr/src/sys/kern/syscalls.master. The
* names used for the various structures are confusing, I sadly admit.
*/
-/*
- * $Id: i386-fbsd.c,v 1.1 1997/12/06 05:22:50 sef Exp $
- */
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <errno.h>
-#include <err.h>
-#include <signal.h>
-#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@@ -113,7 +113,6 @@ i386_syscall_entry(int pid, int nargs) {
struct reg regs = { 0 };
int syscall;
int i;
- int memfd;
unsigned int parm_offset;
struct syscall *sc;
@@ -190,7 +189,6 @@ i386_syscall_entry(int pid, int nargs) {
*/
if (fsc.name) {
- char *tmp;
#if DEBUG
fprintf(stderr, "syscall %s(", fsc.name);
diff --git a/usr.bin/truss/amd64-linux32.c b/usr.bin/truss/amd64-linux32.c
index fc1f9b0..0cb7c22 100644
--- a/usr.bin/truss/amd64-linux32.c
+++ b/usr.bin/truss/amd64-linux32.c
@@ -27,24 +27,25 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
*/
+#ifndef lint
+static const char rcsid[] =
+ "$Id$";
+#endif /* not lint */
+
/*
* Linux/i386-specific system call handling. Given how much of this code
* is taken from the freebsd equivalent, I can probably put even more of
* it in support routines that can be used by any personality support.
*/
-/*
- * $Id: i386-linux.c,v 1.1 1997/12/06 05:22:54 sef Exp $
- */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <errno.h>
-#include <err.h>
-#include <signal.h>
-#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@@ -91,7 +92,6 @@ i386_linux_syscall_entry(int pid, int nargs) {
struct reg regs = { 0 };
int syscall;
int i;
- int memfd;
struct syscall *sc;
if (fd == -1 || pid != cpid) {
@@ -149,7 +149,6 @@ i386_linux_syscall_entry(int pid, int nargs) {
lsc.sc = sc;
if (lsc.name) {
- char *tmp;
#ifdef DEBUG
fprintf(stderr, "syscall %s(", lsc.name);
diff --git a/usr.bin/truss/i386-fbsd.c b/usr.bin/truss/i386-fbsd.c
index 57d7d88..e141e2c 100644
--- a/usr.bin/truss/i386-fbsd.c
+++ b/usr.bin/truss/i386-fbsd.c
@@ -27,9 +27,13 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
*/
+#ifndef lint
+static const char rcsid[] =
+ "$Id$";
+#endif /* not lint */
+
/*
* FreeBSD/386-specific system call handling. This is probably the most
* complex part of the entire truss program, although I've got lots of
@@ -37,17 +41,13 @@
* automatically, thanks to /usr/src/sys/kern/syscalls.master. The
* names used for the various structures are confusing, I sadly admit.
*/
-/*
- * $Id: i386-fbsd.c,v 1.1 1997/12/06 05:22:50 sef Exp $
- */
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <errno.h>
-#include <err.h>
-#include <signal.h>
-#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@@ -113,7 +113,6 @@ i386_syscall_entry(int pid, int nargs) {
struct reg regs = { 0 };
int syscall;
int i;
- int memfd;
unsigned int parm_offset;
struct syscall *sc;
@@ -190,7 +189,6 @@ i386_syscall_entry(int pid, int nargs) {
*/
if (fsc.name) {
- char *tmp;
#if DEBUG
fprintf(stderr, "syscall %s(", fsc.name);
diff --git a/usr.bin/truss/i386-linux.c b/usr.bin/truss/i386-linux.c
index fc1f9b0..0cb7c22 100644
--- a/usr.bin/truss/i386-linux.c
+++ b/usr.bin/truss/i386-linux.c
@@ -27,24 +27,25 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
*/
+#ifndef lint
+static const char rcsid[] =
+ "$Id$";
+#endif /* not lint */
+
/*
* Linux/i386-specific system call handling. Given how much of this code
* is taken from the freebsd equivalent, I can probably put even more of
* it in support routines that can be used by any personality support.
*/
-/*
- * $Id: i386-linux.c,v 1.1 1997/12/06 05:22:54 sef Exp $
- */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <errno.h>
-#include <err.h>
-#include <signal.h>
-#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@@ -91,7 +92,6 @@ i386_linux_syscall_entry(int pid, int nargs) {
struct reg regs = { 0 };
int syscall;
int i;
- int memfd;
struct syscall *sc;
if (fd == -1 || pid != cpid) {
@@ -149,7 +149,6 @@ i386_linux_syscall_entry(int pid, int nargs) {
lsc.sc = sc;
if (lsc.name) {
- char *tmp;
#ifdef DEBUG
fprintf(stderr, "syscall %s(", lsc.name);
diff --git a/usr.bin/truss/main.c b/usr.bin/truss/main.c
index 8261b7f..37608bb 100644
--- a/usr.bin/truss/main.c
+++ b/usr.bin/truss/main.c
@@ -27,25 +27,26 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
*/
+#ifndef lint
+static const char rcsid[] =
+ "$Id$";
+#endif /* not lint */
+
/*
* The main module for truss. Suprisingly simple, but, then, the other
* files handle the bulk of the work. And, of course, the kernel has to
* do a lot of the work :).
*/
-/*
- * $Id: main.c,v 1.5 1997/12/13 03:13:47 sef Exp $
- */
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <errno.h>
-#include <err.h>
-#include <signal.h>
-#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
@@ -65,14 +66,15 @@ extern void i386_linux_syscall_exit(int, int);
int pid = 0;
int nosigs = 0;
FILE *outfile = stderr;
-char *prog;
int Procfd;
char progtype[50]; /* OS and type of executable */
static inline void
-usage(void) {
- fprintf(stderr, "usage: %s [-o <file>] [-S] { [-p <pid> ] | "
- "[ <command> <args>] }\n", prog);
+usage(void)
+{
+ fprintf(stderr, "%s\n%s\n",
+ "usage: truss [-S] [-o file] -p pid",
+ " truss [-S] [-o file] command [args]");
exit(1);
}
@@ -116,18 +118,15 @@ set_etype() {
return funcs;
}
+int
main(int ac, char **av) {
- int mask;
int c;
int i;
char **command;
struct procfs_status pfs;
- char etype[25];
struct ex_types *funcs;
- int fd;
int in_exec = 0;
-
- prog = av[0];
+ char *fname = NULL;
while ((c = getopt(ac, av, "p:o:S")) != EOF) {
switch (c) {
@@ -135,10 +134,7 @@ main(int ac, char **av) {
pid = atoi(optarg);
break;
case 'o': /* Specified output file */
- if ((outfile = fopen(optarg, "w")) == NULL) {
- fprintf (stderr, "%s: cannot open %s\n", av[0], optarg);
- exit(1);
- }
+ fname = optarg;
break;
case 'S': /* Don't trace signals */
nosigs = 1;
@@ -152,6 +148,11 @@ main(int ac, char **av) {
if ((pid == 0 && ac == 0) || (pid != 0 && ac != 0))
usage();
+ if (fname != NULL) { /* Use output file */
+ if ((outfile = fopen(fname, "w")) == NULL)
+ errx(1, "cannot open %s", fname);
+ }
+
/*
* If truss starts the process itself, it will ignore some signals --
* they should be passed off to the process, which may or may not
@@ -193,7 +194,7 @@ main(int ac, char **av) {
int val = 0;
if (ioctl(Procfd, PIOCWAIT, &pfs) == -1)
- perror("PIOCWAIT top of loop");
+ warn("PIOCWAIT top of loop");
else {
switch(i = pfs.why) {
case S_SCE:
@@ -229,7 +230,7 @@ main(int ac, char **av) {
}
}
if (ioctl(Procfd, PIOCCONT, val) == -1)
- perror("PIOCCONT");
+ warn("PIOCCONT");
} while (pfs.why != S_EXIT);
return 0;
}
diff --git a/usr.bin/truss/setup.c b/usr.bin/truss/setup.c
index 407dd7f..9d0abf2 100644
--- a/usr.bin/truss/setup.c
+++ b/usr.bin/truss/setup.c
@@ -27,25 +27,26 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
*/
+#ifndef lint
+static const char rcsid[] =
+ "$Id$";
+#endif /* not lint */
+
/*
* Various setup functions for truss. Not the cleanest-written code,
* I'm afraid.
*/
-/*
- * $Id: setup.c,v 1.5 1997/12/13 03:13:47 sef Exp $
- */
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include <errno.h>
-#include <err.h>
-#include <fcntl.h>
-#include <signal.h>
#include <sys/ioctl.h>
#include <sys/pioctl.h>
#include <sys/types.h>
@@ -66,7 +67,6 @@ setup_and_wait(char *command[]) {
char buf[32];
int fd;
int pid;
- extern char *prog;
int flags;
pid = vfork();
@@ -88,7 +88,7 @@ setup_and_wait(char *command[]) {
* we want.
*/
if (ioctl(fd, PIOCSFL, flags) == -1)
- perror("cannot set PF_LINGER");
+ warn("cannot set PF_LINGER");
execvp(command[0], command);
mask = ~0;
ioctl(fd, PIOCBIC, ~0);
@@ -151,7 +151,7 @@ start_tracing(int pid, int flags) {
*/
if (ioctl(fd, PIOCSFL, 0) == -1)
- perror("cannot clear PF_LINGER");
+ warn("cannot clear PF_LINGER");
return fd;
}
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
index 7118836..9c29d52 100644
--- a/usr.bin/truss/syscalls.c
+++ b/usr.bin/truss/syscalls.c
@@ -27,17 +27,19 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
*/
+#ifndef lint
+static const char rcsid[] =
+ "$Id$";
+#endif /* not lint */
+
/*
* This file has routines used to print out system calls and their
* arguments.
*/
-/*
- * $Id: syscalls.c,v 1.2 1997/12/06 06:51:14 sef Exp $
- */
+#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -75,9 +77,11 @@ struct syscall syscalls[] = {
{ { Int, 0}, { Ioctl, 1 }, { Hex, 2 }}},
{ "break", 1, 1, { { Hex, 0 }}},
{ "exit", 0, 1, { { Hex, 0 }}},
- { 0, 0, 0, { 0, 0 } },
+ { 0, 0, 0, { { 0, 0 }}},
};
+char * ioctlname __P((int));
+
/*
* If/when the list gets big, it might be desirable to do it
* as a hash table or binary search.
@@ -104,14 +108,12 @@ get_syscall(const char *name) {
char *
get_string(int procfd, void *offset, int max) {
- char *buf, *tmp;
+ char *buf;
int size, len, c;
FILE *p;
- if ((p = fdopen(procfd, "r")) == NULL) {
- perror("fdopen");
- exit(1);
- }
+ if ((p = fdopen(procfd, "r")) == NULL)
+ err(1, "fdopen");
buf = malloc( size = (max ? max : 64 ) );
len = 0;
fseek(p, (long)offset, SEEK_SET);
@@ -164,7 +166,7 @@ make_quad(unsigned long p1, unsigned long p2) {
char *
print_arg(int fd, struct syscall_args *sc, unsigned long *args) {
- char *tmp;
+ char *tmp = NULL;
switch (sc->type & ARG_MASK) {
case Hex:
tmp = malloc(12);
diff --git a/usr.bin/truss/truss.1 b/usr.bin/truss/truss.1
index e3cdb5f..0cfabea 100644
--- a/usr.bin/truss/truss.1
+++ b/usr.bin/truss/truss.1
@@ -2,35 +2,41 @@
.Dt TRUSS 1
.Os FreeBSD
.Sh NAME
-.Nm \&truss
+.Nm truss
.Nd trace system calls
-.Sh Synopsis
-.Nm \&truss
+.Sh SYNOPSIS
+.Nm truss
+.Op Fl S
+.Op Fl o Ar file
+.Fl p Ar pid
+.Nm truss
.Op Fl S
-.Op Fl p Ar pid
.Op Fl o Ar file
command
+.Op args
.Sh DESCRIPTION
-.Nm \&truss
+.Nm Truss
traces the system calls called by the specified process or program.
Output is to the specified output file, or standard error by default.
It does this by stopping and restarting the process being monitored via
.Xr procfs 5 .
.Pp
The options are as follows:
-.Bl -tag -width command
+.Bl -tag -width indent
.It Fl S
Do not display information about signals received by the process.
(Normally,
-.Nm \&truss
+.Nm
displays signal as well as system call events.)
-.It Fl p
+.It Fl o Ar file
+Print the output to the specified
+.Ar file
+instead of standard error.
+.It Fl p Ar pid
Follow the process specified by
.Ar pid
instead of a new command.
-.It Fl o
-Print the output to the specified file instead of standard error.
-.It Ar command
+.It Ar command Op args
Execute
.Ar command
and trace the system calls of it.
@@ -47,11 +53,15 @@ options are mutually exclusive.)
# Follow an already-running process
.Dl $ truss -p 1
.Sh SEE ALSO
-.Xr procfs 5 ,
+.Xr kdump 1 ,
.Xr ktrace 1 ,
-.Xr kdump 1
+.Xr procfs 5
.Sh HISTORY
The
-.Nm truss
-command was written by Sean Eric Fagan for FreeBSD; it was modeled after
+.Nm
+command was written by
+.An Sean Eric Fagan
+for
+.Bx Free Ns ;
+it was modeled after
similar commands available for System V Release 4 and SunOS.
OpenPOWER on IntegriCloud