PERFORCE change 144612 for review

Hans Petter Selasky hselasky at FreeBSD.org
Fri Jul 4 13:15:15 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=144612

Change 144612 by hselasky at hselasky_laptop001 on 2008/07/04 13:14:33

	
	Improve kernel devfs symlink support.

Affected files ...

.. //depot/projects/usb/src/sys/fs/devfs/devfs_devs.c#8 edit
.. //depot/projects/usb/src/sys/kern/kern_conf.c#8 edit
.. //depot/projects/usb/src/sys/sys/conf.h#8 edit

Differences ...

==== //depot/projects/usb/src/sys/fs/devfs/devfs_devs.c#8 (text+ko) ====

@@ -350,7 +350,6 @@
 	struct cdev_priv *cdp;
 	struct devfs_dirent *de;
 	struct devfs_dirent *dd;
-	struct cdev *pdev;
 	int j;
 	char *q, *s;
 
@@ -436,10 +435,9 @@
 			de->de_gid = 0;
 			de->de_mode = 0755;
 			de->de_dirent->d_type = DT_LNK;
-			pdev = cdp->cdp_c.si_parent;
-			j = strlen(pdev->si_name) + 1;
+			j = strlen(cdp->cdp_c.si_symlink) + 1;
 			de->de_symlink = malloc(j, M_DEVFS, M_WAITOK);
-			bcopy(pdev->si_name, de->de_symlink, j);
+			bcopy(cdp->cdp_c.si_symlink, de->de_symlink, j);
 		} else {
 			de->de_uid = cdp->cdp_c.si_uid;
 			de->de_gid = cdp->cdp_c.si_gid;

==== //depot/projects/usb/src/sys/kern/kern_conf.c#8 (text+ko) ====

@@ -690,7 +690,7 @@
 		printf("WARNING: Device name truncated! (%s)\n", 
 		    dev->__si_namebuf);
 	}
-		
+
 	dev->si_flags |= SI_NAMED;
 #ifdef MAC
 	if (cr != NULL)
@@ -758,7 +758,6 @@
 dev_dependsl(struct cdev *pdev, struct cdev *cdev)
 {
 
-	cdev->si_parent = pdev;
 	cdev->si_flags |= SI_CHILD;
 	LIST_INSERT_HEAD(&pdev->si_children, cdev, si_siblings);
 }
@@ -773,35 +772,81 @@
 	dev_unlock();
 }
 
-struct cdev *
-make_dev_alias(struct cdev *pdev, const char *fmt, ...)
+static struct cdev *
+make_dev_alias_symlink(const char *target, struct cdev *pdev, const char *fmt, va_list ap)
 {
 	struct cdev *dev;
-	va_list ap;
 	int i;
 
 	dev = devfs_alloc();
 	dev_lock();
 	dev->si_flags |= SI_ALIAS;
 	dev->si_flags |= SI_NAMED;
-	va_start(ap, fmt);
-	i = vsnrprintf(dev->__si_namebuf, sizeof dev->__si_namebuf, 32, fmt, ap);
-	if (i > (sizeof dev->__si_namebuf - 1)) {
+	i = sizeof(dev->__si_namebuf);
+	i -= vsnrprintf(dev->__si_namebuf, i, 32, fmt, ap);
+	if (i < 1) {
 		printf("WARNING: Device name truncated! (%s)\n", 
 		    dev->__si_namebuf);
+		i = 1;
 	}
-	va_end(ap);
 
+	if (target == NULL) {
+		/* use parent device name */
+		dev->si_symlink = pdev->si_name;
+	} else {
+		if (i < 2) {
+			i = 1;
+		} else {
+			/* make sure there is a NUL between the strings */
+			i --;
+		}
+		/* use specified target name */
+		dev->si_symlink = dev->__si_namebuf + 
+		  sizeof(dev->__si_namebuf) - i;
+		i -= strlcpy(dev->si_symlink, target, i);
+		if (i < 1) {
+			printf("WARNING: Symlink name truncated! (%s)\n",
+			    dev->si_symlink);
+			i = 1;
+		}
+	}
 	devfs_create(dev);
 	clean_unrhdrl(devfs_inos);
 	dev_unlock();
-	dev_depends(pdev, dev);
+
+	if (pdev != NULL) {
+		dev_depends(pdev, dev);
+	}
 
 	notify_create(dev);
 
 	return (dev);
 }
 
+struct cdev *
+make_dev_alias(struct cdev *pdev, const char *fmt, ...)
+{
+	struct cdev *dev;
+	va_list ap;
+
+	va_start(ap, fmt);
+	dev = make_dev_alias_symlink(NULL, pdev, fmt, ap);
+	va_end(ap);
+	return (dev);
+}
+
+struct cdev *
+make_dev_symlink(const char *target, const char *fmt, ...)
+{
+	struct cdev *dev;
+	va_list ap;
+
+	va_start(ap, fmt);
+	dev = make_dev_alias_symlink(target, NULL, fmt, ap);
+	va_end(ap);
+	return (dev);
+}
+
 static void
 destroy_devl(struct cdev *dev)
 {

==== //depot/projects/usb/src/sys/sys/conf.h#8 (text+ko) ====

@@ -77,7 +77,7 @@
 	LIST_ENTRY(cdev)	si_clone;
 	LIST_HEAD(, cdev)	si_children;
 	LIST_ENTRY(cdev)	si_siblings;
-	struct cdev *si_parent;
+	char		*si_symlink; /* symbolic link name */
 	char		*si_name;
 	void		*si_drv1, *si_drv2;
 	struct cdevsw	*si_devsw;
@@ -273,6 +273,8 @@
 		struct ucred *_cr, uid_t _uid, gid_t _gid, int _mode,
 		const char *_fmt, ...) __printflike(8, 9);
 struct cdev *make_dev_alias(struct cdev *_pdev, const char *_fmt, ...) __printflike(2, 3);
+struct cdev *make_dev_symlink(const char *target, const char *fmt, ...) __printflike(2, 3);
+
 void	dev_lock(void);
 void	dev_unlock(void);
 void	setconf(void);


More information about the p4-projects mailing list