summaryrefslogtreecommitdiff
path: root/sysctl.c
diff options
context:
space:
mode:
authorWerner Fink <werner@suse.de>2018-01-18 11:06:55 +0100
committerCraig Small <csmall@enc.com.au>2018-03-01 21:39:46 +1100
commit1ca49b93d225fe91576d2f37306317f0c7d2abed (patch)
tree83674986644fb7a8bcded5c8d41e09b2a15e7115 /sysctl.c
parent96f61a27b755cf0cd7ec518aeaed3dfe40bfde43 (diff)
downloadprocps-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.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/sysctl.c b/sysctl.c
index 9356910..54988a5 100644
--- a/sysctl.c
+++ b/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)) {
+ 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;
}