/*
- * udev_utils_run.c - execute programs from udev and read its output
- *
* Copyright (C) 2004-2005 Kay Sievers <kay.sievers@vrfy.org>
*
* This program is free software; you can redistribute it and/or modify it
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
- * 675 Mass Ave, Cambridge, MA 02139, USA.
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "udev.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 devnull;
int i;
+ /* build argv from comand */
strlcpy(arg, command, sizeof(arg));
i = 0;
- if (strchr(arg, ' ')) {
+ if (strchr(arg, ' ') != NULL) {
char *pos = arg;
+
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, " ");
i++;
}
argv[i] = NULL;
- info("'%s'", command);
} 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) {
close(devnull);
} else
err("open /dev/null failed: %s", strerror(errno));
- if (outpipe[WRITE_END] > 0)
+ if (outpipe[WRITE_END] > 0) {
dup2(outpipe[WRITE_END], STDOUT_FILENO);
- if (errpipe[WRITE_END] > 0)
+ close(outpipe[WRITE_END]);
+ }
+ if (errpipe[WRITE_END] > 0) {
dup2(errpipe[WRITE_END], STDERR_FILENO);
+ close(errpipe[WRITE_END]);
+ }
execv(argv[0], argv);
/* we should never reach this */