chiark / gitweb /
more fixups
[elogind.git] / udevsend.c
index 7db2378b83b16afc9bda5e8a91cd56b52a721924..341ed4cc36e033814812855b06bb76141dd0cf1d 100644 (file)
 #include <linux/stddef.h>
 
 #include "udev.h"
-#include "udev_lib.h"
 #include "udev_version.h"
 #include "udevd.h"
 #include "logging.h"
 
+/* global variables */
+static int sock = -1;
+
 #ifdef LOG
 unsigned char logname[LOGNAME_SIZE];
 void log_message (int level, const char *format, ...)
@@ -66,8 +68,7 @@ static int start_daemon(void)
                switch (child_pid) {
                case 0:
                        /* daemon */
-                       setsid();
-                       chdir("/");
+                       close(sock);
                        execl(UDEVD_BIN, "udevd", NULL);
                        dbg("exec of daemon failed");
                        _exit(1);
@@ -119,7 +120,6 @@ int main(int argc, char *argv[], char *envp[])
        int subsystem_env = 0;
        int bufpos = 0;
        int retval = 1;
-       int sock = -1;
        int started_daemon = 0;
 
        logging_init("udevsend");
@@ -131,14 +131,18 @@ int main(int argc, char *argv[], char *envp[])
                goto exit;
        }
 
+       /* prevent loops in the scripts we execute */
+       if (getenv("MANAGED_EVENT") != NULL) {
+               dbg("seems that the event source is not the kernel, just exit");
+               goto exit;
+       }
+
        sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
        if (sock == -1) {
                dbg("error getting socket");
                goto fallback;
        }
 
-       set_cloexec_flag(sock, 1);
-
        memset(&saddr, 0x00, sizeof(struct sockaddr_un));
        saddr.sun_family = AF_LOCAL;
        /* use abstract namespace for socket path */