[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