From: kay.sievers@vrfy.org Date: Fri, 23 Jan 2004 12:01:09 +0000 (-0800) Subject: [PATCH] fix udevd exec X-Git-Tag: 015~22 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=90c210eb6bfc2ae294202fffb080315f3c47a57b [PATCH] fix udevd exec Sorry, some code is missing. Here is a fix to make the exec functional. --- diff --git a/udevd.c b/udevd.c index 08dede36e..6af265a38 100644 --- a/udevd.c +++ b/udevd.c @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -49,6 +50,7 @@ static int timeout = 0; static struct hotplug_msg *head = NULL; static char exec_program[100]; + static void sig_handler(int signum) { dbg("caught signal %d", signum); @@ -104,13 +106,40 @@ static void dump_msg(struct hotplug_msg *pmsg) pmsg->seqnum, pmsg->action, pmsg->devpath, pmsg->subsystem); } -static void dispatch_msg(struct hotplug_msg *pmsg) +static int dispatch_msg(struct hotplug_msg *pmsg) { + pid_t pid; + char *argv[3]; + int retval; + extern char **environ; + dump_msg(pmsg); dbg("exec '%s'", exec_program); + setenv("ACTION", pmsg->action, 1); setenv("DEVPATH", pmsg->devpath, 1); - execl(exec_program, pmsg->subsystem); + + argv[0] = exec_program; + argv[1] = pmsg->subsystem; + argv[2] = NULL; + + pid = fork(); + switch (pid) { + case 0: + retval = execve(argv[0], argv, environ); + if (retval != 0) { + dbg("child execve failed"); + exit(1); + } + break; + case -1: + dbg("fork failed"); + return -1; + default: + wait(0); + break; + } + return 0; } static void reset_timer(void) diff --git a/udevsend.c b/udevsend.c index 1a897451c..748c8f221 100644 --- a/udevsend.c +++ b/udevsend.c @@ -117,15 +117,16 @@ int main(int argc, char* argv[]) } seq = atoi(seqnum); + /* create ipc message queue or get id of our existing one */ key = ftok(DEFAULT_EXEC_PROGRAM, IPC_KEY_ID); size = build_hotplugmsg( (struct hotplug_msg**) &pmsg, action, devpath, subsystem, seq); msgid = msgget(key, IPC_CREAT); if (msgid == -1) { - dbg("open ipc queue error"); + dbg("error open ipc queue"); goto exit; } - /* get state of queue */ + /* get state of ipc queue */ retval = msgctl(msgid, IPC_STAT, &msg_queue); if (retval == -1) { dbg("error getting info on ipc queue"); @@ -134,10 +135,11 @@ int main(int argc, char* argv[]) if (msg_queue.msg_qnum > 0) dbg("%li messages already in the ipc queue", msg_queue.msg_qnum); + /* send ipc message to the daemon */ retval = msgsnd(msgid, pmsg, size, 0); free_hotplugmsg( (struct hotplug_msg*) pmsg); if (retval == -1) { - dbg("send ipc message error"); + dbg("error sending ipc message"); goto exit; } return 0;