X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fprocess.c;h=9f5c35f2489198e52ec2bcd3aa40fca5c76f9184;hb=c0d95206c068d95460a068defd76274e73225a4a;hp=f772833d818ba694812d5e55fd8ed25c15893af7;hpb=b725cf028c85d0ebafcf55e503d332bb96fb708c;p=sliver-openvswitch.git diff --git a/lib/process.c b/lib/process.c index f772833d8..9f5c35f24 100644 --- a/lib/process.c +++ b/lib/process.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -82,20 +82,14 @@ process_init(void) inited = true; /* Create notification pipe. */ - if (pipe(fds)) { - ovs_fatal(errno, "could not create pipe"); - } - set_nonblocking(fds[0]); - set_nonblocking(fds[1]); + xpipe_nonblocking(fds); /* Set up child termination signal handler. */ memset(&sa, 0, sizeof sa); sa.sa_handler = sigchld_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_NOCLDSTOP | SA_RESTART; - if (sigaction(SIGCHLD, &sa, NULL)) { - ovs_fatal(errno, "sigaction(SIGCHLD) failed"); - } + xsigaction(SIGCHLD, &sa, NULL); } char * @@ -407,13 +401,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)); @@ -447,9 +443,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; } } @@ -484,7 +480,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' @@ -494,7 +490,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; @@ -514,12 +510,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; @@ -638,9 +634,8 @@ static bool sigchld_is_blocked(void) { sigset_t sigs; - if (sigprocmask(SIG_SETMASK, NULL, &sigs)) { - ovs_fatal(errno, "sigprocmask"); - } + + xsigprocmask(SIG_SETMASK, NULL, &sigs); return sigismember(&sigs, SIGCHLD); } @@ -648,17 +643,14 @@ static void block_sigchld(sigset_t *oldsigs) { sigset_t sigchld; + sigemptyset(&sigchld); sigaddset(&sigchld, SIGCHLD); - if (sigprocmask(SIG_BLOCK, &sigchld, oldsigs)) { - ovs_fatal(errno, "sigprocmask"); - } + xsigprocmask(SIG_BLOCK, &sigchld, oldsigs); } static void unblock_sigchld(const sigset_t *oldsigs) { - if (sigprocmask(SIG_SETMASK, oldsigs, NULL)) { - ovs_fatal(errno, "sigprocmask"); - } + xsigprocmask(SIG_SETMASK, oldsigs, NULL); }