chiark / gitweb /
let NAME="" supress node creation, but do RUN keys
[elogind.git] / udevinitsend.c
index 05c39b99b3c15356c1ffe9714a06fea5d3439b0d..4f50da8f680160e2e3187ae3d17105f3ae4547ef 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * udevinitsend.c
  *
- * Userspace devfs
- *
- * Copyright (C) 2004, 2005 Hannes Reinecke <hare@suse.de>
+ * Copyright (C) 2004, 2005 SuSE Linux Products GmbH
+ * Author:
+ *     Hannes Reinecke <hare@suse.de>
  *
  *     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 <stdio.h>
 #include <stddef.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <errno.h>
 #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;
 }