[Initng-svn] r1986 - initng/tools

svn at initng.thinktux.net svn at initng.thinktux.net
Tue Nov 8 00:23:12 CET 2005


Author: SaTaN0r1
Date: Tue Nov  8 00:23:12 2005
New Revision: 1986

Modified:
   initng/tools/install_service.c
Log:
now install_service will now honor multi-line default paths

Modified: initng/tools/install_service.c
==============================================================================
--- initng/tools/install_service.c	(original)
+++ initng/tools/install_service.c	Tue Nov  8 00:23:12 2005
@@ -53,6 +53,8 @@
 };
 
 static char* at_default_path = NULL;
+#define MAX_AT_DEF_PATHS 100
+static char* at_default_paths[MAX_AT_DEF_PATHS] = {NULL};
 
 /* this program will parse all .i files in installation
    setting distribution dependent values on install time */
@@ -131,7 +133,7 @@
     }
 }
 
-static void parse_phrase(FILE * stream, const char *fullphrase)
+static int parse_phrase(FILE * stream, const char *fullphrase, int def_path_no)
 {
 #define FILENAME_LEN 1000
     char filename[FILENAME_LEN];
@@ -142,11 +144,11 @@
     if (!*fullphrase)
     {
         fputc('@', stream);
-        return;
+        return 0; /* @@ => @ translation, no looping required */
     }
 
-    if (!path)
-        return;
+/*    if (!path)
+        return; */
     if (! (phrase = strrchr(fullphrase, '/')) )
         phrase = fullphrase;
     else
@@ -168,7 +170,7 @@
         if (is_exec(filename))
         {
             fputs(filename, stream);
-            return;
+            return 0; /* found filename in Path => no looping req'd */
         }
         if (!*tmp)
         {
@@ -182,7 +184,7 @@
                 if (is_exec(filename))
                 {
                     fputs(filename, stream);
-                    return;
+                    return 0; /* found filename in Path => no looping req'd */
                 }
                 i++;
             }
@@ -192,32 +194,40 @@
 	    {
                 fprintf(stderr, "using full path \"%s\"\n", fullphrase);
 		fputs(fullphrase, stream);
+		/* return 0;  full path specified => no looping req'd */
 	    }
 	    else if (at_default_path)
 	    {
-                fprintf(stderr, "using supplied default path \"%s%s\"\n", 
-                    at_default_path, phrase);
-		fputs(at_default_path, stream);
+                tmp = at_default_paths[def_path_no];
+                fprintf(stderr, "using supplied default path \"%s\"\n", 
+                    tmp);
+		fputs(tmp, stream);
+		if (tmp[strlen(tmp) - 1] != '/')
+                    fputc('/', stream);
 		fputs(phrase, stream);
+		if (at_default_paths[def_path_no + 1])
+                    return 1; /* next default path exits, so looping is required*/
+		/* return 0 */
 	    }
 	    else /* at_default_path == NULL && fullphrase == phrase */
 	    {
-                fprintf(stderr, "using builtin default path \"/usr/sbin/%s\"\n",
-                    phrase);
+                fprintf(stderr, "using builtin default path \"/usr/sbin/\"\n");
 		fputs("/usr/sbin/", stream);
 		fputs(phrase, stream);
+		/* no default path(s) so no looping */
 	    }
             /* exit(1) ??? */
-            return;
+            return 0;
         }
     }
 }
 
-static void print_it(FILE * stream, const char *buf)
+static int print_line(FILE * stream, const char *buf, int def_path_no)
 {
     const char *tmp;
     const char *phrase;
     int i = 0;
+    int retval = 0;
 
 #define PHRASE_LEN 1000
     char phrase_name[PHRASE_LEN];
@@ -228,7 +238,7 @@
         if (!(phrase = find_at_phrases(buf)))
         {
             fputs(buf, stream);
-            return;
+            return retval;
         }
 
         /* write all chars up to the beginning '@' thingie to stream */
@@ -243,12 +253,40 @@
         }
         phrase_name[i] = '\0';
         /* pasrse Phrase */
-        parse_phrase(stream, phrase_name);
+        retval |= parse_phrase(stream, phrase_name, def_path_no);
         /* re-adjust output buffer */
         buf = tmp + 1;
     }
 }
 
