diff options
author | Dima Dorfman <dd@FreeBSD.org> | 2001-07-18 13:39:43 +0000 |
---|---|---|
committer | Dima Dorfman <dd@FreeBSD.org> | 2001-07-18 13:39:43 +0000 |
commit | ac60b28d35889001b743fba44384be56f581f7fe (patch) | |
tree | 9d5c8e3ec0a54addc372cb70d2590ef38d8f610f /sys/kern/tty_snoop.c | |
parent | 10b0e058bbc6bfa10b0ff2816637b0bbd1f3c658 (diff) | |
download | src-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.c | 10 |
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); |