From nobody Sun Apr 09 23:57:56 2023 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4PvpvT4tNlz44Snt; Sun, 9 Apr 2023 23:57:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4PvpvT2FYTz4FPn; Sun, 9 Apr 2023 23:57:57 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681084677; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=fUydyIrlGkFsxHjY8VPA5HhMexX5Xplsxxbv0DPhNNs=; b=DcBm5rTSzPg0XwqqoPJqrarqW9rTQWFbjspQ62bFAzRtRHMr7N5Uytyf5V6GfHpovk2hxJ rY+MeXnug+BvmjBIz97XmFTvX4w8Wjl6/Ji1yDWvXRDqJmCJt9dvNCPlLuGgU1g+fywUiR RtPuwrrAFcYLs3P2GbiGgBWjE/Xo8HgRezG6/npKd9jmHkqV6tk0IvPMgzk6inQXGjK3uH ylJdhoso9wjY5SWS+K8tLLEQQEycdM7NFrCqyx9QsUEvJOmqKKQJUby0OHgiVt4aN3CsVe IWiByeElLrQQp/r2S3LpNYKk7sH3jbmGP4NVxS7mdI3/HvsUWqYq4SRP2OlPng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1681084677; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=fUydyIrlGkFsxHjY8VPA5HhMexX5Xplsxxbv0DPhNNs=; b=y0KSBeSoJbtT/VVbO3ekKH/y0lVd+yJpW8oyt8ZPN7kriSa3Nno3lzSCwmAhCSu1wtOeyv XlI2uCcItQ6Ds9f0Q4GejDlLZoAquPH7JTi27kVpLmnDwA9IJOVYuY5vOulunhEiuNrw6c xIGW7mTWdQdnDCHGK5qDR7QGUSEQSNGMJnmM/eLUAoyaqNy2zQ35rKGNwx7O+3r2NwDrQp VCRspkof32470nlKc66L0bHnGP8fQEIvQl73j8hhwKD19DP+xfHeMeAgFVs3FB0NfZGoS7 QOBzkmhubtKJe+QtUdZj3w4fwoz/WsSzEnWazmVQJGkT50rk9f+H6n9u2XuOkg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1681084677; a=rsa-sha256; cv=none; b=QuRHWPTEHDaeISUbfgGR79G9D14B8zh9FpaOsB0+0bSyY2xCszkubEKTRvqBxWRuFOCM5Z YXrEzuNUnyMZ9uNp2AI9rMmEnaux5+qDYjuwCoq3zsXqWpqwhgW3iEindKB4ZFJiE1bfb7 lUzfnnObYIpuTvRPwk8lMG/pec9Hdp8PdNEoVD3RvyBoUaFp2mMzqaj0LoHWg22EBLIGUD uAsO7lXK/z4SNGCbPa7l4ug0gWp1yZ7tnI/fB0MraCGCtYAj3t7h5cvYD9badVsOn0grHB AiQ9KF85sDL1+1iwnFyE8w8OyRnXujIwBtP6o+IDxL/C4J69xNockr3zOT7Y9g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4PvpvS6ssLzT0M; Sun, 9 Apr 2023 23:57:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 339NvuG6011936; Sun, 9 Apr 2023 23:57:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 339NvuvL011935; Sun, 9 Apr 2023 23:57:56 GMT (envelope-from git) Date: Sun, 9 Apr 2023 23:57:56 GMT Message-Id: <202304092357.339NvuvL011935@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Kyle Evans Subject: git: edc3bffde20a - stable/13 - daemon: repace goto exit with daemon_terminate() List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kevans X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: edc3bffde20a0cc6ad5921fbaab75bbf3ec44e68 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by kevans: URL: https://cgit.FreeBSD.org/src/commit/?id=edc3bffde20a0cc6ad5921fbaab75bbf3ec44e68 commit edc3bffde20a0cc6ad5921fbaab75bbf3ec44e68 Author: Ihor Antonov AuthorDate: 2023-03-18 05:31:12 +0000 Commit: Kyle Evans CommitDate: 2023-04-09 22:49:51 +0000 daemon: repace goto exit with daemon_terminate() Start breaking down big main() Remove goto exit label and replace it with a function that does cleanup. Comment re-worded by kevans@. (cherry picked from commit cf6356fd471cdf4e5c52550f63599881d722962c) --- usr.sbin/daemon/daemon.c | 65 +++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/usr.sbin/daemon/daemon.c b/usr.sbin/daemon/daemon.c index b215803cf3c6..2a57d021258e 100644 --- a/usr.sbin/daemon/daemon.c +++ b/usr.sbin/daemon/daemon.c @@ -95,6 +95,8 @@ static void open_pid_files(struct daemon_state *); static void do_output(const unsigned char *, size_t, struct daemon_state *); static void daemon_sleep(time_t, long); static void daemon_state_init(struct daemon_state *); +static void daemon_terminate(struct daemon_state *); + static volatile sig_atomic_t terminate = 0; static volatile sig_atomic_t child_gone = 0; @@ -305,7 +307,7 @@ main(int argc, char *argv[]) open_pid_files(&state); if (daemon(state.keep_cur_workdir, state.keep_fds_open) == -1) { warn("daemon"); - goto exit; + daemon_terminate(&state); } /* Write out parent pidfile if needed. */ pidfile_write(state.parent_pidfh); @@ -341,15 +343,15 @@ main(int argc, char *argv[]) /* Block SIGTERM to avoid racing until we have forked. */ if (sigprocmask(SIG_BLOCK, &mask_term, &mask_orig)) { warn("sigprocmask"); - goto exit; + daemon_terminate(&state); } if (sigaction(SIGTERM, &act_term, NULL) == -1) { warn("sigaction"); - goto exit; + daemon_terminate(&state); } if (sigaction(SIGCHLD, &act_chld, NULL) == -1) { warn("sigaction"); - goto exit; + daemon_terminate(&state); } /* * Try to protect against pageout kill. Ignore the @@ -360,7 +362,7 @@ main(int argc, char *argv[]) if (state.log_reopen && state.output_fd >= 0 && sigaction(SIGHUP, &act_hup, NULL) == -1) { warn("sigaction"); - goto exit; + daemon_terminate(&state); } restart: if (pipe(state.pipe_fd)) { @@ -376,7 +378,7 @@ restart: /* fork failed, this can only happen when supervision is enabled */ if (pid == -1) { warn("fork"); - goto exit; + daemon_terminate(&state); } @@ -425,7 +427,7 @@ restart: */ if (sigprocmask(SIG_UNBLOCK, &mask_term, NULL)) { warn("sigprocmask"); - goto exit; + daemon_terminate(&state); } close(state.pipe_fd[1]); state.pipe_fd[1] = -1; @@ -458,34 +460,34 @@ restart: } if (terminate) { - goto exit; + daemon_terminate(&state); } if (state.child_eof) { if (sigprocmask(SIG_BLOCK, &mask_susp, NULL)) { warn("sigprocmask"); - goto exit; + daemon_terminate(&state); } while (!terminate && !child_gone) { sigsuspend(&mask_orig); } if (sigprocmask(SIG_UNBLOCK, &mask_susp, NULL)) { warn("sigprocmask"); - goto exit; + daemon_terminate(&state); } continue; } if (sigprocmask(SIG_BLOCK, &mask_read, NULL)) { warn("sigprocmask"); - goto exit; + daemon_terminate(&state); } state.child_eof = !listen_child(state.pipe_fd[0], &state); if (sigprocmask(SIG_UNBLOCK, &mask_read, NULL)) { warn("sigprocmask"); - goto exit; + daemon_terminate(&state); } } @@ -494,23 +496,14 @@ restart: } if (sigprocmask(SIG_BLOCK, &mask_term, NULL)) { warn("sigprocmask"); - goto exit; + daemon_terminate(&state); } if (state.restart_enabled && !terminate) { close(state.pipe_fd[0]); state.pipe_fd[0] = -1; goto restart; } -exit: - close(state.output_fd); - close(state.pipe_fd[0]); - close(state.pipe_fd[1]); - if (state.syslog_enabled) { - closelog(); - } - pidfile_remove(state.child_pidfh); - pidfile_remove(state.parent_pidfh); - exit(1); /* If daemon(3) succeeded exit status does not matter. */ + daemon_terminate(&state); } static void @@ -601,7 +594,7 @@ listen_child(int fd, struct daemon_state *state) static size_t bytes_read = 0; int rv; - assert(state); + assert(state != NULL); assert(bytes_read < LBUF_SIZE - 1); if (do_log_reopen) { @@ -659,7 +652,7 @@ static void do_output(const unsigned char *buf, size_t len, struct daemon_state *state) { assert(len <= LBUF_SIZE); - assert(state); + assert(state != NULL); if (len < 1) { return; @@ -762,3 +755,25 @@ daemon_state_init(struct daemon_state *state) .output_filename = NULL, }; } + + +static _Noreturn void +daemon_terminate(struct daemon_state *state) +{ + assert(state != NULL); + close(state->output_fd); + close(state->pipe_fd[0]); + close(state->pipe_fd[1]); + if (state->syslog_enabled) { + closelog(); + } + pidfile_remove(state->child_pidfh); + pidfile_remove(state->parent_pidfh); + + /* + * Note that the exit value here doesn't matter in the case of a clean + * exit; daemon(3) already detached us from the caller, nothing is left + * to care about this one. + */ + exit(1); +}