[Initng-svn] r2308 - initng/plugins/simple_launcher
svn at initng.thinktux.net
svn at initng.thinktux.net
Fri Dec 2 13:08:21 CET 2005
Author: thelich
Date: Fri Dec 2 13:08:20 2005
New Revision: 2308
Modified:
initng/plugins/simple_launcher/initng_simple_launcher.c
Log:
returned back split_n like behaviour in simple_launcher
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 13:08:20 2005
@@ -73,29 +73,32 @@
* @idea DEac-
* @author TheLich
*/
-static char **split_argv(char *string, size_t *argc)
+static char **split_argv(char *string, const char *delim, size_t *argc)
{
- int len=0;
- char *new_str;
+ int len,pos=0;
char **array = (char **) initng_calloc(1, sizeof(char *));
size_t i=0;
if (string)
{
- while (string[0]!=0)
+ while (string[pos]!='\0')
{
- len = strcspn(string, WHITESPACE);
+ len = strcspn(string+pos, delim);
if (len!=0)
{
i++;
- new_str=(char *) i_strndup(string, len);
array = (char **) initng_realloc(array, sizeof(char *) * (i+1));
- array[i-1]=new_str;
+ array[i-1]=string+pos;
+ if (string[len+pos]!='\0')
+ {
+ string[len+pos]='\0';
+ len++;
+ }
}
else
len = 1;
- string+=len;
+ pos+=len;
}
}
array[i]=NULL;
@@ -127,9 +130,9 @@
if(exec[0] != '/') {
size_t exec_len = strlen(exec);
- int len;
- const char *PATH = getenv("PATH");
- char *new_str = NULL;
+ size_t path_c, i, len;
+ char *PATH = i_strdup(getenv("PATH"));
+ char **path_argv;
struct stat test;
D_("initng_s_launch: %s is not absolute path, searching $PATH\n", exec);
@@ -137,36 +140,31 @@
if(!PATH)
{
D_("No $PATH found, using default path\n");
- PATH = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin";
+ PATH = i_strdup("/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin");
}
D_("PATH determined to be %s\n", PATH);
+
+ path_argv = split_argv(PATH, ":", &path_c);
- while (PATH[0]!=0)
+ for (i = 0; path_argv[i]; i++)
{
- len = strcspn(PATH, ":");
- if (len!=0)
- {
- new_str = (char *) i_strndup(PATH, len);
- filename = (char *) initng_calloc(exec_len+len+2, sizeof(char));
- strcpy(filename, new_str);
- if (new_str[len-1] != '/')
+ len = strlen(path_argv[i]);
+ filename = (char *) initng_calloc(exec_len+len+2, sizeof(char));
+ strcpy(filename, path_argv[i]);
+ if (filename[len-1] != '/')
strcat(filename, "/");
strcat(filename, exec);
- free(new_str);
- if((stat(filename, &test) != -1) && (test.st_mode & (S_IXOTH | S_IXGRP | S_IXUSR |
- S_ISVTX | S_ISGID | S_ISUID | S_IFREG)))
- break;
+ if((stat(filename, &test) != -1) && (test.st_mode & (S_IXOTH | S_IXGRP | S_IXUSR |
+ S_ISVTX | S_ISGID | S_ISUID | S_IFREG)))
+ break;
- free(filename);
- filename = NULL;
- }
- else
- len = 1;
-
- PATH += len;
+ free(filename);
+ filename = NULL;
}
+ free(PATH);
+ free(path_argv);
} else
return exec;
@@ -179,10 +177,10 @@
static int initng_s_launch(active_h * service, process_h * process) {
char *exec = NULL;
char *exec_args = NULL;
- char *t = NULL;
+ char *exec_t = NULL, *exec_args_t = NULL;
size_t exec_c;
size_t exec_args_c;
- char *argv0;
+ char *argv0 = NULL;
char **exec_argv = NULL;
char **exec_args_argv = NULL;
int i;
@@ -193,14 +191,14 @@
/* WE ARE EXECUTING A START FILE */
while ((exec = active_db_get_string_var(&EXEC, process->pt->name, service)))
{
- t = fix_variables(exec, service);
- /* argv-entries are pointer to t[x] */
- exec_argv = split_argv(t, &exec_c);
- free(t);
+ 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])
{
D_( "split_argv on exec returns NULL.\n");
+ free(exec_t);
free(exec_argv);
continue;
}
@@ -209,46 +207,33 @@
if (!argv0)
{
D_("%s was not found in search path.\n", exec_argv[0]);
- /* each element of argv must be freed! */
- for (i = 0; exec_argv[i]; i++)
- free(exec_argv[i]);
+ free(exec_t);
free(exec_argv);
continue;
}
else
- {
- if (argv0 != exec_argv[0])
- {
- free(exec_argv[0]);
- exec_argv[0] = argv0;
- }
- }
+ 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)
{
- t = fix_variables(exec_args, service);
- exec_args_argv = split_argv(t, &exec_args_c);
- free(t);
+ exec_args_t = fix_variables(exec_args, service);
+ exec_args_argv = split_argv(exec_args_t, WHITESPACE, &exec_args_c);
if (!exec_args_argv[0])
{
D_( "split_argv exec_args returns NULL.\n");
+ free(exec_t);
+ free(exec_args_t);
free(exec_args_argv);
- /* each element of argv must be freed! */
- for (i = 0; exec_argv[i]; i++)
- free(exec_argv[i]);
free(exec_argv);
continue;
}
exec_argv = (char **) initng_realloc(exec_argv,(exec_c+exec_args_c+1) * sizeof(char *));
for (i=0; exec_args_argv[i]; i++)
- {
- exec_argv[i+exec_c] = i_strdup(exec_args_argv[i]);
- free(exec_args_argv[i]);
- }
+ exec_argv[i+exec_c] = exec_args_argv[i];
exec_argv[i+exec_c] = NULL;
exec_c += exec_args_c;
@@ -271,13 +256,11 @@
else
{
/* exec found, but could not launch any */
- D_("%s did not work\n", t);
- if(exec_argv)
- {
- for (i = 0; exec_argv[i]; i++)
- free(exec_argv[i]);
- free(exec_argv);
- }
+ D_("%s did not work\n", exec_t);
+ free(exec_t);
+ free(exec_argv);
+ free(exec_args_t);
+
result = FAIL;
}
}
More information about the Initng-svn
mailing list