[ovs-dev] [brcompatd 2/8] process: Let process_run_capture() caller set maximum capture size.
Ben Pfaff
blp at nicira.com
Mon Jun 6 19:41:43 UTC 2011
An upcoming patch needs a larger value.
---
lib/process.c | 18 ++++++++++--------
lib/process.h | 5 ++---
vswitchd/ovs-brcompatd.c | 3 ++-
3 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/lib/process.c b/lib/process.c
index 55092f5..3d6c11a 100644
--- a/lib/process.c
+++ b/lib/process.c
@@ -403,13 +403,15 @@ process_search_path(const char *name)
/* process_run_capture() and supporting functions. */
struct stream {
+ size_t max_size;
struct ds log;
int fds[2];
};
static int
-stream_open(struct stream *s)
+stream_open(struct stream *s, size_t max_size)
{
+ s->max_size = max_size;
ds_init(&s->log);
if (pipe(s->fds)) {
VLOG_WARN("failed to create pipe: %s", strerror(errno));
@@ -443,9 +445,9 @@ stream_read(struct stream *s)
}
break;
}
- } else if (s->log.length > PROCESS_MAX_CAPTURE) {
- VLOG_WARN("subprocess output overflowed %d-byte buffer",
- PROCESS_MAX_CAPTURE);
+ } else if (s->log.length > s->max_size) {
+ VLOG_WARN("subprocess output overflowed %zu-byte buffer",
+ s->max_size);
break;
}
}
@@ -480,7 +482,7 @@ stream_close(struct stream *s)
* '*status'.
*
* If 'stdout_log' is nonnull, then the subprocess's output to stdout (up to a
- * limit of PROCESS_MAX_CAPTURE bytes) is captured in a memory buffer, which
+ * limit of 'log_max' bytes) is captured in a memory buffer, which
* when this function returns 0 is stored as a null-terminated string in
* '*stdout_log'. The caller is responsible for freeing '*stdout_log' (by
* passing it to free()). When this function returns an error, '*stdout_log'
@@ -490,7 +492,7 @@ stream_close(struct stream *s)
* that it captures the subprocess's output to stderr. */
int
process_run_capture(char **argv, char **stdout_log, char **stderr_log,
- int *status)
+ size_t max_log, int *status)
{
struct stream s_stdout, s_stderr;
sigset_t oldsigs;
@@ -510,12 +512,12 @@ process_run_capture(char **argv, char **stdout_log, char **stderr_log,
return error;
}
- error = stream_open(&s_stdout);
+ error = stream_open(&s_stdout, max_log);
if (error) {
return error;
}
- error = stream_open(&s_stderr);
+ error = stream_open(&s_stderr, max_log);
if (error) {
stream_close(&s_stdout);
return error;
diff --git a/lib/process.h b/lib/process.h
index 94549f7..9c4556b 100644
--- a/lib/process.h
+++ b/lib/process.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -45,8 +45,7 @@ void process_wait(struct process *);
char *process_search_path(const char *);
-#define PROCESS_MAX_CAPTURE 65536
int process_run_capture(char **argv, char **stdout_log, char **stderr_log,
- int *status);
+ size_t max_log, int *status);
#endif /* process.h */
diff --git a/vswitchd/ovs-brcompatd.c b/vswitchd/ovs-brcompatd.c
index 973b098..dbb0832 100644
--- a/vswitchd/ovs-brcompatd.c
+++ b/vswitchd/ovs-brcompatd.c
@@ -200,7 +200,8 @@ execute_appctl_command(const char *unixctl_command, char **output)
argv[3] = NULL;
/* Run process and log status. */
- error = process_run_capture(argv, &stdout_log, &stderr_log, &status);
+ error = process_run_capture(argv, &stdout_log, &stderr_log, 65536,
+ &status);
if (error) {
VLOG_ERR("failed to execute %s command via ovs-appctl: %s",
unixctl_command, strerror(error));
--
1.7.4.4
More information about the dev
mailing list