summaryrefslogtreecommitdiffstats
path: root/lib/qiovec.c
diff options
context:
space:
mode:
authorChris Hall <chris.hall@highwayman.com>2011-07-21 19:53:02 +0100
committerChris Hall <chris.hall@highwayman.com>2011-07-21 19:53:02 +0100
commit56da2a1c9b6361e302b7a39fe2740561a9012d88 (patch)
tree6b6543532133a0c618d0f4ec70a87cf3f96caf30 /lib/qiovec.c
parente535bc959729262480a9702e71334002edee3f8c (diff)
downloadquagga-56da2a1c9b6361e302b7a39fe2740561a9012d88.tar.bz2
quagga-56da2a1c9b6361e302b7a39fe2740561a9012d88.tar.xz
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.
Diffstat (limited to 'lib/qiovec.c')
-rw-r--r--lib/qiovec.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/lib/qiovec.c b/lib/qiovec.c
index cc24503e..9492731a 100644
--- a/lib/qiovec.c
+++ b/lib/qiovec.c
@@ -23,23 +23,24 @@
#include <errno.h>
#include "qdebug_nb.h"
+#include "qlib_init.h"
#include "memory.h"
#include "miyagi.h"
#include "qiovec.h"
/*==============================================================================
- * IOV_MAX is defined by POSIX to appear in <limits.h>.
- *
- * This does not appear unless "zconfig.h" is included, first...
- * ...but although it compiles OK, Eclipse cannot see where the value has
- * come from.
+ * We collect the _SC_IOV_MAX very early in the morning, but in any case
+ * only use up to 100 entries -- in order not to let a single operation hog
+ * the cpu.
*/
-#ifdef IOV_MAX /* Stops Eclipse whinging */
-#if IOV_MAX < 64 /* check for a reasonable value */
-#error IOV_MAX < 64
-#endif
-#endif
+static int qiov_max ;
+
+extern void
+qiovec_start_up(void)
+{
+ qiov_max = (qlib_iov_max < 100) ? qlib_iov_max : 100 ;
+}
/*==============================================================================
* Initialise, allocate and reset qiovec
@@ -287,7 +288,7 @@ qiovec_write_nb(int fd, qiovec qiov)
l = iovec_write_nb(fd, (struct iovec*)(&qiov->vec[qiov->i_get]), n) ;
- if (l == 0)
+ if (l <= 0)
{
qiov->writing = false ;
qiov->i_get = qiov->i_put = 0 ;
@@ -342,11 +343,14 @@ iovec_write_nb(int fd, struct iovec p_iov[], int n)
while (n > 0)
{
ssize_t ret ;
+ int m ;
+
+ m = (n < qiov_max) ? n : qiov_max ;
if (qdebug_nb)
- ret = writev_qdebug_nb(fd, p_iov, (n < IOV_MAX ? n : IOV_MAX)) ;
+ ret = writev_qdebug_nb(fd, p_iov, m) ;
else
- ret = writev (fd, p_iov, (n < IOV_MAX ? n : IOV_MAX)) ;
+ ret = writev (fd, p_iov, m) ;
if (ret > 0)
{
@@ -378,7 +382,6 @@ iovec_write_nb(int fd, struct iovec p_iov[], int n)
if ((err == EAGAIN) || (err == EWOULDBLOCK))
break ;
if (err != EINTR)
-// assert(0) ; // Pro tem
return -1 ; /* failed */
} ;
} ;