[Initng-svn] r2312 - initng/plugins/simple_launcher

svn at initng.thinktux.net svn at initng.thinktux.net
Fri Dec 2 13:55:13 CET 2005


Author: jimmy
Date: Fri Dec  2 13:55:12 2005
New Revision: 2312

Modified:
   initng/plugins/simple_launcher/initng_simple_launcher.c
Log:
Cleanups.


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:55:12 2005
@@ -49,92 +49,120 @@
 #include "initng_simple_launcher.h"
 
 s_entry EXEC = { "exec", VARIABLE_STRING, 4, NULL,
-	"The path and name for an executable." };
+    "The path and name for an executable."
+};
 s_entry EXEC_ARGS = { "exec_args", VARIABLE_STRING, 9, NULL,
-	"The arguments for the executable." };
+    "The arguments for the executable."
+};
 
 static int simple_exec(process_h * p, active_h * s, size_t c, char **v);
 
 #ifdef DEBUG
-static void D_argv(const char *o, char **argv) {
-	int i;
-	if(!argv)
-	    return;
-	    
-	for( i = 0; argv[i]; i++)
-	    D_( "%s[%-2i]: %s\n", o, i, argv[i]);
+static void D_argv(const char *o, char **argv)
+{
+    int i;
+
+    if (!argv)
+        return;
+
+    for (i = 0; argv[i]; i++)
+        D_("%s[%-2i]: %s\n", o, i, argv[i]);
 }
 #endif
 
-/* Completely rewritten function.
- * Contains old Code from SaTaN0rX and DEac-.
- */
-
-/** Searches for exec in PATH.
+/*
+ * Searches for exec in PATH.
  * 
+ * Completely rewritten function.
+ * Contains old Code from SaTaN0rX and DEac-.
  * @author TheLich
  * @param exec filename, which searched.
  * @return executeable file with absolute path.\nIf exec was absolute, this will be a pointer to exec.
  * On failure, it will return NULL.
  */
-static char *expand_exec(char *exec) {
-    
+
+static char *expand_exec(char *exec)
+{
     char *filename = NULL;
+    size_t exec_len = 0;
+    size_t path_c, i, len = 0;
+    char *PATH = NULL;
+    char **path_argv = NULL;
+    struct stat test;
+
 
-    if(!exec)
-	return NULL;
+    if (!exec)
+        return NULL;
 
     /* 11/20/2005 SaTaN0rX: preliminary support for searching the PATH
      * only search the PATH if this is NOT already an absolute path
      */
 
-    if(exec[0] != '/') {
-	size_t exec_len = strlen(exec);
-	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);
-
-	if(!PATH)
-	{
-	    D_("No $PATH found, using default path\n");
-	    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);
-
-	for (i = 0; path_argv[i]; i++)
-	{
-	    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);
-
-	    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;
-	}
-	free(PATH);
-	free(path_argv);
-    } else
-	return exec;
+    /* if path provided, youst return */
+    if (exec[0] == '/')
+        return (exec);
+
+    /* fet exec string lenght to later use */
+    exec_len = strlen(exec);
+
+    /* get the env-path variable */
+    PATH = i_strdup(getenv("PATH"));
+
+    D_("initng_s_launch: %s is not absolute path, searching $PATH\n", exec);
 
+    /* Make sure we got a path */
+    if (!PATH)
+    {
+        D_("No $PATH found, using default path\n");
+        PATH =
+            i_strdup
+            ("/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin");
+    }
+
+    D_("PATH determined to be %s\n", PATH);
+
+    /* split path by ':' char */
+    path_argv = split_argv(PATH, ":", &path_c);
+
+    /* walk the list of entrys */
+    for (i = 0; path_argv[i]; i++)
+    {
+        /* get entry lenght */
+        len = strlen(path_argv[i]);
+
+        /* what does this do? */
+        filename = (char *) initng_calloc(exec_len + len + 2, sizeof(char));
+        strcpy(filename, path_argv[i]);
+        if (filename[len - 1] != '/')
+            strcat(filename, "/");
+        strcat(filename, exec);
+
+        /* check so that file exits, if exists leave this loop */
+        if ((stat(filename, &test) != -1)
+            && (test.
+                st_mode & (S_IXOTH | S_IXGRP | S_IXUSR | S_ISVTX | S_ISGID |
+                           S_ISUID | S_IFREG)))
+            break;
+
+        /* cleanup */
+        free(filename);
+        filename = NULL;
+    }
+
+    /* free */
+    free(PATH);
+    free(path_argv);
+
+    /* make sure we got a filename to use */
     if (!filename)
-	F_( "No executeable found\n");
+        F_("No executeable found\n");
 
+    /* return the filename */
     return filename;
 }
 
-static int initng_s_launch(active_h * service, process_h * process) {
+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;
@@ -145,84 +173,91 @@
     char **exec_args_argv = NULL;
     int i;
     int result = FAIL;
+
     assert(service);
     assert(service->name);
 
     /* WE ARE EXECUTING A START FILE */
-    while ((exec = active_db_get_string_var(&EXEC, process->pt->name, service)))
+    while ((exec =
+            active_db_get_string_var(&EXEC, process->pt->name, service)))
     {
-	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;
-	}
-
-	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;
-
-	/* 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)
-	{
-	    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);
-		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] = exec_args_argv[i];
-
-	    exec_argv[i+exec_c] = NULL;
-	    exec_c += exec_args_c;
-	    free(exec_args_argv);
-	}
-
-	result = simple_exec(process, service, exec_c, exec_argv);
-	if (result==TRUE)
-	    break;
+        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;
+        }
+
+        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;
+
+        /* 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)
+        {
+            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);
+                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] = exec_args_argv[i];
+
+            exec_argv[i + exec_c] = NULL;
+            exec_c += exec_args_c;
+            free(exec_args_argv);
+        }
+
+        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);
+        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;
-	}
+            result = FAIL;
+        }
     }
 
     return result;
@@ -230,7 +265,9 @@
 
 /* 2005-11-28 DEac-: char *e, char *ea => char **argv, size_t argc
  */
-static int simple_exec(process_h * process_to_exec, active_h * s, size_t argc, char **argv) {
+static int simple_exec(process_h * process_to_exec, active_h * s, size_t argc,
+                       char **argv)
+{
     /* called from inside the service directory, return the PID or 0 on error */
 
     /* This is the real service kicker */
@@ -242,11 +279,12 @@
     assert(argc);
     assert(argv);
 
-    if ((pid_fork = initng_fork(s, process_to_exec)) == 0) {
+    if ((pid_fork = initng_fork(s, process_to_exec)) == 0)
+    {
 
 #ifdef DEBUG
         D_("FROM_FORK simple_exec(%i,%s, ...);\n", argc, argv[0]);
-	D_argv("simple_exec: ", argv);
+        D_argv("simple_exec: ", argv);
 #endif
 
         /* FINALLY EXECUTE *//* execve replaces the running process */
@@ -280,8 +318,8 @@
 
     if (strcmp(version, INITNG_VERSION) != 0)
     {
-	F_("This module, is compiled for \"%s\" version, and initng is compiled on \"%s\" version, wont load this module!\n", INITNG_VERSION, version);
-	return (FALSE);
+        F_("This module, is compiled for \"%s\" version, and initng is compiled on \"%s\" version, wont load this module!\n", INITNG_VERSION, version);
+        return (FALSE);
     }
 
     initng_add_hook(LAUNCH, 40, &initng_s_launch);


More information about the Initng-svn mailing list