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