Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Apr 2001 02:22:23 -0700
From:      Dima Dorfman <dima@unixfreak.org>
To:        Brian Somers <brian@Awfulhak.org>
Cc:        hackers@FreeBSD.ORG
Subject:   Re: Patch to make snp(4) devfs-friendly 
Message-ID:  <20010417092223.9AC973E09@bazooka.unixfreak.org>
In-Reply-To: <200104170905.f3H95lr61736@hak.lan.Awfulhak.org>; from brian@Awfulhak.org on "Tue, 17 Apr 2001 10:05:47 %2B0100"

next in thread | previous in thread | raw e-mail | index | archive | help
Brian Somers <brian@Awfulhak.org> writes:
> 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 :*]

I think the correct approach is to check for !(si_flags & SI_NAMED) as
done in rev. 1.68 of sys/net/bpf.c (that rev. has a precedence bug,
which has since been fixed).  That was written by phk, who I take to
be pretty authoritative on the subject; looking at the places SI_NAMED
is used also supports this conclusion.

A corrected patch is attached (although I didn't test it in the
non-devfs case).

Thanks!

					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 09:16:52
@@ -287,10 +287,10 @@
 		return (error);
 
 	if (dev->si_drv1 == NULL) {
-		int mynor = minor(dev);
-
+		if (!(dev->si_flags & SI_NAMED))
+			make_dev(&snp_cdevsw, minor(dev), UID_ROOT, GID_WHEEL,
+			    0600, "snp%d", dev2unit(dev));
 		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
 		return (EBUSY);
 
@@ -365,6 +365,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 +506,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);
 }
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010417092223.9AC973E09>