summaryrefslogtreecommitdiff
path: root/src/librc/librc-misc.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2008-01-06 19:52:43 +0000
committerRoy Marples <roy@marples.name>2008-01-06 19:52:43 +0000
commitb1540cba5b88a1ef625b66990af66fbb6aa15e62 (patch)
tree8c4d960d90e10464472b8105219fe9e7b8901800 /src/librc/librc-misc.c
parent8afb86a5deb7187e87f35a62959e3944348eb0d9 (diff)
downloadopenrc-b1540cba5b88a1ef625b66990af66fbb6aa15e62.tar.gz
openrc-b1540cba5b88a1ef625b66990af66fbb6aa15e62.tar.bz2
openrc-b1540cba5b88a1ef625b66990af66fbb6aa15e62.tar.xz
Use a dynamically expanding buffer for reading config files.
Diffstat (limited to 'src/librc/librc-misc.c')
-rw-r--r--src/librc/librc-misc.c144
1 files changed, 72 insertions, 72 deletions
diff --git a/src/librc/librc-misc.c b/src/librc/librc-misc.c
index dcecc29..b8f5993 100644
--- a/src/librc/librc-misc.c
+++ b/src/librc/librc-misc.c
@@ -105,73 +105,109 @@ char *rc_strcatpaths (const char *path1, const char *paths, ...)
}
librc_hidden_def(rc_strcatpaths)
-
-char **rc_config_load (const char *file)
+char **rc_config_list (const char *file)
{
- char **list = NULL;
FILE *fp;
char *buffer;
char *p;
char *token;
- char *line;
- char *linep;
- char *linetok;
- int i = 0;
- bool replaced;
- char *entry;
- char *newline;
+ char **list = NULL;
+ size_t buflen = BUFSIZ;
+ size_t last;
- if (! (fp = fopen (file, "r")))
+ if (! (fp = fopen (file, "r")))
return (NULL);
- buffer = xmalloc (sizeof (char) * RC_LINEBUFFER);
- while (fgets (buffer, RC_LINEBUFFER, fp)) {
- p = buffer;
+ buffer = xmalloc (sizeof (char) * buflen);
+ buffer[buflen - 1] = '\0';
+ while (fgets (buffer, buflen, fp)) {
+ /* Increase the buffer to read the rest of the line if needed */
+ last = strlen (buffer) - 1;
+ while (! feof (fp) && buffer[last] != '\n') {
+ buflen += BUFSIZ;
+ buffer = xrealloc (buffer, sizeof (char *) * buflen);
+ fgets (buffer + last, BUFSIZ, fp);
+ last = strlen (buffer) - 1;
+ }
/* Strip leading spaces/tabs */
+ p = buffer;
while ((*p == ' ') || (*p == '\t'))
p++;
- if (! p || strlen (p) < 3 || p[0] == '#')
- continue;
+ /* Get entry - we do not want comments */
+ token = strsep (&p, "#");
+ if (token && (strlen (token) > 1)) {
+ /* Stip the newline if present */
+ if (token[strlen (token) - 1] == '\n')
+ token[strlen (token) - 1] = 0;
- /* Get entry */
- token = strsep (&p, "=");
+ rc_strlist_add (&list, token);
+ }
+ }
+ free (buffer);
+ fclose (fp);
+
+ return (list);
+}
+librc_hidden_def(rc_config_list)
- if (! token)
+char **rc_config_load (const char *file)
+{
+ char **list = NULL;
+ char **config = NULL;
+ char *token;
+ char *line;
+ char *linep;
+ char *linetok;
+ int i = 0;
+ int j;
+ bool replaced;
+ char *entry;
+ char *newline;
+
+ list = rc_config_list (file);
+ STRLIST_FOREACH (list, line, j) {
+ /* Get entry */
+ if (! (token = strsep (&line, "=")))
continue;
entry = xstrdup (token);
-
/* Preserve shell coloring */
- if (*p == '$')
- token = p;
+ if (*line == '$')
+ token = line;
else
do {
/* Bash variables are usually quoted */
- token = strsep (&p, "\"\'");
+ token = strsep (&line, "\"\'");
} while ((token) && (strlen (token) == 0));
/* Drop a newline if that's all we have */
- i = strlen (token) - 1;
- if (token[i] == 10)
- token[i] = 0;
-
- i = strlen (entry) + strlen (token) + 2;
- newline = xmalloc (i);
- snprintf (newline, i, "%s=%s", entry, token);
+ if (token) {
+ i = strlen (token) - 1;
+ if (token[i] == '\n')
+ token[i] = 0;
+
+ i = strlen (entry) + strlen (token) + 2;
+ newline = xmalloc (sizeof (char) * i);
+ snprintf (newline, i, "%s=%s", entry, token);
+ } else {
+ i = strlen (entry) + 2;
+ newline = xmalloc (sizeof (char) * i);
+ snprintf (newline, i, "%s=", entry);
+ }
replaced = false;
/* In shells the last item takes precedence, so we need to remove
any prior values we may already have */
- STRLIST_FOREACH (list, line, i) {
+ STRLIST_FOREACH (config, line, i) {
char *tmp = xstrdup (line);
linep = tmp;
linetok = strsep (&linep, "=");
if (strcmp (linetok, entry) == 0) {
/* We have a match now - to save time we directly replace it */
- free (list[i - 1]);
- list[i - 1] = newline;
+ free (config[i - 1]);
+ config[i - 1] = newline;
replaced = true;
free (tmp);
break;
@@ -180,15 +216,14 @@ char **rc_config_load (const char *file)
}
if (! replaced) {
- rc_strlist_addsort (&list, newline);
+ rc_strlist_addsort (&config, newline);
free (newline);
}
free (entry);
}
- free (buffer);
- fclose (fp);
+ rc_strlist_free (list);
- return (list);
+ return (config);
}
librc_hidden_def(rc_config_load)
@@ -208,38 +243,3 @@ char *rc_config_value (char **list, const char *entry)
}
librc_hidden_def(rc_config_value)
-char **rc_config_list (const char *file)
-{
- FILE *fp;
- char *buffer;
- char *p;
- char *token;
- char **list = NULL;
-
- if (! (fp = fopen (file, "r")))
- return (NULL);
-
- buffer = xmalloc (sizeof (char) * RC_LINEBUFFER);
- while (fgets (buffer, RC_LINEBUFFER, fp)) {
- p = buffer;
-
- /* Strip leading spaces/tabs */
- while ((*p == ' ') || (*p == '\t'))
- p++;
-
- /* Get entry - we do not want comments */
- token = strsep (&p, "#");
- if (token && (strlen (token) > 1)) {
- /* Stip the newline if present */
- if (token[strlen (token) - 1] == '\n')
- token[strlen (token) - 1] = 0;
-
- rc_strlist_add (&list, token);
- }
- }
- free (buffer);
- fclose (fp);
-
- return (list);
-}
-librc_hidden_def(rc_config_list)