]> granicus.if.org Git - procps-ng/commitdiff
Increase standard I/O buffer a lot to be able to
authorWerner Fink <werner@suse.de>
Fri, 7 Jul 2017 12:09:11 +0000 (14:09 +0200)
committerCraig Small <csmall@enc.com.au>
Sat, 19 Aug 2017 23:22:41 +0000 (09:22 +1000)
read huge informations at once as otherwise all files below
/proc/sys, not using the seq_file API at the kernel side,
will return EOF on a second read.

Signed-off-by: Werner Fink <werner@suse.de>
sysctl.c

index 5353511bf0467b215849ec004eca201b5420390b..cb45ed81d2f976f3f4f1d1b525143b4028f7b5bb 100644 (file)
--- a/sysctl.c
+++ b/sysctl.c
@@ -156,6 +156,8 @@ static char *StripLeadingAndTrailingSpaces(char *oneline)
 /*
  * Read a sysctl setting
  */
+#define IOBUFSIZ    (128<<10)
+static char *iobuf;
 static int ReadSetting(const char *restrict const name)
 {
        int rc = 0;
@@ -218,6 +220,9 @@ static int ReadSetting(const char *restrict const name)
 
        fp = fopen(tmpname, "r");
 
+       if (iobuf)
+               setvbuf(fp, iobuf, _IOFBF, IOBUFSIZ);
+
        if (!fp) {
                switch (errno) {
                case ENOENT:
@@ -428,6 +433,9 @@ static int WriteSetting(const char *setting)
 
        fp = fopen(tmpname, "w");
 
+       if (iobuf)
+               setvbuf(fp, iobuf, _IOFBF, IOBUFSIZ);
+
        if (!fp) {
                switch (errno) {
                case ENOENT:
@@ -791,6 +799,8 @@ int main(int argc, char *argv[])
        argc -= optind;
        argv += optind;
 
+       iobuf = (char*)malloc(IOBUFSIZ);        /* Allow to fail */
+
        if (DisplayAllOpt)
                return DisplayAll(PROC_PATH);