Hello all.

Today I found that when I start some program asynchronously ("prog &") 
from usbhidaction(1) and then usbhidaction(1) terminates, then "prog" 
terminates too. This is caused by the fact usbhidaction(1) uses 
system(3). I changed the logic to do fork+setpgid+exec dance, and now 
things work as expected. The patch is at the end of letter.

-- 
  Best wishes,
    Vadim Zhukov

A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing in e-mail?


Index: usbhidaction.c
===================================================================
RCS file: /cvs/src/usr.bin/usbhidaction/usbhidaction.c,v
retrieving revision 1.12
diff -u -p -r1.12 usbhidaction.c
--- usbhidaction.c      21 Oct 2009 15:48:27 -0000      1.12
+++ usbhidaction.c      27 Mar 2010 08:04:37 -0000
@@ -46,6 +46,7 @@
 #include <util.h>
 #include <syslog.h>
 #include <signal.h>
+#include <paths.h>
 
 int verbose = 0;
 int isdemon = 0;
@@ -399,6 +400,7 @@ docmd(struct command *cmd, int value, co
        char cmdbuf[SIZE], *p, *q;
        size_t len;
        int n, r;
+       pid_t pid;
 
        for (p = cmd->action, q = cmdbuf; *p && q < &cmdbuf[SIZE-1]; ) {
                if (*p == '$') {
@@ -431,11 +433,16 @@ docmd(struct command *cmd, int value, co
        }
        *q = 0;
 
-       if (verbose)
-               printf("system '%s'\n", cmdbuf);
-       r = system(cmdbuf);
-       if (verbose > 1 && r)
-               printf("return code = 0x%x\n", r);
+       pid = fork();
+       if (pid == -1)
+               warn("fork failed");
+       else if (pid == 0) {
+               setpgid(0, 0);
+               if (verbose)
+                       printf("executing '%s'\n", cmdbuf);
+               r = execl(_PATH_BSHELL, "sh", "-c", cmdbuf, NULL);
+               err(1, "execl");
+       }
 }
 
 void

Reply via email to