<cmdsynopsis>
<command>nmbd</command>
<arg choice="opt">-D</arg>
+ <arg choice="opt">-F</arg>
+ <arg choice="opt">-S</arg>
<arg choice="opt">-a</arg>
<arg choice="opt">-i</arg>
<arg choice="opt">-o</arg>
</para></listitem>
</varlistentry>
+ <varlistentry>
+ <term>-F</term>
+ <listitem><para>If specified, this parameter causes
+ the main <command>nmbd</command> process to not daemonize,
+ i.e. double-fork and disassociate with the terminal.
+ Child processes are still created as normal to service
+ each connection request, but the main process does not
+ exit. This operation mode is suitable for running
+ <command>nmbd</command> under process supervisors such
+ as <command>supervise</command> and <command>svscan</command>
+ from Daniel J. Bernstein's <command>daemontools</command>
+ package, or the AIX process monitor.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-S</term>
+ <listitem><para>If specified, this parameter causes
+ <command>nmbd</command> to log to standard output rather
+ than a file.</para></listitem>
+ </varlistentry>
+
<varlistentry>
<term>-a</term>
<listitem><para>If this parameter is specified, each new
server to run "interactively", not as a daemon, even if the
server is executed on the command line of a shell. Setting this
parameter negates the implicit daemon mode when run from the
- command line.
- </para></listitem>
+ command line. <command>nmbd</command> also logs to standard
+ output, as if the <command>-S</command> parameter had been
+ given. </para></listitem>
</varlistentry>
<varlistentry>
<cmdsynopsis>
<command>smbd</command>
<arg choice="opt">-D</arg>
+ <arg choice="opt">-F</arg>
+ <arg choice="opt">-S</arg>
<arg choice="opt">-i</arg>
<arg choice="opt">-h</arg>
<arg choice="opt">-V</arg>
</para></listitem>
</varlistentry>
+ <varlistentry>
+ <term>-F</term>
+ <listitem><para>If specified, this parameter causes
+ the main <command>smbd</command> process to not daemonize,
+ i.e. double-fork and disassociate with the terminal.
+ Child processes are still created as normal to service
+ each connection request, but the main process does not
+ exit. This operation mode is suitable for running
+ <command>smbd</command> under process supervisors such
+ as <command>supervise</command> and <command>svscan</command>
+ from Daniel J. Bernstein's <command>daemontools</command>
+ package, or the AIX process monitor.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-S</term>
+ <listitem><para>If specified, this parameter causes
+ <command>smbd</command> to log to standard output rather
+ than a file.</para></listitem>
+ </varlistentry>
+
<varlistentry>
<term>-i</term>
<listitem><para>If this parameter is specified it causes the
server to run "interactively", not as a daemon, even if the
server is executed on the command line of a shell. Setting this
parameter negates the implicit deamon mode when run from the
- command line.
+ command line. <command>smbd</command> also logs to standard
+ output, as if the <command>-S</command> parameter had been
+ given. </para></listitem>
</para></listitem>
</varlistentry>
<refsynopsisdiv>
<cmdsynopsis>
<command>winbindd</command>
+ <arg choice="opt">-F</arg>
+ <arg choice="opt">-S</arg>
<arg choice="opt">-i</arg>
<arg choice="opt">-B</arg>
<arg choice="opt">-d <debug level></arg>
<title>OPTIONS</title>
<variablelist>
+ <varlistentry>
+ <term>-F</term>
+ <listitem><para>If specified, this parameter causes
+ the main <command>winbindd</command> process to not daemonize,
+ i.e. double-fork and disassociate with the terminal.
+ Child processes are still created as normal to service
+ each connection request, but the main process does not
+ exit. This operation mode is suitable for running
+ <command>winbindd</command> under process supervisors such
+ as <command>supervise</command> and <command>svscan</command>
+ from Daniel J. Bernstein's <command>daemontools</command>
+ package, or the AIX process monitor.
+ </para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>-S</term>
+ <listitem><para>If specified, this parameter causes
+ <command>winbindd</command> to log to standard output rather
+ than a file.</para></listitem>
+ </varlistentry>
+
<varlistentry>
<term>-d debuglevel</term>
<listitem><para>Sets the debuglevel to an integer between
<listitem><para>Tells <command>winbindd</command> to not
become a daemon and detach from the current terminal. This
option is used by developers when interactive debugging
- of <command>winbindd</command> is required. </para></listitem>
+ of <command>winbindd</command> is required.
+ <command>winbindd</command> also logs to standard output,
+ as if the <command>-S</command> parameter had been given.
+ </para></listitem>
</varlistentry>
<varlistentry>
if (interactive) {
stdout_logging = True;
dbf = x_stdout;
+ x_setbuf( x_stdout, NULL );
}
#ifdef WITH_SYSLOG
else {
Become a daemon, discarding the controlling terminal.
****************************************************************************/
-void become_daemon(void)
+void become_daemon(BOOL Fork)
{
- if (sys_fork())
- _exit(0);
+ if (Fork) {
+ if (sys_fork()) {
+ _exit(0);
+ }
+ }
/* detach from the terminal */
#ifdef HAVE_SETSID
/* are we running as a daemon ? */
static BOOL is_daemon = False;
+/* fork or run in foreground ? */
+static BOOL Fork = True;
+
+/* log to standard output ? */
+static BOOL log_stdout = False;
+
/* have we found LanMan clients yet? */
BOOL found_lm_clients = False;
POPT_AUTOHELP
{"daemon", 'D', POPT_ARG_VAL, &is_daemon, True, "Become a daemon(default)" },
{"interactive", 'i', POPT_ARG_VAL, &opt_interactive, True, "Run interactive (not a daemon)" },
+ {"foreground", 'F', POPT_ARG_VAL, &Fork, False, "Run daemon in foreground (for daemontools & etc)" },
+ {"log-stdout", 'S', POPT_ARG_VAL, &log_stdout, True, "Log to stdout" },
{"hosts", 'H', POPT_ARG_STRING, dyn_LMHOSTSFILE, 'H', "Load a netbios hosts file"},
{"port", 'p', POPT_ARG_INT, &global_nmb_port, NMB_PORT, "Listen on the specified port" },
{NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_debug },
{ }
poptFreeContext(pc);
-
- setup_logging( argv[0], opt_interactive );
+
+ if ( opt_interactive ) {
+ Fork = False;
+ log_stdout = True;
+ }
+
+ if ( log_stdout && Fork ) {
+ DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
+ exit(1);
+ }
+
+ setup_logging( argv[0], log_stdout );
reopen_logs();
if (is_daemon && !opt_interactive)
{
DEBUG( 2, ( "Becoming a daemon.\n" ) );
- become_daemon();
+ become_daemon(Fork);
}
#if HAVE_SETPGID
static void usage(void)
{
printf("Usage: winbindd [options]\n");
+ printf("\t-F daemon in foreground mode\n");
+ printf("\t-S log to stdout\n");
printf("\t-i interactive mode\n");
printf("\t-B dual daemon mode\n");
printf("\t-n disable cacheing\n");
extern BOOL AllowDebugChange;
pstring logfile;
BOOL interactive = False;
+ BOOL Fork = True;
+ BOOL log_stdout = False;
int opt;
/* glibc (?) likes to print "User defined signal 1" and exit if a
/* Initialise samba/rpc client stuff */
- while ((opt = getopt(argc, argv, "id:s:nhB")) != EOF) {
+ while ((opt = getopt(argc, argv, "FSid:s:nhB")) != EOF) {
switch (opt) {
+ case 'F':
+ Fork = False;
+ break;
+ case 'S':
+ log_stdout = True;
+ break;
/* Don't become a daemon */
case 'i':
interactive = True;
+ log_stdout = True;
+ Fork = False;
break;
/* dual daemon system */
}
}
+ if (log_stdout && Fork) {
+ printf("Can't log to stdout (-S) unless daemon is in foreground +(-F) or interactive (-i)\n");
+ usage();
+ exit(1);
+ }
+
snprintf(logfile, sizeof(logfile), "%s/log.winbindd", dyn_LOGFILEBASE);
lp_set_logfile(logfile);
- setup_logging("winbindd", interactive);
+ setup_logging("winbindd", log_stdout);
reopen_logs();
DEBUG(1, ("winbindd version %s started.\n", VERSION ) );
exit(1);
if (!interactive) {
- become_daemon();
+ become_daemon(Fork);
pidfile_create("winbindd");
}
/* shall I run as a daemon */
static BOOL is_daemon = False;
static BOOL interactive = False;
+ static BOOL Fork = True;
+ static BOOL log_stdout = False;
static char *ports = NULL;
int opt;
poptContext pc;
POPT_AUTOHELP
{"daemon", 'D', POPT_ARG_VAL, &is_daemon, True, "Become a daemon (default)" },
{"interactive", 'i', POPT_ARG_VAL, &interactive, True, "Run interactive (not a daemon)"},
+ {"foreground", 'F', POPT_ARG_VAL, &Fork, False, "Run daemon in foreground (for daemontools & etc)" },
+ {"log-stdout", 'S', POPT_ARG_VAL, &log_stdout, True, "Log to stdout" },
{"build-options", 'b', POPT_ARG_NONE, NULL, 'b', "Print build options" },
{"port", 'p', POPT_ARG_STRING, &ports, 0, "Listen on the specified ports"},
{NULL, 0, POPT_ARG_INCLUDE_TABLE, popt_common_debug},
set_remote_machine_name("smbd");
- setup_logging(argv[0],interactive);
+ if (interactive) {
+ Fork = False;
+ log_stdout = True;
+ }
+
+ if (log_stdout && Fork) {
+ DEBUG(0,("ERROR: Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n"));
+ exit(1);
+ }
+
+ setup_logging(argv[0],log_stdout);
/* we want to re-seed early to prevent time delays causing
client problems at a later date. (tridge) */
if (is_daemon && !interactive) {
DEBUG( 3, ( "Becoming a daemon.\n" ) );
- become_daemon();
+ become_daemon(Fork);
}
#if HAVE_SETPGID
slprintf(binfile, sizeof(pstring) - 1, "%s/smbd", dyn_SBINDIR);
- become_daemon();
+ become_daemon(True);
execl(binfile, binfile, "-D", NULL);
slprintf(binfile, sizeof(pstring) - 1, "%s/nmbd", dyn_SBINDIR);
- become_daemon();
+ become_daemon(True);
execl(binfile, binfile, "-D", NULL);
slprintf(binfile, sizeof(pstring) - 1, "%s/winbindd", dyn_SBINDIR);
- become_daemon();
+ become_daemon(True);
execl(binfile, binfile, NULL);
static void usage(char *pname)
{
- d_printf("Usage: %s [-DaioPh?V] [-d debuglevel] [-l log basename] [-p port]\n", pname);
+ d_printf("Usage: %s [-DFSaioPh?V] [-d debuglevel] [-l log basename] [-p port]\n", pname);
d_printf(" [-O socket options] [-s services file]\n");
d_printf("\t-D Become a daemon (default)\n");
+ d_printf("\t-F Run daemon in foreground (for daemontools, etc)\n");
+ d_printf("\t-S Log to stdout\n");
d_printf("\t-a Append to log file (default)\n");
d_printf("\t-i Run interactive (not a daemon)\n" );
d_printf("\t-o Overwrite log file, don't append\n");
BOOL is_daemon = False;
BOOL interactive = False;
BOOL specified_logfile = False;
+ BOOL Fork = True;
+ BOOL log_stdout = False;
int opt;
pstring logfile;
argc--;
}
- while ( EOF != (opt = getopt(argc, argv, "O:l:s:d:Dp:h?Vaiof:")) )
+ while ( EOF != (opt = getopt(argc, argv, "FSO:l:s:d:Dp:h?Vaiof:")) )
switch (opt) {
+ case 'F':
+ Fork = False;
+ break;
+ case 'S':
+ log_stdout = True;
+ break;
case 'O':
pstrcpy(user_socket_options,optarg);
break;
case 'i':
interactive = True;
+ Fork = False;
+ log_stdout = True;
break;
case 'D':
usage(argv[0]);
exit(1);
}
+ if (log_stdout && Fork) {
+ d_printf("Can't log to stdout (-S) unless daemon is in foreground (-F) or interactive (-i)\n");
+ usage(argv[0]);
+ exit(1);
+ }
#ifdef HAVE_SETLUID
/* needed for SecureWare on SCO */
set_remote_machine_name("wrepld");
- setup_logging(argv[0],interactive);
+ setup_logging(argv[0],log_stdout);
/* we want to re-seed early to prevent time delays causing
client problems at a later date. (tridge) */
if (is_daemon && !interactive) {
DEBUG( 3, ( "Becoming a daemon.\n" ) );
- become_daemon();
+ become_daemon(Fork);
}
#if HAVE_SETPGID