[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