lib/cmdline: add POPT_COMMON_DAEMON daemon popt options
authorRalph Boehme <slow@samba.org>
Fri, 3 Sep 2021 05:22:18 +0000 (07:22 +0200)
committerJule Anger <janger@samba.org>
Mon, 6 Sep 2021 19:17:11 +0000 (19:17 +0000)
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 <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
(cherry picked from commit aaa3c6a4132d2e739958e168e7dc3e78dfa4a72e)

lib/cmdline/cmdline.c
lib/cmdline/cmdline.h
lib/cmdline/cmdline_private.h

index a0a55f4dcfbb4ff8edc14e39744d8321b70238b8..a299a229f6955af6a0bb1f9a0e80f0bd68807450 100644 (file)
@@ -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;
index 3c0c9e8c18d2c0d7055208dd6e5360726b011849..1f85da0099e76cd9ccf8a1484557bc9394d216c6 100644 (file)
@@ -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.
  */
index 2261e753447c06e2121519277292fbf5c35d7660..b1584e020dc90adbcb5a14c928cbc8339155ab69 100644 (file)
@@ -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);