+#define do_print_line(STREAM, BUF) for(i = 0; print_line(STREAM, BUF, i); i++)
+
+static void print_it(FILE * stream, const char *buf)
+{
+    char *line, *tmp;
+    int i;
+    D_("print_it: Got block \"%s\"\n", buf);
+    while (1)
+    {
+        tmp = strchr(buf, '\n') + 1;
+	if (!tmp)
+	{
+            do_print_line(stream, buf);
+	    return;
+	}
+	else
+	{
+	    line = strndup(buf, tmp - buf);
+	    buf = tmp;
+	    D_("print_it: Got line \"%s\"\n", line);
+            do_print_line(stream, line);
+	    free(line);
+	}
+	if (! *buf)
+            return;
+    }
+}
+
 static char *do_exec(char *data, int length)
 {
     int pipe_fork[2], inpipe_fork[2];
@@ -299,11 +337,12 @@
         fcntl(inpipe_fork[0], F_SETFL, fd_flags | O_NONBLOCK);
         close(inpipe_fork[1]);
         D_("Reading data from fork\n");
-        datalen = read(inpipe_fork[0], return_data, 1024);
+        datalen = read(inpipe_fork[0], return_data, 1023);
         close(inpipe_fork[0]);
         if (datalen > 0)
         {
             D_("Read %d bytes: \"%s\"\n", datalen, return_data);
+	    return_data[datalen] = '\0';
             return return_data;
         }
         printf("Did not got any data from #exec statement!\n");
@@ -367,6 +406,7 @@
     const char *infile = NULL;
     const char *outfile = NULL;
     const char *data;
+    char* tmp;
 
 #define LINE_LEN 1000
     char line[LINE_LEN];
@@ -384,6 +424,12 @@
     int distro_len = -1;
 
     path = getenv("PATH");
+
+    if (! path)
+    {
+        fprintf(stderr, "ERROR: could not get $PATH\n");
+	exit(1);
+    }
     /* check cmdline for set distribution */
     while (argv[i])
     {
@@ -459,6 +505,39 @@
         fgets(line, LINE_LEN, in);
         if (feof(in))
             break;
+        if (MATCH("#atdefpath", line))
+        {
+            //char* tmp;
+            D_("found #atdefpath. updating at default path\n");
+            data = skip_spaces(line + LEN("#atdefpath"));
+            if (at_default_path)
+                free(at_default_path);
+            at_default_path = malloc(strlen(data) + 1);
+            i = 0;
+            while (data[i] && data[i] != ' ' && data[i] != '\t' && data[i] != '\n')
+            {
+                at_default_path[i] = data[i];
+                i++;
+            }
+/*            if (at_default_path[i - 1] != '/')
+               at_default_path[i++] = '/'; */
+            at_default_path[i] = '\0';
+            D_("at_default_path updated to %s\n", at_default_path);
+	    at_default_paths[0] = at_default_path;
+
+	    i = 0;
+	    while ( (tmp = strchr(at_default_paths[i], ':')) )
+	    {
+                *tmp = '\0';
+		i++;
+		at_default_paths[i] = tmp + 1;
+		if (i == MAX_AT_DEF_PATHS - 1)
+                    break; /* inner loop */
+	    }
+	    at_default_paths[i + 1] = NULL;
+            continue;
+	}
+
         if (!in_block && line[0] != '#')
         {
             print_it(out, line);
@@ -490,25 +569,6 @@
                 }
                 continue;
             }
-            else if (MATCH("#atdefpath", line))
-            {
-                D_("found #atdefpath. updating at default path\n");
-                data = skip_spaces(line + LEN("#atdefpath"));
-		if (at_default_path)
-                    free(at_default_path);
-		at_default_path = malloc(strlen(data) + 1);
-		i = 0;
-		while (data[i] && data[i] != ' ' && data[i] != '\t' && data[i] != '\n')
-		{
-                    at_default_path[i] = data[i];
-		    i++;
-		}
-		if (at_default_path[i - 1] != '/')
-                    at_default_path[i++] = '/';
-		at_default_path[i] = '\0';
-		D_("at_default_path updated to %s\n", at_default_path);
-		continue;
-	    }
             else
             {
                 /* line started with a '#', but we are not in_block, and the line was neither 


More information about the Initng-svn mailing list