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