From 872344c41094f636fd667b9e619f8f219d814605 Mon Sep 17 00:00:00 2001 From: "kay.sievers@vrfy.org" Date: Thu, 5 Feb 2004 01:35:15 -0800 Subject: [PATCH] [PATCH] udevd - switch socket path to abstract namespace As Chris Friesen 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 | 1 - udevd.c | 6 ++---- udevd.h | 1 + udevsend.c | 3 ++- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 618adad7..35575806 100644 --- 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 f8b8c27e..24cf9c9a 100644 --- 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 6dbee3a2..8efe1d56 100644 --- 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]; diff --git a/udevsend.c b/udevsend.c index 9dc2b2e8..22364778 100644 --- a/udevsend.c +++ b/udevsend.c @@ -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)); -- 2.39.5