s3:lib: Use C99 initializer for poptOption in popt_common
[vlendec/samba-autobuild/.git] / source3 / lib / popt_common.c
index 128b9c187064eeabff8990aafaa41b1fa4bea56e..6379135a267e19e6011e58f27f8374753020b038 100644 (file)
@@ -21,8 +21,8 @@
 */
 
 #include "includes.h"
-#include "system/filesys.h"
 #include "popt_common.h"
+#include "lib/param/param.h"
 
 /* Handle command line options:
  *             -d,--debuglevel 
@@ -93,18 +93,32 @@ static void popt_common_callback(poptContext con,
                        }
                }
 
+               if (override_logfile) {
+                       setup_logging(lp_logfile(talloc_tos()), DEBUG_FILE );
+               }
+
                /* Further 'every Samba program must do this' hooks here. */
                return;
        }
 
        switch(opt->val) {
        case OPT_OPTION:
-               if (!lp_set_option(arg)) {
+       {
+               struct loadparm_context *lp_ctx;
+
+               lp_ctx = loadparm_init_s3(talloc_tos(), loadparm_s3_helpers());
+               if (lp_ctx == NULL) {
+                       fprintf(stderr, "loadparm_init_s3() failed!\n");
+                       exit(1);
+               }
+
+               if (!lpcfg_set_option(lp_ctx, arg)) {
                        fprintf(stderr, "Error setting option '%s'\n", arg);
                        exit(1);
                }
+               TALLOC_FREE(lp_ctx);
                break;
-
+       }
        case 'd':
                if (arg) {
                        lp_set_cmdline("log level", arg);
@@ -117,7 +131,7 @@ static void popt_common_callback(poptContext con,
 
        case 'O':
                if (arg) {
-                       lp_do_parameter(-1, "socket options", arg);
+                       lp_set_cmdline("socket options", arg);
                }
                break;
 
@@ -129,7 +143,7 @@ static void popt_common_callback(poptContext con,
 
        case 'n':
                if (arg) {
-                       set_global_myname(arg);
+                       lp_set_cmdline("netbios name", arg);
                }
                break;
 
@@ -143,477 +157,161 @@ static void popt_common_callback(poptContext con,
 
        case 'i':
                if (arg) {
-                         set_global_scope(arg);
+                       lp_set_cmdline("netbios scope", arg);
                }
                break;
 
        case 'W':
                if (arg) {
-                       set_global_myworkgroup(arg);
+                       lp_set_cmdline("workgroup", arg);
                }
                break;
        }
 }
 
 struct poptOption popt_common_connection[] = {
-       { NULL, 0, POPT_ARG_CALLBACK, (void *)popt_common_callback },
-       { "socket-options", 'O', POPT_ARG_STRING, NULL, 'O', "socket options to use",
-         "SOCKETOPTIONS" },
-       { "netbiosname", 'n', POPT_ARG_STRING, NULL, 'n', "Primary netbios name", "NETBIOSNAME" },
-       { "workgroup", 'W', POPT_ARG_STRING, NULL, 'W', "Set the workgroup name", "WORKGROUP" },
-       { "scope", 'i', POPT_ARG_STRING, NULL, 'i', "Use this Netbios scope", "SCOPE" },
-
+       {
+               .argInfo    = POPT_ARG_CALLBACK,
+               .arg        = (void *)popt_common_callback,
+       },
+       {
+               .longName   = "socket-options",
+               .shortName  = 'O',
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 'O',
+               .descrip    = "socket options to use",
+               .argDescrip = "SOCKETOPTIONS",
+       },
+       {
+               .longName   = "netbiosname",
+               .shortName  = 'n',
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 'n',
+               .descrip    = "Primary netbios name",
+               .argDescrip = "NETBIOSNAME"
+       },
+       {
+               .longName   = "workgroup",
+               .shortName  = 'W',
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 'W',
+               .descrip    = "Set the workgroup name",
+               .argDescrip = "WORKGROUP"
+       },
+       {
+               .longName   = "scope",
+               .shortName  = 'i',
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 'i',
+               .descrip    = "Use this Netbios scope",
+               .argDescrip = "SCOPE"
+       },
        POPT_TABLEEND
 };
 
 struct poptOption popt_common_samba[] = {
-       { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE|POPT_CBFLAG_POST, (void *)popt_common_callback },
-       { "debuglevel", 'd', POPT_ARG_STRING, NULL, 'd', "Set debug level", "DEBUGLEVEL" },
-       { "configfile", 's', POPT_ARG_STRING, NULL, 's', "Use alternate configuration file", "CONFIGFILE" },
-       { "log-basename", 'l', POPT_ARG_STRING, NULL, 'l', "Base name for log files", "LOGFILEBASE" },
-       { "version", 'V', POPT_ARG_NONE, NULL, 'V', "Print version" },
-       { "option",         0, POPT_ARG_STRING, NULL, OPT_OPTION, "Set smb.conf option from command line", "name=value" },
+       {
+               .argInfo    = POPT_ARG_CALLBACK|POPT_CBFLAG_PRE|POPT_CBFLAG_POST,
+               .arg        = (void *)popt_common_callback,
+       },
+       {
+               .longName   = "debuglevel",
+               .shortName  = 'd',
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 'd',
+               .descrip    = "Set debug level",
+               .argDescrip = "DEBUGLEVEL",
+       },
+       {
+               .longName   = "configfile",
+               .shortName  = 's',
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 's',
+               .descrip    = "Use alternate configuration file",
+               .argDescrip = "CONFIGFILE",
+       },
+       {
+               .longName   = "log-basename",
+               .shortName  = 'l',
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 'l',
+               .descrip    = "Base name for log files",
+               .argDescrip = "LOGFILEBASE",
+       },
+       {
+               .longName   = "version",
+               .shortName  = 'V',
+               .argInfo    = POPT_ARG_NONE,
+               .val        = 'V',
+               .descrip    = "Print version",
+       },
+       {
+               .longName   = "option",
+               .argInfo    = POPT_ARG_STRING,
+               .val        = OPT_OPTION,
+               .descrip    = "Set smb.conf option from command line",
+               .argDescrip = "name=value",
+       },
        POPT_TABLEEND
 };
 
 struct poptOption popt_common_configfile[] = {
-       { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE|POPT_CBFLAG_POST, (void *)popt_common_callback },
-       { "configfile", 0, POPT_ARG_STRING, NULL, 's', "Use alternate configuration file", "CONFIGFILE" },
+       {
+               .argInfo    = POPT_ARG_CALLBACK|POPT_CBFLAG_PRE|POPT_CBFLAG_POST,
+               .arg        = (void *)popt_common_callback,
+       },
+       {
+               .longName   = "configfile",
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 's',
+               .descrip    = "Use alternate configuration file",
+               .argDescrip = "CONFIGFILE",
+       },
        POPT_TABLEEND
 };
 
 struct poptOption popt_common_version[] = {
-       { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_POST, (void *)popt_common_callback },
-       { "version", 'V', POPT_ARG_NONE, NULL, 'V', "Print version" },
+       {
+               .argInfo    = POPT_ARG_CALLBACK|POPT_CBFLAG_POST,
+               .arg        = (void *)popt_common_callback
+       },
+       {
+               .longName   = "version",
+               .shortName  = 'V',
+               .argInfo    = POPT_ARG_NONE,
+               .val        = 'V',
+               .descrip    = "Print version",
+       },
        POPT_TABLEEND
 };
 
 struct poptOption popt_common_debuglevel[] = {
-       { NULL, 0, POPT_ARG_CALLBACK, (void *)popt_common_callback },
-       { "debuglevel", 'd', POPT_ARG_STRING, NULL, 'd', "Set debug level", "DEBUGLEVEL" },
+       {
+               .argInfo    = POPT_ARG_CALLBACK,
+               .arg        = (void *)popt_common_callback,
+       },
+       {
+               .longName   = "debuglevel",
+               .shortName  = 'd',
+               .argInfo    = POPT_ARG_STRING,
+               .val        = 'd',
+               .descrip    = "Set debug level",
+               .argDescrip = "DEBUGLEVEL",
+       },
        POPT_TABLEEND
 };
 
 struct poptOption popt_common_option[] = {
-       { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_POST, (void *)popt_common_callback },
-       { "option",         0, POPT_ARG_STRING, NULL, OPT_OPTION, "Set smb.conf option from command line", "name=value" },
-       POPT_TABLEEND
-};
-
-/* Handle command line options:
- *             --sbindir
- *             --bindir
- *             --swatdir
- *             --lmhostsfile
- *             --libdir
- *             --modulesdir
- *             --shlibext
- *             --lockdir
- *             --statedir
- *             --cachedir
- *             --piddir
- *             --smb-passwd-file
- *             --private-dir
- */
-
-enum dyn_item{
-       DYN_SBINDIR = 1,
-       DYN_BINDIR,
-       DYN_SWATDIR,
-       DYN_LMHOSTSFILE,
-       DYN_LIBDIR,
-       DYN_MODULESDIR,
-       DYN_SHLIBEXT,
-       DYN_LOCKDIR,
-       DYN_STATEDIR,
-       DYN_CACHEDIR,
-       DYN_PIDDIR,
-       DYN_SMB_PASSWD_FILE,
-       DYN_PRIVATE_DIR,
-};
-
-
-static void popt_dynconfig_callback(poptContext con,
-                          enum poptCallbackReason reason,
-                          const struct poptOption *opt,
-                          const char *arg, const void *data)
-{
-
-       switch (opt->val) {
-       case DYN_SBINDIR:
-               if (arg) {
-                       set_dyn_SBINDIR(arg);
-               }
-               break;
-
-       case DYN_BINDIR:
-               if (arg) {
-                       set_dyn_BINDIR(arg);
-               }
-               break;
-
-       case DYN_SWATDIR:
-               if (arg) {
-                       set_dyn_SWATDIR(arg);
-               }
-               break;
-
-       case DYN_LMHOSTSFILE:
-               if (arg) {
-                       set_dyn_LMHOSTSFILE(arg);
-               }
-               break;
-
-       case DYN_LIBDIR:
-               if (arg) {
-                       set_dyn_LIBDIR(arg);
-               }
-               break;
-
-       case DYN_MODULESDIR:
-               if (arg) {
-                       set_dyn_MODULESDIR(arg);
-               }
-               break;
-
-       case DYN_SHLIBEXT:
-               if (arg) {
-                       set_dyn_SHLIBEXT(arg);
-               }
-               break;
-
-       case DYN_LOCKDIR:
-               if (arg) {
-                       set_dyn_LOCKDIR(arg);
-               }
-               break;
-
-       case DYN_STATEDIR:
-               if (arg) {
-                       set_dyn_STATEDIR(arg);
-               }
-               break;
-
-       case DYN_CACHEDIR:
-               if (arg) {
-                       set_dyn_CACHEDIR(arg);
-               }
-               break;
-
-       case DYN_PIDDIR:
-               if (arg) {
-                       set_dyn_PIDDIR(arg);
-               }
-               break;
-
-       case DYN_SMB_PASSWD_FILE:
-               if (arg) {
-                       set_dyn_SMB_PASSWD_FILE(arg);
-               }
-               break;
-
-       case DYN_PRIVATE_DIR:
-               if (arg) {
-                       set_dyn_PRIVATE_DIR(arg);
-               }
-               break;
-
-       }
-}
-
-const struct poptOption popt_common_dynconfig[] = {
-
-       { NULL, '\0', POPT_ARG_CALLBACK, (void *)popt_dynconfig_callback },
-
-       { "sbindir", '\0' , POPT_ARG_STRING, NULL, DYN_SBINDIR,
-           "Path to sbin directory", "SBINDIR" },
-       { "bindir", '\0' , POPT_ARG_STRING, NULL, DYN_BINDIR,
-           "Path to bin directory", "BINDIR" },
-       { "swatdir", '\0' , POPT_ARG_STRING, NULL, DYN_SWATDIR,
-           "Path to SWAT installation directory", "SWATDIR" },
-       { "lmhostsfile", '\0' , POPT_ARG_STRING, NULL, DYN_LMHOSTSFILE,
-           "Path to lmhosts file", "LMHOSTSFILE" },
-       { "libdir", '\0' , POPT_ARG_STRING, NULL, DYN_LIBDIR,
-           "Path to shared library directory", "LIBDIR" },
-       { "modulesdir", '\0' , POPT_ARG_STRING, NULL, DYN_MODULESDIR,
-           "Path to shared modules directory", "MODULESDIR" },
-       { "shlibext", '\0' , POPT_ARG_STRING, NULL, DYN_SHLIBEXT,
-           "Shared library extension", "SHLIBEXT" },
-       { "lockdir", '\0' , POPT_ARG_STRING, NULL, DYN_LOCKDIR,
-           "Path to lock file directory", "LOCKDIR" },
-       { "statedir", '\0' , POPT_ARG_STRING, NULL, DYN_STATEDIR,
-           "Path to persistent state file directory", "STATEDIR" },
-       { "cachedir", '\0' , POPT_ARG_STRING, NULL, DYN_CACHEDIR,
-           "Path to temporary cache file directory", "CACHEDIR" },
-       { "piddir", '\0' , POPT_ARG_STRING, NULL, DYN_PIDDIR,
-           "Path to PID file directory", "PIDDIR" },
-       { "smb-passwd-file", '\0' , POPT_ARG_STRING, NULL, DYN_SMB_PASSWD_FILE,
-           "Path to smbpasswd file", "SMB_PASSWD_FILE" },
-       { "private-dir", '\0' , POPT_ARG_STRING, NULL, DYN_PRIVATE_DIR,
-           "Path to private data directory", "PRIVATE_DIR" },
-
-       POPT_TABLEEND
-};
-
-/****************************************************************************
- * get a password from a a file or file descriptor
- * exit on failure
- * ****************************************************************************/
-
-static void get_password_file(struct user_auth_info *auth_info)
-{
-       int fd = -1;
-       char *p;
-       bool close_it = False;
-       char *spec = NULL;
-       char pass[128];
-
-       if ((p = getenv("PASSWD_FD")) != NULL) {
-               if (asprintf(&spec, "descriptor %s", p) < 0) {
-                       return;
-               }
-               sscanf(p, "%d", &fd);
-               close_it = false;
-       } else if ((p = getenv("PASSWD_FILE")) != NULL) {
-               fd = sys_open(p, O_RDONLY, 0);
-               spec = SMB_STRDUP(p);
-               if (fd < 0) {
-                       fprintf(stderr, "Error opening PASSWD_FILE %s: %s\n",
-                                       spec, strerror(errno));
-                       exit(1);
-               }
-               close_it = True;
-       }
-
-       if (fd < 0) {
-               fprintf(stderr, "fd = %d, < 0\n", fd);
-               exit(1);
-       }
-
-       for(p = pass, *p = '\0'; /* ensure that pass is null-terminated */
-               p && p - pass < sizeof(pass);) {
-               switch (read(fd, p, 1)) {
-               case 1:
-                       if (*p != '\n' && *p != '\0') {
-                               *++p = '\0'; /* advance p, and null-terminate pass */
-                               break;
-                       }
-               case 0:
-                       if (p - pass) {
-                               *p = '\0'; /* null-terminate it, just in case... */
-                               p = NULL; /* then force the loop condition to become false */
-                               break;
-                       } else {
-                               fprintf(stderr, "Error reading password from file %s: %s\n",
-                                               spec, "empty password\n");
-                               SAFE_FREE(spec);
-                               exit(1);
-                       }
-
-               default:
-                       fprintf(stderr, "Error reading password from file %s: %s\n",
-                                       spec, strerror(errno));
-                       SAFE_FREE(spec);
-                       exit(1);
-               }
-       }
-       SAFE_FREE(spec);
-
-       set_cmdline_auth_info_password(auth_info, pass);
-       if (close_it) {
-               close(fd);
-       }
-}
-
-static void get_credentials_file(struct user_auth_info *auth_info,
-                                const char *file)
-{
-       XFILE *auth;
-       fstring buf;
-       uint16 len = 0;
-       char *ptr, *val, *param;
-
-       if ((auth=x_fopen(file, O_RDONLY, 0)) == NULL)
        {
-               /* fail if we can't open the credentials file */
-               d_printf("ERROR: Unable to open credentials file!\n");
-               exit(-1);
-       }
-
-       while (!x_feof(auth))
+               .argInfo    = POPT_ARG_CALLBACK|POPT_CBFLAG_POST,
+               .arg        = (void *)popt_common_callback,
+       },
        {
-               /* get a line from the file */
-               if (!x_fgets(buf, sizeof(buf), auth))
-                       continue;
-               len = strlen(buf);
-
-               if ((len) && (buf[len-1]=='\n'))
-               {
-                       buf[len-1] = '\0';
-                       len--;
-               }
-               if (len == 0)
-                       continue;
-
-               /* break up the line into parameter & value.
-                * will need to eat a little whitespace possibly */
-               param = buf;
-               if (!(ptr = strchr_m (buf, '=')))
-                       continue;
-
-               val = ptr+1;
-               *ptr = '\0';
-
-               /* eat leading white space */
-               while ((*val!='\0') && ((*val==' ') || (*val=='\t')))
-                       val++;
-
-               if (strwicmp("password", param) == 0) {
-                       set_cmdline_auth_info_password(auth_info, val);
-               } else if (strwicmp("username", param) == 0) {
-                       set_cmdline_auth_info_username(auth_info, val);
-               } else if (strwicmp("domain", param) == 0) {
-                       set_global_myworkgroup(val);
-               }
-               memset(buf, 0, sizeof(buf));
-       }
-       x_fclose(auth);
-}
-
-/* Handle command line options:
- *             -U,--user
- *             -A,--authentication-file
- *             -k,--use-kerberos
- *             -N,--no-pass
- *             -S,--signing
- *              -P --machine-pass
- *             -e --encrypt
- *             -C --use-ccache
- */
-
-
-static void popt_common_credentials_callback(poptContext con,
-                                       enum poptCallbackReason reason,
-                                       const struct poptOption *opt,
-                                       const char *arg, const void *data)
-{
-       struct user_auth_info *auth_info = talloc_get_type_abort(
-               *((const char **)data), struct user_auth_info);
-       char *p;
-
-       if (reason == POPT_CALLBACK_REASON_PRE) {
-               set_cmdline_auth_info_username(auth_info, "GUEST");
-
-               if (getenv("LOGNAME")) {
-                       set_cmdline_auth_info_username(auth_info,
-                                                      getenv("LOGNAME"));
-               }
-
-               if (getenv("USER")) {
-                       char *puser = SMB_STRDUP(getenv("USER"));
-                       if (!puser) {
-                               exit(ENOMEM);
-                       }
-                       set_cmdline_auth_info_username(auth_info, puser);
-
-                       if ((p = strchr_m(puser,'%'))) {
-                               size_t len;
-                               *p = 0;
-                               len = strlen(p+1);
-                               set_cmdline_auth_info_password(auth_info, p+1);
-                               memset(strchr_m(getenv("USER"),'%')+1,'X',len);
-                       }
-                       SAFE_FREE(puser);
-               }
-
-               if (getenv("PASSWD")) {
-                       set_cmdline_auth_info_password(auth_info,
-                                                      getenv("PASSWD"));
-               }
-
-               if (getenv("PASSWD_FD") || getenv("PASSWD_FILE")) {
-                       get_password_file(auth_info);
-               }
-
-               return;
-       }
-
-       switch(opt->val) {
-       case 'U':
-               {
-                       char *lp;
-                       char *puser = SMB_STRDUP(arg);
-
-                       if ((lp=strchr_m(puser,'%'))) {
-                               size_t len;
-                               *lp = 0;
-                               set_cmdline_auth_info_username(auth_info,
-                                                              puser);
-                               set_cmdline_auth_info_password(auth_info,
-                                                              lp+1);
-                               len = strlen(lp+1);
-                               memset(strchr_m(arg,'%')+1,'X',len);
-                       } else {
-                               set_cmdline_auth_info_username(auth_info,
-                                                              puser);
-                       }
-                       SAFE_FREE(puser);
-               }
-               break;
-
-       case 'A':
-               get_credentials_file(auth_info, arg);
-               break;
-
-       case 'k':
-#ifndef HAVE_KRB5
-               d_printf("No kerberos support compiled in\n");
-               exit(1);
-#else
-               set_cmdline_auth_info_use_krb5_ticket(auth_info);
-#endif
-               break;
-
-       case 'S':
-               if (!set_cmdline_auth_info_signing_state(auth_info, arg)) {
-                       fprintf(stderr, "Unknown signing option %s\n", arg );
-                       exit(1);
-               }
-               break;
-       case 'P':
-               set_cmdline_auth_info_use_machine_account(auth_info);
-               break;
-       case 'N':
-               set_cmdline_auth_info_password(auth_info, "");
-               break;
-       case 'e':
-               set_cmdline_auth_info_smb_encrypt(auth_info);
-               break;
-       case 'C':
-               set_cmdline_auth_info_use_ccache(auth_info, true);
-               break;
-       }
-}
-
-static struct user_auth_info *global_auth_info;
-
-void popt_common_set_auth_info(struct user_auth_info *auth_info)
-{
-       global_auth_info = auth_info;
-}
-
-struct poptOption popt_common_credentials[] = {
-       { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE,
-         (void *)popt_common_credentials_callback, 0,
-         (const char *)&global_auth_info },
-       { "user", 'U', POPT_ARG_STRING, NULL, 'U', "Set the network username", "USERNAME" },
-       { "no-pass", 'N', POPT_ARG_NONE, NULL, 'N', "Don't ask for a password" },
-       { "kerberos", 'k', POPT_ARG_NONE, NULL, 'k', "Use kerberos (active directory) authentication" },
-       { "authentication-file", 'A', POPT_ARG_STRING, NULL, 'A', "Get the credentials from a file", "FILE" },
-       { "signing", 'S', POPT_ARG_STRING, NULL, 'S', "Set the client signing state", "on|off|required" },
-       {"machine-pass", 'P', POPT_ARG_NONE, NULL, 'P', "Use stored machine account password" },
-       {"encrypt", 'e', POPT_ARG_NONE, NULL, 'e', "Encrypt SMB transport (UNIX extended servers only)" },
-       {"use-ccache", 'C', POPT_ARG_NONE, NULL, 'C',
-        "Use the winbind ccache for authentication" },
+               .longName   = "option",
+               .argInfo    = POPT_ARG_STRING,
+               .val        = OPT_OPTION,
+               .descrip    = "Set smb.conf option from command line",
+               .argDescrip = "name=value",
+       },
        POPT_TABLEEND
 };