Date: Tue, 17 Apr 2001 10:05:47 +0100 From: Brian Somers <brian@Awfulhak.org> To: Dima Dorfman <dima@unixfreak.org> Cc: hackers@FreeBSD.ORG, brian@Awfulhak.org Subject: Re: Patch to make snp(4) devfs-friendly Message-ID: <200104170905.f3H95lr61736@hak.lan.Awfulhak.org> In-Reply-To: Message from Dima Dorfman <dima@unixfreak.org> of "Tue, 17 Apr 2001 01:33:50 PDT." <20010417083350.5989F3E2F@bazooka.unixfreak.org>
index | next in thread | previous in thread | raw e-mail
I haven't actually tested the code, but looking at the patch, I think
there's a problem with it...
Specifically, on a non-devfs system - where the device nodes are
created with mknod(1), snp_clone() isn't going to be called before
snpopen().
I've (ab)used drv2 as a flag to say whether make_dev() has been
called in net/if_tun.c, but I'm not sure if this is the right answer
either :*]
> Attached is a patch to make the snp(4) driver play ball with DEVFS.
> For better or for worse, I used the bpf(4) driver as a guide on how to
> do this.
>
> If someone could review this, and, if nothing is wrong with it, commit
> it, I'd appreciate it.
>
> Thanks in advance,
>
> Dima Dorfman
> dima@unixfreak.org
>
> Index: tty_snoop.c
> ===================================================================
> RCS file: /st/src/FreeBSD/src/sys/kern/tty_snoop.c,v
> retrieving revision 1.52
> diff -u -r1.52 tty_snoop.c
> --- tty_snoop.c 2001/03/26 12:41:01 1.52
> +++ tty_snoop.c 2001/04/17 08:17:23
> @@ -286,12 +286,9 @@
> if ((error = suser(p)) != 0)
> return (error);
>
> - if (dev->si_drv1 == NULL) {
> - int mynor = minor(dev);
> -
> + if (dev->si_drv1 == NULL)
> dev->si_drv1 = snp = malloc(sizeof(*snp), M_SNP, M_WAITOK|M_ZERO);
> - make_dev(&snp_cdevsw, mynor, 0, 0, 0600, "snp%d", mynor);
> - } else
> + else
> return (EBUSY);
>
> /*
> @@ -365,6 +362,7 @@
> free(snp->snp_buf, M_SNP);
> snp->snp_flags &= ~SNOOP_OPEN;
> dev->si_drv1 = NULL;
> + destroy_dev(dev);
>
> return (snp_detach(snp));
> }
> @@ -505,10 +503,25 @@
> static void snp_drvinit __P((void *unused));
>
> static void
> +snp_clone(void *arg, char *name, int namelen, dev_t *dev)
> +{
> + int u;
> +
> + if (*dev != NODEV)
> + return;
> + if (dev_stdclone(name, NULL, "snp", &u) != 1)
> + return;
> + *dev = make_dev(&snp_cdevsw, unit2minor(u), UID_ROOT, GID_WHEEL, 0600,
> + "snp%d", u);
> + return;
> +}
> +
> +static void
> snp_drvinit(unused)
> void *unused;
> {
>
> + EVENTHANDLER_REGISTER(dev_clone, snp_clone, 0, 1000);
> cdevsw_add(&snp_cdevsw);
> }
>
--
Brian <brian@Awfulhak.org> <brian@[uk.]FreeBSD.org>
<http://www.Awfulhak.org> <brian@[uk.]OpenBSD.org>
Don't _EVER_ lose your sense of humour !
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200104170905.f3H95lr61736>
