aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBernd Eckenfels <net-tools@lina.inka.de>2007-12-01 18:44:56 +0000
committerBernd Eckenfels <net-tools@lina.inka.de>2007-12-01 18:44:56 +0000
commit20f0f8e12f4b638bedc67b30a5d35162b42f4abc (patch)
tree9572c5293acfba32f6a87b1f4a00e1ffe6c5a4bb /lib
parentBetter netstat -s error handling and larger buffers (diff)
downloadnet-tools-20f0f8e12f4b638bedc67b30a5d35162b42f4abc.tar.gz
net-tools-20f0f8e12f4b638bedc67b30a5d35162b42f4abc.tar.bz2
net-tools-20f0f8e12f4b638bedc67b30a5d35162b42f4abc.zip
Faster pagesize aligned fopen for netstat -s (Eric Dumazet)
Diffstat (limited to 'lib')
-rw-r--r--lib/proc.c22
-rw-r--r--lib/proc.h8
2 files changed, 26 insertions, 4 deletions
diff --git a/lib/proc.c b/lib/proc.c
index bf34dbe..9cd4eeb 100644
--- a/lib/proc.c
+++ b/lib/proc.c
@@ -1,11 +1,12 @@
/* Tolerant /proc file parser. Copyright 1998 Andi Kleen */
-/* $Id: proc.c,v 1.4 1999/01/05 20:54:00 philip Exp $ */
+/* $Id: proc.c,v 1.5 2007/12/01 18:44:57 ecki Exp $ */
/* Fixme: cannot currently cope with removed fields */
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <ctype.h>
+#include <unistd.h>
/* Caller must free return string. */
@@ -72,3 +73,22 @@ int proc_guess_fmt(char *name, FILE *fh, ...)
va_end(ap);
return flag;
}
+
+
+FILE *proc_fopen(const char *name)
+{
+ static char *buffer;
+ static size_t pagesz;
+ FILE *fd = fopen(name, "r");
+
+ if (fd == NULL)
+ return NULL;
+
+ if (!buffer) {
+ pagesz = getpagesize();
+ buffer = malloc(pagesz);
+ }
+
+ setvbuf(fd, buffer, _IOFBF, pagesz);
+ return fd;
+}
diff --git a/lib/proc.h b/lib/proc.h
index 91f803c..0f4ed93 100644
--- a/lib/proc.h
+++ b/lib/proc.h
@@ -1,5 +1,7 @@
-
-
-/* Generate a suitable scanf format for a column title line */
+/*
+ * prototypes for proc.c
+ */
char *proc_gen_fmt(char *name, int more, FILE * fh,...);
int proc_guess_fmt(char *name, FILE* fh,...);
+FILE *proc_fopen(const char *name);
+