[Midnightbsd-cvs] src [6588] trunk/sys/dev/filemon: revert
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Mon Dec 30 01:10:21 EST 2013
Revision: 6588
http://svnweb.midnightbsd.org/src/?rev=6588
Author: laffer1
Date: 2013-12-30 01:10:21 -0500 (Mon, 30 Dec 2013)
Log Message:
-----------
revert
Modified Paths:
--------------
trunk/sys/dev/filemon/filemon.c
trunk/sys/dev/filemon/filemon_wrapper.c
Modified: trunk/sys/dev/filemon/filemon.c
===================================================================
--- trunk/sys/dev/filemon/filemon.c 2013-12-30 05:54:41 UTC (rev 6587)
+++ trunk/sys/dev/filemon/filemon.c 2013-12-30 06:10:21 UTC (rev 6588)
@@ -28,6 +28,8 @@
#include <sys/cdefs.h>
__MBSDID("$MidnightBSD$");
+#include "opt_compat.h"
+
#include <sys/param.h>
#include <sys/file.h>
#include <sys/systm.h>
@@ -48,7 +50,9 @@
#include <sys/sysproto.h>
#include <sys/uio.h>
+#if __FreeBSD_version >= 900041
#include <sys/capability.h>
+#endif
#include "filemon.h"
@@ -101,12 +105,48 @@
static struct thread *access_owner = NULL;
static struct thread *access_requester = NULL;
+#if __FreeBSD_version < 701000
+static struct clonedevs *filemon_clones;
+static eventhandler_tag eh_tag;
+#else
static struct cdev *filemon_dev;
+#endif
#include "filemon_lock.c"
#include "filemon_wrapper.c"
+#if __FreeBSD_version < 701000
static void
+filemon_clone(void *arg, struct ucred *cred, char *name, int namelen,
+ struct cdev **dev)
+{
+ int u = -1;
+ size_t len;
+
+ if (*dev != NULL)
+ return;
+
+ len = strlen(name);
+
+ if (len != 7)
+ return;
+
+ if (bcmp(name,"filemon", 7) != 0)
+ return;
+
+ /* Clone the device to the new minor number. */
+ if (clone_create(&filemon_clones, &filemon_cdevsw, &u, dev, 0) != 0)
+ /* Create the /dev/filemonNN entry. */
+ *dev = make_dev_cred(&filemon_cdevsw, u, cred, UID_ROOT,
+ GID_WHEEL, 0666, "filemon%d", u);
+ if (*dev != NULL) {
+ dev_ref(*dev);
+ (*dev)->si_flags |= SI_CHEAPCLONE;
+ }
+}
+#endif
+
+static void
filemon_dtr(void *data)
{
struct filemon *filemon = data;
@@ -142,12 +182,20 @@
struct filemon *filemon;
struct proc *p;
+#if __FreeBSD_version < 701000
+ filemon = dev->si_drv1;
+#else
devfs_get_cdevpriv((void **) &filemon);
+#endif
switch (cmd) {
/* Set the output file descriptor. */
case FILEMON_SET_FD:
+#if __FreeBSD_version < 900041
+#define FGET_WRITE(a1, a2, a3) fget_write((a1), (a2), (a3))
+#else
#define FGET_WRITE(a1, a2, a3) fget_write((a1), (a2), CAP_WRITE | CAP_SEEK, (a3))
+#endif
if ((error = FGET_WRITE(td, *(int *)data, &filemon->fp)) == 0)
/* Write the file header. */
filemon_comment(filemon);
@@ -198,7 +246,11 @@
filemon->pid = curproc->p_pid;
+#if __FreeBSD_version < 701000
+ dev->si_drv1 = filemon;
+#else
devfs_set_cdevpriv(filemon, filemon_dtr);
+#endif
/* Get exclusive write access. */
filemon_lock_write();
@@ -216,7 +268,15 @@
filemon_close(struct cdev *dev __unused, int flag __unused, int fmt __unused,
struct thread *td __unused)
{
+#if __FreeBSD_version < 701000
+ filemon_dtr(dev->si_drv1);
+ dev->si_drv1 = NULL;
+
+ /* Schedule this cloned device to be destroyed. */
+ destroy_dev_sched(dev);
+#endif
+
return (0);
}
@@ -229,8 +289,16 @@
/* Install the syscall wrappers. */
filemon_wrapper_install();
+#if __FreeBSD_version < 701000
+ /* Enable device cloning. */
+ clone_setup(&filemon_clones);
+
+ /* Setup device cloning events. */
+ eh_tag = EVENTHANDLER_REGISTER(dev_clone, filemon_clone, 0, 1000);
+#else
filemon_dev = make_dev(&filemon_cdevsw, 0, UID_ROOT, GID_WHEEL, 0666,
"filemon");
+#endif
}
static int
@@ -245,7 +313,9 @@
if (TAILQ_FIRST(&filemons_inuse) != NULL)
error = EBUSY;
else {
+#if __FreeBSD_version >= 701000
destroy_dev(filemon_dev);
+#endif
/* Deinstall the syscall wrappers. */
filemon_wrapper_deinstall();
@@ -255,6 +325,19 @@
filemon_unlock_write();
if (error == 0) {
+#if __FreeBSD_version < 701000
+ /*
+ * Check if there is still an event handler callback registered.
+ */
+ if (eh_tag != 0) {
+ /* De-register the device cloning event handler. */
+ EVENTHANDLER_DEREGISTER(dev_clone, eh_tag);
+ eh_tag = 0;
+
+ /* Stop device cloning. */
+ clone_cleanup(&filemon_clones);
+ }
+#endif
/* free() filemon structs free list. */
filemon_lock_write();
while ((filemon = TAILQ_FIRST(&filemons_free)) != NULL) {
Modified: trunk/sys/dev/filemon/filemon_wrapper.c
===================================================================
--- trunk/sys/dev/filemon/filemon_wrapper.c 2013-12-30 05:54:41 UTC (rev 6587)
+++ trunk/sys/dev/filemon/filemon_wrapper.c 2013-12-30 06:10:21 UTC (rev 6588)
@@ -30,8 +30,31 @@
#include "opt_compat.h"
+#if __FreeBSD_version > 800032
#define FILEMON_HAS_LINKAT
+#endif
+#if __FreeBSD_version < 900044 /* r225617 (2011-09-16) failed to bump
+ __FreeBSD_version. This really should
+ be based on "900045". "900044" is r225469
+ (2011-09-10) so this code is broken for
+ 9-CURRENT September 10th-16th. */
+#define sys_chdir chdir
+#define sys_execve execve
+#define sys_fork fork
+#define sys_link link
+#define sys_open open
+#define sys_rename rename
+#define sys_stat stat
+#define sys_symlink symlink
+#define sys_unlink unlink
+#define sys_vfork vfork
+#define sys_sys_exit sys_exit
+#ifdef FILEMON_HAS_LINKAT
+#define sys_linkat linkat
+#endif
+#endif /* __FreeBSD_version */
+
static void
filemon_output(struct filemon *filemon, char *msg, size_t len)
{
More information about the Midnightbsd-cvs
mailing list