process: Let process_run_capture() caller set maximum capture size.
authorBen Pfaff <blp@nicira.com>
Mon, 6 Jun 2011 18:48:11 +0000 (11:48 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 8 Jun 2011 00:05:42 +0000 (17:05 -0700)
An upcoming patch needs a larger value.

lib/process.c
lib/process.h
vswitchd/ovs-brcompatd.c

index 55092f503653bd6261dbfe1d6ea66a2812a3ea85..3d6c11ae2018079d00096978d2b3b97df6b3b5a6 100644 (file)
@@ -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;
index 94549f7c8498780f1bbc24df880a2ed5088fa085..9c4556b79a5f3cc4cd27977caf495eddd460d95e 100644 (file)
@@ -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 */
index 973b098b2f1e43303964d28f146e5be0f18f9450..dbb083292959a4a866bebae67a0de9964b00f0c0 100644 (file)
@@ -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));