xref: /freebsd/share/man/man4/filemon.4 (revision 30a39288e41042174d009919ac210bce19218ee5)
127db57a9SDavid E. O'Brien.\" Copyright (c) 2012
227db57a9SDavid E. O'Brien.\"	David E. O'Brien <obrien@FreeBSD.org>.  All rights reserved.
327db57a9SDavid E. O'Brien.\"
427db57a9SDavid E. O'Brien.\" Redistribution and use in source and binary forms, with or without
527db57a9SDavid E. O'Brien.\" modification, are permitted provided that the following conditions
627db57a9SDavid E. O'Brien.\" are met:
727db57a9SDavid E. O'Brien.\" 1. Redistributions of source code must retain the above copyright
827db57a9SDavid E. O'Brien.\"    notice, this list of conditions and the following disclaimer.
927db57a9SDavid E. O'Brien.\" 2. Redistributions in binary form must reproduce the above copyright
1027db57a9SDavid E. O'Brien.\"    notice, this list of conditions and the following disclaimer in the
1127db57a9SDavid E. O'Brien.\"    documentation and/or other materials provided with the distribution.
1227db57a9SDavid E. O'Brien.\" 3. All advertising materials mentioning features or use of this software
1327db57a9SDavid E. O'Brien.\"    must display the following acknowledgement:
1427db57a9SDavid E. O'Brien.\"	This product includes software developed by David E. O'Brien and
1527db57a9SDavid E. O'Brien.\"	contributors.
1627db57a9SDavid E. O'Brien.\" 4. Neither the name of the author nor the names of its contributors
1727db57a9SDavid E. O'Brien.\"    may be used to endorse or promote products derived from this software
1827db57a9SDavid E. O'Brien.\"    without specific prior written permission.
1927db57a9SDavid E. O'Brien.\"
2027db57a9SDavid E. O'Brien.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2127db57a9SDavid E. O'Brien.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2227db57a9SDavid E. O'Brien.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2327db57a9SDavid E. O'Brien.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2427db57a9SDavid E. O'Brien.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2527db57a9SDavid E. O'Brien.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2627db57a9SDavid E. O'Brien.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2727db57a9SDavid E. O'Brien.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2827db57a9SDavid E. O'Brien.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2927db57a9SDavid E. O'Brien.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3027db57a9SDavid E. O'Brien.\" SUCH DAMAGE.
3127db57a9SDavid E. O'Brien.\"
3227db57a9SDavid E. O'Brien.\" $FreeBSD$
3327db57a9SDavid E. O'Brien.\"
3427db57a9SDavid E. O'Brien.Dd May 30, 2012
3527db57a9SDavid E. O'Brien.Dt FILEMON 4
3627db57a9SDavid E. O'Brien.Os
3727db57a9SDavid E. O'Brien.Sh NAME
3827db57a9SDavid E. O'Brien.Nm filemon
3927db57a9SDavid E. O'Brien.Nd the filemon device
4027db57a9SDavid E. O'Brien.Sh SYNOPSIS
4127db57a9SDavid E. O'Brien.In dev/filemon/filemon.h
4227db57a9SDavid E. O'Brien.Sh DESCRIPTION
4327db57a9SDavid E. O'BrienThe
4427db57a9SDavid E. O'Brien.Nm
4527db57a9SDavid E. O'Briendevice allows a process to collect file operations data of its children.
4627db57a9SDavid E. O'BrienThe device
4727db57a9SDavid E. O'Brien.Pa /dev/filemon
4827db57a9SDavid E. O'Brienresponds to two
4927db57a9SDavid E. O'Brien.Xr ioctl 2
5027db57a9SDavid E. O'Briencalls.
5127db57a9SDavid E. O'Brien.Pp
5227db57a9SDavid E. O'BrienSystem calls are denoted using the following single letters:
5327db57a9SDavid E. O'Brien.Bl -tag -width indent -compact
5427db57a9SDavid E. O'Brien.It Dq Li C
5527db57a9SDavid E. O'Brien.Xr chdir 2
5627db57a9SDavid E. O'Brien.It Dq Li D
5727db57a9SDavid E. O'Brien.Xr unlink 2
5827db57a9SDavid E. O'Brien.It Dq Li E
5927db57a9SDavid E. O'Brien.Xr exec 2
6027db57a9SDavid E. O'Brien.It Dq Li F
6127db57a9SDavid E. O'Brien.Xr fork 2 ,
6227db57a9SDavid E. O'Brien.Xr vfork 2
6327db57a9SDavid E. O'Brien.It Dq Li L
6427db57a9SDavid E. O'Brien.Xr link 2 ,
6527db57a9SDavid E. O'Brien.Xr linkat 2 ,
6627db57a9SDavid E. O'Brien.Xr symlink 2 ,
6727db57a9SDavid E. O'Brien.Xr symlinkat 2
6827db57a9SDavid E. O'Brien.It Dq Li M
6927db57a9SDavid E. O'Brien.Xr rename 2
7027db57a9SDavid E. O'Brien.It Dq Li R
7127db57a9SDavid E. O'Brien.Xr open 2
7227db57a9SDavid E. O'Brienfor read
7327db57a9SDavid E. O'Brien.It Dq Li S
7427db57a9SDavid E. O'Brien.Xr stat 2
7527db57a9SDavid E. O'Brien.It Dq Li W
7627db57a9SDavid E. O'Brien.Xr open 2
7727db57a9SDavid E. O'Brienfor write
7827db57a9SDavid E. O'Brien.It Dq Li X
7927db57a9SDavid E. O'Brien.Xr _exit 2
8027db57a9SDavid E. O'Brien.El
8127db57a9SDavid E. O'Brien.Pp
8227db57a9SDavid E. O'BrienNote that
8327db57a9SDavid E. O'Brien.Dq R
8427db57a9SDavid E. O'Brienfollowing
8527db57a9SDavid E. O'Brien.Dq W
8627db57a9SDavid E. O'Brienrecords can represent a single
8727db57a9SDavid E. O'Brien.Xr open 2
8827db57a9SDavid E. O'Brienfor R/W,
8927db57a9SDavid E. O'Brienor two seperate
9027db57a9SDavid E. O'Brien.Xr open 2
9127db57a9SDavid E. O'Briencalls, one for
9227db57a9SDavid E. O'BrienR
9327db57a9SDavid E. O'Brienand one for
9427db57a9SDavid E. O'BrienW.
9527db57a9SDavid E. O'Brien.Sh IOCTLS
9627db57a9SDavid E. O'BrienUser mode programs communicate with the filemon driver through a
9727db57a9SDavid E. O'Briennumber of ioctls which are described below.
9827db57a9SDavid E. O'BrienEach takes a single argument.
9927db57a9SDavid E. O'Brien.Bl -tag -width FILEMON_SET_PID
10027db57a9SDavid E. O'Brien.It Dv FILEMON_SET_FD
10127db57a9SDavid E. O'BrienWrite the internal tracing buffer to the supplied open file descriptor.
10227db57a9SDavid E. O'Brien.It Dv FILEMON_SET_PID .
10327db57a9SDavid E. O'BrienChild process ID to trace.
10427db57a9SDavid E. O'Brien.El
10527db57a9SDavid E. O'Brien.Pp
10627db57a9SDavid E. O'Brien.Sh RETURN VALUES
10727db57a9SDavid E. O'BrienThe ioctl returns zero on success and non-zero on failure.
10827db57a9SDavid E. O'Brien.Sh EXAMPLES
10927db57a9SDavid E. O'Brien.Bd -literal -offset indent
11027db57a9SDavid E. O'Brien#include <sys/types.h>
11127db57a9SDavid E. O'Brien#include <sys/stat.h>
11227db57a9SDavid E. O'Brien#include <sys/wait.h>
11327db57a9SDavid E. O'Brien#include <sys/ioctl.h>
11427db57a9SDavid E. O'Brien#include <dev/filemon/filemon.h>
11527db57a9SDavid E. O'Brien#include <fcntl.h>
11627db57a9SDavid E. O'Brien#include <err.h>
11727db57a9SDavid E. O'Brien
11827db57a9SDavid E. O'Brienstatic void
11927db57a9SDavid E. O'Brienopen_filemon(void)
12027db57a9SDavid E. O'Brien{
12127db57a9SDavid E. O'Brien	pid_t child;
12227db57a9SDavid E. O'Brien	int fm_fd, fm_log;
12327db57a9SDavid E. O'Brien
12427db57a9SDavid E. O'Brien	if ((fm_fd = open("/dev/filemon", O_RDWR)) == -1)
12527db57a9SDavid E. O'Brien		err(1, "open(\"/dev/filemon\", O_RDWR)");
12627db57a9SDavid E. O'Brien	if ((fm_log = open("filemon.out",
12727db57a9SDavid E. O'Brien	    O_CREAT | O_WRONLY | O_TRUNC, DEFFILEMODE)) == -1)
12827db57a9SDavid E. O'Brien		err(1, "open(filemon.out)");
12927db57a9SDavid E. O'Brien
130*30a39288SDavid E. O'Brien	if (ioctl(fm_fd, FILEMON_SET_FD, &fm_log) == -1)
13127db57a9SDavid E. O'Brien		err(1, "Cannot set filemon log file descriptor");
13227db57a9SDavid E. O'Brien	/* Set up these two fd's to close on exec. */
13327db57a9SDavid E. O'Brien	(void)fcntl(fm_fd, F_SETFD, FD_CLOEXEC);
13427db57a9SDavid E. O'Brien	(void)fcntl(fm_log, F_SETFD, FD_CLOEXEC);
13527db57a9SDavid E. O'Brien
13627db57a9SDavid E. O'Brien	if ((child = fork()) == 0) {
137*30a39288SDavid E. O'Brien		child = getpid();
138*30a39288SDavid E. O'Brien		if (ioctl(fm_fd, FILEMON_SET_PID, &child) == -1)
139*30a39288SDavid E. O'Brien			err(1, "Cannot set filemon PID");
14027db57a9SDavid E. O'Brien		/* Do something here. */
14127db57a9SDavid E. O'Brien		return 0;
14227db57a9SDavid E. O'Brien	} else {
14327db57a9SDavid E. O'Brien		wait(&child);
14427db57a9SDavid E. O'Brien		close(fm_fd);
14527db57a9SDavid E. O'Brien	}
14627db57a9SDavid E. O'Brien	return 0;
14727db57a9SDavid E. O'Brien}
14827db57a9SDavid E. O'Brien.Ed
14927db57a9SDavid E. O'Brien.Pp
15027db57a9SDavid E. O'BrienCreates a file named
15127db57a9SDavid E. O'Brien.Pa filemon.out
15227db57a9SDavid E. O'Brienand configures the
15327db57a9SDavid E. O'Brien.Nm
15427db57a9SDavid E. O'Briendevice to write the filemon buffer contents to it.
15527db57a9SDavid E. O'Brien.Sh FILES
15627db57a9SDavid E. O'Brien.Bl -tag -width /dev/zero
15727db57a9SDavid E. O'Brien.It Pa /dev/filemon
15827db57a9SDavid E. O'Brien.El
15927db57a9SDavid E. O'Brien.Sh SEE ALSO
16027db57a9SDavid E. O'Brien.Xr dtrace 1 ,
16127db57a9SDavid E. O'Brien.Xr ktrace 1 ,
16227db57a9SDavid E. O'Brien.Xr truss 1
16327db57a9SDavid E. O'Brien.Sh HISTORY
16427db57a9SDavid E. O'BrienA
16527db57a9SDavid E. O'Brien.Nm
16627db57a9SDavid E. O'Briendevice appeared in
16727db57a9SDavid E. O'Brien.Fx 9.1 .
168