From: patmans@us.ibm.com Date: Sat, 12 Feb 2005 02:30:01 +0000 (-0800) Subject: [PATCH] scsi_id changes for use with udev %N and %p X-Git-Tag: 053~4 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=07544a93d6c75361b4906d90945755e34fd07565 [PATCH] scsi_id changes for use with udev %N and %p Changes to scsi_id to support the udev %N and %p substitutions: - Update version from .7 to .8 - change TMP_DIR back to /tmp - if DEVPATH is set assume hotplug_mode (use syslog for logging, and does not output some warnings) - Always output a newline after the id is printed - Allow command line options to override settings when hotplug_mode is set - update man page - update generator script to use the %N and %p substitutions. --- diff --git a/extras/scsi_id/Makefile b/extras/scsi_id/Makefile index 610faac4b..e832102e3 100644 --- a/extras/scsi_id/Makefile +++ b/extras/scsi_id/Makefile @@ -14,7 +14,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -SCSI_ID_VERSION=0.7 +SCSI_ID_VERSION=0.8 prefix = etcdir = ${prefix}/etc diff --git a/extras/scsi_id/gen_scsi_id_udev_rules.sh b/extras/scsi_id/gen_scsi_id_udev_rules.sh index 874e94e8b..92fde5df1 100644 --- a/extras/scsi_id/gen_scsi_id_udev_rules.sh +++ b/extras/scsi_id/gen_scsi_id_udev_rules.sh @@ -60,7 +60,7 @@ do if [ $first_line = "yes" ] then first_line=no - echo "BUS=\"scsi\", PROGRAM=\"${scsi_id}\", RESULT=\"${id}\", NAME=\"${prefix}${name}%n\"" + echo "BUS=\"scsi\", PROGRAM=\"${scsi_id} -d %N -s %p\", RESULT=\"${id}\", NAME=\"${prefix}${name}%n\"" echo echo "# Further RESULT keys use the result of the last PROGRAM rule." echo "# Be careful not to add any rules containing PROGRAM key between here" diff --git a/extras/scsi_id/scsi_id.8 b/extras/scsi_id/scsi_id.8 index 591bb7936..68d4a1c04 100644 --- a/extras/scsi_id/scsi_id.8 +++ b/extras/scsi_id/scsi_id.8 @@ -53,9 +53,10 @@ identifier starts with the NAA value of 6): .SH OPTIONS .TP .BI subsystem -When called with only a single argument without a leading \-, runs in a hotplug -mode, and expects the environment variable DEVPATH to specify the -corresponding sysfs device. See section below on usage with \fBudev\fP. +Deprecated method: when called with only a single argument without a +leading \-, runs in a hotplug mode, and expects the environment variable +DEVPATH to specify the corresponding sysfs device. See section below on +usage with \fBudev\fP. .TP .BI \-b The default behaviour \- treat the device as black listed, and do nothing @@ -66,6 +67,8 @@ Instead of determining and creating a device node based on a sysfs dev entry as done for the \fB\-s\fP, send SG_IO commands to \fBdevice\fP, such as \fB/dev/sdc\fP. +This argument should also be used when invoked via udev to avoid problems +with creation of temporary files on not-yet writable directories. .TP .BI \-f "\| config\-file" Read configuration and black/white list entries from @@ -106,15 +109,15 @@ Display version number and exit. .RE .SH USAGE WITH UDEV + If \fBscsi_id\fP is invoked with one argument without a leading \-, it assumes it is called for a hotplug event, and looks for the sysfs device -in the DEVPATH environment variable. - -This mode is used when run via the \fBudev\fP PROGRAM key. Passing any -arguments or options as part of the PROGRAM rule breaks this assumption, -and the results will likely not be as expected. +in the DEVPATH environment variable. This mode is deprecated, but +available for backwards compatibility. -When in this mode, all errors and warnings are sent via syslog. +If the DEVPATH environment variable is set, scsi_id assumes it has been +invoked via udev (or some other hotplug program), and all errors or +warnings are sent using syslog. To determine the specific value needed in a RESULT key, use the \-s option, for example: @@ -131,7 +134,7 @@ of 312345: .sp .nf -BUS="scsi", PROGRAM="/sbin/scsi_id", RESULT="312345", NAME="disk%n" +BUS="scsi", PROGRAM="/sbin/scsi_id -d %N -s %p", RESULT="312345", NAME="disk%n" .fi .P diff --git a/extras/scsi_id/scsi_id.c b/extras/scsi_id/scsi_id.c index f45563d1b..507fa2776 100644 --- a/extras/scsi_id/scsi_id.c +++ b/extras/scsi_id/scsi_id.c @@ -44,8 +44,8 @@ /* * temporary names for mknod. */ -#define TMP_DIR "/dev" -#define TMP_PREFIX "tmp-scsi" +#define TMP_DIR "/tmp" +#define TMP_PREFIX "scsi" /* * XXX Note the 'e' (send output to stderr in all cases), and 'c' (callout) @@ -736,9 +736,7 @@ static int scsi_id(const char *target_path, char *maj_min_dev) format_serial(serial); if (display_bus_id) printf("%s: ", scsi_dev->name); - printf("%s", serial); - if (!hotplug_mode) - printf("\n"); + printf("%s\n", serial); dprintf("%s\n", serial); retval = 0; } @@ -762,11 +760,6 @@ int main(int argc, char **argv) if (getenv("DEBUG")) debug++; - if ((argc == 2) && (argv[1][0] != '-')) { - hotplug_mode = 1; - dprintf("hotplug assumed\n"); - } - dprintf("argc is %d\n", argc); if (sysfs_get_mnt_path(sysfs_mnt_path, MAX_NAME_LEN)) { log_message(LOG_WARNING, "sysfs_get_mnt_path failed: %s\n", @@ -774,27 +767,19 @@ int main(int argc, char **argv) exit(1); } - if (hotplug_mode) { + devpath = getenv("DEVPATH"); + if (devpath) { /* - * There is a kernel race creating attributes, if called - * directly, uncomment the sleep. + * This implies that we were invoked via udev or hotplug. */ - /* sleep(1); */ - - devpath = getenv("DEVPATH"); - if (!devpath) { - log_message(LOG_WARNING, "DEVPATH is not set\n"); - exit(1); - } + hotplug_mode = 1; sys_specified = 1; - strncpy(target_path, sysfs_mnt_path, MAX_NAME_LEN); strncat(target_path, devpath, MAX_NAME_LEN); } /* - * Override any command line options set via the config file. This - * is the only way to set options when in hotplug mode. + * Get config file options. */ newargv = NULL; retval = get_file_options(NULL, NULL, &newargc, &newargv); @@ -806,11 +791,13 @@ int main(int argc, char **argv) exit(1); free(newargv); } - if (!hotplug_mode) { - if (set_options(argc, argv, short_options, target_path, - maj_min_dev) < 0) + /* + * Get command line options (overriding any config file or DEVPATH + * settings). + */ + if (set_options(argc, argv, short_options, target_path, + maj_min_dev) < 0) exit(1); - } if (!sys_specified) { log_message(LOG_WARNING, "-s must be specified\n");