* [udev] - format char for CALLOUT output
@ 2003-11-21 16:53 Kay Sievers
0 siblings, 0 replies; 2+ messages in thread
From: Kay Sievers @ 2003-11-21 16:53 UTC (permalink / raw)
To: linux-hotplug
[-- Attachment #1: Type: text/plain, Size: 919 bytes --]
Hi Greg,
here is a patch for inserting the callout output into NAME=.
ID= supports the usual wildcard to compare with the output.
I've moved all wildcard matching to a function cause this was the third occurrence.
Also attached is the last whitespace cleanup and debug text corrections.
The callout patch depends on the whitespace patch.
CALLOUT, BUS="usb", PROGRAM="/bin/echo -n return", ID="ret*", NAME="webcam-%c-"
results in:
Nov 21 17:33:51 pim udev[20399]: get_major_minor: found major = 81, minor = 0
Nov 21 17:33:51 pim udev[20399]: exec_callout: callout to '/bin/echo -n return'
Nov 21 17:33:51 pim udev[20399]: exec_callout: callout returned 'return'
Nov 21 17:33:51 pim udev[20399]: get_attr: substitute callout output 'return'
Nov 21 17:33:51 pim udev[20399]: udev_add_device: name = webcam-return-
Nov 21 17:33:51 pim udev[20399]: create_node: mknod(/udev/webcam-return-, 020660, 81, 0)
thanks,
Kay
[-- Attachment #2: 11-namedev.c-whitespace+debug.diff --]
[-- Type: text/plain, Size: 1747 bytes --]
--- ../udev/namedev.c 2003-11-21 08:48:32.000000000 +0100
+++ namedev.c 2003-11-21 17:12:24.000000000 +0100
@@ -82,9 +82,9 @@
dev->owner, dev->group, dev->mode);
break;
case CALLOUT:
- dbg_parse("CALLOUT name='%s', program='%s', bus='%s', id='%s', "
+ dbg_parse("CALLOUT name='%s', bus='%s', program='%s', id='%s', "
"owner='%s', group='%s', mode=%#o",
- dev->name, dev->exec_program, dev->bus, dev->id,
+ dev->name, dev->bus, dev->exec_program, dev->id,
dev->owner, dev->group, dev->mode);
break;
default:
@@ -270,8 +270,8 @@
strfieldcpy(dev.name, temp3);
dbg_parse("LABEL name='%s', bus='%s', "
- "sysfs_file='%s', sysfs_value='%s'",
- dev.name, dev.bus, dev.sysfs_file,
+ "sysfs_file='%s', sysfs_value='%s'",
+ dev.name, dev.bus, dev.sysfs_file,
dev.sysfs_value);
}
@@ -416,7 +416,6 @@
/* loop through the whole file */
while (1) {
- /* get a line */
temp = fgets(line, sizeof(line), fd);
if (temp == NULL)
break;
@@ -509,7 +508,7 @@
break;
}
if (args[i]) {
- dbg("to many args - %d", i);
+ dbg("too many args - %d", i);
args[i] = NULL;
}
retval = execve(args[0], args, main_envp);
@@ -869,6 +868,7 @@
char *pos = strchr(udev->name, '%');
char *dig;
char name[NAME_SIZE];
+
if (pos) {
strfieldcpy(name, pos+2);
*pos = 0x00;
@@ -877,8 +877,7 @@
if (!sysfs_device)
break;
strcat(udev->name, sysfs_device->bus_id);
- dbg("bus_id inserted: %s",
- sysfs_device->bus_id);
+ dbg("substitute bus_id '%s'", sysfs_device->bus_id);
break;
case 'n':
dig = class_dev->name + strlen(class_dev->name);
@@ -944,5 +943,3 @@
dump_dev_list();
return retval;
}
-
-
[-- Attachment #3: 12-namedev.c-callout-return-substitution.diff --]
[-- Type: text/plain, Size: 3434 bytes --]
--- ../namedev.c 2003-11-21 17:42:48.000000000 +0100
+++ namedev.c 2003-11-21 17:43:52.000000000 +0100
@@ -49,6 +49,19 @@
static LIST_HEAD(config_device_list);
+/* s2 may end with '*' to match everything */
+static int strncmp_wildcard(char *s1, char *s2, int max)
+{
+ int len = strlen(s2);
+ if (len > max)
+ len = max;
+ if (s2[len-1] == '*')
+ len--;
+ else
+ len = max;
+ return strncmp(s1, s2, len);
+}
+
static void dump_dev(struct config_device *dev)
{
switch (dev->type) {
@@ -108,16 +121,8 @@
/* update the values if we already have the device */
list_for_each(tmp, &config_device_list) {
struct config_device *dev = list_entry(tmp, struct config_device, node);
- int len = strlen(new_dev->name);
- if (new_dev->name[len-1] == '*') {
- len--;
- if (strncmp(dev->name, new_dev->name, len))
- continue;
- } else {
- if (strcmp(dev->name, new_dev->name))
- continue;
- }
- /* the same, copy the new info into this structure */
+ if (strncmp_wildcard(dev->name, new_dev->name, sizeof(dev->name)))
+ continue;
copy_var(dev, new_dev, type);
copy_var(dev, new_dev, mode);
copy_string(dev, new_dev, bus);
@@ -559,20 +564,18 @@
return retval;
}
-static int do_callout(struct sysfs_class_device *class_dev, struct udevice *udev)
+static int do_callout(struct sysfs_class_device *class_dev, struct udevice *udev, char *value, int len)
{
struct config_device *dev;
struct list_head *tmp;
- char value[ID_SIZE];
list_for_each(tmp, &config_device_list) {
dev = list_entry(tmp, struct config_device, node);
if (dev->type != CALLOUT)
continue;
-
- if (exec_callout(dev, value, sizeof(value)))
+ if (exec_callout(dev, value, len))
continue;
- if (strncmp(value, dev->id, sizeof(value)) != 0)
+ if (strncmp_wildcard(value, dev->id, len) != 0)
continue;
strfieldcpy(udev->name, dev->name);
if (dev->mode != 0) {
@@ -771,17 +774,12 @@
int len;
strfieldcpy(udev->name, class_dev->name);
+ /* look for permissions */
list_for_each(tmp, &config_device_list) {
dev = list_entry(tmp, struct config_device, node);
len = strlen(dev->name);
- if (dev->name[len-1] == '*') {
- len--;
- if (strncmp(dev->name, class_dev->name, len))
- continue;
- } else {
- if (strcmp(dev->name, class_dev->name))
- continue;
- }
+ if (strncmp_wildcard(class_dev->name, dev->name, sizeof(dev->name)))
+ continue;
if (dev->mode != 0) {
dbg_parse("found permissions for '%s'", class_dev->name);
udev->mode = dev->mode;
@@ -797,6 +795,7 @@
struct sysfs_class_device *class_dev_parent = NULL;
int retval = 0;
char *temp = NULL;
+ char value[ID_SIZE];
udev->mode = 0;
@@ -839,7 +838,7 @@
}
/* rules are looked at in priority order */
- retval = do_callout(class_dev, udev);
+ retval = do_callout(class_dev, udev, value, sizeof(value));
if (retval == 0)
goto found;
@@ -883,7 +882,7 @@
dig = class_dev->name + strlen(class_dev->name);
while (isdigit(*(dig-1)))
dig--;
- strcat(udev->name, dig);
+ strcat(pos, dig);
dbg("substitute kernel number '%s'", dig);
break;
case 'm':
@@ -894,6 +893,10 @@
sprintf(pos, "%u", udev->major);
dbg("substitute major number '%u'", udev->major);
break;
+ case 'c':
+ strcat(pos, value);
+ dbg("substitute callout output '%s'", value);
+ break;
default:
dbg("unknown substitution type '%%%c'", pos[1]);
break;
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [udev] - format char for CALLOUT output
@ 2003-11-23 21:18 Greg KH
0 siblings, 0 replies; 2+ messages in thread
From: Greg KH @ 2003-11-23 21:18 UTC (permalink / raw)
To: linux-hotplug
On Fri, Nov 21, 2003 at 05:53:32PM +0100, Kay Sievers wrote:
> Hi Greg,
> here is a patch for inserting the callout output into NAME=.
> ID= supports the usual wildcard to compare with the output.
>
> I've moved all wildcard matching to a function cause this was the third occurrence.
> Also attached is the last whitespace cleanup and debug text corrections.
> The callout patch depends on the whitespace patch.
Nice, I've applied both of these.
thanks,
greg k-h
-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive? Does it
help you create better code? SHARE THE LOVE, and help us help
YOU! Click Here: http://sourceforge.net/donate/
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2003-11-23 21:18 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-11-23 21:18 [udev] - format char for CALLOUT output Greg KH
-- strict thread matches above, loose matches on Subject: below --
2003-11-21 16:53 Kay Sievers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).