[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