Module Name: src Committed By: christos Date: Mon Jun 15 19:45:31 UTC 2015
Modified Files: src/sys/dev/filemon: filemon_wrapper.c Log Message: staircase flattening police. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/dev/filemon/filemon_wrapper.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/filemon/filemon_wrapper.c diff -u src/sys/dev/filemon/filemon_wrapper.c:1.6 src/sys/dev/filemon/filemon_wrapper.c:1.7 --- src/sys/dev/filemon/filemon_wrapper.c:1.6 Mon Jun 15 14:11:36 2015 +++ src/sys/dev/filemon/filemon_wrapper.c Mon Jun 15 15:45:31 2015 @@ -1,3 +1,5 @@ +/* $NetBSD: filemon_wrapper.c,v 1.7 2015/06/15 19:45:31 christos Exp $ */ + /* * Copyright (c) 2010, Juniper Networks, Inc. * @@ -24,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: filemon_wrapper.c,v 1.6 2015/06/15 18:11:36 sjg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: filemon_wrapper.c,v 1.7 2015/06/15 19:45:31 christos Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -41,27 +43,27 @@ static int filemon_wrapper_chdir(struct lwp * l, const struct sys_chdir_args * uap, register_t * retval) { - int ret; int error; size_t done; struct filemon *filemon; - if ((ret = sys_chdir(l, uap, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_chdir(l, uap, retval)) != 0) + return 0; - if (filemon) { + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; - error = copyinstr(SCARG(uap, path), filemon->fm_fname1, - sizeof(filemon->fm_fname1), &done); - if (error == 0) { - filemon_printf(filemon, - "C %d %s\n", - curproc->p_pid, filemon->fm_fname1); - } - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + error = copyinstr(SCARG(uap, path), filemon->fm_fname1, + sizeof(filemon->fm_fname1), &done); + if (error) + goto out; + + filemon_printf(filemon, "C %d %s\n", + curproc->p_pid, filemon->fm_fname1); +out: + rw_exit(&filemon->fm_mtx); + return 0; } static int @@ -69,232 +71,234 @@ filemon_wrapper_execve(struct lwp * l, s register_t * retval) { char fname[MAXPATHLEN]; - int ret; int error; size_t done; struct filemon *filemon; - error = copyinstr(SCARG(uap, path), fname, sizeof(fname), &done); + if ((error = sys_execve(l, uap, retval)) != EJUSTRETURN) + return 0; - if ((ret = sys_execve(l, uap, retval)) == EJUSTRETURN && error == 0) { - filemon = filemon_lookup(curproc); + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; - if (filemon) { - filemon_printf(filemon, "E %d %s\n", - curproc->p_pid, fname); - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + error = copyinstr(SCARG(uap, path), fname, sizeof(fname), &done); + if (error) + goto out; + + filemon_printf(filemon, "E %d %s\n", curproc->p_pid, fname); +out: + rw_exit(&filemon->fm_mtx); + return 0; } static int filemon_wrapper_fork(struct lwp * l, const void *v, register_t * retval) { - int ret; + int error; struct filemon *filemon; - if ((ret = sys_fork(l, v, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_fork(l, v, retval)) != 0) + return error; - if (filemon) { - filemon_printf(filemon, "F %d %ld\n", - curproc->p_pid, (long) retval[0]); - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; + + filemon_printf(filemon, "F %d %ld\n", curproc->p_pid, (long) retval[0]); + + rw_exit(&filemon->fm_mtx); + return 0; } static int filemon_wrapper_vfork(struct lwp * l, const void *v, register_t * retval) { - int ret; + int error; struct filemon *filemon; - if ((ret = sys_vfork(l, v, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_vfork(l, v, retval)) != 0) + return error; + + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; + + filemon_printf(filemon, "F %d %ld\n", curproc->p_pid, (long) retval[0]); - if (filemon) { - filemon_printf(filemon, "F %d %ld\n", - curproc->p_pid, (long) retval[0]); - rw_exit(&filemon->fm_mtx); - } + rw_exit(&filemon->fm_mtx); + return 0; +} + +static void +filemon_flags(struct filemon * filemon, int f) +{ + if (f & O_RDWR) { + /* we want a separate R record */ + filemon_printf(filemon, "R %d %s\n", curproc->p_pid, + filemon->fm_fname1); } - return (ret); + + filemon_printf(filemon, "%c %d %s\n", (f & O_ACCMODE) ? 'W' : 'R', + curproc->p_pid, filemon->fm_fname1); } static int filemon_wrapper_open(struct lwp * l, struct sys_open_args * uap, register_t * retval) { - int ret; int error; size_t done; struct filemon *filemon; - if ((ret = sys_open(l, uap, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_open(l, uap, retval)) != 0) + return error; - if (filemon) { - error = copyinstr(SCARG(uap, path), filemon->fm_fname1, - sizeof(filemon->fm_fname1), &done); - if (error == 0) { - if (SCARG(uap, flags) & O_RDWR) { - /* we want a separate R record */ - filemon_printf(filemon, - "R %d %s\n", - curproc->p_pid, - filemon->fm_fname1); - } - filemon_printf(filemon, - "%c %d %s\n", - (SCARG(uap, flags) & O_ACCMODE) ? 'W' : 'R', - curproc->p_pid, filemon->fm_fname1); - } - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; + + error = copyinstr(SCARG(uap, path), filemon->fm_fname1, + sizeof(filemon->fm_fname1), &done); + if (error) + goto out; + + filemon_flags(filemon, SCARG(uap, flags)); +out: + rw_exit(&filemon->fm_mtx); + return 0; } static int filemon_wrapper_openat(struct lwp * l, struct sys_openat_args * uap, register_t * retval) { - int ret; int error; size_t done; struct filemon *filemon; - if ((ret = sys_openat(l, uap, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_openat(l, uap, retval)) != 0) + return error; - if (filemon) { - error = copyinstr(SCARG(uap, path), filemon->fm_fname1, - sizeof(filemon->fm_fname1), &done); - if (error == 0) { - if (filemon->fm_fname1[0] != '/' && - SCARG(uap, fd) != AT_FDCWD) { - /* - * Rats we cannot just treat like open. - * Output an 'A' record as a clue. - */ - filemon_printf(filemon, - "A %d %s\n", - curproc->p_pid, - filemon->fm_fname1); - } - if (SCARG(uap, oflags) & O_RDWR) { - /* we want a separate R record */ - filemon_printf(filemon, - "R %d %s\n", - curproc->p_pid, - filemon->fm_fname1); - } - filemon_printf(filemon, - "%c %d %s\n", - (SCARG(uap, oflags) & O_ACCMODE) ? 'W' : 'R', - curproc->p_pid, filemon->fm_fname1); - } - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; + + error = copyinstr(SCARG(uap, path), filemon->fm_fname1, + sizeof(filemon->fm_fname1), &done); + if (error) + goto out; + + if (filemon->fm_fname1[0] != '/' && SCARG(uap, fd) != AT_FDCWD) { + /* + * Rats we cannot just treat like open. + * Output an 'A' record as a clue. + */ + filemon_printf(filemon, "A %d %s\n", curproc->p_pid, + filemon->fm_fname1); + } + + filemon_flags(filemon, SCARG(uap, oflags)); +out: + rw_exit(&filemon->fm_mtx); + return 0; } static int filemon_wrapper_rename(struct lwp * l, struct sys_rename_args * uap, register_t * retval) { - int ret; int error; size_t done; struct filemon *filemon; - if ((ret = sys_rename(l, uap, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_rename(l, uap, retval)) != 0) + return error; - if (filemon) { - error = copyinstr(SCARG(uap, from), filemon->fm_fname1, - sizeof(filemon->fm_fname1), &done); - if (error == 0) - error = copyinstr(SCARG(uap, to), - filemon->fm_fname2, - sizeof(filemon->fm_fname2), &done); - if (error == 0) { - filemon_printf(filemon, - "M %d '%s' '%s'\n", - curproc->p_pid, filemon->fm_fname1, - filemon->fm_fname2); - } - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; + + error = copyinstr(SCARG(uap, from), filemon->fm_fname1, + sizeof(filemon->fm_fname1), &done); + if (error) + goto out; + + error = copyinstr(SCARG(uap, to), filemon->fm_fname2, + sizeof(filemon->fm_fname2), &done); + if (error) + goto out; + + filemon_printf(filemon, "M %d '%s' '%s'\n", curproc->p_pid, + filemon->fm_fname1, filemon->fm_fname2); +out: + rw_exit(&filemon->fm_mtx); + return 0; } static int filemon_wrapper_link(struct lwp * l, struct sys_link_args * uap, register_t * retval) { - int ret; int error; size_t done; struct filemon *filemon; - if ((ret = sys_link(l, uap, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_link(l, uap, retval)) != 0) + return error; - if (filemon) { - error = copyinstr(SCARG(uap, path), - filemon->fm_fname1, sizeof(filemon->fm_fname1), - &done); - if (error == 0) - error = copyinstr(SCARG(uap, link), - filemon->fm_fname2, - sizeof(filemon->fm_fname2), &done); - if (error == 0) { - filemon_printf(filemon, "L %d '%s' '%s'\n", - curproc->p_pid, filemon->fm_fname1, - filemon->fm_fname2); - } - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; + + error = copyinstr(SCARG(uap, path), filemon->fm_fname1, + sizeof(filemon->fm_fname1), &done); + if (error) + goto out; + + error = copyinstr(SCARG(uap, link), filemon->fm_fname2, + sizeof(filemon->fm_fname2), &done); + if (error) + goto out; + + filemon_printf(filemon, "L %d '%s' '%s'\n", curproc->p_pid, + filemon->fm_fname1, filemon->fm_fname2); +out: + rw_exit(&filemon->fm_mtx); + return 0; } static int filemon_wrapper_symlink(struct lwp * l, struct sys_symlink_args * uap, register_t * retval) { - int ret; int error; size_t done; struct filemon *filemon; - if ((ret = sys_symlink(l, uap, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_symlink(l, uap, retval)) != 0) + return error; - if (filemon) { - error = copyinstr(SCARG(uap, path), - filemon->fm_fname1, - sizeof(filemon->fm_fname1), &done); - if (error == 0) - error = copyinstr(SCARG(uap, link), - filemon->fm_fname2, - sizeof(filemon->fm_fname2), &done); - if (error == 0) { - filemon_printf(filemon, "L %d '%s' '%s'\n", - curproc->p_pid, filemon->fm_fname1, - filemon->fm_fname2); - } - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; + + error = copyinstr(SCARG(uap, path), filemon->fm_fname1, + sizeof(filemon->fm_fname1), &done); + if (error) + goto out; + + error = copyinstr(SCARG(uap, link), filemon->fm_fname2, + sizeof(filemon->fm_fname2), &done); + if (error) + goto out; + + filemon_printf(filemon, "L %d '%s' '%s'\n", curproc->p_pid, + filemon->fm_fname1, filemon->fm_fname2); +out: + rw_exit(&filemon->fm_mtx); + return 0; } @@ -309,10 +313,11 @@ filemon_wrapper_sys_exit(struct lwp * l, if (filemon) { filemon_printf(filemon, "X %d %d\n", curproc->p_pid, SCARG(uap, rval)); + /* Check if the monitored process is about to exit. */ - if (filemon->fm_pid == curproc->p_pid) { + if (filemon->fm_pid == curproc->p_pid) filemon_printf(filemon, "# Bye bye\n"); - } + rw_exit(&filemon->fm_mtx); } sys_exit(l, uap, retval); @@ -322,26 +327,27 @@ static int filemon_wrapper_unlink(struct lwp * l, struct sys_unlink_args * uap, register_t * retval) { - int ret; int error; size_t done; struct filemon *filemon; - if ((ret = sys_unlink(l, uap, retval)) == 0) { - filemon = filemon_lookup(curproc); + if ((error = sys_unlink(l, uap, retval)) != 0) + return error; - if (filemon) { - error = copyinstr(SCARG(uap, path), - filemon->fm_fname1, - sizeof(filemon->fm_fname1), &done); - if (error == 0) { - filemon_printf(filemon, "D %d %s\n", - curproc->p_pid, filemon->fm_fname1); - } - rw_exit(&filemon->fm_mtx); - } - } - return (ret); + filemon = filemon_lookup(curproc); + if (filemon == NULL) + return 0; + + error = copyinstr(SCARG(uap, path), filemon->fm_fname1, + sizeof(filemon->fm_fname1), &done); + if (error) + goto out; + + filemon_printf(filemon, "D %d %s\n", + curproc->p_pid, filemon->fm_fname1); +out: + rw_exit(&filemon->fm_mtx); + return 0; }