From: Ralph Boehme Date: Fri, 3 Sep 2021 05:22:18 +0000 (+0200) Subject: lib/cmdline: add POPT_COMMON_DAEMON daemon popt options X-Git-Tag: ldb-2.5.0~775 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aaa3c6a4132d2e739958e168e7dc3e78dfa4a72e;p=thirdparty%2Fsamba.git lib/cmdline: add POPT_COMMON_DAEMON daemon popt options Note: interactive=true implies fork=false. This matches the semantics that currently 3/4 daemons implement manually. Not used so far, no change in behaviour. BUG: https://bugzilla.samba.org/show_bug.cgi?id=14803 Signed-off-by: Ralph Boehme Reviewed-by: Volker Lendecke --- diff --git a/lib/cmdline/cmdline.c b/lib/cmdline/cmdline.c index a0a55f4dcfb..a299a229f69 100644 --- a/lib/cmdline/cmdline.c +++ b/lib/cmdline/cmdline.c @@ -28,6 +28,7 @@ static TALLOC_CTX *cmdline_mem_ctx; static struct loadparm_context *cmdline_lp_ctx; static struct cli_credentials *cmdline_creds; static samba_cmdline_load_config cmdline_load_config_fn; +static struct samba_cmdline_daemon_cfg cmdline_daemon_cfg; /* PRIVATE */ bool samba_cmdline_set_talloc_ctx(TALLOC_CTX *mem_ctx) @@ -59,6 +60,10 @@ bool samba_cmdline_init_common(TALLOC_CTX *mem_ctx) return false; } + cmdline_daemon_cfg = (struct samba_cmdline_daemon_cfg) { + .fork = true, + }; + fault_setup(); /* @@ -112,6 +117,11 @@ struct cli_credentials *samba_cmdline_get_creds(void) return cmdline_creds; } +struct samba_cmdline_daemon_cfg *samba_cmdline_get_daemon_cfg(void) +{ + return &cmdline_daemon_cfg; +} + void samba_cmdline_burn(int argc, char *argv[]) { bool found = false; @@ -1134,6 +1144,73 @@ static struct poptOption popt_common_version[] = { POPT_TABLEEND }; +/********************************************************** + * DAEMON POPT + **********************************************************/ + +static void popt_daemon_callback(poptContext ctx, + enum poptCallbackReason reason, + const struct poptOption *opt, + const char *arg, + const void *data) +{ + switch(opt->val) { + case OPT_DAEMON: + cmdline_daemon_cfg.daemon = true; + break; + case OPT_INTERACTIVE: + cmdline_daemon_cfg.interactive = true; + cmdline_daemon_cfg.fork = false; + break; + case OPT_FORK: + cmdline_daemon_cfg.fork = false; + break; + case OPT_NO_PROCESS_GROUP: + cmdline_daemon_cfg.no_process_group = true; + break; + } +} + +static struct poptOption popt_common_daemon[] = { + { + .argInfo = POPT_ARG_CALLBACK, + .arg = (void *)popt_daemon_callback + }, + { + .longName = "daemon", + .shortName = 'D', + .argInfo = POPT_ARG_NONE, + .arg = NULL, + .val = OPT_DAEMON, + .descrip = "Become a daemon (default)" , + }, + { + .longName = "interactive", + .shortName = 'i', + .argInfo = POPT_ARG_NONE, + .arg = NULL, + .val = OPT_INTERACTIVE, + .descrip = "Run interactive (not a daemon) and log to stdout", + }, + { + .longName = "foreground", + .shortName = 'F', + .argInfo = POPT_ARG_NONE, + .arg = NULL, + .val = OPT_FORK, + .descrip = "Run daemon in foreground (for daemontools, etc.)", + }, + { + .longName = "no-process-group", + .shortName = '\0', + .argInfo = POPT_ARG_NONE, + .arg = NULL, + .val = OPT_NO_PROCESS_GROUP, + .descrip = "Don't create a new process group" , + }, + POPT_TABLEEND +}; + /********************************************************** * LEGACY S3 POPT **********************************************************/ @@ -1270,6 +1347,9 @@ struct poptOption *samba_cmdline_get_popt(enum smb_cmdline_popt_options opt) case SAMBA_CMDLINE_POPT_OPT_VERSION: return popt_common_version; break; + case SAMBA_CMDLINE_POPT_OPT_DAEMON: + return popt_common_daemon; + break; case SAMBA_CMDLINE_POPT_OPT_SAMBA_LDB: return popt_common_samba_ldb; break; diff --git a/lib/cmdline/cmdline.h b/lib/cmdline/cmdline.h index 3c0c9e8c18d..1f85da0099e 100644 --- a/lib/cmdline/cmdline.h +++ b/lib/cmdline/cmdline.h @@ -46,11 +46,19 @@ enum smb_cmdline_popt_options { SAMBA_CMDLINE_POPT_OPT_CONNECTION, SAMBA_CMDLINE_POPT_OPT_CREDENTIALS, SAMBA_CMDLINE_POPT_OPT_VERSION, + SAMBA_CMDLINE_POPT_OPT_DAEMON, SAMBA_CMDLINE_POPT_OPT_SAMBA_LDB, SAMBA_CMDLINE_POPT_OPT_LEGACY_S3, SAMBA_CMDLINE_POPT_OPT_LEGACY_S4, }; +struct samba_cmdline_daemon_cfg { + bool daemon; + bool interactive; + bool fork; + bool no_process_group; +}; + /** * @brief Initialize the commandline interface for parsing options. * @@ -114,6 +122,15 @@ struct cli_credentials *samba_cmdline_get_creds(void); */ struct poptOption *samba_cmdline_get_popt(enum smb_cmdline_popt_options opt); +/** + * @brief Get a pointer to the poptOptions for daemons + * + * @return A pointer to the daemon options + * + * @see POPT_COMMON_DAEMON + */ +struct samba_cmdline_daemon_cfg *samba_cmdline_get_daemon_cfg(void); + /** * @brief Burn secrets on the command line. * @@ -249,6 +266,18 @@ poptContext samba_popt_get_context(const char * name, .descrip = "Version options:", \ .argDescrip = NULL }, +/** + * @brief A popt structure for daemon options. + */ +#define POPT_COMMON_DAEMON { \ + .longName = NULL, \ + .shortName = '\0', \ + .argInfo = POPT_ARG_INCLUDE_TABLE, \ + .arg = samba_cmdline_get_popt(SAMBA_CMDLINE_POPT_OPT_DAEMON), \ + .val = 0, \ + .descrip = "Daemon options:", \ + .argDescrip = NULL }, + /** * @brief A popt structure for common samba options. */ diff --git a/lib/cmdline/cmdline_private.h b/lib/cmdline/cmdline_private.h index 2261e753447..b1584e020dc 100644 --- a/lib/cmdline/cmdline_private.h +++ b/lib/cmdline/cmdline_private.h @@ -34,6 +34,10 @@ enum { OPT_USE_KERBEROS_CCACHE, OPT_USE_WINBIND_CCACHE, OPT_CLIENT_PROTECTION, + OPT_DAEMON, + OPT_INTERACTIVE, + OPT_FORK, + OPT_NO_PROCESS_GROUP, }; typedef bool (*samba_cmdline_load_config)(void);