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