On Fri, Aug 01, 2008 at 02:22:09PM +0200, Marco d'Itri wrote:
> On Aug 01, Guido Günther <[EMAIL PROTECTED]> wrote:
> 
> > It turned out that the code for another usage of '-s' is there but it
> > isn't in the options passed to getopt_long, so we can safely keep the
> > compat code. Possible patch attached.
> WTF? You cannot just remove the code, -s is not used but --sg-version
> is. You need to change the index from 's' to something else (even
> non-alphanumeric).
You're of course right - thought this got dropped. New version attached,
I use '*' as character so we won't clash with any future short options.
 -- Guido
>From 221d4561c3c94d9dc105658dafe4aaed279f7d55 Mon Sep 17 00:00:00 2001
From: Guido Guenther <[EMAIL PROTECTED]>
Date: Fri, 1 Aug 2008 03:16:05 -0400
Subject: [PATCH] convert sysfs paths for block devices into device names

adds some backwardscompatibility for programms/udev rules that use
"-s/--devpath"
---
 extras/scsi_id/scsi_id.c |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c
index 5eb95e8..1c03009 100644
--- a/extras/scsi_id/scsi_id.c
+++ b/extras/scsi_id/scsi_id.c
@@ -33,12 +33,13 @@
 
 static const struct option options[] = {
 	{ "device", 1, NULL, 'd' },
+	{ "devpath", 1, NULL, 's' },
 	{ "config", 1, NULL, 'f' },
 	{ "page", 1, NULL, 'p' },
 	{ "blacklisted", 0, NULL, 'b' },
 	{ "whitelisted", 0, NULL, 'g' },
 	{ "replace-whitespace", 0, NULL, 'u' },
-	{ "sg-version", 1, NULL, 's' },
+	{ "sg-version", 1, NULL, '*' },
 	{ "verbose", 0, NULL, 'v' },
 	{ "version", 0, NULL, 'V' },
 	{ "export", 0, NULL, 'x' },
@@ -46,7 +47,7 @@ static const struct option options[] = {
 	{}
 };
 
-static const char short_options[] = "d:f:ghip:uvVx";
+static const char short_options[] = "d:f:ghip:uvVxs:";
 static const char dev_short_options[] = "bgp:";
 
 static int all_good;
@@ -374,6 +375,16 @@ static int get_file_options(const char *vendor, const char *model,
 	return retval;
 }
 
+static void convert_sysfs_path(const char* sysfs, char *devpath)
+{
+	if (!strncmp(optarg, "/block/", 7)) {
+		snprintf(devpath, MAX_PATH_LEN, "/dev/%s", &(optarg[7]));
+	} else {
+		strncpy(devpath, optarg, MAX_PATH_LEN);
+	}
+	devpath[MAX_PATH_LEN-1] = '\0';
+}
+
 static int set_options(int argc, char **argv, const char *short_opts,
 		       char *maj_min_dev)
 {
@@ -406,6 +417,11 @@ static int set_options(int argc, char **argv, const char *short_opts,
 			maj_min_dev[MAX_PATH_LEN-1] = '\0';
 			break;
 
+		case 's':
+			dev_specified = 1;
+			convert_sysfs_path(optarg, maj_min_dev);
+			break;
+
 		case 'e':
 			use_stderr = 1;
 			break;
@@ -447,7 +463,7 @@ static int set_options(int argc, char **argv, const char *short_opts,
 			}
 			break;
 
-		case 's':
+		case '*':
 			sg_version = atoi(optarg);
 			if (sg_version < 3 || sg_version > 4) {
 				err("Unknown SG version '%s'\n", optarg);
-- 
1.5.6.3

Reply via email to