chiark / gitweb /
[PATCH] udevd - fix socket path length
[elogind.git] / udevsend.c
index 415207d..246a097 100644 (file)
@@ -29,6 +29,7 @@
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <stddef.h>
 #include <string.h>
 #include <unistd.h>
 #include <time.h>
@@ -124,8 +125,11 @@ int main(int argc, char* argv[])
        struct timespec tspec;
        int sock;
        struct sockaddr_un saddr;
+       socklen_t addrlen;
 
+#ifdef DEBUG
        init_logging("udevsend");
+#endif
 
        subsystem = argv[1];
        if (subsystem == NULL) {
@@ -146,11 +150,10 @@ int main(int argc, char* argv[])
        }
 
        seqnum = get_seqnum();
-       if (seqnum == NULL) {
-               dbg("no seqnum");
-               goto exit;
-       }
-       seq = atoi(seqnum);
+       if (seqnum == NULL)
+               seq = 0;
+       else
+               seq = atoi(seqnum);
 
        sock = socket(AF_LOCAL, SOCK_STREAM, 0);
        if (sock == -1) {
@@ -160,10 +163,12 @@ int main(int argc, char* argv[])
 
        memset(&saddr, 0x00, sizeof(saddr));
        saddr.sun_family = AF_LOCAL;
-       strcpy(saddr.sun_path, UDEVD_SOCK);
+       /* use abstract namespace for socket path */
+       strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH);
+       addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
 
        /* try to connect, if it fails start daemon */
-       retval = connect(sock, &saddr, sizeof(saddr));
+       retval = connect(sock, (struct sockaddr *) &saddr, addrlen);
        if (retval != -1) {
                goto send;
        } else {
@@ -182,7 +187,7 @@ int main(int argc, char* argv[])
        tspec.tv_nsec = 100000000;  /* 100 millisec */
        loop = UDEVSEND_CONNECT_RETRY;
        while (loop--) {
-               retval = connect(sock, &saddr, sizeof(saddr));
+               retval = connect(sock, (struct sockaddr *) &saddr, sizeof(saddr));
                if (retval != -1)
                        goto send;
                else