chiark / gitweb /
[PATCH] udevd - switch socket path to abstract namespace
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Thu, 5 Feb 2004 09:35:15 +0000 (01:35 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:32:25 +0000 (21:32 -0700)
As Chris Friesen <chris_friesen@sympatico.ca> suggested, here we switch
the unix domains socket path to abstract namespace and get rid of the
socket file in the filesystem.

Hey, this was new to me today. So here a few words:
  Linux supports a abstract namespace for sockets. We don't need a
  physical file on the filesystem but only a unique string magically
  starting with the '\0' character.

  strace with real file:
    connect(3, {sa_family=AF_UNIX, path="/udev/.udevd.sock"}, 110)

  strace with abstract namespace:
    connect(3, {sa_family=AF_UNIX, path=@udevd}, 110)

Makefile
udevd.c
udevd.h
udevsend.c

index 618adad..3557580 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -241,7 +241,6 @@ udev_version.h:
        @echo \#define UDEV_PERMISSION_FILE     \"$(configdir)\udev.permissions\" >> $@
        @echo \#define UDEV_BIN         \"$(DESTDIR)$(sbindir)/udev\" >> $@
        @echo \#define UDEVD_BIN        \"$(DESTDIR)$(sbindir)/udevd\" >> $@
-       @echo \#define UDEVD_SOCK       \"$(udevdir)/\.udevd.sock\" >> $@
        @echo \#define UDEVD_LOCK       \"$(udevdir)/\.udevd.lock\" >> $@
 
 # config files automatically generated
diff --git a/udevd.c b/udevd.c
index f8b8c27..24cf9c9 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -325,7 +325,6 @@ static void sig_handler(int signum)
                case SIGINT:
                case SIGTERM:
                        unlink(UDEVD_LOCK);
-                       unlink(UDEVD_SOCK);
                        exit(20 + signum);
                        break;
                default:
@@ -378,9 +377,9 @@ 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);
 
-       unlink(UDEVD_SOCK);
        ssock = socket(AF_LOCAL, SOCK_STREAM, 0);
        if (ssock == -1) {
                dbg("error getting socket");
@@ -426,6 +425,5 @@ int main(int argc, char *argv[])
        }
 exit:
        close(ssock);
-       unlink(UDEVD_SOCK);
        exit(1);
 }
diff --git a/udevd.h b/udevd.h
index 6dbee3a..8efe1d5 100644 (file)
--- a/udevd.h
+++ b/udevd.h
@@ -27,6 +27,7 @@
 #define UDEV_MAGIC                     "udevd_" UDEV_VERSION
 #define EVENT_TIMEOUT_SEC              5
 #define UDEVSEND_CONNECT_RETRY         20 /* x 100 millisec */
+#define UDEVD_SOCK_PATH                        "udevd"
 
 struct hotplug_msg {
        char magic[20];
index 9dc2b2e..2236477 100644 (file)
@@ -161,7 +161,8 @@ 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);
 
        /* try to connect, if it fails start daemon */
        retval = connect(sock, (struct sockaddr *) &saddr, sizeof(saddr));