[Initng-svn] r2313 - in initng: plugins/simple_launcher src

svn at initng.thinktux.net svn at initng.thinktux.net
Fri Dec 2 14:21:01 CET 2005


Author: jimmy
Date: Fri Dec  2 14:21:00 2005
New Revision: 2313

Modified:
   initng/plugins/simple_launcher/initng_simple_launcher.c
   initng/src/initng_string_tools.h
Log:
Bug cleanup with initng_simple_launcher.c please test.


Modified: initng/plugins/simple_launcher/initng_simple_launcher.c
==============================================================================
--- initng/plugins/simple_launcher/initng_simple_launcher.c	(original)
+++ initng/plugins/simple_launcher/initng_simple_launcher.c	Fri Dec  2 14:21:00 2005
@@ -100,7 +100,7 @@
 
     /* if path provided, youst return */
     if (exec[0] == '/')
-        return (exec);
+        return (NULL);
 
     /* fet exec string lenght to later use */
     exec_len = strlen(exec);
@@ -164,15 +164,6 @@
 static int initng_s_launch(active_h * service, process_h * process)
 {
     char *exec = NULL;
-    char *exec_args = NULL;
-    char *exec_t = NULL, *exec_args_t = NULL;
-    size_t exec_c;
-    size_t exec_args_c;
-    char *argv0 = NULL;
-    char **exec_argv = NULL;
-    char **exec_args_argv = NULL;
-    int i;
-    int result = FAIL;
 
     assert(service);
     assert(service->name);
@@ -181,48 +172,64 @@
     while ((exec =
             active_db_get_string_var(&EXEC, process->pt->name, service)))
     {
+	char *exec_args = NULL;
+	char *exec_t = NULL, *exec_args_t = NULL;
+	size_t exec_c = 0;
+	size_t exec_args_c = 0;
+	char *argv0 = NULL;
+	char **exec_argv = NULL;
+	char **exec_args_argv = NULL;
+	int i = 0;
+	int result = FALSE;
+    
+	/* be aware that fix_variables() return is a malloc, and needs to be free */
         exec_t = fix_variables(exec, service);
+	
         /* argv-entries are pointer to exec_t[x] */
         exec_argv = split_argv(exec_t, WHITESPACE, &exec_c);
 
-        if (!exec_argv[0])
+	/* make sure we got something from the split */
+        if (!exec_argv || !exec_argv[0])
         {
             D_("split_argv on exec returns NULL.\n");
-            free(exec_t);
-            free(exec_argv);
-            continue;
+	    goto go_free;
         }
 
-        argv0 = expand_exec(exec_argv[0]);
-        if (!argv0)
-        {
-            D_("%s was not found in search path.\n", exec_argv[0]);
-            free(exec_t);
-            free(exec_argv);
-            continue;
-        }
-        else
-            exec_argv[0] = argv0;
+	/* if it not contains a full path */
+	if(exec_argv[0][0]!='/')
+	{
+    	    argv0 = expand_exec(exec_argv[0]);
+    	    if (!argv0)
+    	    {
+        	D_("%s was not found in search path.\n", exec_argv[0]);
+		goto go_free;
+    	    }
+            exec_argv[0] = argv0;	    
+	}
 
         /* exec_args should be parsed at the moment, too */
         exec_args =
             active_db_get_string_var(&EXEC_ARGS, process->pt->name, service);
         if (exec_args)
         {
+	    /* get some fixed variables, with ${VARIABLES} fixed, be aware that this is a new malloc and needs to be free() */
             exec_args_t = fix_variables(exec_args, service);
+	    
+	    if(!exec_args_t)
+	    {
+		W_("Failed to fix_variables: \"%s\"\n", exec_args);
+		goto go_free;
+	    }
+		    
             exec_args_argv =
                 split_argv(exec_args_t, WHITESPACE, &exec_args_c);
-
-            if (!exec_args_argv[0])
+            if (!exec_args_argv || !exec_args_argv[0])
             {
                 D_("split_argv exec_args returns NULL.\n");
-                free(exec_t);
-                free(exec_args_t);
-                free(exec_args_argv);
-                free(exec_argv);
-                continue;
+		goto go_free;
             }
 
+	    /* what does this part do ??? */
             exec_argv =
                 (char **) initng_realloc(exec_argv,
                                          (exec_c + exec_args_c +
@@ -232,35 +239,51 @@
 
             exec_argv[i + exec_c] = NULL;
             exec_c += exec_args_c;
+	    
+	    /* this have to exist */
             free(exec_args_argv);
+	    exec_args_argv=NULL;
         }
 
+	/* try to execute, remember the result */
         result = simple_exec(process, service, exec_c, exec_argv);
-        if (result == TRUE)
-            break;
-    }
-
-    if (result != TRUE)
-    {
-        if (result == FAIL)
-        {
-            /* there was no exec in service */
-            result = FALSE;
 
-        }
-        else
-        {
-            /* exec found, but could not launch any */
-            D_("%s did not work\n", exec_t);
-            free(exec_t);
-            free(exec_argv);
-            free(exec_args_t);
-
-            result = FAIL;
-        }
+	/* this is a fallback, that we can go to if anything fail */
+go_free:
+	/* Start freeing */
+	if(exec_t)
+	{
+	    free(exec_t);
+	    exec_t=NULL;
+	}
+	if(exec_argv)
+	{
+	    free(exec_argv);
+	    exec_argv=NULL;
+	}
+	if(argv0)
+	{
+	    free(argv0);
+	    argv0=NULL;
+	}
+	if(exec_args_t)
+	{
+	    free(exec_args_t);
+	    exec_args_t=NULL;
+	}
+	
+	/* return if sucessfull */
+        if (result == TRUE)
+            return(TRUE);
+	
+	/* if something failed return false directly */
+	if (result == FAIL)
+	    return(FALSE);
+	    
+	/* continue the next otherwise */
     }
 
-    return result;
+    return(FALSE);
 }
 
 /* 2005-11-28 DEac-: char *e, char *ea => char **argv, size_t argc

Modified: initng/src/initng_string_tools.h
==============================================================================
--- initng/src/initng_string_tools.h	(original)
+++ initng/src/initng_string_tools.h	Fri Dec  2 14:21:00 2005
@@ -58,7 +58,7 @@
 
 /* to use with split_argv */
 #define WHITESPACE " \t\n\r\v"
-static char **split_argv(char *string, const char *delim, size_t *argc);
+char **split_argv(char *string, const char *delim, size_t *argc);
 
 /* pattern searching */
 int service_match(const char *string, const char *pattern);


More information about the Initng-svn mailing list