diff options
author | Bernd Eckenfels <net-tools@lina.inka.de> | 2007-12-01 18:44:56 +0000 |
---|---|---|
committer | Bernd Eckenfels <net-tools@lina.inka.de> | 2007-12-01 18:44:56 +0000 |
commit | 20f0f8e12f4b638bedc67b30a5d35162b42f4abc (patch) | |
tree | 9572c5293acfba32f6a87b1f4a00e1ffe6c5a4bb /lib | |
parent | Better netstat -s error handling and larger buffers (diff) | |
download | net-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.c | 22 | ||||
-rw-r--r-- | lib/proc.h | 8 |
2 files changed, 26 insertions, 4 deletions
@@ -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; +} @@ -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); + |