diff options
author | Werner Fink <werner@suse.de> | 2018-01-18 11:06:55 +0100 |
---|---|---|
committer | Craig Small <csmall@enc.com.au> | 2018-03-01 21:39:46 +1100 |
commit | 1ca49b93d225fe91576d2f37306317f0c7d2abed (patch) | |
tree | 83674986644fb7a8bcded5c8d41e09b2a15e7115 /sysctl.c | |
parent | 96f61a27b755cf0cd7ec518aeaed3dfe40bfde43 (diff) | |
download | procps-ng-1ca49b93d225fe91576d2f37306317f0c7d2abed.tar.gz |
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>
Diffstat (limited to 'sysctl.c')
-rw-r--r-- | sysctl.c | 31 |
1 files changed, 24 insertions, 7 deletions
@@ -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)) { + while ((rlen = getline(&oneline, &blen, fp)) != -1) { + size_t offset; + n++; - t = StripLeadingAndTrailingSpaces(oneline); + 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; } |