aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/tty_snoop.c
diff options
context:
space:
mode:
authorDima Dorfman <dd@FreeBSD.org>2001-07-18 13:39:43 +0000
committerDima Dorfman <dd@FreeBSD.org>2001-07-18 13:39:43 +0000
commitac60b28d35889001b743fba44384be56f581f7fe (patch)
tree9d5c8e3ec0a54addc372cb70d2590ef38d8f610f /sys/kern/tty_snoop.c
parent10b0e058bbc6bfa10b0ff2816637b0bbd1f3c658 (diff)
downloadsrc-ac60b28d35889001b743fba44384be56f581f7fe.tar.gz
src-ac60b28d35889001b743fba44384be56f581f7fe.zip
Keep track of all "struct snoop"'s so that snp_modevent can fail with
EBUSY if there's a device still open.
Notes
Notes: svn path=/head/; revision=79864
Diffstat (limited to 'sys/kern/tty_snoop.c')
-rw-r--r--sys/kern/tty_snoop.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sys/kern/tty_snoop.c b/sys/kern/tty_snoop.c
index 3a8e57651d22..d0563c8bd7c2 100644
--- a/sys/kern/tty_snoop.c
+++ b/sys/kern/tty_snoop.c
@@ -23,6 +23,7 @@
#include <sys/conf.h>
#include <sys/poll.h>
#include <sys/kernel.h>
+#include <sys/queue.h>
#include <sys/snoop.h>
#include <sys/vnode.h>
@@ -64,6 +65,9 @@ static MALLOC_DEFINE(M_SNP, "snp", "Snoop device data");
*/
static int snooplinedisc;
+
+static LIST_HEAD(, snoop) snp_sclist = LIST_HEAD_INITIALIZER(&snp_sclist);
+
static struct tty *snpdevtotty __P((dev_t dev));
static void snp_clone __P((void *arg, char *name,
int namelen, dev_t *dev));
@@ -361,6 +365,8 @@ snpopen(dev, flag, mode, p)
*/
snp->snp_tty = NULL;
snp->snp_target = NODEV;
+
+ LIST_INSERT_HEAD(&snp_sclist, snp, snp_list);
return (0);
}
@@ -413,6 +419,7 @@ snpclose(dev, flags, fmt, p)
snp = dev->si_drv1;
snp->snp_blen = 0;
+ LIST_REMOVE(snp, snp_list);
free(snp->snp_buf, M_SNP);
snp->snp_flags &= ~SNOOP_OPEN;
dev->si_drv1 = NULL;
@@ -583,7 +590,8 @@ snp_modevent(mod, type, data)
cdevsw_add(&snp_cdevsw);
break;
case MOD_UNLOAD:
- /* XXX don't unload if busy. */
+ if (!LIST_EMPTY(&snp_sclist))
+ return (EBUSY);
EVENTHANDLER_DEREGISTER(dev_clone, eh_tag);
ldisc_deregister(snooplinedisc);
cdevsw_remove(&snp_cdevsw);