X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevinitsend.c;h=4f50da8f680160e2e3187ae3d17105f3ae4547ef;hp=05c39b99b3c15356c1ffe9714a06fea5d3439b0d;hb=29ed5bf414c9eebdc78c68540f8a19af7691ef1f;hpb=0590abd720f0ddc8204539feef4df8987d7a1f8c diff --git a/udevinitsend.c b/udevinitsend.c index 05c39b99b..4f50da8f6 100644 --- a/udevinitsend.c +++ b/udevinitsend.c @@ -1,9 +1,9 @@ /* * udevinitsend.c * - * Userspace devfs - * - * Copyright (C) 2004, 2005 Hannes Reinecke + * Copyright (C) 2004, 2005 SuSE Linux Products GmbH + * Author: + * Hannes Reinecke * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -38,16 +39,21 @@ #include "udev.h" #include "udev_version.h" #include "udevd.h" +#include "udev_utils.h" #include "logging.h" +static int udev_log = 0; #ifdef USE_LOG -void log_message (int level, const char *format, ...) +void log_message (int priority, const char *format, ...) { va_list args; + if (priority > udev_log) + return; + va_start(args, format); - vsyslog(level, format, args); + vsyslog(priority, format, args); va_end(args); } #endif @@ -58,17 +64,18 @@ void log_message (int level, const char *format, ...) * Scan a file, write all variables into the msgbuf and * fires the message to udevd. */ -static int udevsend(char *filename, int sock, int ignore_loops) +static int udevsend(char *filename, int sock, int disable_loop_detection) { + static struct udevd_msg usend_msg; + int usend_msg_len; + int bufpos = 0; struct stat statbuf; - int fd, bufpos; + int fd; char *fdmap, *ls, *le, *ch; - struct udevd_msg usend_msg; - int retval = 0; - int usend_msg_len; struct sockaddr_un saddr; socklen_t addrlen; - + int retval = 0; + if (stat(filename,&statbuf) < 0) { dbg("cannot stat %s: %s\n", filename, strerror(errno)); return 1; @@ -91,24 +98,23 @@ static int udevsend(char *filename, int sock, int ignore_loops) strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH); addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1; - memset(usend_msg.envbuf, 0, UEVENT_BUFFER_SIZE+256); - bufpos = 0; memset(&usend_msg, 0x00, sizeof(struct udevd_msg)); strcpy(usend_msg.magic, UDEV_MAGIC); + usend_msg.type = UDEVD_UEVENT_INITSEND; ls = fdmap; ch = le = ls; while (*ch && ch < fdmap + statbuf.st_size) { - le = strchr(ch,'\n'); + le = strchr(ch, '\n'); if (!le) break; - ch = strchr(ch,'='); + ch = strchr(ch, '='); if (!ch) break; /* prevent loops in the scripts we execute */ if (strncmp(ls, "UDEVD_EVENT=", 12) == 0) { - if (!ignore_loops) { + if (!disable_loop_detection) { dbg("event already handled by udev\n"); retval = -1; break; @@ -122,15 +128,14 @@ static int udevsend(char *filename, int sock, int ignore_loops) } if (ch < le) { - strncpy(&usend_msg.envbuf[bufpos],ls,(ch - ls) + 1); bufpos += (ch - ls) + 1; if (ch[1] == '\'' && le[-1] == '\'') { - strncpy(&usend_msg.envbuf[bufpos],ch + 2, (le - ch) -3); + strncpy(&usend_msg.envbuf[bufpos],ch + 2, (le - ch) - 3); bufpos += (le - ch) - 3; } else { - strncpy(&usend_msg.envbuf[bufpos],ch, (le - ch)); - bufpos += (le - ch); + strncpy(&usend_msg.envbuf[bufpos],ch + 1, (le - ch) - 1); + bufpos += (le - ch) - 1; } bufpos++; } @@ -147,9 +152,10 @@ loop_end: retval = sendto(sock, &usend_msg, usend_msg_len, 0, (struct sockaddr *)&saddr, addrlen); if (retval < 0) { dbg("error sending message (%s)", strerror(errno)); + retval = -1; } } - + return retval; } @@ -161,8 +167,14 @@ int main(int argc, char *argv[], char *envp[]) char *event_file = NULL; DIR *dirstream; struct dirent *direntry; - int retval = 1, ignore_loops = 0; + int retval = 0; + int disable_loop_detection = 0; int sock; + const char *env; + + env = getenv("UDEV_LOG"); + if (env) + udev_log = log_priority(env); logging_init("udevinitsend"); dbg("version %s", UDEV_VERSION); @@ -186,14 +198,10 @@ int main(int argc, char *argv[], char *envp[]) break; case 'l': - dbg("ignoring loops\n"); - ignore_loops = 1; + dbg("disable loop detection, ignore UDEVD_EVENT\n"); + disable_loop_detection = 1; break; - case 'V': - printf("udevinitsend, version 0.1\n"); - return 0; - case 'h': retval = 0; } @@ -210,22 +218,24 @@ int main(int argc, char *argv[], char *envp[]) if (!dirstream) { info("error opening directory %s: %s\n", event_dir, strerror(errno)); - return 1; + return 2; } chdir(event_dir); while ((direntry = readdir(dirstream)) != NULL) { if (!strcmp(direntry->d_name,".") || !strcmp(direntry->d_name,"..")) continue; - retval = udevsend(direntry->d_name, sock, ignore_loops); + retval = udevsend(direntry->d_name, sock, disable_loop_detection); } closedir(dirstream); } else if (event_file) { - retval = udevsend(event_file, sock, ignore_loops); + retval = udevsend(event_file, sock, disable_loop_detection); } if (sock != -1) close(sock); - return retval; + if (retval) + return 3; + return 0; }