linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [patch] compile udevd with klibc
@ 2004-02-09  4:41 Kay Sievers
  2004-02-09 23:30 ` Kay Sievers
  2004-02-11 22:31 ` Greg KH
  0 siblings, 2 replies; 3+ messages in thread
From: Kay Sievers @ 2004-02-09  4:41 UTC (permalink / raw)
  To: linux-hotplug

[-- Attachment #1: Type: text/plain, Size: 337 bytes --]

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?


thanks,
Kay

[-- Attachment #2: 03-udevd-klibc.patch --]
[-- Type: text/plain, Size: 4364 bytes --]

diff -Nru a/Makefile b/Makefile
--- a/Makefile	Mon Feb  9 05:06:07 2004
+++ b/Makefile	Mon Feb  9 05:06:07 2004
@@ -157,7 +157,6 @@
 		-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 @@
 	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 -Nru a/klibc/klibc/Makefile b/klibc/klibc/Makefile
--- a/klibc/klibc/Makefile	Mon Feb  9 05:06:07 2004
+++ b/klibc/klibc/Makefile	Mon Feb  9 05:06:07 2004
@@ -23,7 +23,7 @@
 	  fwrite.o fwrite2.o fputc.o fputs.o puts.o \
 	  sleep.o usleep.o raise.o abort.o assert.o alarm.o pause.o \
 	  __signal.o signal.o bsd_signal.o siglist.o siglongjmp.o \
-	  sigaction.o sigpending.o sigprocmask.o sigsuspend.o \
+	  sigaction.o siginterrupt.o sigpending.o sigprocmask.o sigsuspend.o \
 	  brk.o sbrk.o malloc.o realloc.o calloc.o mmap.o getpagesize.o \
 	  memcpy.o memcmp.o memset.o memccpy.o memmem.o memswap.o \
 	  memmove.o \
diff -Nru a/klibc/klibc/include/signal.h b/klibc/klibc/include/signal.h
--- a/klibc/klibc/include/signal.h	Mon Feb  9 05:06:07 2004
+++ b/klibc/klibc/include/signal.h	Mon Feb  9 05:06:07 2004
@@ -67,6 +67,7 @@
 __extern __sighandler_t signal(int, __sighandler_t);
 __extern __sighandler_t bsd_signal(int, __sighandler_t);
 __extern int sigaction(int, const struct sigaction *, struct sigaction *);
+__extern int siginterrupt(int, int);
 __extern int sigprocmask(int, const sigset_t *, sigset_t *);
 __extern int sigpending(sigset_t *);
 __extern int sigsuspend(const sigset_t *);
diff -Nru a/klibc/klibc/siginterrupt.c b/klibc/klibc/siginterrupt.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/klibc/klibc/siginterrupt.c	Mon Feb  9 05:06:07 2004
@@ -0,0 +1,21 @@
+/*
+ * siginterrupt.c
+ */
+
+#include <signal.h>
+
+int siginterrupt(int sig, int flag) {
+  int ret;
+  struct sigaction act;
+
+  sigaction(sig, 0, &act);
+
+  if (flag)
+    act.sa_flags &= ~SA_RESTART;
+  else
+    act.sa_flags |= SA_RESTART;
+
+  ret = sigaction(sig, &act, 0);
+
+  return ret;
+}
diff -Nru a/klibc/klibc/signal.c b/klibc/klibc/signal.c
--- a/klibc/klibc/signal.c	Mon Feb  9 05:06:07 2004
+++ b/klibc/klibc/signal.c	Mon Feb  9 05:06:07 2004
@@ -7,5 +7,5 @@
 __sighandler_t signal(int signum, __sighandler_t handler)
 {
   /* Linux/SysV signal() semantics */
-  return __signal(signum, handler, SA_RESETHAND);
+  return __signal(signum, handler, SA_NODEFER);
 }
diff -Nru a/udevd.c b/udevd.c
--- a/udevd.c	Mon Feb  9 05:06:07 2004
+++ b/udevd.c	Mon Feb  9 05:06:07 2004
@@ -108,14 +108,18 @@
 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;
@@ -282,6 +286,7 @@
 
 	init_logging("udevd");
 
+	/* set signal handler */
 	signal(SIGINT, sig_handler);
 	signal(SIGTERM, sig_handler);
 	signal(SIGALRM, sig_handler);
@@ -304,7 +309,7 @@
 	}
 
 	/* 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 -Nru a/udevsend.c b/udevsend.c
--- a/udevsend.c	Mon Feb  9 05:06:07 2004
+++ b/udevsend.c	Mon Feb  9 05:06:07 2004
@@ -174,7 +174,7 @@
 	/* 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;

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [patch] compile udevd with klibc
  2004-02-09  4:41 [patch] compile udevd with klibc Kay Sievers
@ 2004-02-09 23:30 ` Kay Sievers
  2004-02-11 22:31 ` Greg KH
  1 sibling, 0 replies; 3+ messages in thread
From: Kay Sievers @ 2004-02-09 23:30 UTC (permalink / raw)
  To: linux-hotplug

[-- Attachment #1: Type: text/plain, Size: 619 bytes --]

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.

thanks,
Kay

[-- Attachment #2: 03-udevd-klibc.patch --]
[-- Type: text/plain, Size: 3705 bytes --]

diff -Nru a/Makefile b/Makefile
--- a/Makefile	Tue Feb 10 00:24:00 2004
+++ b/Makefile	Tue Feb 10 00:24:00 2004
@@ -157,7 +157,6 @@
 		-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 @@
 	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 -Nru a/udev.c b/udev.c
--- a/udev.c	Tue Feb 10 00:24:00 2004
+++ b/udev.c	Tue Feb 10 00:24:00 2004
@@ -42,14 +42,12 @@
 
 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");
 	}
@@ -95,6 +93,7 @@
 	char *subsystem;
 	int retval = -EINVAL;
 	int i;
+	struct sigaction act;
 
 	action = get_action();
 	if (!action) {
@@ -141,8 +140,11 @@
 	}
 
 	/* 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 -Nru a/udevd.c b/udevd.c
--- a/udevd.c	Tue Feb 10 00:24:00 2004
+++ b/udevd.c	Tue Feb 10 00:24:00 2004
@@ -108,14 +108,18 @@
 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;
@@ -279,17 +283,21 @@
 	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;
@@ -304,7 +312,7 @@
 	}
 
 	/* 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 -Nru a/udevsend.c b/udevsend.c
--- a/udevsend.c	Tue Feb 10 00:24:00 2004
+++ b/udevsend.c	Tue Feb 10 00:24:00 2004
@@ -174,7 +174,7 @@
 	/* 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;

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [patch] compile udevd with klibc
  2004-02-09  4:41 [patch] compile udevd with klibc Kay Sievers
  2004-02-09 23:30 ` Kay Sievers
@ 2004-02-11 22:31 ` Greg KH
  1 sibling, 0 replies; 3+ messages in thread
From: Greg KH @ 2004-02-11 22:31 UTC (permalink / raw)
  To: linux-hotplug

On Tue, Feb 10, 2004 at 12:30:31AM +0100, Kay Sievers wrote:
> 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.

Very nice, I've applied this.

thanks,

greg k-h


-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id\x1356&alloc_id438&op=click
_______________________________________________
Linux-hotplug-devel mailing list  http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2004-02-11 22:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-02-09  4:41 [patch] compile udevd with klibc Kay Sievers
2004-02-09 23:30 ` Kay Sievers
2004-02-11 22:31 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).