Preload sysctl lines even if longer than stdio buffer
by using getline(3) to use a dynamically increased buffer if required by the input found in sysctl configuration files. Signed-off-by: Werner Fink <werner@suse.de>
This commit is contained in:
parent
96f61a27b7
commit
1ca49b93d2
33
sysctl.c
33
sysctl.c
@ -509,18 +509,21 @@ static int pattern_match(const char *string, const char *pat)
|
||||
*/
|
||||
static int Preload(const char *restrict const filename)
|
||||
{
|
||||
char oneline[LINELEN];
|
||||
char buffer[LINELEN];
|
||||
char *oneline;
|
||||
FILE *fp;
|
||||
char *t;
|
||||
int n = 0;
|
||||
int rc = 0;
|
||||
size_t blen = LINELEN;
|
||||
ssize_t rlen;
|
||||
char *name, *value;
|
||||
glob_t globbuf;
|
||||
int globerr;
|
||||
int globflg;
|
||||
int j;
|
||||
|
||||
oneline = xmalloc(blen);
|
||||
|
||||
globflg = GLOB_NOCHECK;
|
||||
#ifdef GLOB_BRACE
|
||||
globflg |= GLOB_BRACE;
|
||||
@ -542,13 +545,19 @@ static int Preload(const char *restrict const filename)
|
||||
? stdin : fopen(globbuf.gl_pathv[j], "r");
|
||||
if (!fp) {
|
||||
xwarn(_("cannot open \"%s\""), globbuf.gl_pathv[j]);
|
||||
return -1;
|
||||
rc = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
while (fgets(oneline, sizeof oneline, fp)) {
|
||||
n++;
|
||||
t = StripLeadingAndTrailingSpaces(oneline);
|
||||
while ((rlen = getline(&oneline, &blen, fp)) != -1) {
|
||||
size_t offset;
|
||||
|
||||
n++;
|
||||
|
||||
if (rlen < 2)
|
||||
continue;
|
||||
|
||||
t = StripLeadingAndTrailingSpaces(oneline);
|
||||
if (strlen(t) < 2)
|
||||
continue;
|
||||
|
||||
@ -567,6 +576,10 @@ static int Preload(const char *restrict const filename)
|
||||
if (pattern && !pattern_match(name, pattern))
|
||||
continue;
|
||||
|
||||
offset = strlen(name);
|
||||
memmove(&oneline[0], name, offset);
|
||||
oneline[offset++] = '=';
|
||||
|
||||
value = strtok(NULL, "\n\r");
|
||||
if (!value || !*value) {
|
||||
xwarnx(_("%s(%d): invalid syntax, continuing..."),
|
||||
@ -578,12 +591,16 @@ static int Preload(const char *restrict const filename)
|
||||
value++;
|
||||
|
||||
/* should NameOnly affect this? */
|
||||
sprintf(buffer, "%s=%s", name, value);
|
||||
rc |= WriteSetting(buffer);
|
||||
memmove(&oneline[offset], value, strlen(value));
|
||||
offset += strlen(value);
|
||||
oneline[offset] = '\0';
|
||||
|
||||
rc |= WriteSetting(oneline);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user