mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
[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:
parent
3e4414508b
commit
0a8dd7f37c
40
namedev.c
40
namedev.c
@ -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;
|
||||
|
15
udev.8.in
15
udev.8.in
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user