server.c revision f85ae5fce84ad7bdc515c1ec324b9c56cb1a39b2
/*
SSSD
Servers setup routines
Copyright (C) Andrew Tridgell 1992-2005
Copyright (C) Martin Pool 2002
Copyright (C) Jelmer Vernooij 2002
Copyright (C) James J Myers 2003 <myersjj@samba.org>
Copyright (C) Simo Sorce 2008
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdbool.h>
#include <unistd.h>
#include <popt.h>
#include "providers/providers.h"
#include "monitor.h"
struct event_context *ev,
struct confdb_ctx *cdb);
{
return;
}
{
#if HAVE_GETPGRP
static int done_sigterm;
DEBUG(0,("SIGTERM: killing children\n"));
done_sigterm = 1;
}
#endif
exit(0);
}
/*
setup signal masks
*/
static void setup_signals(void)
{
/* we are never interested in SIGPIPE */
BlockSignals(true, SIGPIPE);
#if defined(SIGFPE)
/* we are never interested in SIGFPE */
BlockSignals(true, SIGFPE);
#endif
/* We are no longer interested in USR1 */
BlockSignals(true, SIGUSR1);
#if defined(SIGUSR2)
/* We are no longer interested in USR2 */
BlockSignals(true, SIGUSR2);
#endif
/* POSIX demands that signals are inherited. If the invoking process has
* these signals masked, we will have problems, as we won't recieve them. */
BlockSignals(false, SIGHUP);
BlockSignals(false, SIGTERM);
}
/*
handle io on stdin
*/
{
const char *binary_name = (const char *)private;
uint8_t c;
if (read(0, &c, 1) == 0) {
#if HAVE_GETPGRP
}
#endif
exit(0);
}
}
/*
main server.
*/
{
bool opt_daemon = false;
bool opt_interactive = false;
int opt;
struct event_context *event_ctx;
struct confdb_ctx *confdb_ctx;
bool is_monitor = false;
debug_prg_name = argv[0];
enum {
OPT_DAEMON = 1000,
};
struct poptOption long_options[] = {
"Become a daemon (default)", NULL },
"Run interactive (not a daemon)", NULL},
"Executes a specific service instead of the monitor", NULL},
"Executes a specific service instead of the monitor", NULL},
{ NULL }
};
switch(opt) {
case OPT_DAEMON:
opt_daemon = true;
break;
case OPT_INTERACTIVE:
opt_interactive = true;
break;
default:
return 1;
}
}
if (!service) {
return 5;
}
if (is_monitor) {
if (opt_daemon && opt_interactive) {
"Option -i|--interactive is not allowed together with -D|--daemon\n\n");
return 1;
} else if (!opt_interactive) {
/* default is --daemon */
opt_daemon = true;
}
} else {
if (opt_daemon || opt_interactive) {
"Options -i or -D not allowed with -s (service)\n\n");
return 1;
}
}
/* we want default permissions on created files to be very strict,
so set our umask to 0177 */
umask(0177);
if (opt_daemon) {
become_daemon(true);
return 1;
}
}
/* the event context is the top level structure.
* Everything else should hang off that */
DEBUG(0,("The event context initialiaziton failed\n"));
return 1;
}
DEBUG(0,("Out of memory, aborting!\n"));
return 1;
}
DEBUG(0,("The confdb initialization failed\n"));
return 1;
}
if (opt_interactive) {
/* terminate when stdin goes away */
} else {
/* stay alive forever */
stdin_event_flags = 0;
}
/* catch EOF on stdin */
#ifdef SIGTTIN
#endif
discard_const(argv[0]));
/* What are we asked to run ? */
if (is_monitor) {
/* the monitor */
} else {
} else {
"\nERROR: Unknown Service specified [%s]\n",
service);
}
}
/* wait for events - this is where smbd sits for most of its
life */
/* as everything hangs off this event context, freeing it
should initiate a clean shutdown of all services */
return 0;
}