From: Patrick Mansfield <patmans@us.ibm.com>
To: linux-hotplug@vger.kernel.org
Subject: Re: [PATCH] add callout config type to udev
Date: Fri, 10 Oct 2003 02:03:05 +0000 [thread overview]
Message-ID: <marc-linux-hotplug-106575155504508@msgid-missing> (raw)
(Oops, resending with the right hotplug list address.)
This patch adds a callout config type to udev, so external programs can be
called to get serial numbers or id's that are not available as a sysfs
attribute.
=== namedev.c 1.10 vs edited ==--- 1.10/namedev.c Thu Jul 24 20:01:48 2003
+++ edited/namedev.c Thu Oct 9 14:27:55 2003
@@ -29,6 +29,7 @@
#include <ctype.h>
#include <unistd.h>
#include <errno.h>
+#include <sys/wait.h>
#include "list.h"
#include "udev.h"
@@ -40,6 +41,7 @@
#define TYPE_NUMBER "NUMBER"
#define TYPE_TOPOLOGY "TOPOLOGY"
#define TYPE_REPLACE "REPLACE"
+#define TYPE_CALLOUT "CALLOUT"
static LIST_HEAD(config_device_list);
@@ -76,6 +78,12 @@
dev->attr.name, dev->kernel_name,
dev->attr.owner, dev->attr.group, dev->attr.mode);
break;
+ case CALLOUT:
+ dbg("CALLOUT name = '%s', program ='%s', bus = '%s', id = '%s'"
+ " owner = '%s', group = '%s', mode = '%#o'",
+ dev->attr.name, dev->exec_program, dev->bus, dev->id,
+ dev->attr.owner, dev->attr.group, dev->attr.mode);
+ break;
default:
dbg("Unknown type of device!");
}
@@ -328,6 +336,38 @@
strcpy(dev.attr.name, temp3);
dbg("REPLACE name = %s, kernel_name = %s", dev.attr.name, dev.kernel_name);
}
+ if (strcasecmp(temp2, TYPE_CALLOUT) = 0) {
+ /* number type */
+ dev.type = CALLOUT;
+
+ /* PROGRAM="executable" */
+ retval = get_value("PROGRAM", &temp, &temp3);
+ if (retval)
+ continue;
+ strcpy(dev.exec_program, temp3);
+
+ /* BUS="bus" */
+ temp2 = strsep(&temp, ",");
+ retval = get_value("BUS", &temp, &temp3);
+ if (retval)
+ continue;
+ strcpy(dev.bus, temp3);
+
+ /* ID="id" */
+ temp2 = strsep(&temp, ",");
+ retval = get_value("ID", &temp, &temp3);
+ if (retval)
+ continue;
+ strcpy(dev.id, temp3);
+
+ /* NAME="new_name" */
+ temp2 = strsep(&temp, ",");
+ retval = get_value("NAME", &temp, &temp3);
+ if (retval)
+ continue;
+ strcpy(dev.attr.name, temp3);
+ dbg("CALLOUT name = %s, program = %s", dev.attr.name, dev.exec_program);
+ }
retval = add_dev(&dev);
if (retval) {
@@ -415,6 +455,78 @@
}
+static int exec_callout(struct config_device *dev, char *value, int len)
+{
+ int retval;
+ int res;
+ int status;
+ int fds[2];
+ pid_t pid;
+ int value_set = 0;
+ char buffer[256];
+
+ dbg("callout to %s\n", dev->exec_program);
+ retval = pipe(fds);
+ if (retval != 0) {
+ dbg("pipe failed");
+ return -1;
+ }
+ pid = fork();
+ if (pid = -1) {
+ dbg("fork failed");
+ return -1;
+ }
+
+ if (pid = 0) {
+ /*
+ * child
+ */
+ close(STDOUT_FILENO);
+ dup(fds[1]); /* dup write side of pipe to STDOUT */
+ retval = execve(dev->exec_program, main_argv, main_envp);
+ if (retval != 0) {
+ dbg("child execve failed");
+ exit(1);
+ }
+ return -1; /* avoid compiler warning */
+ } else {
+ /*
+ * Parent reads from fds[0].
+ */
+ close(fds[1]);
+ retval = 0;
+ while (1) {
+ res = read(fds[0], buffer, sizeof(buffer) - 1);
+ if (res <= 0)
+ break;
+ buffer[res] = '\0';
+ if (res > len) {
+ dbg("callout len %d too short\n", len);
+ retval = -1;
+ }
+ if (value_set) {
+ dbg("callout value already set");
+ retval = -1;
+ } else {
+ value_set = 1;
+ strncpy(value, buffer, len);
+ }
+ }
+ close(fds[0]);
+ res = wait(&status);
+ if (res < 0) {
+ dbg("wait failed result %d", res);
+ retval = -1;
+ }
+
+ if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) {
+ dbg("callout program status 0x%x", status);
+ retval = -1;
+ }
+ }
+ return retval;
+}
+
static int get_attr(struct sysfs_class_device *class_dev, struct device_attr *attr)
{
struct list_head *tmp;
@@ -581,6 +693,26 @@
}
dbg("device at '%s' becomes '%s' - owner = %s, group = %s, mode = %#o",
dev->place, attr->name,
+ dev->attr.owner, dev->attr.group, dev->attr.mode);
+ goto done;
+ break;
+ }
+ case CALLOUT:
+ {
+ char value[ID_SIZE];
+
+ if (exec_callout(dev, value, sizeof(value)))
+ continue;
+ if (strncmp(value, dev->id, sizeof(value)) != 0)
+ continue;
+ strcpy(attr->name, dev->attr.name);
+ if (dev->attr.mode != 0) {
+ attr->mode = dev->attr.mode;
+ strcpy(attr->owner, dev->attr.owner);
+ strcpy(attr->group, dev->attr.group);
+ }
+ dbg("device callout '%s' becomes '%s' - owner = %s, group = %s, mode = %#o",
+ dev->id, attr->name,
dev->attr.owner, dev->attr.group, dev->attr.mode);
goto done;
break;
=== namedev.h 1.5 vs edited ==--- 1.5/namedev.h Tue Jul 29 09:59:46 2003
+++ edited/namedev.h Mon Oct 6 13:23:55 2003
@@ -40,6 +40,7 @@
NUMBER = 2,
TOPOLOGY = 3,
REPLACE = 4,
+ CALLOUT = 5,
};
#define BUS_SIZE 30
@@ -60,6 +61,7 @@
char id[ID_SIZE];
char place[PLACE_SIZE];
char kernel_name[NAME_SIZE];
+ char exec_program[FILE_SIZE];
/* what to set the device to */
struct device_attr attr;
=== udev.c 1.9 vs edited ==--- 1.9/udev.c Sun Jul 20 12:48:47 2003
+++ edited/udev.c Tue Oct 7 11:24:08 2003
@@ -51,13 +51,19 @@
return device;
}
-int main(int argc, char *argv[])
+char **main_argv;
+char **main_envp;
+
+int main(int argc, char **argv, char **envp)
{
char *action;
char *device;
char *subsystem;
int retval = -EINVAL;
+ main_argv = argv;
+ main_envp = envp;
+
if (argc != 2) {
dbg ("unknown number of arguments");
goto exit;
=== udev.h 1.11 vs edited ==--- 1.11/udev.h Mon Aug 4 13:59:50 2003
+++ edited/udev.h Tue Oct 7 18:12:34 2003
@@ -57,5 +57,7 @@
extern int udev_add_device(char *device, char *subsystem);
extern int udev_remove_device(char *device, char *subsystem);
+extern char **main_argv;
+extern char **main_envp;
#endif
-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
SourceForge.net hosts over 70,000 Open Source Projects.
See the people who have HELPED US provide better services:
Click here: http://sourceforge.net/supporters.php
_______________________________________________
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
next reply other threads:[~2003-10-10 2:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-10-10 2:03 Patrick Mansfield [this message]
2003-10-14 22:36 ` [PATCH] add callout config type to udev 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=marc-linux-hotplug-106575155504508@msgid-missing \
--to=patmans@us.ibm.com \
--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.