1*1d3f2ddcSSimon J. Gerraty /* $NetBSD: filemon_dev.c,v 1.9 2022/03/04 23:17:16 sjg Exp $ */
249caa483SSimon J. Gerraty
3dba7b0efSSimon 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
49*1d3f2ddcSSimon J. Gerraty #ifndef MAKE_ATTR_UNUSED
50*1d3f2ddcSSimon J. Gerraty #define MAKE_ATTR_UNUSED __attribute__((__unused__))
51*1d3f2ddcSSimon J. Gerraty #endif
52*1d3f2ddcSSimon J. Gerraty
5349caa483SSimon J. Gerraty struct filemon {
5449caa483SSimon J. Gerraty int fd;
5549caa483SSimon J. Gerraty };
5649caa483SSimon J. Gerraty
5749caa483SSimon J. Gerraty const char *
filemon_path(void)5849caa483SSimon J. Gerraty filemon_path(void)
5949caa483SSimon J. Gerraty {
6049caa483SSimon J. Gerraty
6149caa483SSimon J. Gerraty return _PATH_FILEMON;
6249caa483SSimon J. Gerraty }
6349caa483SSimon J. Gerraty
6449caa483SSimon J. Gerraty struct filemon *
filemon_open(void)6549caa483SSimon J. Gerraty filemon_open(void)
6649caa483SSimon J. Gerraty {
6749caa483SSimon J. Gerraty struct filemon *F;
6849caa483SSimon J. Gerraty unsigned i;
6949caa483SSimon J. Gerraty int error;
7049caa483SSimon J. Gerraty
7149caa483SSimon J. Gerraty /* Allocate and zero a struct filemon object. */
72e2eeea75SSimon J. Gerraty F = calloc(1, sizeof *F);
7349caa483SSimon J. Gerraty if (F == NULL)
7449caa483SSimon J. Gerraty return NULL;
7549caa483SSimon J. Gerraty
7649caa483SSimon J. Gerraty /* Try opening /dev/filemon, up to six times (cargo cult!). */
773841c287SSimon J. Gerraty for (i = 0; (F->fd = open(_PATH_FILEMON, O_RDWR|O_CLOEXEC)) == -1; i++) {
7849caa483SSimon J. Gerraty if (i == 5) {
7949caa483SSimon J. Gerraty error = errno;
8049caa483SSimon J. Gerraty goto fail0;
8149caa483SSimon J. Gerraty }
8249caa483SSimon J. Gerraty }
8349caa483SSimon J. Gerraty
8449caa483SSimon J. Gerraty /* Success! */
8549caa483SSimon J. Gerraty return F;
8649caa483SSimon J. Gerraty
8749caa483SSimon J. Gerraty fail0: free(F);
8849caa483SSimon J. Gerraty errno = error;
8949caa483SSimon J. Gerraty return NULL;
9049caa483SSimon J. Gerraty }
9149caa483SSimon J. Gerraty
9249caa483SSimon J. Gerraty int
filemon_setfd(struct filemon * F,int fd)9349caa483SSimon J. Gerraty filemon_setfd(struct filemon *F, int fd)
9449caa483SSimon J. Gerraty {
9549caa483SSimon J. Gerraty
9649caa483SSimon J. Gerraty /* Point the kernel at this file descriptor. */
9749caa483SSimon J. Gerraty if (ioctl(F->fd, FILEMON_SET_FD, &fd) == -1)
9849caa483SSimon J. Gerraty return -1;
9949caa483SSimon J. Gerraty
10049caa483SSimon J. Gerraty /* No need for it in userland any more; close it. */
10149caa483SSimon J. Gerraty (void)close(fd);
10249caa483SSimon J. Gerraty
10349caa483SSimon J. Gerraty /* Success! */
10449caa483SSimon J. Gerraty return 0;
10549caa483SSimon J. Gerraty }
10649caa483SSimon J. Gerraty
10749caa483SSimon J. Gerraty void
filemon_setpid_parent(struct filemon * F MAKE_ATTR_UNUSED,pid_t pid MAKE_ATTR_UNUSED)108*1d3f2ddcSSimon J. Gerraty filemon_setpid_parent(struct filemon *F MAKE_ATTR_UNUSED, pid_t pid MAKE_ATTR_UNUSED)
10949caa483SSimon J. Gerraty {
11049caa483SSimon J. Gerraty /* Nothing to do! */
11149caa483SSimon J. Gerraty }
11249caa483SSimon J. Gerraty
11349caa483SSimon J. Gerraty int
filemon_setpid_child(const struct filemon * F,pid_t pid)11449caa483SSimon J. Gerraty filemon_setpid_child(const struct filemon *F, pid_t pid)
11549caa483SSimon J. Gerraty {
11649caa483SSimon J. Gerraty
11749caa483SSimon J. Gerraty /* Just pass it on to the kernel. */
11849caa483SSimon J. Gerraty return ioctl(F->fd, FILEMON_SET_PID, &pid);
11949caa483SSimon J. Gerraty }
12049caa483SSimon J. Gerraty
12149caa483SSimon J. Gerraty int
filemon_close(struct filemon * F)12249caa483SSimon J. Gerraty filemon_close(struct filemon *F)
12349caa483SSimon J. Gerraty {
12449caa483SSimon J. Gerraty int error = 0;
12549caa483SSimon J. Gerraty
12649caa483SSimon J. Gerraty /* Close the filemon device fd. */
12749caa483SSimon J. Gerraty if (close(F->fd) == -1 && error == 0)
12849caa483SSimon J. Gerraty error = errno;
12949caa483SSimon J. Gerraty
13049caa483SSimon J. Gerraty /* Free the filemon descriptor. */
13149caa483SSimon J. Gerraty free(F);
13249caa483SSimon J. Gerraty
13349caa483SSimon J. Gerraty /* Set errno and return -1 if anything went wrong. */
13406b9b3e0SSimon J. Gerraty if (error != 0) {
13549caa483SSimon J. Gerraty errno = error;
13649caa483SSimon J. Gerraty return -1;
13749caa483SSimon J. Gerraty }
13849caa483SSimon J. Gerraty
13949caa483SSimon J. Gerraty /* Success! */
14049caa483SSimon J. Gerraty return 0;
14149caa483SSimon J. Gerraty }
14249caa483SSimon J. Gerraty
14349caa483SSimon J. Gerraty int
filemon_readfd(const struct filemon * F MAKE_ATTR_UNUSED)144*1d3f2ddcSSimon J. Gerraty filemon_readfd(const struct filemon *F MAKE_ATTR_UNUSED)
14549caa483SSimon J. Gerraty {
14649caa483SSimon J. Gerraty
14749caa483SSimon J. Gerraty return -1;
14849caa483SSimon J. Gerraty }
14949caa483SSimon J. Gerraty
15049caa483SSimon J. Gerraty int
filemon_process(struct filemon * F MAKE_ATTR_UNUSED)151*1d3f2ddcSSimon J. Gerraty filemon_process(struct filemon *F MAKE_ATTR_UNUSED)
15249caa483SSimon J. Gerraty {
15349caa483SSimon J. Gerraty
15449caa483SSimon J. Gerraty return 0;
15549caa483SSimon J. Gerraty }
156