chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
don't do RUN if "ignore_device" is given
[elogind.git]
/
udev_utils_run.c
diff --git
a/udev_utils_run.c
b/udev_utils_run.c
index 1315154c2678c27d9c869fe3fdc2100b0aad6764..31363588c86386da0302779575b879c38c7474dd 100644
(file)
--- a/
udev_utils_run.c
+++ b/
udev_utils_run.c
@@
-31,12
+31,9
@@
#include <sys/wait.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <sys/select.h>
-#include "udev_libc_wrapper.h"
#include "udev.h"
#include "udev.h"
-#include "logging.h"
-#include "udev_utils.h"
-#include "list.h"
+extern char **environ;
int pass_env_to_socket(const char *sockname, const char *devpath, const char *action)
{
int pass_env_to_socket(const char *sockname, const char *devpath, const char *action)
{
@@
-53,7
+50,7
@@
int pass_env_to_socket(const char *sockname, const char *devpath, const char *ac
sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
memset(&saddr, 0x00, sizeof(struct sockaddr_un));
saddr.sun_family = AF_LOCAL;
sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
memset(&saddr, 0x00, sizeof(struct sockaddr_un));
saddr.sun_family = AF_LOCAL;
- /*
only abstract namespace is supported
*/
+ /*
abstract namespace only
*/
strcpy(&saddr.sun_path[1], sockname);
addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
strcpy(&saddr.sun_path[1], sockname);
addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
@@
-82,6
+79,7
@@
int run_program(const char *command, const char *subsystem,
int errpipe[2] = {-1, -1};
pid_t pid;
char arg[PATH_SIZE];
int errpipe[2] = {-1, -1};
pid_t pid;
char arg[PATH_SIZE];
+ char program[PATH_SIZE];
char *argv[(sizeof(arg) / 2) + 1];
int devnull;
int i;
char *argv[(sizeof(arg) / 2) + 1];
int devnull;
int i;
@@
-115,17
+113,24
@@
int run_program(const char *command, const char *subsystem,
/* prepare pipes from child to parent */
if (result || log) {
if (pipe(outpipe) != 0) {
/* prepare pipes from child to parent */
if (result || log) {
if (pipe(outpipe) != 0) {
- err("pipe failed
"
);
+ err("pipe failed
: %s", strerror(errno)
);
return -1;
}
}
if (log) {
if (pipe(errpipe) != 0) {
return -1;
}
}
if (log) {
if (pipe(errpipe) != 0) {
- err("pipe failed
"
);
+ err("pipe failed
: %s", strerror(errno)
);
return -1;
}
}
return -1;
}
}
+ /* allow programs in /lib/udev called without the path */
+ if (strchr(argv[0], '/') == NULL) {
+ strlcpy(program, "/lib/udev/", sizeof(program));
+ strlcat(program, argv[0], sizeof(program));
+ argv[0] = program;
+ }
+
pid = fork();
switch(pid) {
case 0:
pid = fork();
switch(pid) {
case 0:
@@
-145,7
+150,7
@@
int run_program(const char *command, const char *subsystem,
dup2(devnull, STDERR_FILENO);
close(devnull);
} else
dup2(devnull, STDERR_FILENO);
close(devnull);
} else
- err("open /dev/null failed
"
);
+ err("open /dev/null failed
: %s", strerror(errno)
);
if (outpipe[WRITE_END] > 0)
dup2(outpipe[WRITE_END], STDOUT_FILENO);
if (errpipe[WRITE_END] > 0)
if (outpipe[WRITE_END] > 0)
dup2(outpipe[WRITE_END], STDOUT_FILENO);
if (errpipe[WRITE_END] > 0)
@@
-156,7
+161,7
@@
int run_program(const char *command, const char *subsystem,
err("exec of program '%s' failed", argv[0]);
_exit(1);
case -1:
err("exec of program '%s' failed", argv[0]);
_exit(1);
case -1:
- err("fork of '%s' failed
", argv[0]
);
+ err("fork of '%s' failed
: %s", argv[0], strerror(errno)
);
return -1;
default:
/* read from child if requested */
return -1;
default:
/* read from child if requested */
@@
-199,7
+204,7
@@
int run_program(const char *command, const char *subsystem,
close(outpipe[READ_END]);
outpipe[READ_END] = -1;
if (count < 0) {
close(outpipe[READ_END]);
outpipe[READ_END] = -1;
if (count < 0) {
- err("stdin read failed
with '%s'
", strerror(errno));
+ err("stdin read failed
: %s
", strerror(errno));
retval = -1;
}
continue;
retval = -1;
}
continue;
@@
-233,7
+238,7
@@
int run_program(const char *command, const char *subsystem,
close(errpipe[READ_END]);
errpipe[READ_END] = -1;
if (count < 0)
close(errpipe[READ_END]);
errpipe[READ_END] = -1;
if (count < 0)
- err("stderr read failed
with '%s'
", strerror(errno));
+ err("stderr read failed
: %s
", strerror(errno));
continue;
}
errbuf[count] = '\0';
continue;
}
errbuf[count] = '\0';