From: Alexander Turenko <alexander.turenko@tarantool.org> To: Cyrill Gorcunov <gorcunov@gmail.com> Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH 01/13] popen: require popen handle to be non-NULL Date: Fri, 10 Apr 2020 05:50:39 +0300 [thread overview] Message-ID: <0bd904ddc2f18b1a078aac62fcc95485b36edd92.1586486220.git.alexander.turenko@tarantool.org> (raw) In-Reply-To: <cover.1586486219.git.alexander.turenko@tarantool.org> Further commits will add proper entries into the diagnostics area for failures inside popen functions. We should either report handle == NULL case via the diagnostics area or ensure that the NULL handle case is not possible. The latter approach is implemented in this commit. There are two reasons for this: * This way simplifies function contracts (one less kind of failure). * The popen Lua module (that will be implemented in the further commits) will not construct any logic using NULL as a handle. When 'NULL handle' error is not possible in the C API, it will be easier to verify that this failure is not possible the Lua API. A user of the C API should take care to don't call those functions with NULL handle. Part of #4031 --- src/lib/core/popen.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/lib/core/popen.c b/src/lib/core/popen.c index 6b6062215..5f74bc3ce 100644 --- a/src/lib/core/popen.c +++ b/src/lib/core/popen.c @@ -163,13 +163,13 @@ popen_may_io(struct popen_handle *handle, unsigned int idx, } /** - * Test if the handle is not nil and still have - * a living child process. + * Test if the handle still have a living child process. */ static inline bool popen_may_pidop(struct popen_handle *handle) { - if (!handle || handle->pid == -1) { + assert(handle != NULL); + if (handle->pid == -1) { errno = ESRCH; return false; } @@ -182,10 +182,7 @@ popen_may_pidop(struct popen_handle *handle) int popen_stat(struct popen_handle *handle, struct popen_stat *st) { - if (!handle) { - errno = ESRCH; - return -1; - } + assert(handle != NULL); st->pid = handle->pid; st->flags = handle->flags; @@ -204,11 +201,7 @@ popen_stat(struct popen_handle *handle, struct popen_stat *st) const char * popen_command(struct popen_handle *handle) { - if (!handle) { - errno = ESRCH; - return NULL; - } - + assert(handle != NULL); return (const char *)handle->command; } @@ -236,6 +229,8 @@ popen_write_timeout(struct popen_handle *handle, void *buf, size_t count, unsigned int flags, ev_tstamp timeout) { + assert(handle != NULL); + int idx = STDIN_FILENO; if (!(flags & POPEN_FLAG_FD_STDIN)) { @@ -268,6 +263,8 @@ popen_read_timeout(struct popen_handle *handle, void *buf, size_t count, unsigned int flags, ev_tstamp timeout) { + assert(handle != NULL); + int idx = flags & POPEN_FLAG_FD_STDOUT ? STDOUT_FILENO : STDERR_FILENO; @@ -380,10 +377,7 @@ popen_sigchld_handler(EV_P_ ev_child *w, int revents) int popen_state(struct popen_handle *handle, int *state, int *exit_code) { - if (!handle) { - errno = ESRCH; - return -1; - } + assert(handle != NULL); if (handle->pid != -1) { *state = POPEN_STATE_ALIVE; @@ -437,6 +431,8 @@ popen_send_signal(struct popen_handle *handle, int signo) { int ret; + assert(handle != NULL); + /* * A child may be killed or exited already. */ @@ -464,10 +460,7 @@ popen_delete(struct popen_handle *handle) { size_t i; - if (!handle) { - errno = ESRCH; - return -1; - } + assert(handle != NULL); if (popen_send_signal(handle, SIGKILL) && errno != ESRCH) return -1; -- 2.25.0
next prev parent reply other threads:[~2020-04-10 2:51 UTC|newest] Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-10 2:50 [Tarantool-patches] [PATCH 00/13] Popen Lua API: preliminary patches Alexander Turenko 2020-04-10 2:50 ` Alexander Turenko [this message] 2020-04-10 7:16 ` [Tarantool-patches] [PATCH 01/13] popen: require popen handle to be non-NULL Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 02/13] popen: remove retval from popen_state() Alexander Turenko 2020-04-10 7:17 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 03/13] popen: add missed diag_set in popen_signal/delete Alexander Turenko 2020-04-10 7:23 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 04/13] popen: add logging of fds closed in a child Alexander Turenko 2020-04-10 7:46 ` Cyrill Gorcunov 2020-04-10 12:19 ` Alexander Turenko 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 05/13] say: allow to set a logger file descriptor Alexander Turenko 2020-04-10 8:33 ` Cyrill Gorcunov 2020-04-10 12:19 ` Alexander Turenko 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 06/13] popen: decouple logger fd from stderr Alexander Turenko 2020-04-10 9:18 ` Cyrill Gorcunov 2020-04-10 12:20 ` Alexander Turenko 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 07/13] popen: add const qualifier to popen_write_timeout Alexander Turenko 2020-04-10 8:04 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 08/13] popen: unblock popen_read_timeout at a first byte Alexander Turenko 2020-04-10 8:10 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 09/13] popen: remove redundant fd check before perform IO Alexander Turenko 2020-04-10 8:18 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 10/13] popen: add missed diag_set() in popen IO functions Alexander Turenko 2020-04-10 8:28 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 11/13] coio: fix obsoleted comment in coio_write_timeout Alexander Turenko 2020-04-10 8:28 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 12/13] coio: add *_noxc read / write functions Alexander Turenko 2020-04-10 8:05 ` Konstantin Osipov 2020-04-10 8:17 ` Cyrill Gorcunov 2020-04-10 11:57 ` Alexander Turenko 2020-04-12 12:51 ` Alexander Turenko 2020-04-10 8:29 ` Cyrill Gorcunov 2020-04-10 2:50 ` [Tarantool-patches] [PATCH 13/13] popen: use of exception safe functions for IO Alexander Turenko 2020-04-10 11:50 ` Cyrill Gorcunov 2020-04-10 12:21 ` Alexander Turenko 2020-04-10 16:36 ` [Tarantool-patches] [PATCH 00/13] Popen Lua API: preliminary patches Kirill Yukhin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=0bd904ddc2f18b1a078aac62fcc95485b36edd92.1586486220.git.alexander.turenko@tarantool.org \ --to=alexander.turenko@tarantool.org \ --cc=gorcunov@gmail.com \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 01/13] popen: require popen handle to be non-NULL' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox