[PATCH] compatibility symlinks for udev

On Mon, 2004-09-06 at 17:45 +0200, Kay Sievers wrote:
> On Mon, 2004-09-06 at 16:46 +0200, David Zeuthen wrote:
>
> Nice, I like it. It's a easy way to group device nodes of the same type,
> but coming from different kernel subsystems.
>

That's a good way of putting it, yeah.

> > Here's a patch against udev-030 that can help create compatibility
> > symlinks like /dev/cdrom, /dev/cdrom1 etc. The patch introduces a new
> > substitution type %C (for Compatibility) that can be used as follows
>
> I suggest using %e for enumeration here, cause "compatibility" can
> easily be misunderstood.
>

Good point, I've changed that.

> And we need a few lines added to the man page at udev.8.in :)
>

Done. I've also added an example.

Also, Kay pointed out offlist that the rules can be written to not
require a shell script; this actually works

        KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
        KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
        KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
        KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom", NAME="\%k", SYMLINK="cdrom%e"
        KERNEL="fd[0-9]", NAME="%k", SYMLINK="floppy%e"
        KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="floppy", NAME=\"%k", SYMLINK="floppy%e"

New patch is attached.

David
This commit is contained in:
david@fubar.dk 2004-09-10 21:04:13 -07:00 committed by Greg KH
parent 3e4414508b
commit 0a8dd7f37c
2 changed files with 55 additions and 0 deletions

View File

@ -42,6 +42,7 @@
#include "logging.h"
#include "namedev.h"
#include "klibc_fixups.h"
#include "udevdb.h"
static struct sysfs_attribute *find_sysfs_attribute(struct sysfs_class_device *class_dev, struct sysfs_device *sysfs_device, char *attr);
@ -179,6 +180,37 @@ static int get_format_len(char **str)
return -1;
}
/** Finds the lowest positive N such that <name>N isn't present in
* $(udevroot) either as a file or a symlink.
*
* @param name Name to check for
* @return 0 if <name> didn't exist and N otherwise.
*/
static unsigned int find_free_number (struct udevice *udev, char *name)
{
char temp[NAME_SIZE];
char path[NAME_SIZE];
struct udevice dev;
int result;
/* have to sweep the database for each lookup */
result = 0;
strncpy(temp, name, sizeof (temp));
while (1) {
if (udevdb_get_dev_byname(temp, path, &dev) != 0)
goto found;
/* symlink might be stale if $(udevroot) isn't cleaned; check
* on major/minor to see if it's the same device
*/
if (dev.major == udev->major && dev.minor == udev->minor)
goto found;
snprintf (temp, sizeof(temp), "%s%d", name, ++result);
}
found:
return result;
}
static void apply_format(struct udevice *udev, char *string, size_t maxsize,
struct sysfs_class_device *class_dev,
struct sysfs_device *sysfs_device)
@ -195,6 +227,7 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
char *rest;
int slen;
struct sysfs_attribute *tmpattr;
unsigned int next_free_number;
pos = string;
while (1) {
@ -284,6 +317,13 @@ static void apply_format(struct udevice *udev, char *string, size_t maxsize,
strfieldcatmax(string, "%", maxsize);
pos++;
break;
case 'e':
next_free_number = find_free_number(udev, string);
if (next_free_number > 0) {
snprintf(temp2, sizeof(temp2), "%d", next_free_number);
strfieldcatmax(string, temp2, maxsize);
}
break;
default:
dbg("unknown substitution type '%%%c'", c);
break;

View File

@ -272,6 +272,13 @@ all remaining parts of the result string are substituted:
.BI %s{ filename }
The content of a sysfs attribute.
.TP
.B %e
If a device node already exists with the name, the smallest positive
decimal integer N is substituted such that the resulting name doesn't
match an existing device node. Otherwise nothing is substituted. This
can be used to create compatibility symlinks and enumerate devices of
the same type originating from different kernel subsystems.
.TP
.B %%
The '%' character itself.
.P
@ -302,6 +309,14 @@ KERNEL="ttyUSB1", NAME="pda", SYMLINK="palmtop handheld"
# multiple USB webcams with symlinks to be called webcam0, webcam1, ...
BUS="usb", SYSFS{model}="XV3", NAME="video%n", SYMLINK="webcam%n"
# grouping of optical drives from multiple kernel subsystems
KERNEL="sr*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="scd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="pcd*", NAME="%k", SYMLINK="cdrom%e"
KERNEL="hd[a-z]", PROGRAM="/bin/cat /proc/ide/%k/media", RESULT="cdrom",
NAME="%k", SYMLINK="cdrom%e"
.fi
.P
The permissions and ownership of the created device file is read from