From 691ac3d8c5f892b8d423c8855d55fecf24abd1ae Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 6 Jun 2011 11:48:11 -0700 Subject: [PATCH] process: Let process_run_capture() caller set maximum capture size. 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 55092f503..3d6c11ae2 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 94549f7c8..9c4556b79 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 973b098b2..dbb083292 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)); -- 2.43.0