mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
r7525: Unify lp_load(), load_interfaces and logging setup into popt().
There is now a new --debug-stderr option to enable debug to STDERR. popt isn't perfect, but the callbacks are used in all the main Samba binaries, and should be used in the rest. This avoids duplicated code, and ensures every binary is setup correctly. This also ensures the setup happens early enough to have -s function, and have a correct impact on the credentials code. (Fixing a bug that frustrated tridge earlier today). The only 'subtle' aspect of all this is that I'm pretty sure that the SAMBA_COMMON popt code must be above the CREDENTIALS code, in the popt tables. Andrew Bartlett
This commit is contained in:
parent
235cf625e2
commit
50f3c2b3a2
@ -3361,18 +3361,12 @@ static void remember_query_host(const char *arg,
|
||||
*query_host = 0;
|
||||
*base_directory = 0;
|
||||
|
||||
setup_logging(argv[0],DEBUG_STDOUT);
|
||||
mem_ctx = talloc_init("client.c/main");
|
||||
if (!mem_ctx) {
|
||||
d_printf("\nclient.c: Not enough memory\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!lp_load(dyn_CONFIGFILE,True,False,False)) {
|
||||
fprintf(stderr, "%s: Can't load %s - run testparm to debug it\n",
|
||||
argv[0], dyn_CONFIGFILE);
|
||||
}
|
||||
|
||||
pc = poptGetContext("smbclient", argc, (const char **) argv, long_options, 0);
|
||||
poptSetOtherOptionHelp(pc, "[OPTIONS] service <password>");
|
||||
|
||||
@ -3393,10 +3387,6 @@ static void remember_query_host(const char *arg,
|
||||
case 'I':
|
||||
dest_ip = poptGetOptArg(pc);
|
||||
break;
|
||||
case 'E':
|
||||
setup_logging("client", DEBUG_STDERR);
|
||||
break;
|
||||
|
||||
case 'L':
|
||||
remember_query_host(poptGetOptArg(pc), query_host);
|
||||
break;
|
||||
@ -3412,8 +3402,6 @@ static void remember_query_host(const char *arg,
|
||||
}
|
||||
}
|
||||
|
||||
load_interfaces();
|
||||
|
||||
smbclient_init_subsystems;
|
||||
|
||||
if(poptPeekArg(pc)) {
|
||||
|
@ -46,7 +46,7 @@ extern int DEBUGLEVEL;
|
||||
#define DEBUGADDC(class, level, body) DEBUG(level, body)
|
||||
#define DEBUGTAB(n) do_debug_tab(n)
|
||||
|
||||
enum debug_logtype {DEBUG_FILE, DEBUG_STDOUT, DEBUG_STDERR};
|
||||
enum debug_logtype {DEBUG_STDOUT = 0, DEBUG_FILE = 1, DEBUG_STDERR = 2};
|
||||
|
||||
/* keep some debug class defines for now to avoid changing old code too much */
|
||||
#define DBGC_AUTH 0
|
||||
|
@ -38,7 +38,7 @@
|
||||
* -i,--scope
|
||||
*/
|
||||
|
||||
enum {OPT_OPTION=1,OPT_LEAK_REPORT,OPT_LEAK_REPORT_FULL};
|
||||
enum {OPT_OPTION=1,OPT_LEAK_REPORT,OPT_LEAK_REPORT_FULL, OPT_DEBUG_STDERR};
|
||||
|
||||
struct cli_credentials *cmdline_credentials = NULL;
|
||||
|
||||
@ -49,6 +49,14 @@ static void popt_common_callback(poptContext con,
|
||||
{
|
||||
const char *pname;
|
||||
|
||||
if (reason == POPT_CALLBACK_REASON_POST) {
|
||||
/* Hook any 'every Samba program must do this, after
|
||||
* the smb.conf is setup' functions here */
|
||||
lp_load(dyn_CONFIGFILE,True,False,False);
|
||||
load_interfaces();
|
||||
return;
|
||||
}
|
||||
|
||||
/* Find out basename of current program */
|
||||
pname = strrchr_m(poptGetInvocationName(con),'/');
|
||||
|
||||
@ -58,9 +66,7 @@ static void popt_common_callback(poptContext con,
|
||||
pname++;
|
||||
|
||||
if (reason == POPT_CALLBACK_REASON_PRE) {
|
||||
char *logfile = talloc_asprintf(NULL, "%s/log.%s", dyn_LOGFILEBASE, pname);
|
||||
lp_set_cmdline("log file", logfile);
|
||||
talloc_free(logfile);
|
||||
setup_logging(pname, DEBUG_STDOUT);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -69,6 +75,10 @@ static void popt_common_callback(poptContext con,
|
||||
lp_set_cmdline("log level", arg);
|
||||
break;
|
||||
|
||||
case OPT_DEBUG_STDERR:
|
||||
setup_logging(pname, DEBUG_STDERR);
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
printf( "Version %s\n", SAMBA_VERSION_STRING );
|
||||
exit(0);
|
||||
@ -128,6 +138,7 @@ static void popt_common_callback(poptContext con,
|
||||
case OPT_LEAK_REPORT_FULL:
|
||||
talloc_enable_leak_report_full();
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -143,8 +154,9 @@ struct poptOption popt_common_connection[] = {
|
||||
};
|
||||
|
||||
struct poptOption popt_common_samba[] = {
|
||||
{ NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE, popt_common_callback },
|
||||
{ NULL, 0, POPT_ARG_CALLBACK|POPT_CBFLAG_PRE|POPT_CBFLAG_POST, popt_common_callback },
|
||||
{ "debuglevel", 'd', POPT_ARG_STRING, NULL, 'd', "Set debug level", "DEBUGLEVEL" },
|
||||
{ "debug-stderr", 0, POPT_ARG_NONE, NULL, OPT_DEBUG_STDERR, "Send debug output to STDERR", NULL },
|
||||
{ "configfile", 's', POPT_ARG_STRING, NULL, 's', "Use alternative configuration file", "CONFIGFILE" },
|
||||
{ "option", 0, POPT_ARG_STRING, NULL, OPT_OPTION, "Set smb.conf option from command line", "name=value" },
|
||||
{ "log-basename", 'l', POPT_ARG_STRING, NULL, 'l', "Basename for log/debug files", "LOGFILEBASE" },
|
||||
|
@ -74,8 +74,6 @@ void reopen_logs(void)
|
||||
char *fname = NULL;
|
||||
int old_fd = state.fd;
|
||||
|
||||
state.fd = 0;
|
||||
|
||||
switch (state.logtype) {
|
||||
case DEBUG_STDOUT:
|
||||
state.fd = 1;
|
||||
@ -89,12 +87,20 @@ void reopen_logs(void)
|
||||
if ((*logfile) == '/') {
|
||||
fname = strdup(logfile);
|
||||
} else {
|
||||
asprintf(&fname, "%s/%s.log", dyn_LOGFILEBASE, logfile);
|
||||
asprintf(&fname, "%s/%s.log", dyn_LOGFILEBASE, state.prog_name);
|
||||
}
|
||||
if (fname) {
|
||||
state.fd = open(fname, O_CREAT|O_APPEND|O_WRONLY, 0644);
|
||||
int newfd = open(fname, O_CREAT|O_APPEND|O_WRONLY, 0600);
|
||||
if (newfd == -1) {
|
||||
DEBUG(1, ("Failed to open new logfile: %s\n", fname));
|
||||
} else {
|
||||
state.fd = newfd;
|
||||
}
|
||||
free(fname);
|
||||
} else {
|
||||
DEBUG(1, ("Failed to find name for file-based logfile!\n"));
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@ -109,8 +115,12 @@ void reopen_logs(void)
|
||||
*/
|
||||
void setup_logging(const char *prog_name, enum debug_logtype new_logtype)
|
||||
{
|
||||
state.logtype = new_logtype;
|
||||
state.prog_name = prog_name;
|
||||
if (state.logtype < new_logtype) {
|
||||
state.logtype = new_logtype;
|
||||
}
|
||||
if (prog_name) {
|
||||
state.prog_name = prog_name;
|
||||
}
|
||||
reopen_logs();
|
||||
}
|
||||
|
||||
|
@ -121,21 +121,18 @@ static void writediff(struct registry_key *oldkey, struct registry_key *newkey,
|
||||
WERROR error, error2;
|
||||
struct poptOption long_options[] = {
|
||||
POPT_AUTOHELP
|
||||
POPT_COMMON_CREDENTIALS
|
||||
{"output", 'o', POPT_ARG_STRING, &outputfile, 'o', "output file to use", NULL },
|
||||
{"null", 'n', POPT_ARG_NONE, &from_null, 'n', "Diff from NULL", NULL },
|
||||
{"remote", 'R', POPT_ARG_STRING, NULL, 0, "Connect to remote server" , NULL },
|
||||
{"local", 'L', POPT_ARG_NONE, NULL, 0, "Open local registry", NULL },
|
||||
POPT_COMMON_SAMBA
|
||||
POPT_COMMON_CREDENTIALS
|
||||
POPT_COMMON_VERSION
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
regdiff_init_subsystems;
|
||||
|
||||
if (!lp_load(dyn_CONFIGFILE,True,False,False)) {
|
||||
fprintf(stderr, "Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE);
|
||||
}
|
||||
|
||||
|
||||
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
|
||||
|
||||
while((opt = poptGetNextOpt(pc)) != -1) {
|
||||
@ -157,7 +154,6 @@ static void writediff(struct registry_key *oldkey, struct registry_key *newkey,
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
setup_logging(argv[0], DEBUG_STDOUT);
|
||||
|
||||
poptFreeContext(pc);
|
||||
|
||||
|
@ -749,25 +749,19 @@ static int nt_apply_reg_command_file(struct registry_context *r, const char *cmd
|
||||
WERROR error;
|
||||
struct poptOption long_options[] = {
|
||||
POPT_AUTOHELP
|
||||
POPT_COMMON_CREDENTIALS
|
||||
{"remote", 'R', POPT_ARG_STRING, &remote, 0, "connect to specified remote server", NULL},
|
||||
POPT_COMMON_SAMBA
|
||||
POPT_COMMON_CREDENTIALS
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
regpatch_init_subsystems;
|
||||
|
||||
if (!lp_load(dyn_CONFIGFILE,True,False,False)) {
|
||||
fprintf(stderr, "Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE);
|
||||
}
|
||||
|
||||
|
||||
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
|
||||
|
||||
while((opt = poptGetNextOpt(pc)) != -1) {
|
||||
}
|
||||
|
||||
setup_logging(argv[0], DEBUG_STDOUT);
|
||||
|
||||
if (remote) {
|
||||
error = reg_open_remote (&h, cmdline_credentials, remote);
|
||||
} else {
|
||||
|
@ -374,26 +374,21 @@ static char **reg_completion(const char *text, int start, int end)
|
||||
struct registry_context *h = NULL;
|
||||
struct poptOption long_options[] = {
|
||||
POPT_AUTOHELP
|
||||
POPT_COMMON_CREDENTIALS
|
||||
{"backend", 'b', POPT_ARG_STRING, &backend, 0, "backend to use", NULL},
|
||||
{"remote", 'R', POPT_ARG_STRING, &remote, 0, "connect to specified remote server", NULL},
|
||||
POPT_COMMON_SAMBA
|
||||
POPT_COMMON_CREDENTIALS
|
||||
POPT_COMMON_VERSION
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
regshell_init_subsystems;
|
||||
|
||||
if (!lp_load(dyn_CONFIGFILE,True,False,False)) {
|
||||
fprintf(stderr, "Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE);
|
||||
}
|
||||
|
||||
|
||||
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
|
||||
|
||||
while((opt = poptGetNextOpt(pc)) != -1) {
|
||||
}
|
||||
|
||||
setup_logging("regtree", DEBUG_STDOUT);
|
||||
|
||||
if (remote) {
|
||||
error = reg_open_remote (&h, cmdline_credentials, remote);
|
||||
} else if (backend) {
|
||||
|
@ -82,28 +82,22 @@ static void print_tree(int l, struct registry_key *p, int fullpath, int novals)
|
||||
int fullpath = 0, no_values = 0;
|
||||
struct poptOption long_options[] = {
|
||||
POPT_AUTOHELP
|
||||
POPT_COMMON_CREDENTIALS
|
||||
{"backend", 'b', POPT_ARG_STRING, &backend, 0, "backend to use", NULL},
|
||||
{"fullpath", 'f', POPT_ARG_NONE, &fullpath, 0, "show full paths", NULL},
|
||||
{"remote", 'R', POPT_ARG_STRING, &remote, 0, "connect to specified remote server", NULL },
|
||||
{"no-values", 'V', POPT_ARG_NONE, &no_values, 0, "don't show values", NULL},
|
||||
POPT_COMMON_SAMBA
|
||||
POPT_COMMON_CREDENTIALS
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
regtree_init_subsystems;
|
||||
|
||||
if (!lp_load(dyn_CONFIGFILE,True,False,False)) {
|
||||
fprintf(stderr, "Can't load %s - run testparm to debug it\n", dyn_CONFIGFILE);
|
||||
}
|
||||
|
||||
|
||||
pc = poptGetContext(argv[0], argc, (const char **) argv, long_options,0);
|
||||
|
||||
while((opt = poptGetNextOpt(pc)) != -1) {
|
||||
}
|
||||
|
||||
setup_logging("regtree", DEBUG_STDOUT);
|
||||
|
||||
if (remote) {
|
||||
error = reg_open_remote(&h, cmdline_credentials, remote);
|
||||
} else if (backend) {
|
||||
|
@ -163,13 +163,13 @@ static int binary_smbd_main(int argc, const char *argv[])
|
||||
int max_runtime = 0;
|
||||
struct poptOption long_options[] = {
|
||||
POPT_AUTOHELP
|
||||
POPT_COMMON_SAMBA
|
||||
{"interactive", 'i', POPT_ARG_VAL, &interactive, True,
|
||||
"Run interactive (not a daemon)", NULL},
|
||||
{"model", 'M', POPT_ARG_STRING, &model, True,
|
||||
"Select process model", "MODEL"},
|
||||
{"maximum-runtime", 0, POPT_ARG_INT, &max_runtime, True,
|
||||
"set maximum time for smbd to live", "seconds"},
|
||||
POPT_COMMON_SAMBA
|
||||
POPT_COMMON_VERSION
|
||||
POPT_TABLEEND
|
||||
};
|
||||
@ -180,15 +180,13 @@ static int binary_smbd_main(int argc, const char *argv[])
|
||||
|
||||
poptFreeContext(pc);
|
||||
|
||||
setup_logging(argv[0], interactive?DEBUG_STDOUT:DEBUG_FILE);
|
||||
setup_logging(NULL, interactive?DEBUG_STDOUT:DEBUG_FILE);
|
||||
setup_signals();
|
||||
|
||||
/* we want total control over the permissions on created files,
|
||||
so set our umask to 0 */
|
||||
umask(0);
|
||||
|
||||
reopen_logs();
|
||||
|
||||
DEBUG(0,("smbd version %s started.\n", SAMBA_VERSION_STRING));
|
||||
DEBUGADD(0,("Copyright Andrew Tridgell and the Samba Team 1992-2005\n"));
|
||||
|
||||
@ -197,11 +195,6 @@ static int binary_smbd_main(int argc, const char *argv[])
|
||||
exit(1);
|
||||
}
|
||||
|
||||
lp_load(dyn_CONFIGFILE, False, False, True);
|
||||
|
||||
reopen_logs();
|
||||
load_interfaces();
|
||||
|
||||
if (!interactive) {
|
||||
DEBUG(3,("Becoming a daemon.\n"));
|
||||
become_daemon(True);
|
||||
|
@ -195,10 +195,6 @@ int main(int argc, char *argv[])
|
||||
|
||||
while(poptGetNextOpt(pc) != -1);
|
||||
|
||||
/* the following functions are part of the Samba debugging
|
||||
facilities. See lib/debug.c */
|
||||
setup_logging("smbiconv", DEBUG_STDOUT);
|
||||
|
||||
if (preload_modules[0]) smb_load_modules(preload_modules);
|
||||
|
||||
if(output) {
|
||||
|
@ -2558,8 +2558,6 @@ static void max_runtime_handler(int sig)
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
setup_logging("smbtorture", DEBUG_STDOUT);
|
||||
|
||||
#ifdef HAVE_SETBUFFER
|
||||
setbuffer(stdout, NULL, 0);
|
||||
#endif
|
||||
@ -2604,9 +2602,6 @@ static void max_runtime_handler(int sig)
|
||||
alarm(max_runtime);
|
||||
}
|
||||
|
||||
lp_load(dyn_CONFIGFILE,True,False,False);
|
||||
load_interfaces();
|
||||
|
||||
smbtorture_init_subsystems;
|
||||
|
||||
|
||||
|
@ -121,8 +121,6 @@ static char *stdin_load(TALLOC_CTX *mem_ctx, size_t *size)
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
setup_logging("ndrdump", DEBUG_STDOUT);
|
||||
|
||||
ndrdump_init_subsystems;
|
||||
|
||||
pc = poptGetContext("ndrdump", argc, argv, long_options, 0);
|
||||
|
@ -154,14 +154,12 @@ static int binary_net(int argc, const char **argv)
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
setup_logging("net", DEBUG_STDOUT);
|
||||
|
||||
#ifdef HAVE_SETBUFFER
|
||||
setbuffer(stdout, NULL, 0);
|
||||
#endif
|
||||
|
||||
pc = poptGetContext("net", argc, (const char **) argv, long_options,
|
||||
POPT_CONTEXT_KEEP_FIRST);
|
||||
POPT_CONTEXT_KEEP_FIRST);
|
||||
|
||||
while((opt = poptGetNextOpt(pc)) != -1) {
|
||||
switch (opt) {
|
||||
@ -173,9 +171,6 @@ static int binary_net(int argc, const char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
lp_load(dyn_CONFIGFILE,True,False,False);
|
||||
load_interfaces();
|
||||
|
||||
argv_new = (const char **)poptGetArgs(pc);
|
||||
|
||||
argc_new = argc;
|
||||
|
@ -271,8 +271,6 @@ int main(int argc,char *argv[])
|
||||
{ 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
setup_logging(argv[0], DEBUG_STDOUT);
|
||||
|
||||
pc = poptGetContext("nmblookup", argc, (const char **)argv, long_options,
|
||||
POPT_CONTEXT_KEEP_FIRST);
|
||||
|
||||
@ -288,9 +286,6 @@ int main(int argc,char *argv[])
|
||||
exit(1);
|
||||
}
|
||||
|
||||
lp_load(dyn_CONFIGFILE,True,False,False);
|
||||
load_interfaces();
|
||||
|
||||
while (poptPeekArg(pc)) {
|
||||
const char *name = poptGetArg(pc);
|
||||
|
||||
|
@ -865,13 +865,7 @@ enum {
|
||||
|
||||
/* Samba client initialisation */
|
||||
|
||||
setup_logging("ntlm_auth", DEBUG_STDERR);
|
||||
|
||||
if (!lp_load(dyn_CONFIGFILE, True, False, False)) {
|
||||
d_fprintf(stderr, "wbinfo: error opening config file %s. Error was %s\n",
|
||||
dyn_CONFIGFILE, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
setup_logging(NULL, DEBUG_STDERR);
|
||||
|
||||
/* Parse options */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user