All of lore.kernel.org
 help / color / mirror / Atom feed
From: Darren Salt <linux@youmustbejoking.demon.co.uk>
To: linux-hotplug@vger.kernel.org
Subject: Re: [PATCH][RFC] cdsymlinks bugfixes & numbered link 0
Date: Thu, 17 Feb 2005 18:29:19 +0000	[thread overview]
Message-ID: <4D3EC1E3A8%linux@youmustbejoking.demon.co.uk> (raw)
In-Reply-To: <4D3DDFD03F%linux@youmustbejoking.demon.co.uk>

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

I demand that Greg KH may or may not have written...

> On Wed, Feb 16, 2005 at 01:19:58AM +0000, Darren Salt wrote:
>> The attached patch does the following to cdsymlinks.{sh,c}:

> Care to resend it, not in compressed form?

Attached.

-- 
| Darren Salt | nr. Ashington, | d youmustbejoking,demon,co,uk
| Debian,     | Northumberland | s zap,tartarus,org
| RISC OS     | Toon Army      | @                      Say NO to UK ID cards
|                                                       http://www.no2id.net/

You have a truly strong individuality.

[-- Attachment #2: cdsymlinks.diff --]
[-- Type: text/plain, Size: 15927 bytes --]

--- udev-0.51-debian/extras/cdsymlinks.c
+++ udev/extras/cdsymlinks.c
@@ -11,7 +11,12 @@
  * BUS="scsi", KERNEL="scd[0-9]*", PROGRAM="/etc/udev/cdsymlinks.sh %k", SYMLINK="%c{1} %c{2} %c{3} %c{4} %c{5} %c{6}"
  * (this last one is "just in case")
  *
- * (c) 2004 Darren Salt <linux@youmustbejoking.demon.co.uk>
+ * (c) 2004, 2005 Darren Salt <linux@youmustbejoking.demon.co.uk>
+ *
+ * Contributors:
+ *  - J A Magallon <jamagallon@able.es> (bug fixes)
+ *
+ * Last modified: 2005-02-15
  */
 
 #define _GNU_SOURCE
@@ -56,6 +61,7 @@
 /* Configuration variables */
 static struct list_t allowed_output = {0};
 static int numbered_links = 1;
+static int link_zero = 0;
 
 /* Available devices */
 static struct list_t Devices = {0};
@@ -65,14 +71,40 @@
  */
 static struct list_t cap_DVDRAM = {0}, cap_DVDRW = {0}, cap_DVD = {0},
                      cap_CDRW = {0}, cap_CDR = {0}, cap_CDWMRW = {0},
-                     cap_CDMRW = {0};
+                     cap_CDMRW = {0}, cap_CDRAM = {0};
 
 /* Device capabilities by name */
 static struct list_t dev_DVDRAM = {0}, dev_DVDRW = {0}, dev_DVD = {0},
                      dev_CDRW = {0}, dev_CDR = {0}, dev_CDWMRW = {0},
-                     dev_CDMRW = {0};
+                     dev_CDMRW = {0}, dev_CDRAM = {0};
 #define dev_CD Devices
 
+typedef struct {
+  struct list_t *cap, *dev;
+  const char label[8], symlink[8];
+  const char *captext;
+  int captextlen;
+} cap_dev_t;
+
+#define CAPDEV(X) &cap_##X, &dev_##X
+
+static const cap_dev_t cap_dev_info[] = {
+  { NULL, &dev_CD,  "CD",     "cdrom",  NULL, 0 },
+  { CAPDEV(CDR),    "CDR",    "cd-r",   "Can write CD-R:", 15 },
+  { CAPDEV(CDRW),   "CDRW",   "cdrw",   "Can write CD-RW:", 16 },
+  { CAPDEV(DVD),    "DVD",    "dvd",    "Can read DVD:", 13 },
+  { CAPDEV(DVDRW),  "DVDRW",  "dvdrw",  "Can write DVD-R:", 16 },
+  { CAPDEV(DVDRAM), "DVDRAM", "dvdram", "Can write DVD-RAM:", 18 },
+  { CAPDEV(CDMRW),  "CDMRW",  "cdm",    "Can read MRW:", 13 },  /* CDC-MRW R */
+  { CAPDEV(CDWMRW), "CDWMRW", "cdmrw",  "Can write MRW:", 14 }, /* CDC-MRW W */
+  { CAPDEV(CDRAM),  "CDRAM",  "cdram",  "Can write RAM:", 14 }, /* CDC-RAM W */
+  { NULL }
+};
+
+#define foreach_cap_dev(loop) \
+  for ((loop) = cap_dev_info; (loop)->label[0]; ++(loop))
+#define foreach_cap_dev_noCD(loop) \
+  for ((loop) = cap_dev_info + 1; (loop)->label[0]; ++(loop))
 
 /*
  * Some library-like bits first...
@@ -218,7 +250,7 @@
 list_assign_split (struct list_t *list, char *text)
 {
   char *token = strchr (text, ':');
-  token = strtok (token ? token + 1 : text, " \t");
+  token = strtok (token ? token + 1 : text, " \t\n");
   while (token)
   {
     list_prepend (list, token);
@@ -267,8 +299,10 @@
             list_delete (&allowed_output);
             list_assign_split (&allowed_output, p.we_wordv[0] + 7);
           }
-          else if (!strncmp (p.we_wordv[0], "NUMBERED_LINKS=", 14))
-            numbered_links = atoi (p.we_wordv[0] + 14);
+          else if (!strncmp (p.we_wordv[0], "NUMBERED_LINKS=", 15))
+            numbered_links = atoi (p.we_wordv[0] + 15);
+          else if (!strncmp (p.we_wordv[0], "LINK_ZERO=", 15))
+            link_zero = atoi (p.we_wordv[0] + 15);
           break;
         }
         /* fall through */
@@ -315,20 +349,16 @@
   {
     if (!strncasecmp (text, "drive name", 10))
       list_assign_split (&Devices, text);
-    else if (!strncasecmp (text, "Can write DVD-RAM", 17))
-      list_assign_split (&cap_DVDRAM, text);
-    else if (!strncasecmp (text, "Can write DVD-R", 15))
-      list_assign_split (&cap_DVDRW, text);
-    else if (!strncasecmp (text, "Can read DVD", 12))
-      list_assign_split (&cap_DVD, text);
-    else if (!strncasecmp (text, "Can write CD-RW", 15))
-      list_assign_split (&cap_CDRW, text);
-    else if (!strncasecmp (text, "Can write CD-R", 14))
-      list_assign_split (&cap_CDR, text);
-    else if (!strncasecmp (text, "Can read MRW", 14))
-      list_assign_split (&cap_CDMRW, text);
-    else if (!strncasecmp (text, "Can write MRW", 14))
-      list_assign_split (&cap_CDWMRW, text);
+    else
+    {
+      const cap_dev_t *cap;
+      foreach_cap_dev_noCD (cap)
+        if (!strncasecmp (text, cap->captext, cap->captextlen))
+        {
+          list_assign_split (cap->cap, text);
+          break;
+        }
+    }
   }
   if (!feof (info))
     errexit ("error accessing CD/DVD info");
@@ -341,7 +371,8 @@
  * taking into account existing links and the capability list for type LINK.
  */
 static void
-do_output (const char *name, const char *link, const struct list_t *dev)
+do_output (const char *name, const char *link, const struct list_t *dev,
+           int do_link_zero)
 {
   const struct list_item_t *i = (const struct list_item_t *)dev;
   if (!i->next)
@@ -406,6 +437,8 @@
       /* Existing symlink found - don't output a new one.
        * If ISDEV, we output the name of the existing symlink.
        */
+      if (do_link_zero)
+        return;
       present = 1;
       if (isdev)
         printf (" %s", list_nth (&devls, li)->data);
@@ -415,14 +448,19 @@
     if (!present)
     {
       char buf[256];
-      snprintf (buf, sizeof (buf), count ? "%s%d" : "%s", link, count);
+      snprintf (buf, sizeof (buf), count || do_link_zero ? "%s%d" : "%s",
+                link, count);
       /* Find the next available (not present) symlink name.
        * We always need to do this for reasons of output consistency: if a
        * symlink is created by udev as a result of use of this program, we
        * DON'T want different output!
        */
       while (list_search (&devls, buf))
+      {
+        if (do_link_zero)
+          return;
         snprintf (buf, sizeof (buf), "%s%d", link, ++count);
+      }
       /* If ISDEV, output it. */
       if (isdev && (numbered_links || count == 0))
         printf (" %s", buf);
@@ -431,6 +469,8 @@
        */
       if (!list_search (&devls, buf))
       {
+        if (do_link_zero)
+          return;
         list_append (&devls, buf);
         ++count;
       }
@@ -458,6 +498,8 @@
 int
 main (int argc, char *argv[])
 {
+  const cap_dev_t *capdev;
+
   progname = argv[0];
   debug = argc > 2 && !strcmp (argv[2], "-d");
 
@@ -470,62 +512,43 @@
   read_defaults ();
   populate_capability_lists ();
 
-  /* Construct the device lists from the capability lists. */
-  populate_device_list (&dev_DVDRAM, &cap_DVDRAM);
-  populate_device_list (&dev_DVDRW, &cap_DVDRW);
-  populate_device_list (&dev_DVD, &cap_DVD);
-  populate_device_list (&dev_CDRW, &cap_CDRW);
-  populate_device_list (&dev_CDR, &cap_CDR);
-  populate_device_list (&dev_CDWMRW, &cap_CDWMRW);
-  populate_device_list (&dev_CDMRW, &cap_CDMRW);
-  /* (All devices can read CDs.) */
+  /* Construct the device lists from the capability lists.
+   * (We assume that all relevant devices can read CDs.)
+   */
+  foreach_cap_dev_noCD (capdev)
+    populate_device_list (capdev->dev, capdev->cap);
 
   if (debug)
   {
-#define printdev(DEV) \
-        printf ("%-7s:", #DEV); \
-        list_print (&cap_##DEV, stdout); \
-        list_print (&dev_##DEV, stdout); \
-        puts ("");
-
     printf ("Devices:");
     const struct list_item_t *item = (const struct list_item_t *)&Devices;
     while ((item = item->next) != NULL)
       printf (" %s", item->data);
-    puts ("");
 
-    printdev (DVDRAM);
-    printdev (DVDRW);
-    printdev (DVD);
-    printdev (CDRW);
-    printdev (CDR);
-    printdev (CDWMRW);
-    printdev (CDMRW);
-
-    printf ("CDROM  : (all)");
+    printf ("\nCDROM     : (all)");
     item = (const struct list_item_t *)&dev_CD;
     while ((item = item->next) != NULL)
       printf (" %s", item->data);
     puts ("");
+
+    foreach_cap_dev_noCD (capdev)
+    {
+      printf ("%-10s:", capdev->label);
+      list_print (capdev->cap, stdout);
+      list_print (capdev->dev, stdout);
+      puts ("");
+    }
+
   }
 
   /* Write the symlink names. */
-  if (list_search (&allowed_output, "CD"))
-    do_output (argv[1], "cdrom",  &dev_CD);
-  if (list_search (&allowed_output, "CDR"))
-    do_output (argv[1], "cd-r",   &dev_CDR);
-  if (list_search (&allowed_output, "CDRW"))
-    do_output (argv[1], "cdrw",   &dev_CDRW);
-  if (list_search (&allowed_output, "DVD"))
-    do_output (argv[1], "dvd",    &dev_DVD);
-  if (list_search (&allowed_output, "DVDRW"))
-    do_output (argv[1], "dvdrw",  &dev_DVDRW);
-  if (list_search (&allowed_output, "DVDRAM"))
-    do_output (argv[1], "dvdram", &dev_DVDRAM);
-  if (list_search (&allowed_output, "CDMRW"))
-    do_output (argv[1], "cdmrw",   &dev_CDMRW);
-  if (list_search (&allowed_output, "CDWMRW"))
-    do_output (argv[1], "cdwmrw",   &dev_CDWMRW);
+  foreach_cap_dev (capdev)
+    if (list_search (&allowed_output, capdev->label))
+    {
+      do_output (argv[1], capdev->symlink, capdev->dev, 0);
+      if (link_zero)
+        do_output (argv[1], capdev->symlink, capdev->dev, 1);
+    }
   puts ("");
 
   return 0;
--- udev-0.50-debian/extras/cdsymlinks.sh
+++ udev/extras/cdsymlinks.sh
@@ -1,6 +1,7 @@
 #! /bin/sh -e
 #
-# Map cdrom, cdm, cdmrw, cd-r, cdrw, dvd, dvdrw, dvdram to suitable devices.
+# Map cdrom, cd-r, cdrw, dvd, dvdrw, dvdram, cdm, cdmrw, cdram
+# to suitable devices.
 # Prefers cd* for DVD-incapable and cdrom and dvd for read-only devices.
 # First parameter is the kernel device name.
 # Second parameter, if present, must be "-d" => output the full mapping.
@@ -11,13 +12,16 @@
 # BUS="scsi", KERNEL="scd[0-9]*", PROGRAM="/etc/udev/cdsymlinks.sh %k", SYMLINK="%c{1} %c{2} %c{3} %c{4} %c{5} %c{6}"
 # (this last one is "just in case")
 #
-# (c) 2004 Darren Salt <linux@youmustbejoking.demon.co.uk>
+# (c) 2004, 2005 Darren Salt <linux@youmustbejoking.demon.co.uk>
+#
+# Last modified: 2005-02-15
 
 test -e /proc/sys/dev/cdrom/info || exit 0
 
 # Defaults; it's better that you alter them in /etc/udev/cdsymlinks.conf
 OUTPUT='CD CDRW DVD DVDRW DVDRAM'
 NUMBERED_LINKS=1
+LINK_ZERO=0
 
 test -e /etc/udev/cdsymlinks.conf && . /etc/udev/cdsymlinks.conf
 
@@ -61,6 +65,7 @@
 setArray CDRs    `sed -re '/^Can write CD-R:/I!    d; s/.*://' /proc/sys/dev/cdrom/info`
 setArray CDMRWs  `sed -re '/^Can write MRW:/I!     d; s/.*://' /proc/sys/dev/cdrom/info`
 setArray CDMs    `sed -re '/^Can read MRW:/I!      d; s/.*://' /proc/sys/dev/cdrom/info`
+setArray CDRAMs  `sed -re '/^Can write RAM:/I!     d; s/.*://' /proc/sys/dev/cdrom/info`
 
 # How many devices do we have?
 NumDevs=$(($DEVICES-1))
@@ -80,6 +85,7 @@
   test "`ix CDRs $i`"    != '' || ixs CDRs $i 0
   test "`ix CDMRWs $i`"  != '' || ixs CDMRWs $i 0
   test "`ix CDMs $i`"    != '' || ixs CDMs $i 0
+  test "`ix CDRAMs $i`"  != '' || ixs CDRAMs $i 0
 done
 
 DVDRAM=''
@@ -89,6 +95,7 @@
 CDR=''
 CDMRW=''
 CDM=''
+CDRAM=''
 CD=''
 
 # Calculate symlink->device mappings.
@@ -117,27 +124,31 @@
   test "`ix CDMs $i`" = 1 &&    CDM="$CDM `ix DEVICES $i`"
 done
 for i in $Count; do
+  test "`ix CDRAMs $i`" = 1 &&  CDRAM="$CDRAM `ix DEVICES $i`"
+done
+for i in $Count; do
                                 CD="$CD `ix DEVICES $i`"
 done
 
 # Debug output
 if test "$DEBUG" = 1; then
   echo 'Devices:' `for i in $Count; do ix DEVICES $i; echo -n \ ; done`
-  echo 'DVDRAM :' `for i in $Count; do ix DVDRAMs $i; echo -n \ ; done` $DVDRAM
-  echo 'DVDRW  :' `for i in $Count; do ix DVDRWs  $i; echo -n \ ; done` $DVDRW
-  echo 'DVD    :' `for i in $Count; do ix DVDs    $i; echo -n \ ; done` $DVD
-  echo 'CDRW   :' `for i in $Count; do ix CDRWs   $i; echo -n \ ; done` $CDRW
+  echo 'CDROM  : (all)' $CD
   echo 'CD-R   :' `for i in $Count; do ix CDRs    $i; echo -n \ ; done` $CDR
+  echo 'CDRW   :' `for i in $Count; do ix CDRWs   $i; echo -n \ ; done` $CDRW
+  echo 'DVD    :' `for i in $Count; do ix DVDs    $i; echo -n \ ; done` $DVD
+  echo 'DVDRW  :' `for i in $Count; do ix DVDRWs  $i; echo -n \ ; done` $DVDRW
+  echo 'DVDRAM :' `for i in $Count; do ix DVDRAMs $i; echo -n \ ; done` $DVDRAM
   echo 'CDMRW  :' `for i in $Count; do ix CDMRWs  $i; echo -n \ ; done` $CDMRW
-  echo 'CDM    :' `for i in $Count; do ix CDMs    $i; echo -n \ ; done` $CDM
-  echo 'CDROM  : (all)' $CD
+  echo 'CDWMRW :' `for i in $Count; do ix CDMs    $i; echo -n \ ; done` $CDM
+  echo 'CDRAM  :' `for i in $Count; do ix CDRAMs  $i; echo -n \ ; done` $CDRAM
 fi
 
 # Prepare symlink names output
-output () {
+do_output () {
   test "`eval echo '$'$3`" = '' && return
   local i
-  local COUNT=''
+  local COUNT=$4
   local DEVLS="`ls -dl \"/dev/$2\" \"/dev/$2\"[0-9]* 2>/dev/null`"
   local PRESENT="`echo "$DEVLS" |
     sed -re 's!^.* /dev/('$2'[[:digit:]]*) -> [^[:space:]]+$!\1!'`"
@@ -148,6 +159,7 @@
     if test "$DEVPRESENT" != ""; then
       # Existing symlinks found - don't output a new one.
       # If the target dev ($1) is the current dev ($i), we output their names.
+      test -z "$4" || return;
       test "$1" = "$i" && echo " $DEVPRESENT" | sed -e 'N; $ s/\n/ /'
     else
       # If we found no existing symlinks for the target device...
@@ -156,15 +168,17 @@
       # symlink is created by udev as a result of use of this program, we
       # DON'T want different output!
       until notin PRESENT "$2$COUNT"; do
+        test -z "$4" || return;
         COUNT=$(($COUNT+1))
       done
       # If the target dev ($1) is the current dev ($i), we output its name.
       if test $(($NUMBERED_LINKS)) -ne 0 || test "$COUNT" = ''; then
-        test "$i" = "$1" && echo -n " $2$COUNT"
+        test "$i" != "$1" || echo -n " $2$COUNT"
       fi
       # If the link isn't in our "existing links" list, add it and increment
       # our counter.
-      if test ! -e "/dev/$2$COUNT"; then
+      if notin PRESENT "$2$COUNT"; then
+        test -z "$4" || return;
         PRESENT="$PRESENT\n$2$COUNT"
         COUNT=$(($COUNT+1))
       fi
@@ -172,13 +186,19 @@
   done
 }
 
+output () {
+  do_output "$@"
+  test $(($LINK_ZERO)) -eq 0 || do_output "$@" 0
+}
+
 # And output it
 notin OUTPUT CD     || echo -n "`output "$1" cdrom CD`"
-notin OUTPUT CDMRW  || echo -n "`output "$1" cdmrw CDM`"
-notin OUTPUT CDWMRW || echo -n "`output "$1" cdwmrw CDMRW`"
 notin OUTPUT CDR    || echo -n "`output "$1" cd-r CDR`"
 notin OUTPUT CDRW   || echo -n "`output "$1" cdrw CDRW`"
 notin OUTPUT DVD    || echo -n "`output "$1" dvd DVD`"
 notin OUTPUT DVDRW  || echo -n "`output "$1" dvdrw DVDRW`"
 notin OUTPUT DVDRAM || echo -n "`output "$1" dvdram DVDRAM`"
+notin OUTPUT CDMRW  || echo -n "`output "$1" cdmrw CDM`"
+notin OUTPUT CDWMRW || echo -n "`output "$1" cdwmrw CDMRW`"
+notin OUTPUT CDRAM  || echo -n "`output "$1" cdram CDRAM`"
 echo
--- udev-0.50-debian/extras/cdsymlinks.conf
+++ udev/extras/cdsymlinks.conf
@@ -1,8 +1,13 @@
 # Configuration file for cdsymlinks
 
 # Output links for these types of devices.
-# Allowed keywords are CD, CDR, CDRW, DVD, DVDRW, DVDRAM, CDMRW, CDWMRW.
+# Allowed keywords are:     corresponding to device names:
+#   CD    CDR    CDRW         cdrom cd-r  cdrw
+#   DVD   DVDRW  DVDRAM       dvd   dvdrw dvdram
+#   CDMRW CDWMRW              cdm   cdmrw
+#   CDRAM                     cdram
 # Other words are accepted but ignored.
+# Devices with multiple recognised capabilities WILL get multiple links.
 #OUTPUT="CD CDRW DVD DVDRW DVDRAM"
 
 # Whether to output numbered links.
@@ -10,3 +15,7 @@
 # 0 = don't output 'cdrom1', 'dvd1' etc.
 # We always output 'cdrom', 'dvd' etc. for the best-match devices.
 #NUMBERED_LINKS=1
+
+# Whether to output link 0 along with each unnumbered link.
+# (No effect if NUMBERED_DEVS=0.)
+#LINK_ZERO=0

      parent reply	other threads:[~2005-02-17 18:29 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-02-16  1:19 [PATCH][RFC] cdsymlinks bugfixes & numbered link 0 Darren Salt
2005-02-17 17:21 ` Greg KH
2005-02-17 18:29 ` Darren Salt [this message]

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=4D3EC1E3A8%linux@youmustbejoking.demon.co.uk \
    --to=linux@youmustbejoking.demon.co.uk \
    --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.