All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Zeuthen <david@fubar.dk>
To: linux-hotplug@vger.kernel.org
Subject: Re: [patch] compatibility symlinks for udev
Date: Tue, 07 Sep 2004 11:19:34 +0000	[thread overview]
Message-ID: <1094555975.15900.23.camel@localhost.localdomain> (raw)
In-Reply-To: <1094481997.4727.14.camel@localhost.localdomain>

[-- Attachment #1: Type: text/plain, Size: 1325 bytes --]

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


[-- Attachment #2: udev-compat-symlinks-2.patch --]
[-- Type: text/x-patch, Size: 3446 bytes --]

--- udev-030.orig/namedev.c	2004-07-09 19:59:10.000000000 +0200
+++ udev-030/namedev.c	2004-09-07 12:50:09.599372960 +0200
@@ -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 
 	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 
 			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;
--- udev-030.orig/udev.8.in	2004-07-09 19:59:10.000000000 +0200
+++ udev-030/udev.8.in	2004-09-07 13:12:58.660244072 +0200
@@ -272,6 +272,13 @@ all remaining parts of the result string
 .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="p
 
 # 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

  parent reply	other threads:[~2004-09-07 11:19 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-06 14:46 [patch] compatibility symlinks for udev David Zeuthen
2004-09-06 15:45 ` Kay Sievers
2004-09-07 11:19 ` David Zeuthen [this message]
2004-09-10 20:09 ` Greg KH
2004-09-14 17:50 ` Kay Sievers
2004-09-14 20:50 ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1094555975.15900.23.camel@localhost.localdomain \
    --to=david@fubar.dk \
    --cc=linux-hotplug@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.