Date: Fri, 4 Jul 2008 13:15:14 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 144612 for review Message-ID: <200807041315.m64DFEse011470@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=144612 Change 144612 by hselasky@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);help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200807041315.m64DFEse011470>
