summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>2004-02-11 22:29:15 -0800
committerGreg KH <gregkh@suse.de>2005-04-26 21:32:26 -0700
commitf8911dbb0404902502085c7bb204f2f9c5bc1b9c (patch)
treea2b3a120e0dab1f455688c3f54ffa368dd10e508
parentc5118442a16940fc6ba40fd94ab28061e0f0d43b (diff)
[PATCH] compile udevd with klibc
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.
-rw-r--r--Makefile4
-rw-r--r--udev.c10
-rw-r--r--udevd.c28
-rw-r--r--udevsend.c2
4 files changed, 26 insertions, 18 deletions
diff --git a/Makefile b/Makefile
index ebcb2815c8..d2cec3ac8a 100644
--- 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 55a324efbc..0f01fa41d2 100644
--- 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 476cb64309..104cb2b987 100644
--- 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;
diff --git a/udevsend.c b/udevsend.c
index 17372d8d9a..a24e7d75ed 100644
--- a/udevsend.c
+++ b/udevsend.c
@@ -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;