summaryrefslogtreecommitdiff
path: root/udevsend.c
diff options
context:
space:
mode:
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>2004-02-06 22:21:15 -0800
committerGreg KH <gregkh@suse.de>2005-04-26 21:32:26 -0700
commit2f6cbd19113167746dc4fb6b4f3f5fd64a1c211f (patch)
tree3ee052f575f8a3094a97a0dc39fe2ffaf9e93459 /udevsend.c
parentd2cf99df7df132d8d90c4f7b438374618793c15a (diff)
[PATCH] convert udevsend/udevd to DGRAM and single-threaded
On Fri, Feb 06, 2004 at 01:08:24AM -0500, Chris Friesen wrote: > > Kay, you said "unless we can get rid of _all_ the threads or at least > getting faster, I don't want to change it." > > Well how about we get rid of all the threads, *and* we get faster? Yes, we are twice as fast now on my box :) > This patch applies to current bk trees, and does the following: > > 1) Switch to DGRAM sockets rather than STREAM. This simplifies things > as mentioned in the previous message. > > 2) Invalid sequence numbers are mapped to -1 rather than zero, since > zero is a valid sequence number (I think). Also, this allows for real > speed tests using scripts starting at a zero sequence number, since that > is what the initial expected sequence number is. > > 3) Get rid of all threading. This is the biggie. Some highlights: > a) timeout using setitimer() and SIGALRM > b) async child death notification via SIGCHLD > c) these two signal handlers do nothing but raise volatile flags, > all the > work is done in the main loop > d) locking no longer required I cleaned up the rest of the comments, the whitespace and a few names to match the whole thing. Please recheck it. Test script is switched to work on subsystem 'test' to let udev ignore it.
Diffstat (limited to 'udevsend.c')
-rw-r--r--udevsend.c80
1 files changed, 38 insertions, 42 deletions
diff --git a/udevsend.c b/udevsend.c
index 246a097f26..f6de88565f 100644
--- a/udevsend.c
+++ b/udevsend.c
@@ -33,6 +33,7 @@
#include <string.h>
#include <unistd.h>
#include <time.h>
+#include <linux/stddef.h>
#include "udev.h"
#include "udev_version.h"
@@ -119,13 +120,14 @@ int main(int argc, char* argv[])
char *subsystem;
char *seqnum;
int seq;
- int retval = -EINVAL;
+ int retval = 1;
int size;
int loop;
struct timespec tspec;
int sock;
struct sockaddr_un saddr;
socklen_t addrlen;
+ int started_daemon = 0;
#ifdef DEBUG
init_logging("udevsend");
@@ -151,11 +153,11 @@ int main(int argc, char* argv[])
seqnum = get_seqnum();
if (seqnum == NULL)
- seq = 0;
+ seq = -1;
else
seq = atoi(seqnum);
- sock = socket(AF_LOCAL, SOCK_STREAM, 0);
+ sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
if (sock == -1) {
dbg("error getting socket");
goto exit;
@@ -167,48 +169,42 @@ int main(int argc, char* argv[])
strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH);
addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
- /* try to connect, if it fails start daemon */
- retval = connect(sock, (struct sockaddr *) &saddr, addrlen);
- if (retval != -1) {
- goto send;
- } else {
- dbg("connect failed, try starting daemon...");
- retval = start_daemon();
- if (retval == 0) {
+ size = build_hotplugmsg(&message, action, devpath, subsystem, seq);
+
+ /* 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);
+ if (retval != -1) {
+ retval = 0;
+ goto close_and_exit;
+ }
+
+ if (errno != ECONNREFUSED) {
+ dbg("error sending message");
+ goto close_and_exit;
+ }
+
+ if (!started_daemon) {
+ dbg("connect failed, try starting daemon...");
+ retval = start_daemon();
+ if (retval) {
+ dbg("error starting daemon");
+ goto exit;
+ }
+
dbg("daemon started");
+ started_daemon = 1;
} else {
- dbg("error starting daemon");
- goto exit;
+ dbg("retry to connect %d", UDEVSEND_CONNECT_RETRY - loop);
+ tspec.tv_sec = 0;
+ tspec.tv_nsec = 100000000; /* 100 millisec */
+ nanosleep(&tspec, NULL);
}
}
-
- /* try to connect while daemon to starts */
- tspec.tv_sec = 0;
- tspec.tv_nsec = 100000000; /* 100 millisec */
- loop = UDEVSEND_CONNECT_RETRY;
- while (loop--) {
- retval = connect(sock, (struct sockaddr *) &saddr, sizeof(saddr));
- if (retval != -1)
- goto send;
- else
- dbg("retry to connect %d",
- UDEVSEND_CONNECT_RETRY - loop);
- nanosleep(&tspec, NULL);
- }
- dbg("error connecting to daemon, start daemon failed");
- goto exit;
-
-send:
- size = build_hotplugmsg(&message, action, devpath, subsystem, seq);
- retval = send(sock, &message, size, 0);
- if (retval == -1) {
- dbg("error sending message");
- close (sock);
- goto exit;
- }
- close (sock);
- return 0;
-
+
+close_and_exit:
+ close(sock);
exit:
- return 1;
+ return retval;
}