From 56da2a1c9b6361e302b7a39fe2740561a9012d88 Mon Sep 17 00:00:00 2001 From: Chris Hall Date: Thu, 21 Jul 2011 19:53:02 +0100 Subject: Update pipework and improve memory reporting. Improve error handling for all new pipework inputs and outputs. Change behaviour of ^C from VTY Terminal, so that will interrupt output and terminate all running pipes -- including running shell commands. In pipe commands, recognise "~/..." and "~user/..." home directory forms. Changed "~/" to mean the usual home for the current user. "~~/" now means the configuration file directory. Introduced "shdir DIR" command to show what is (currently) what. Changed "<|" so that if the command has a path, it is expanded using Quagga's rules (including "~~/" and "~./") and the "here" directory is set to that path. Fixed collection of stderr output from all pipes so that is separate from stdout output, and is always sent to the base output (eg VTY Terminal). Increase amount of information about the heap that "show mem" shows -- particularly if the "memory_tracker" is enabled. Tested and applied resulting fixes. --- lib/qlib_init.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 5 deletions(-) (limited to 'lib/qlib_init.c') diff --git a/lib/qlib_init.c b/lib/qlib_init.c index 757a9e65..1d641e26 100644 --- a/lib/qlib_init.c +++ b/lib/qlib_init.c @@ -19,6 +19,10 @@ * Boston, MA 02111-1307, USA. */ #include "misc.h" + +#include +#include + #include "qlib_init.h" #include "zassert.h" #include "memory.h" @@ -30,6 +34,7 @@ #include "mqueue.h" #include "pthread_safe.h" #include "log_local.h" +#include "qiovec.h" /*============================================================================== * Quagga Library Initialise/Closedown @@ -44,6 +49,8 @@ * * this is expected to be called before the program does anything at all. * + * Collects a small number of useful system parameters -- see below. + * * This performs all initialisation required to support asserts, logging, * basic I/O (but not the remote console), trap signals... and so on. * @@ -57,21 +64,82 @@ * This performs all initialisation required to support socket I/O, * thread handling, timers, and so on. * - * In particular, at this stage the system is set into Pthread Mode, if - * required. No pthreads may be started before this. Up to this point - * the system operates in non-Pthread Mode -- all mutexes are implicitly - * free. + * NB: at this stage the system is set into pthread mode, if required. + * + * No pthreads may be started before this. Up to this point + * the system operates in non-pthread mode -- all mutexes are + * implicitly free. * * There is one stage of closedown. This is expected to be called last, and * is passed the exit code. * + *============================================================================== + * System parameters: * + * iov_max -- _SC_IOV_MAX + * + * open_max -- _SC_OPEN_MAX */ +int qlib_iov_max ; +int qlib_open_max ; +int qlib_pagesize ; + +struct +{ + int* p_var ; + int sc ; + const char* name ; + long min ; + long max ; +} qlib_vars[] = +{ + { .p_var = &qlib_iov_max, .sc = _SC_IOV_MAX, .name = "_SC_IOV_MAX", + .min = 16, .max = INT_MAX }, + { .p_var = &qlib_open_max, .sc = _SC_OPEN_MAX, .name = "_SC_OPEN_MAX", + .min = 256, .max = INT_MAX }, + { .p_var = &qlib_pagesize, .sc = _SC_PAGESIZE, .name = "_SC_PAGESIZE", + .min = 256, .max = (INT_MAX >> 1) + 1 }, + { .p_var = NULL } +} ; + extern void qlib_init_first_stage(void) { + int i ; + + for (i = 0 ; qlib_vars[i].p_var != NULL ; ++i) + { + long val ; + + errno = 0 ; + val = sysconf(qlib_vars[i].sc) ; + + if (val == -1) + { + if (errno == 0) + val = INT_MAX ; + else + { + fprintf(stderr, "Failed to sysconf(%s): %s\n", + qlib_vars[i].name, errtoa(errno, 0).str) ; + exit(1) ; + } ; + } ; + + if ((val < qlib_vars[i].min) || (val > qlib_vars[i].max)) + { + fprintf(stderr, "sysconf(%s) = %ld: which is < %ld or > %ld\n", + qlib_vars[i].name, val, qlib_vars[i].min, qlib_vars[i].max) ; + exit(1) ; + } ; + + *(qlib_vars[i].p_var) = (int)val ; + } ; + qps_start_up() ; + memory_start() ; + qiovec_start_up() ; } extern void @@ -87,7 +155,6 @@ qlib_init_second_stage(bool pthreads) safe_init_r(); } - extern void qexit(int exit_code) { -- cgit v1.2.3