[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