*/
#include "includes.h"
+#include "popt_common.h"
+#include "lib/param/param.h"
/* Handle command line options:
* -d,--debuglevel
* -i,--scope
*/
-extern bool AllowDebugChange;
+enum {OPT_OPTION=1};
+
extern bool override_logfile;
static void set_logfile(poptContext con, const char * arg)
{
- char *logfile = NULL;
+ char *lfile = NULL;
const char *pname;
/* Find out basename of current program */
else
pname++;
- if (asprintf(&logfile, "%s/log.%s", arg, pname) < 0) {
+ if (asprintf(&lfile, "%s/log.%s", arg, pname) < 0) {
return;
}
- lp_set_logfile(logfile);
- SAFE_FREE(logfile);
+ lp_set_logfile(lfile);
+ SAFE_FREE(lfile);
}
static bool PrintSambaVersionString;
+static void popt_s3_talloc_log_fn(const char *message)
+{
+ DEBUG(0,("%s", message));
+}
+
static void popt_common_callback(poptContext con,
enum poptCallbackReason reason,
const struct poptOption *opt,
if (reason == POPT_CALLBACK_REASON_PRE) {
set_logfile(con, get_dyn_LOGFILEBASE());
+ talloc_set_log_fn(popt_s3_talloc_log_fn);
+ talloc_set_abort_fn(smb_panic);
return;
}
if (reason == POPT_CALLBACK_REASON_POST) {
if (PrintSambaVersionString) {
- printf( "Version %s\n", SAMBA_VERSION_STRING);
+ printf( "Version %s\n", samba_version_string());
exit(0);
}
}
}
+ 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:
+ {
+ 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) {
- debug_parse_levels(arg);
- AllowDebugChange = False;
+ lp_set_cmdline("log level", arg);
}
break;
case 'O':
if (arg) {
- lp_do_parameter(-1, "socket options", arg);
+ lp_set_cmdline("socket options", arg);
}
break;
case 'n':
if (arg) {
- set_global_myname(arg);
+ lp_set_cmdline("netbios name", arg);
}
break;
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" },
+ {
+ .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, (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" },
- POPT_TABLEEND
-};
-
-
-/* Handle command line options:
- * --sbindir
- * --bindir
- * --swatdir
- * --lmhostsfile
- * --libdir
- * --modulesdir
- * --shlibext
- * --lockdir
- * --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_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_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" },
- { "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" },
-
+ {
+ .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
};
-/****************************************************************************
- * get a password from a a file or file descriptor
- * exit on failure
- * ****************************************************************************/
-
-static void get_password_file(void)
-{
- 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(pass);
- if (close_it) {
- close(fd);
- }
-}
-
-static void get_credentials_file(const char *file)
-{
- XFILE *auth;
- fstring buf;
- uint16 len = 0;
- char *ptr, *val, *param;
-
- if ((auth=x_fopen(file, O_RDONLY, 0)) == NULL)
+struct poptOption popt_common_option[] = {
{
- /* 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(val);
- } else if (strwicmp("username", param) == 0) {
- set_cmdline_auth_info_username(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
- */
-
-
-static void popt_common_credentials_callback(poptContext con,
- enum poptCallbackReason reason,
- const struct poptOption *opt,
- const char *arg, const void *data)
-{
- char *p;
-
- if (reason == POPT_CALLBACK_REASON_PRE) {
- set_cmdline_auth_info_username("GUEST");
-
- if (getenv("LOGNAME")) {
- set_cmdline_auth_info_username(getenv("LOGNAME"));
- }
-
- if (getenv("USER")) {
- char *puser = SMB_STRDUP(getenv("USER"));
- if (!puser) {
- exit(ENOMEM);
- }
- set_cmdline_auth_info_username(puser);
-
- if ((p = strchr_m(puser,'%'))) {
- size_t len;
- *p = 0;
- len = strlen(p+1);
- set_cmdline_auth_info_password(p+1);
- memset(strchr_m(getenv("USER"),'%')+1,'X',len);
- }
- SAFE_FREE(puser);
- }
-
- if (getenv("PASSWD")) {
- set_cmdline_auth_info_password(getenv("PASSWD"));
- }
-
- if (getenv("PASSWD_FD") || getenv("PASSWD_FILE")) {
- get_password_file();
- }
-
- 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(puser);
- set_cmdline_auth_info_password(lp+1);
- len = strlen(lp+1);
- memset(strchr_m(arg,'%')+1,'X',len);
- } else {
- set_cmdline_auth_info_username(puser);
- }
- SAFE_FREE(puser);
- }
- break;
-
- case 'A':
- get_credentials_file(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();
-#endif
- break;
-
- case 'S':
- if (!set_cmdline_auth_info_signing_state(arg)) {
- fprintf(stderr, "Unknown signing option %s\n", arg );
- exit(1);
- }
- break;
- case 'P':
- set_cmdline_auth_info_use_machine_account();
- break;
- case 'N':
- set_cmdline_auth_info_password("");
- break;
- case 'e':
- set_cmdline_auth_info_smb_encrypt();
- break;
-
- }
-}
-
-struct poptOption popt_common_credentials[] = {
- { NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE, (void *)popt_common_credentials_callback },
- { "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)" },
+ .longName = "option",
+ .argInfo = POPT_ARG_STRING,
+ .val = OPT_OPTION,
+ .descrip = "Set smb.conf option from command line",
+ .argDescrip = "name=value",
+ },
POPT_TABLEEND
};