[Initng-svn] r3690 - initng/trunk/src

svn at initng.thinktux.net svn at initng.thinktux.net
Wed Apr 5 22:28:24 CEST 2006


Author: jimmy
Date: Wed Apr  5 22:28:22 2006
New Revision: 3690

Modified:
   initng/trunk/src/initng_main.c
Log:
make initng_segfault to try harder to tell the user something failed.


Modified: initng/trunk/src/initng_main.c
==============================================================================
--- initng/trunk/src/initng_main.c	(original)
+++ initng/trunk/src/initng_main.c	Wed Apr  5 22:28:22 2006
@@ -413,7 +413,11 @@
  */
 void initng_main_segfault(void)
 {
-
+    int i = 0;
+    /* open a direct socket to /dev/console */
+    int emergency_output = -1;
+    
+    
     /* if this is not init */
     if (!g.i_am_init)
     {
@@ -422,23 +426,58 @@
     }
 
 #ifdef DEBUG
+#define MESSAGE "Initng segfaulted, will wait in 20 seconds for you to start a gdb, before execve(/sbin/initng-segfault);\n"
     /* if we compiled debug mode, we get the user 20 seconds to fire up gdb, and attach pid 1 */
-    printf("Initng segfaulted, will wait in 20 seconds for you to start a gdb, before execve(/sbin/initng-segfault);\n");
-    sleep(20);
+    while(i<6)
+    {
+	emergency_output = open("/dev/console", O_WRONLY);
+	if(emergency_output>0)
+	{
+	    write(emergency_output, MESSAGE, sizeof(char) * strlen(MESSAGE));
+	    close(emergency_output);
+	}
+	sleep(4);
+	i++;
+    }
 #endif
 
-    printf("Launching /sbin/initng-segfault, this is pid: %i\n", getpid());
+#define LMESSAGE "Launching /sbin/initng-segfault"
+    emergency_output = open("/dev/console", O_WRONLY);
+    if(emergency_output > 0)
+    {
+	write(emergency_output, LMESSAGE, sizeof(char) * strlen(LMESSAGE));
+	close(emergency_output);
+    }
+    
+    /* launch initng-segfault */
     {
         const char *segfault_argv[] = { "/sbin/initng-segfault", NULL };
+	const char *segfault_argv_initng[] = { "/sbin/initng", "--hot_reload", NULL };
         const char *segfault_env[] = { NULL };
 
+	/* first try /sbin/initng-segfault */
         if (execve
             ((char *) segfault_argv[0], (char **) segfault_argv,
              (char **) segfault_env) == -1)
         {
-            printf("/sbin/initng-segfault did not exist, will die!\n");
+	    /* then try /sbin/initng --hot_reload */
+    	    if (execve
+        	((char *) segfault_argv_initng[0], (char **) segfault_argv,
+            	    (char **) segfault_env) == -1)
+	
+    	    {    
+		/* else tell the user, it dont succeded to start a replacement */
+		fprintf(stderr, "/sbin/initng-segfault did not exist, will die!\n");
+	    }
         }
-        _exit(99);
+	
+    }
+
+    /* Looop forever ever, becouse init cant die */
+    while(1)
+    {
+	sleep(10);
+	fprintf(stderr, "INITNG_SEGFAULT\n");
     }
 }
 


More information about the Initng-svn mailing list