chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
remove old symlinks before creating current ones
[elogind.git]
/
udev_utils_run.c
diff --git
a/udev_utils_run.c
b/udev_utils_run.c
index 1315154c2678c27d9c869fe3fdc2100b0aad6764..76a704c52cb19b93db15fe517f2b3171043708b8 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,20
+79,23
@@
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;
+ /* build argv from comand */
strlcpy(arg, command, sizeof(arg));
i = 0;
strlcpy(arg, command, sizeof(arg));
i = 0;
- if (strchr(arg, ' ')) {
+ if (strchr(arg, ' ')
!= NULL
) {
char *pos = arg;
char *pos = arg;
+
while (pos != NULL) {
if (pos[0] == '\'') {
/* don't separate if in apostrophes */
pos++;
argv[i] = strsep(&pos, "\'");
while (pos != NULL) {
if (pos[0] == '\'') {
/* don't separate if in apostrophes */
pos++;
argv[i] = strsep(&pos, "\'");
- while (pos && pos[0] == ' ')
+ while (pos
!= NULL
&& pos[0] == ' ')
pos++;
} else {
argv[i] = strsep(&pos, " ");
pos++;
} else {
argv[i] = strsep(&pos, " ");
@@
-104,28
+104,33
@@
int run_program(const char *command, const char *subsystem,
i++;
}
argv[i] = NULL;
i++;
}
argv[i] = NULL;
- info("'%s'", command);
} else {
argv[0] = arg;
} else {
argv[0] = arg;
- argv[1] = (char *) subsystem;
- argv[2] = NULL;
- info("'%s' '%s'", arg, argv[1]);
+ argv[1] = NULL;
}
}
+ info("'%s'", command);
/* 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';