xref: /freebsd-src/contrib/bmake/filemon/filemon_dev.c (revision 06b9b3e0ad0dc3f0166b3e8f26ced68c271cf527)
1*06b9b3e0SSimon J. Gerraty /*	$NetBSD: filemon_dev.c,v 1.6 2020/11/29 09:27:40 rillig Exp $	*/
249caa483SSimon J. Gerraty 
349caa483SSimon J. Gerraty /*-
449caa483SSimon J. Gerraty  * Copyright (c) 2020 The NetBSD Foundation, Inc.
549caa483SSimon J. Gerraty  * All rights reserved.
649caa483SSimon J. Gerraty  *
749caa483SSimon J. Gerraty  * This code is derived from software contributed to The NetBSD Foundation
849caa483SSimon J. Gerraty  * by Taylor R. Campbell.
949caa483SSimon J. Gerraty  *
1049caa483SSimon J. Gerraty  * Redistribution and use in source and binary forms, with or without
1149caa483SSimon J. Gerraty  * modification, are permitted provided that the following conditions
1249caa483SSimon J. Gerraty  * are met:
1349caa483SSimon J. Gerraty  * 1. Redistributions of source code must retain the above copyright
1449caa483SSimon J. Gerraty  *    notice, this list of conditions and the following disclaimer.
1549caa483SSimon J. Gerraty  * 2. Redistributions in binary form must reproduce the above copyright
1649caa483SSimon J. Gerraty  *    notice, this list of conditions and the following disclaimer in the
1749caa483SSimon J. Gerraty  *    documentation and/or other materials provided with the distribution.
1849caa483SSimon J. Gerraty  *
1949caa483SSimon J. Gerraty  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2049caa483SSimon J. Gerraty  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2149caa483SSimon J. Gerraty  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2249caa483SSimon J. Gerraty  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2349caa483SSimon J. Gerraty  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2449caa483SSimon J. Gerraty  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2549caa483SSimon J. Gerraty  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2649caa483SSimon J. Gerraty  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2749caa483SSimon J. Gerraty  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2849caa483SSimon J. Gerraty  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2949caa483SSimon J. Gerraty  * POSSIBILITY OF SUCH DAMAGE.
3049caa483SSimon J. Gerraty  */
3149caa483SSimon J. Gerraty 
3249caa483SSimon J. Gerraty #include "filemon.h"
3349caa483SSimon J. Gerraty 
3449caa483SSimon J. Gerraty #include <sys/ioctl.h>
3549caa483SSimon J. Gerraty 
3649caa483SSimon J. Gerraty #include <errno.h>
3749caa483SSimon J. Gerraty #include <fcntl.h>
3849caa483SSimon J. Gerraty #include <stdlib.h>
3949caa483SSimon J. Gerraty #include <unistd.h>
4049caa483SSimon J. Gerraty 
4149caa483SSimon J. Gerraty #ifdef HAVE_FILEMON_H
4249caa483SSimon J. Gerraty #  include <filemon.h>
4349caa483SSimon J. Gerraty #endif
4449caa483SSimon J. Gerraty 
4549caa483SSimon J. Gerraty #ifndef _PATH_FILEMON
4649caa483SSimon J. Gerraty #define _PATH_FILEMON	"/dev/filemon"
4749caa483SSimon J. Gerraty #endif
4849caa483SSimon J. Gerraty 
4949caa483SSimon J. Gerraty struct filemon {
5049caa483SSimon J. Gerraty 	int	fd;
5149caa483SSimon J. Gerraty };
5249caa483SSimon J. Gerraty 
5349caa483SSimon J. Gerraty const char *
5449caa483SSimon J. Gerraty filemon_path(void)
5549caa483SSimon J. Gerraty {
5649caa483SSimon J. Gerraty 
5749caa483SSimon J. Gerraty 	return _PATH_FILEMON;
5849caa483SSimon J. Gerraty }
5949caa483SSimon J. Gerraty 
6049caa483SSimon J. Gerraty struct filemon *
6149caa483SSimon J. Gerraty filemon_open(void)
6249caa483SSimon J. Gerraty {
6349caa483SSimon J. Gerraty 	struct filemon *F;
6449caa483SSimon J. Gerraty 	unsigned i;
6549caa483SSimon J. Gerraty 	int error;
6649caa483SSimon J. Gerraty 
6749caa483SSimon J. Gerraty 	/* Allocate and zero a struct filemon object.  */
68e2eeea75SSimon J. Gerraty 	F = calloc(1, sizeof *F);
6949caa483SSimon J. Gerraty 	if (F == NULL)
7049caa483SSimon J. Gerraty 		return NULL;
7149caa483SSimon J. Gerraty 
7249caa483SSimon J. Gerraty 	/* Try opening /dev/filemon, up to six times (cargo cult!).  */
733841c287SSimon J. Gerraty 	for (i = 0; (F->fd = open(_PATH_FILEMON, O_RDWR|O_CLOEXEC)) == -1; i++) {
7449caa483SSimon J. Gerraty 		if (i == 5) {
7549caa483SSimon J. Gerraty 			error = errno;
7649caa483SSimon J. Gerraty 			goto fail0;
7749caa483SSimon J. Gerraty 		}
7849caa483SSimon J. Gerraty 	}
7949caa483SSimon J. Gerraty 
8049caa483SSimon J. Gerraty 	/* Success!  */
8149caa483SSimon J. Gerraty 	return F;
8249caa483SSimon J. Gerraty 
8349caa483SSimon J. Gerraty fail0:	free(F);
8449caa483SSimon J. Gerraty 	errno = error;
8549caa483SSimon J. Gerraty 	return NULL;
8649caa483SSimon J. Gerraty }
8749caa483SSimon J. Gerraty 
8849caa483SSimon J. Gerraty int
8949caa483SSimon J. Gerraty filemon_setfd(struct filemon *F, int fd)
9049caa483SSimon J. Gerraty {
9149caa483SSimon J. Gerraty 
9249caa483SSimon J. Gerraty 	/* Point the kernel at this file descriptor.  */
9349caa483SSimon J. Gerraty 	if (ioctl(F->fd, FILEMON_SET_FD, &fd) == -1)
9449caa483SSimon J. Gerraty 		return -1;
9549caa483SSimon J. Gerraty 
9649caa483SSimon J. Gerraty 	/* No need for it in userland any more; close it.  */
9749caa483SSimon J. Gerraty 	(void)close(fd);
9849caa483SSimon J. Gerraty 
9949caa483SSimon J. Gerraty 	/* Success!  */
10049caa483SSimon J. Gerraty 	return 0;
10149caa483SSimon J. Gerraty }
10249caa483SSimon J. Gerraty 
10349caa483SSimon J. Gerraty void
10449caa483SSimon J. Gerraty filemon_setpid_parent(struct filemon *F, pid_t pid)
10549caa483SSimon J. Gerraty {
10649caa483SSimon J. Gerraty 	/* Nothing to do!  */
10749caa483SSimon J. Gerraty }
10849caa483SSimon J. Gerraty 
10949caa483SSimon J. Gerraty int
11049caa483SSimon J. Gerraty filemon_setpid_child(const struct filemon *F, pid_t pid)
11149caa483SSimon J. Gerraty {
11249caa483SSimon J. Gerraty 
11349caa483SSimon J. Gerraty 	/* Just pass it on to the kernel.  */
11449caa483SSimon J. Gerraty 	return ioctl(F->fd, FILEMON_SET_PID, &pid);
11549caa483SSimon J. Gerraty }
11649caa483SSimon J. Gerraty 
11749caa483SSimon J. Gerraty int
11849caa483SSimon J. Gerraty filemon_close(struct filemon *F)
11949caa483SSimon J. Gerraty {
12049caa483SSimon J. Gerraty 	int error = 0;
12149caa483SSimon J. Gerraty 
12249caa483SSimon J. Gerraty 	/* Close the filemon device fd.  */
12349caa483SSimon J. Gerraty 	if (close(F->fd) == -1 && error == 0)
12449caa483SSimon J. Gerraty 		error = errno;
12549caa483SSimon J. Gerraty 
12649caa483SSimon J. Gerraty 	/* Free the filemon descriptor.  */
12749caa483SSimon J. Gerraty 	free(F);
12849caa483SSimon J. Gerraty 
12949caa483SSimon J. Gerraty 	/* Set errno and return -1 if anything went wrong.  */
130*06b9b3e0SSimon J. Gerraty 	if (error != 0) {
13149caa483SSimon J. Gerraty 		errno = error;
13249caa483SSimon J. Gerraty 		return -1;
13349caa483SSimon J. Gerraty 	}
13449caa483SSimon J. Gerraty 
13549caa483SSimon J. Gerraty 	/* Success!  */
13649caa483SSimon J. Gerraty 	return 0;
13749caa483SSimon J. Gerraty }
13849caa483SSimon J. Gerraty 
13949caa483SSimon J. Gerraty int
14049caa483SSimon J. Gerraty filemon_readfd(const struct filemon *F)
14149caa483SSimon J. Gerraty {
14249caa483SSimon J. Gerraty 
14349caa483SSimon J. Gerraty 	return -1;
14449caa483SSimon J. Gerraty }
14549caa483SSimon J. Gerraty 
14649caa483SSimon J. Gerraty int
14749caa483SSimon J. Gerraty filemon_process(struct filemon *F)
14849caa483SSimon J. Gerraty {
14949caa483SSimon J. Gerraty 
15049caa483SSimon J. Gerraty 	return 0;
15149caa483SSimon J. Gerraty }
152