summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2005-06-13 08:12:39 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:18:06 -0500
commit2b4791ae733488845b2c36bca64db695203de571 (patch)
treee6c3836a90b412e61b10d30f3b256092b46811c7
parent8fd5825a890db4f08966e4b262b03fb7868cc4c2 (diff)
downloadsamba-2b4791ae733488845b2c36bca64db695203de571.tar.gz
samba-2b4791ae733488845b2c36bca64db695203de571.tar.bz2
samba-2b4791ae733488845b2c36bca64db695203de571.zip
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 used to be commit 50f3c2b3a22971f40e0d3a88127b5120bfc47591)
-rw-r--r--source4/client/client.c12
-rw-r--r--source4/include/debug.h2
-rw-r--r--source4/lib/cmdline/popt_common.c22
-rw-r--r--source4/lib/debug.c22
-rw-r--r--source4/lib/registry/tools/regdiff.c10
-rw-r--r--source4/lib/registry/tools/regpatch.c10
-rw-r--r--source4/lib/registry/tools/regshell.c11
-rw-r--r--source4/lib/registry/tools/regtree.c10
-rw-r--r--source4/smbd/server.c11
-rw-r--r--source4/torture/smbiconv.c4
-rw-r--r--source4/torture/torture.c5
-rw-r--r--source4/utils/ndrdump.c2
-rw-r--r--source4/utils/net/net.c7
-rw-r--r--source4/utils/nmblookup.c5
-rw-r--r--source4/utils/ntlm_auth.c8
15 files changed, 48 insertions, 93 deletions
diff --git a/source4/client/client.c b/source4/client/client.c
index 34d0fc20f1..afdab5928c 100644
--- a/source4/client/client.c
+++ b/source4/client/client.c
@@ -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)) {
diff --git a/source4/include/debug.h b/source4/include/debug.h
index 166b7c26f5..ccd1c90040 100644
--- a/source4/include/debug.h
+++ b/source4/include/debug.h
@@ -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
diff --git a/source4/lib/cmdline/popt_common.c b/source4/lib/cmdline/popt_common.c
index 94b72c520d..fec85281ef 100644
--- a/source4/lib/cmdline/popt_common.c
+++ b/source4/lib/cmdline/popt_common.c
@@ -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" },
diff --git a/source4/lib/debug.c b/source4/lib/debug.c
index ab012a98aa..a775c46854 100644
--- a/source4/lib/debug.c
+++ b/source4/lib/debug.c
@@ -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();
}
diff --git a/source4/lib/registry/tools/regdiff.c b/source4/lib/registry/tools/regdiff.c
index 4260a56142..f86c0ae383 100644
--- a/source4/lib/registry/tools/regdiff.c
+++ b/source4/lib/registry/tools/regdiff.c
@@ -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);
diff --git a/source4/lib/registry/tools/regpatch.c b/source4/lib/registry/tools/regpatch.c
index 5c9851b71b..02ef4d4655 100644
--- a/source4/lib/registry/tools/regpatch.c
+++ b/source4/lib/registry/tools/regpatch.c
@@ -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 {
diff --git a/source4/lib/registry/tools/regshell.c b/source4/lib/registry/tools/regshell.c
index 03cb09c443..0c53f737b8 100644
--- a/source4/lib/registry/tools/regshell.c
+++ b/source4/lib/registry/tools/regshell.c
@@ -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) {
diff --git a/source4/lib/registry/tools/regtree.c b/source4/lib/registry/tools/regtree.c
index 2cf5f6ab96..f18467b523 100644
--- a/source4/lib/registry/tools/regtree.c
+++ b/source4/lib/registry/tools/regtree.c
@@ -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) {
diff --git a/source4/smbd/server.c b/source4/smbd/server.c
index a08202baab..717de0c523 100644
--- a/source4/smbd/server.c
+++ b/source4/smbd/server.c
@@ -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);
diff --git a/source4/torture/smbiconv.c b/source4/torture/smbiconv.c
index 7ca6bb1c12..0cd16278ee 100644
--- a/source4/torture/smbiconv.c
+++ b/source4/torture/smbiconv.c
@@ -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) {
diff --git a/source4/torture/torture.c b/source4/torture/torture.c
index 98519a3797..a2ca9fc72f 100644
--- a/source4/torture/torture.c
+++ b/source4/torture/torture.c
@@ -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;
diff --git a/source4/utils/ndrdump.c b/source4/utils/ndrdump.c
index eabeaad537..58cdeb13c3 100644
--- a/source4/utils/ndrdump.c
+++ b/source4/utils/ndrdump.c
@@ -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);
diff --git a/source4/utils/net/net.c b/source4/utils/net/net.c
index c7c6f7dec9..51b860234d 100644
--- a/source4/utils/net/net.c
+++ b/source4/utils/net/net.c
@@ -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;
diff --git a/source4/utils/nmblookup.c b/source4/utils/nmblookup.c
index fb21cb5529..900d55d6df 100644
--- a/source4/utils/nmblookup.c
+++ b/source4/utils/nmblookup.c
@@ -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);
diff --git a/source4/utils/ntlm_auth.c b/source4/utils/ntlm_auth.c
index 4c7286a4c1..8e858e2970 100644
--- a/source4/utils/ntlm_auth.c
+++ b/source4/utils/ntlm_auth.c
@@ -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 */