[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