chiark / gitweb /
[PATCH] compile udevd with klibc
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Thu, 12 Feb 2004 06:29:15 +0000 (22:29 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:32:26 +0000 (21:32 -0700)
On Mon, Feb 09, 2004 at 05:41:15AM +0100, Kay Sievers wrote:
> It seems that today was just another udev-sunday for me :)
>
> Here is a working patch to compile udevd with klibc.
>
> It's sweet the static binary takes 6 kbytes and it runs
> with only 80 kbytes virtual memory.
>
> I changed a few peaces and added a siginterrupt.c file to klibc.
> We may check with hpa to get the changes upstream?

So here is the next try :)
hpa, for good reason, didn't like my changes to klibc.
He will dump signal() completely from klibc instead, so here we switch to
sigaction() and keep udevd working with klibc.

Makefile
udev.c
udevd.c
udevsend.c

index ebcb2815c806736d79d194ccdab70c0a19f18c0c..d2cec3ac8a9a619f361a91cd79ca479eb4cea67d 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -157,7 +157,6 @@ ifeq ($(strip $(USE_KLIBC)),true)
                -I$(LINUX_INCLUDE_DIR)
        LIB_OBJS =
        LDFLAGS = --static --nostdlib -nostartfiles -nodefaultlibs
-       UDEVD =
 else
        WARNINGS += -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
        CRT0 =
@@ -165,12 +164,11 @@ else
        CFLAGS += $(WARNINGS) -I$(GCCINCDIR)
        LIB_OBJS = -lc
        LDFLAGS =
-       UDEVD = $(DAEMON)
 endif
 
 CFLAGS += -I$(PWD)/libsysfs
 
-all: $(ROOT) $(SENDER) $(UDEVD) $(HELPER)
+all: $(ROOT) $(SENDER) $(DAEMON) $(HELPER)
        @extras="$(EXTRAS)" ; for target in $$extras ; do \
                echo $$target ; \
                $(MAKE) prefix=$(prefix) \
diff --git a/udev.c b/udev.c
index 55a324efbc9a87d84340022a3a8b8b8fc01107c0..0f01fa41d2a04e6b08cda306c7d61d6345c146de 100644 (file)
--- a/udev.c
+++ b/udev.c
@@ -47,14 +47,12 @@ int log_ok(void)
 
 static void sig_handler(int signum)
 {
-       dbg("caught signal %d", signum);
        switch (signum) {
                case SIGINT:
                case SIGTERM:
                        sysbus_disconnect();
                        udevdb_exit();
                        exit(20 + signum);
-                       break;
                default:
                        dbg("unhandled signal");
        }
@@ -100,6 +98,7 @@ static int udev_hotplug(int argc, char **argv)
        char *subsystem;
        int retval = -EINVAL;
        int i;
+       struct sigaction act;
 
        action = get_action();
        if (!action) {
@@ -146,8 +145,11 @@ static int udev_hotplug(int argc, char **argv)
        }
 
        /* set up a default signal handler for now */
-       signal(SIGINT, sig_handler);
-       signal(SIGTERM, sig_handler);
+       act.sa_handler = sig_handler;
+       sigemptyset (&act.sa_mask);
+       act.sa_flags = SA_RESTART;
+       sigaction(SIGINT, &act, NULL);
+       sigaction(SIGTERM, &act, NULL);
 
        /* initialize the naming deamon */
        namedev_init();
diff --git a/udevd.c b/udevd.c
index 476cb64309a2ab9f71caf3ed4f29fb8e23f49516..104cb2b9877c92894190b7de93cc6e40637b7e5c 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -114,14 +114,18 @@ static void msg_queue_insert(struct hotplug_msg *msg)
 static void udev_run(struct hotplug_msg *msg)
 {
        pid_t pid;
-       setenv("ACTION", msg->action, 1);
-       setenv("DEVPATH", msg->devpath, 1);
+       char action[32];
+       char devpath[256];
+       char *env[] = { action, devpath, NULL };
+
+       snprintf(action, sizeof(action), "ACTION=%s", msg->action);
+       snprintf(devpath, sizeof(devpath), "DEVPATH=%s", msg->devpath);
 
        pid = fork();
        switch (pid) {
        case 0:
                /* child */
-               execl(UDEV_BIN, "udev", msg->subsystem, NULL);
+               execle(UDEV_BIN, "udev", msg->subsystem, NULL, env);
                dbg("exec of child failed");
                exit(1);
                break;
@@ -285,17 +289,21 @@ int main(int argc, char *argv[])
        struct sockaddr_un saddr;
        socklen_t addrlen;
        int retval;
+       struct sigaction act;
 
        init_logging("udevd");
 
-       signal(SIGINT, sig_handler);
-       signal(SIGTERM, sig_handler);
-       signal(SIGALRM, sig_handler);
-       signal(SIGCHLD, sig_handler);
+       /* set signal handler */
+       act.sa_handler = sig_handler;
+       sigemptyset (&act.sa_mask);
+       act.sa_flags = SA_RESTART;
+       sigaction(SIGINT, &act, NULL);
+       sigaction(SIGTERM, &act, NULL);
 
        /* we want these two to interrupt system calls */
-       siginterrupt(SIGALRM, 1);
-       siginterrupt(SIGCHLD, 1);
+       act.sa_flags = 0;
+       sigaction(SIGALRM, &act, NULL);
+       sigaction(SIGCHLD, &act, NULL);
 
        memset(&saddr, 0x00, sizeof(saddr));
        saddr.sun_family = AF_LOCAL;
@@ -310,7 +318,7 @@ int main(int argc, char *argv[])
        }
 
        /* the bind takes care of ensuring only one copy running */
-       retval = bind(ssock, &saddr, addrlen);
+       retval = bind(ssock, (struct sockaddr *) &saddr, addrlen);
        if (retval < 0) {
                dbg("bind failed\n");
                goto exit;
index 17372d8d9a0ec28568f036ea82be120c93203166..a24e7d75ed47baedf863ad893225a7c69f7bc036 100644 (file)
@@ -179,7 +179,7 @@ int main(int argc, char* argv[])
        /* If we can't send, try to start daemon and resend message */
        loop = UDEVSEND_CONNECT_RETRY;
        while (loop--) {
-               retval = sendto(sock, &message, size, 0, (struct sockaddr*)&saddr, addrlen);
+               retval = sendto(sock, &message, size, 0, (struct sockaddr *)&saddr, addrlen);
                if (retval != -1) {
                        retval = 0;
                        goto close_and_exit;