xref: /freebsd/share/man/man4/filemon.4 (revision d5064cc2f60e69472f37d7dcc8397d15c1ade9b4)
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
96*d5064cc2SJoel DahlUser mode programs communicate with the
97*d5064cc2SJoel Dahl.Nm filemon
98*d5064cc2SJoel Dahldriver through a
9927db57a9SDavid E. O'Briennumber of ioctls which are described below.
10027db57a9SDavid E. O'BrienEach takes a single argument.
10127db57a9SDavid E. O'Brien.Bl -tag -width FILEMON_SET_PID
10227db57a9SDavid E. O'Brien.It Dv FILEMON_SET_FD
10327db57a9SDavid E. O'BrienWrite the internal tracing buffer to the supplied open file descriptor.
104*d5064cc2SJoel Dahl.It Dv FILEMON_SET_PID
10527db57a9SDavid E. O'BrienChild process ID to trace.
10627db57a9SDavid E. O'Brien.El
10727db57a9SDavid E. O'Brien.Sh RETURN VALUES
10827db57a9SDavid E. O'BrienThe ioctl returns zero on success and non-zero on failure.
109*d5064cc2SJoel Dahl.Sh FILES
110*d5064cc2SJoel Dahl.Bl -tag -width /dev/zero
111*d5064cc2SJoel Dahl.It Pa /dev/filemon
112*d5064cc2SJoel Dahl.El
11327db57a9SDavid E. O'Brien.Sh EXAMPLES
114*d5064cc2SJoel Dahl.Bd -literal
11527db57a9SDavid E. O'Brien#include <sys/types.h>
11627db57a9SDavid E. O'Brien#include <sys/stat.h>
11727db57a9SDavid E. O'Brien#include <sys/wait.h>
11827db57a9SDavid E. O'Brien#include <sys/ioctl.h>
11927db57a9SDavid E. O'Brien#include <dev/filemon/filemon.h>
12027db57a9SDavid E. O'Brien#include <fcntl.h>
12127db57a9SDavid E. O'Brien#include <err.h>
12227db57a9SDavid E. O'Brien
12327db57a9SDavid E. O'Brienstatic void
12427db57a9SDavid E. O'Brienopen_filemon(void)
12527db57a9SDavid E. O'Brien{
12627db57a9SDavid E. O'Brien	pid_t child;
12727db57a9SDavid E. O'Brien	int fm_fd, fm_log;
12827db57a9SDavid E. O'Brien
12927db57a9SDavid E. O'Brien	if ((fm_fd = open("/dev/filemon", O_RDWR)) == -1)
13027db57a9SDavid E. O'Brien		err(1, "open(\"/dev/filemon\", O_RDWR)");
13127db57a9SDavid E. O'Brien	if ((fm_log = open("filemon.out",
13227db57a9SDavid E. O'Brien	    O_CREAT | O_WRONLY | O_TRUNC, DEFFILEMODE)) == -1)
13327db57a9SDavid E. O'Brien		err(1, "open(filemon.out)");
13427db57a9SDavid E. O'Brien
13530a39288SDavid E. O'Brien	if (ioctl(fm_fd, FILEMON_SET_FD, &fm_log) == -1)
13627db57a9SDavid E. O'Brien		err(1, "Cannot set filemon log file descriptor");
13727db57a9SDavid E. O'Brien	/* Set up these two fd's to close on exec. */
13827db57a9SDavid E. O'Brien	(void)fcntl(fm_fd, F_SETFD, FD_CLOEXEC);
13927db57a9SDavid E. O'Brien	(void)fcntl(fm_log, F_SETFD, FD_CLOEXEC);
14027db57a9SDavid E. O'Brien
14127db57a9SDavid E. O'Brien	if ((child = fork()) == 0) {
14230a39288SDavid E. O'Brien		child = getpid();
14330a39288SDavid E. O'Brien		if (ioctl(fm_fd, FILEMON_SET_PID, &child) == -1)
14430a39288SDavid E. O'Brien			err(1, "Cannot set filemon PID");
14527db57a9SDavid E. O'Brien		/* Do something here. */
14627db57a9SDavid E. O'Brien		return 0;
14727db57a9SDavid E. O'Brien	} else {
14827db57a9SDavid E. O'Brien		wait(&child);
14927db57a9SDavid E. O'Brien		close(fm_fd);
15027db57a9SDavid E. O'Brien	}
15127db57a9SDavid E. O'Brien	return 0;
15227db57a9SDavid E. O'Brien}
15327db57a9SDavid E. O'Brien.Ed
15427db57a9SDavid E. O'Brien.Pp
15527db57a9SDavid E. O'BrienCreates a file named
15627db57a9SDavid E. O'Brien.Pa filemon.out
15727db57a9SDavid E. O'Brienand configures the
15827db57a9SDavid E. O'Brien.Nm
15927db57a9SDavid E. O'Briendevice to write the filemon buffer contents to it.
16027db57a9SDavid E. O'Brien.Sh SEE ALSO
16127db57a9SDavid E. O'Brien.Xr dtrace 1 ,
16227db57a9SDavid E. O'Brien.Xr ktrace 1 ,
16327db57a9SDavid E. O'Brien.Xr truss 1
16427db57a9SDavid E. O'Brien.Sh HISTORY
16527db57a9SDavid E. O'BrienA
16627db57a9SDavid E. O'Brien.Nm
16727db57a9SDavid E. O'Briendevice appeared in
16827db57a9SDavid E. O'Brien.Fx 9.1 .
169