[Initng-svn] r4368 - initng/trunk/plugins/bash_parser
svn at initng.thinktux.net
svn at initng.thinktux.net
Tue Jun 6 04:18:15 CEST 2006
Author: jimmy
Date: Tue Jun 6 04:18:13 2006
New Revision: 4368
Modified:
initng/trunk/plugins/bash_parser/bp.c
initng/trunk/plugins/bash_parser/initng_bash_parser.c
initng/trunk/plugins/bash_parser/runiscript.c
Log:
Big parts of bash_parser rewritten again.
Modified: initng/trunk/plugins/bash_parser/bp.c
==============================================================================
--- initng/trunk/plugins/bash_parser/bp.c (original)
+++ initng/trunk/plugins/bash_parser/bp.c Tue Jun 6 04:18:13 2006
@@ -45,21 +45,43 @@
#include "initng_bash_parser.h"
int bp_send(bp_req * to_send);
-int bp_new_active(const char *type, const char *service);
-int bp_abort(const char *service);
-int bp_done(const char *service);
-int bp_get_variable(const char *service, const char *vartype,
- const char *varname);
-int bp_set_variable(const char *service, const char *vartype,
- const char *varname, const char *value);
-char *message;
+/* these are gonna be used for main() for every command */
+int bp_new_active(char * service, int argc, char **argv);
+int bp_abort(char * service, int argc, char **argv);
+int bp_done(char * service, int argc, char **argv);
+int bp_get_variable(char * service, int argc, char **argv);
+int bp_set_variable(char * service, int argc, char **argv);
+char *message;
+typedef struct
+{
+ const char *name;
+ int (*function) (char * service, int argc, char **argv);
+} command_entry;
+
+command_entry commands[] = {
+{"abort", &bp_abort},
+{"iabort", &bp_abort},
+{"register", &bp_new_active},
+{"iregister", &bp_new_active},
+{"done", &bp_done},
+{"idone", &bp_done},
+{"get", &bp_get_variable},
+{"iget", &bp_get_variable},
+{"set", &bp_set_variable},
+{"iset", &bp_set_variable},
+{NULL, NULL }
+};
int main(int argc, char **argv)
{
int status = 99;
char *service = NULL;
+ char **new_argv;
+ int new_argc;
+ int i;
+ int stop_checking = FALSE;
/* cut path or so from name */
char *argv0 = strrchr(argv[0], '/');
@@ -69,207 +91,74 @@
if (argv0[0] == '/')
argv0++;
- service = getenv("SERVICE");
+ /* allocate a new argv to use */
+ new_argv=calloc(argc+1, sizeof(char *));
+
+ /* fill it up */
+ new_argv[0] = argv0;
- /*if(service)
- printf("SERVICE: %s\n", service);*/
+ /* copy all, but not options */
+ new_argc=0;
+ for(i=1; argv[i]; i++)
+ {
+ /* iset -s service test */
+ if(stop_checking == FALSE && argv[i][0] == '-')
+ {
+ if(argv[i][1] == 's' && !argv[i][2] && argv[i+1][0])
+ {
+ service = argv[i+1];
+ i++;
+ continue;
+ }
+
+ printf("unknown variable \"%s\"\n", argv[i]);
+ }
+ /* stop searching for arguments behind the '=' char */
+ if(argv[i][0] == '=')
+ stop_checking = TRUE;
+
+ /* copy the entry */
+ new_argc++;
+ new_argv[new_argc]=argv[i];
+ }
+
+ /* if service was not found.. */
+ if(!service)
+ service = getenv("SERVICE");
+
+ /* make sure */
+ if(!service)
+ {
+ printf("I dont know what service you want!\n");
+ exit(1);
+ }
{
- int i;
printf(" **||** ");
- for(i=0; argv[i]; i++)
+ for (i = 0; argv[i]; i++)
printf("%s ", argv[i]);
printf("\n");
}
- /* printf("argc: %i argv[0]: %s :: %s\n", argc, argv[0], argv0); */
-
- /* Sort by the number of arguments */
-
- /* if service is known, we dont need that in the argline */
- if (service)
- {
- switch (argc)
- {
- case 1:
- /* abort <service> */
- if (strcmp(argv0, "abort") == 0
- || strcmp(argv0, "iabort") == 0)
- {
- status = bp_abort(service);
- break;
- }
-
- /* done <service> */
- if (strcmp(argv0, "done") == 0 || strcmp(argv0, "idone") == 0)
- {
- status = bp_done(service);
- break;
- }
- break;
-
- case 2:
- /* get <service> chdir */
- if (strcmp(argv0, "get") == 0 || strcmp(argv0, "iget") == 0)
- {
- status = bp_get_variable(service, argv[1], NULL);
- break;
- }
-
- /* register service_type <service> */
- if (strcmp(argv0, "register") == 0 ||
- strcmp(argv0, "iregister") == 0)
- {
- status = bp_new_active(argv[1], service);
- break;
- }
-
- /* iset <service> test */
- if (strcmp(argv0, "set") == 0 ||
- strcmp(argv0, "iset") == 0)
- {
- status = bp_set_variable(service, argv[1], NULL, NULL);
- break;
- }
- break;
-
- case 3:
- /* get <service> exec start */
- if (strcmp(argv0, "get") == 0 || strcmp(argv0, "iget") == 0)
- {
- status = bp_get_variable(service, argv[1], argv[2]);
- break;
- }
-
- /* iset <service> var test */
- if (strcmp(argv0, "set") == 0 ||
- strcmp(argv0, "iset") == 0)
- {
- status = bp_set_variable(service, argv[1], argv[2], NULL);
- break;
- }
-
- break;
-
- case 4:
- /* set <service> chdir = /root */
- if (argv[2][0] == '=' && (strcmp(argv0, "set") == 0 ||
- strcmp(argv0, "iset") == 0))
- {
- status = bp_set_variable(service, argv[1], NULL, argv[3]);
- break;
- }
- break;
+
- case 5:
- /* set <service> exec start = /bin/true */
- if (argv[3][0] == '=' && (strcmp(argv0, "set") == 0 ||
- strcmp(argv0, "iset") == 0))
- {
- status = bp_set_variable(service, argv[1], argv[2],
- argv[4]);
- break;
- }
- break;
- default:
- break;
- }
- }
- else
+ /* LIST THE DB OF COMMANDS AND EXECUTE THE RIGHT ONE */
{
- switch (argc)
+ for(i=0;commands[i].name; i++)
{
- case 2:
- /* abort service */
- if (strcmp(argv0, "abort") == 0
- || strcmp(argv0, "iabort") == 0)
- {
- status = bp_abort(argv[1]);
- break;
- }
-
- /* done service */
- if (strcmp(argv0, "done") == 0 || strcmp(argv0, "idone") == 0)
- {
- status = bp_done(argv[1]);
- break;
- }
- break;
-
- case 3:
- /* get service chdir */
- if (strcmp(argv0, "get") == 0 || strcmp(argv0, "iget") == 0)
- {
- status = bp_get_variable(argv[1], argv[2], NULL);
- break;
- }
-
- /* register service_type test */
- if (strcmp(argv0, "register") == 0 ||
- strcmp(argv0, "iregister") == 0)
- {
- status = bp_new_active(argv[1], argv[2]);
- break;
- }
- /* iset <service> test */
- if (strcmp(argv0, "set") == 0 ||
- strcmp(argv0, "iset") == 0)
- {
- status = bp_set_variable(argv[1], argv[2], NULL, NULL);
- break;
- }
-
- break;
-
- case 4:
- /* get service exec start */
- if (strcmp(argv0, "get") == 0 || strcmp(argv0, "iget") == 0)
- {
- status = bp_get_variable(argv[1], argv[2], argv[3]);
- break;
- }
- /* iset <service> var test */
- if (strcmp(argv0, "set") == 0 ||
- strcmp(argv0, "iset") == 0)
- {
- status = bp_set_variable(argv[1], argv[2], argv[3], NULL);
- break;
- }
-
- break;
-
- case 5:
- /* set service chdir = /root */
- if (argv[3][0] == '=' && (strcmp(argv0, "set") == 0 ||
- strcmp(argv0, "iset") == 0))
- {
- status = bp_set_variable(argv[1], argv[2], NULL, argv[4]);
- break;
- }
- break;
-
- case 6:
- /* set service exec start = /bin/true */
- if (argv[4][0] == '=' && (strcmp(argv0, "set") == 0 ||
- strcmp(argv0, "iset") == 0))
- {
- status = bp_set_variable(argv[1], argv[2], argv[3],
- argv[5]);
- break;
- }
- break;
- default:
+ if(strcasecmp(argv0, commands[i].name)==0)
+ status = (*commands[i].function) (service, new_argc, new_argv);
+ if(status != 99)
break;
}
}
+
/* if still 99, print usage */
if (status == 99)
{
+ int i;
printf("Avaible commands:\n");
- printf("./idone <service>\n");
- printf("./iabort <service>\n");
- printf("./iget <service> <variable>\n");
- printf("./iregister <type> <name>\n");
- printf("./iset <service> <variable> <value>\n");
+ for(i=0;commands[i].name; i++)
+ printf(" ./%s\n", commands[i].name);
exit(status);
}
@@ -283,7 +172,7 @@
exit(status == TRUE ? 0 : 1);
}
-int bp_abort(const char *service)
+int bp_abort(char *service, int argc, char ** argv)
{
/* the request to send */
bp_req to_send;
@@ -296,7 +185,7 @@
return (bp_send(&to_send));
}
-int bp_done(const char *service)
+int bp_done(char *service, int argc, char ** argv)
{
/* the request to send */
bp_req to_send;
@@ -309,58 +198,139 @@
return (bp_send(&to_send));
}
-int bp_get_variable(const char *service, const char *vartype,
- const char *varname)
+
+/* This have 2 senarios, with 1 or 2 argc:
+ * iget test
+ * iget exec test
+ */
+
+int bp_get_variable(char *service, int argc, char ** argv)
{
/* the request to send */
bp_req to_send;
+
+ /* make sure its 1 or 2 args with this */
+ if(argc != 1 && argc != 2)
+ return(FALSE);
memset(&to_send, 0, sizeof(bp_req));
to_send.request = GET_VARIABLE;
+ /* use service */
strncpy(to_send.u.get_variable.service, service, 100);
- strncpy(to_send.u.get_variable.vartype, vartype, 100);
- if (varname)
- strncpy(to_send.u.get_variable.varname, varname, 100);
+
+
+ if(argc==1)
+ {
+ strncpy(to_send.u.get_variable.vartype, argv[1], 100);
+ } else {
+ strncpy(to_send.u.get_variable.varname, argv[1], 100);
+ strncpy(to_send.u.get_variable.vartype, argv[2], 100);
+ }
return (bp_send(&to_send));
}
-int bp_set_variable(const char *service, const char *vartype,
- const char *varname, const char *value)
+
+/*
+ * Have 4 usages:
+ * With only 1 arg and no '=', sets a variable without value.
+ * 1) iset forks
+ * With only 2 args and no '=', sets a variable without value.
+ * 2) iset start forks
+ * With minimum 3 words and 2on a '='
+ * 3) iset test = "Coool"
+ * With minimum 4 words and 3rd a '='
+ * 4) iset exec test = "Coool"
+ */
+
+int bp_set_variable(char *service, int argc, char ** argv)
{
/* the request to send */
bp_req to_send;
-
memset(&to_send, 0, sizeof(bp_req));
-
- /* printf("bp_set_variable(%s, %s, %s, %s)\n", service, vartype, varname, value); */
to_send.request = SET_VARIABLE;
+ int i;
+ int ret = FALSE;
+
+ /* make sure have enought variables */
+ if(argc < 1)
+ return(FALSE);
+ /* use service set in main() */
strncpy(to_send.u.set_variable.service, service, 100);
- strncpy(to_send.u.set_variable.vartype, vartype, 100);
-
- if (varname)
- strncpy(to_send.u.set_variable.varname, varname, 100);
-
- if (value)
- strncpy(to_send.u.set_variable.value, value, 1024);
-
- return (bp_send(&to_send));
+
+ /* if not usage 3 or 4 */
+ if(argc < 3)
+ {
+ /* handle valueless variable, type 1 */
+ if(argc == 1)
+ {
+ strncpy(to_send.u.set_variable.vartype, argv[1], 100);
+ return (bp_send(&to_send));
+ }
+
+ /* handle valueless variable, type 2 */
+ if(argc == 2)
+ {
+ strncpy(to_send.u.set_variable.vartype, argv[1], 100);
+ strncpy(to_send.u.set_variable.varname, argv[2], 100);
+ return (bp_send(&to_send));
+ }
+
+ /* then this is not valid */
+ return(FALSE);
+ }
+
+ /* if its a short set ( type 3 ) without vartype */
+ if( argc >= 3 && argv[2][0] == '=')
+ {
+ strncpy(to_send.u.set_variable.vartype, argv[1], 100);
+ /* argv[2] == '=' */
+ for(i=3;argv[i];i++)
+ {
+ strncpy(to_send.u.set_variable.value, argv[i], 1024);
+ ret=bp_send(&to_send);
+ }
+ return(ret);
+ }
+
+ /* else type 4 */
+ if ( argc >= 4 && argv[3][0] == '=')
+ {
+ strncpy(to_send.u.set_variable.vartype, argv[1], 100);
+ strncpy(to_send.u.set_variable.varname, argv[2], 100);
+ /* argv[3] == '=' */
+ for(i=4;argv[i];i++)
+ {
+ strncpy(to_send.u.set_variable.value, argv[i], 1024);
+ ret=bp_send(&to_send);
+ }
+ return(ret);
+ }
+
+ return(FALSE);
}
-int bp_new_active(const char *type, const char *service)
+int bp_new_active(char * service, int argc, char ** argv)
{
/* the request to send */
bp_req to_send;
-
memset(&to_send, 0, sizeof(bp_req));
-
to_send.request = NEW_ACTIVE;
- strncpy(to_send.u.new_active.type, type, 40);
+
+ /* do a check */
+ if(argc != 1)
+ return(FALSE);
+
+ /* use servicename from main() */
strncpy(to_send.u.new_active.service, service, 100);
+ /* set the type */
+ strncpy(to_send.u.new_active.type, argv[1], 40);
+
+
return (bp_send(&to_send));
}
Modified: initng/trunk/plugins/bash_parser/initng_bash_parser.c
==============================================================================
--- initng/trunk/plugins/bash_parser/initng_bash_parser.c (original)
+++ initng/trunk/plugins/bash_parser/initng_bash_parser.c Tue Jun 6 04:18:13 2006
@@ -231,9 +231,15 @@
value = NULL;
/* but these are */
- if (strlen(service) < 1 || strlen(vartype) < 1)
+ if (strlen(service) < 1)
{
- strcpy(rep->message, "Variables missing.");
+ strcpy(rep->message, "Service missing.");
+ rep->success = FALSE;
+ return;
+ }
+ if (strlen(vartype) < 1)
+ {
+ strcpy(rep->message, "Vartype missing.");
rep->success = FALSE;
return;
}
@@ -256,15 +262,17 @@
type = initng_service_data_type_find(vartype);
if (!type)
{
- strcpy(rep->message, "Variable entry not found.");
+ strcpy(rep->message, "Variable entry \"");
+ strcat(rep->message, vartype);
+ strcat(rep->message, "\" not found.");
rep->success = FALSE;
return;
}
/* now we now if variable is required or not */
- if(!value)
+ if (!value)
{
- if((type->opt_type != SET && type->opt_type != VARIABLE_SET))
+ if ((type->opt_type != SET && type->opt_type != VARIABLE_SET))
{
strcpy(rep->message, "Value missing.");
rep->success = FALSE;
@@ -284,10 +292,12 @@
case VARIABLE_STRINGS:
{
char *new_st = NULL;
- while((new_st=st_dup_next_word(&value)))
+
+ while ((new_st = st_dup_next_word(&value)))
{
- set_another_string_var(type, varname ? i_strdup(varname) : NULL,
- active, new_st);
+ set_another_string_var(type,
+ varname ? i_strdup(varname) : NULL,
+ active, new_st);
}
}
D_("strings type\n");
@@ -431,8 +441,8 @@
}
/* must set to a DOWN state, to be able to start */
- active->current_state=&REDY_TO_START;
-
+ active->current_state = &REDY_TO_START;
+
/* start this service */
rep->success = initng_handler_start_service(active);
return;
Modified: initng/trunk/plugins/bash_parser/runiscript.c
==============================================================================
--- initng/trunk/plugins/bash_parser/runiscript.c (original)
+++ initng/trunk/plugins/bash_parser/runiscript.c Tue Jun 6 04:18:13 2006
@@ -30,26 +30,28 @@
extern char **environ;
/* These commands will be forwarded to /sbin/ngc if issued */
-const char *ngc_args[] = { "start", "stop", "restart", "zap", "status", NULL };
+const char *ngc_args[] = { "start", "stop", "restart", "zap", "status", NULL
+};
/* this lists the commands the service can be executed with directly */
static void print_usage(void)
{
- int i;
- printf("Usage: /etc/init/service");
- for(i=0; ngc_args[i]; i++)
- printf(" <%s>", ngc_args[i]);
- printf("\n");
+ int i;
+
+ printf("Usage: /etc/init/service");
+ for (i = 0; ngc_args[i]; i++)
+ printf(" <%s>", ngc_args[i]);
+ printf("\n");
}
/* here is main */
int main(int argc, char *argv[])
{
- char path[1025]; /* the argv[0] is not always the full path, so we make a full path and put in here */
- char script[1024]; /* plenty of space for the bash script header we crate to execute. */
- char *new_argv[24]; /* used for execve, 24 arguments is really enoght */
- char *servname; /* local storage of the service name, cut from / pointing in path abow */
- struct stat st; /* file stat storage, used to check that files exist */
+ char path[1025]; /* the argv[0] is not always the full path, so we make a full path and put in here */
+ char script[1024]; /* plenty of space for the bash script header we crate to execute. */
+ char *new_argv[24]; /* used for execve, 24 arguments is really enoght */
+ char *servname; /* local storage of the service name, cut from / pointing in path abow */
+ struct stat st; /* file stat storage, used to check that files exist */
/* check to no of arguments */
if (argc != 3)
@@ -88,21 +90,22 @@
}
/* check that path is correct */
- if(stat(path, &st)!=0 || !S_ISREG(st.st_mode))
+ if (stat(path, &st) != 0 || !S_ISREG(st.st_mode))
{
printf("Full path not provided, Guessed path to \"%s\" but no file existed in that place.\n", path);
print_usage();
exit(2);
}
-
+
/* cut service name from the last '/' found in service path */
servname = strrchr(path, '/') + 1;
-
+
/* check if command shud forward to a ngc command */
{
int i;
- for(i=0; ngc_args[i]; i++)
+
+ for (i = 0; ngc_args[i]; i++)
{
/* check if these are direct commands, then use ngc */
@@ -112,13 +115,13 @@
new_argv[0] = strdup("/sbin/ngc");
/* put new_argv = "--start" */
new_argv[1] = calloc(strlen(ngc_args[i] + 4), sizeof(char));
- new_argv[1][0]='-';
- new_argv[1][1]='-';
+ new_argv[1][0] = '-';
+ new_argv[1][1] = '-';
strcat(new_argv[1], ngc_args[i]);
/* put service name */
new_argv[2] = strdup(servname);
new_argv[3] = NULL;
-
+
/* execute this call */
execve(new_argv[0], new_argv, environ);
printf("/sbin/ngc is missing or invalid.\n");
More information about the Initng-svn
mailing list