linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kay Sievers <kay.sievers@vrfy.org>
To: linux-hotplug@vger.kernel.org
Subject: Re: udevsend fallback
Date: Fri, 14 May 2004 11:22:06 +0000	[thread overview]
Message-ID: <20040514112206.GA19004@vrfy.org> (raw)
In-Reply-To: <20040511111641.GB12034@vrfy.org>

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

On Tue, May 11, 2004 at 04:54:44PM -0700, Greg KH wrote:
> On Tue, May 11, 2004 at 01:16:41PM +0200, Kay Sievers wrote:
> > Hi,
> > the execution of udev depends on the proper fuction of udevd, the
> > serializing daemon. If we can't connect to udevd within a 20 second we
> > give up and the request to create a node is lost. Hope this never happens,
> > but a broken udevd may prevent udev from working.
> > 
> > What do you think? Should we call the udev binary directly from udevsend
> > instead of discarding the event? This way we would create the node, regardless
> > of the state of udevd. It would be 20 seconds later and maybe not in the right
> > sequence order - but the node will propably be there.
> > 
> > Does it sound sane? What do you think?
> 
> That sounds like a good "failsafe" thing to do.

Here we go:

Add a fallback udev call to udevsend. If udev is unable to send the
event to udevd, we call the udevd binary instead of do nothing and exit.

thanks,
Kay

[-- Attachment #2: 01-udevsend-fallback.patch --]
[-- Type: text/plain, Size: 1931 bytes --]

===== udevsend.c 1.29 vs edited =====
--- 1.29/udevsend.c	Sun Mar 28 01:08:58 2004
+++ edited/udevsend.c	Fri May 14 12:55:50 2004
@@ -98,6 +98,26 @@
 	return 0;
 }
 
+static void run_udev(const char *subsystem)
+{
+	pid_t pid;
+
+	pid = fork();
+	switch (pid) {
+	case 0:
+		/* child */
+		execl(UDEV_BIN, "udev", subsystem, NULL);
+		dbg("exec of child failed");
+		exit(1);
+		break;
+	case -1:
+		dbg("fork of child failed");
+		break;
+	default:
+		wait(NULL);
+	}
+}
+
 int main(int argc, char* argv[])
 {
 	struct hotplug_msg msg;
@@ -109,14 +129,12 @@
 	int retval = 1;
 	int loop;
 	struct timespec tspec;
-	int sock;
+	int sock = -1;
 	struct sockaddr_un saddr;
 	socklen_t addrlen;
 	int started_daemon = 0;
 
-#ifdef DEBUG
 	init_logging("udevsend");
-#endif
 	dbg("version %s", UDEV_VERSION);
 
 	subsystem = get_subsystem(argv[1]);
@@ -150,7 +168,7 @@
 	sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
 	if (sock == -1) {
 		dbg("error getting socket");
-		goto exit;
+		goto fallback;
 	}
 
 	memset(&saddr, 0x00, sizeof(struct sockaddr_un));
@@ -168,22 +186,21 @@
 				(struct sockaddr *)&saddr, addrlen);
 		if (retval != -1) {
 			retval = 0;
-			goto close_and_exit;
+			goto exit;
 		}
-		
+
 		if (errno != ECONNREFUSED) {
 			dbg("error sending message");
-			goto close_and_exit;
+			goto fallback;
 		}
-		
+
 		if (!started_daemon) {
-			dbg("connect failed, try starting daemon...");
+			info("starting udevd daemon");
 			retval = start_daemon();
 			if (retval) {
-				dbg("error starting daemon");
-				goto exit;
+				info("error starting daemon");
+				goto fallback;
 			}
-			
 			dbg("daemon started");
 			started_daemon = 1;
 		} else {
@@ -193,9 +210,14 @@
 			nanosleep(&tspec, NULL);
 		}
 	}
-	
-close_and_exit:
-	close(sock);
+
+fallback:
+	info("unable to connect to event daemon, try to call udev directly");
+	run_udev(subsystem);
+
 exit:
+	if (sock != -1)
+		close(sock);
+
 	return retval;
 }

  parent reply	other threads:[~2004-05-14 11:22 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-11 11:16 udevsend fallback Kay Sievers
2004-05-11 12:21 ` Harald Hoyer
2004-05-11 23:54 ` Greg KH
2004-05-13  7:51 ` Harald Hoyer
2004-05-13 10:10 ` Kay Sievers
2004-05-13 21:03 ` Greg KH
2004-05-14 11:22 ` Kay Sievers [this message]
2004-05-14 22:21 ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040514112206.GA19004@vrfy.org \
    --to=kay.sievers@vrfy.org \
    --cc=linux-hotplug@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).