#include <sys/wait.h>
#include <sys/select.h>
-#include "udev_libc_wrapper.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)
{
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;
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;
/* 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) {
- err("pipe failed");
+ err("pipe failed: %s", strerror(errno));
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:
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)
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 */
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;
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';