mirror of git://sourceware.org/git/glibc.git
Add --foreground option for nscd
For a better integration of nscd with systemd, we should run nscd not as daemon but in the foreground. A new --foreground option should be added. 2012-05-09 Alexandre Oliva <aoliva@redhat.com> Andreas Jaeger <aj@suse.de> * nscd/nscd.c (go_background): Replaced with... (run_mode): ... this. (RUN_FOREGROUND, RUN_DAEMONIZE, RUN_DEBUG): Add. (options): Add -F --foreground. (main): Implement it. (parse_opt): Parse it.
This commit is contained in:
parent
1a4b75a190
commit
bb90b80baa
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2012-05-09 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
|
* nscd/nscd.c (go_background): Replaced with...
|
||||||
|
(run_mode): ... this.
|
||||||
|
(RUN_FOREGROUND, RUN_DAEMONIZE, RUN_DEBUG): Add.
|
||||||
|
(options): Add -F --foreground.
|
||||||
|
(main): Implement it.
|
||||||
|
(parse_opt): Parse it.
|
||||||
|
|
||||||
2012-05-09 Andreas Jaeger <aj@suse.de>
|
2012-05-09 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
[BZ #14083]
|
[BZ #14083]
|
||||||
|
|
59
nscd/nscd.c
59
nscd/nscd.c
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (c) 1998-2011, 2012 Free Software Foundation, Inc.
|
/* Copyright (c) 1998-2012 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
|
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
|
||||||
|
|
||||||
|
@ -71,7 +71,19 @@ thread_info_t thread_info;
|
||||||
int do_shutdown;
|
int do_shutdown;
|
||||||
int disabled_passwd;
|
int disabled_passwd;
|
||||||
int disabled_group;
|
int disabled_group;
|
||||||
int go_background = 1;
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
/* Running in foreground but otherwise behave like a daemon,
|
||||||
|
i.e., detach from terminal and use syslog. This allows
|
||||||
|
better integration with services like systemd. */
|
||||||
|
RUN_FOREGROUND,
|
||||||
|
/* Running in background as daemon. */
|
||||||
|
RUN_DAEMONIZE,
|
||||||
|
/* Run in foreground in debug mode. */
|
||||||
|
RUN_DEBUG
|
||||||
|
};
|
||||||
|
static int run_mode = RUN_DAEMONIZE;
|
||||||
|
|
||||||
static const char *conffile = _PATH_NSCDCONF;
|
static const char *conffile = _PATH_NSCDCONF;
|
||||||
|
|
||||||
|
@ -103,6 +115,8 @@ static const struct argp_option options[] =
|
||||||
N_("Read configuration data from NAME") },
|
N_("Read configuration data from NAME") },
|
||||||
{ "debug", 'd', NULL, 0,
|
{ "debug", 'd', NULL, 0,
|
||||||
N_("Do not fork and display messages on the current tty") },
|
N_("Do not fork and display messages on the current tty") },
|
||||||
|
{ "foreground", 'F', NULL, 0,
|
||||||
|
N_("Do not fork, but otherwise behave like a deamon") },
|
||||||
{ "nthreads", 't', N_("NUMBER"), 0, N_("Start NUMBER threads") },
|
{ "nthreads", 't', N_("NUMBER"), 0, N_("Start NUMBER threads") },
|
||||||
{ "shutdown", 'K', NULL, 0, N_("Shut the server down") },
|
{ "shutdown", 'K', NULL, 0, N_("Shut the server down") },
|
||||||
{ "statistics", 'g', NULL, 0, N_("Print current configuration statistics") },
|
{ "statistics", 'g', NULL, 0, N_("Print current configuration statistics") },
|
||||||
|
@ -173,16 +187,22 @@ main (int argc, char **argv)
|
||||||
/* Determine page size. */
|
/* Determine page size. */
|
||||||
pagesize_m1 = getpagesize () - 1;
|
pagesize_m1 = getpagesize () - 1;
|
||||||
|
|
||||||
/* Behave like a daemon. */
|
if ((run_mode == RUN_DAEMONIZE) || (run_mode == RUN_FOREGROUND))
|
||||||
if (go_background)
|
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
pid_t pid = fork ();
|
/* Behave like a daemon. */
|
||||||
if (pid == -1)
|
if (run_mode == RUN_DAEMONIZE)
|
||||||
error (EXIT_FAILURE, errno, _("cannot fork"));
|
{
|
||||||
if (pid != 0)
|
pid = fork ();
|
||||||
exit (0);
|
if (pid == -1)
|
||||||
|
error (EXIT_FAILURE, errno, _("cannot fork"));
|
||||||
|
if (pid != 0)
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fprintf (stderr, _("further output sent to syslog\n"));
|
||||||
|
|
||||||
int nullfd = open (_PATH_DEVNULL, O_RDWR);
|
int nullfd = open (_PATH_DEVNULL, O_RDWR);
|
||||||
if (nullfd != -1)
|
if (nullfd != -1)
|
||||||
|
@ -233,11 +253,14 @@ main (int argc, char **argv)
|
||||||
for (i = min_close_fd; i < getdtablesize (); i++)
|
for (i = min_close_fd; i < getdtablesize (); i++)
|
||||||
close (i);
|
close (i);
|
||||||
|
|
||||||
pid = fork ();
|
if (run_mode == RUN_DAEMONIZE)
|
||||||
if (pid == -1)
|
{
|
||||||
error (EXIT_FAILURE, errno, _("cannot fork"));
|
pid = fork ();
|
||||||
if (pid != 0)
|
if (pid == -1)
|
||||||
exit (0);
|
error (EXIT_FAILURE, errno, _("cannot fork"));
|
||||||
|
if (pid != 0)
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
setsid ();
|
setsid ();
|
||||||
|
|
||||||
|
@ -259,7 +282,7 @@ main (int argc, char **argv)
|
||||||
signal (SIGTSTP, SIG_IGN);
|
signal (SIGTSTP, SIG_IGN);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* In foreground mode we are not paranoid. */
|
/* In debug mode we are not paranoid. */
|
||||||
paranoia = 0;
|
paranoia = 0;
|
||||||
|
|
||||||
signal (SIGINT, termination_handler);
|
signal (SIGINT, termination_handler);
|
||||||
|
@ -308,7 +331,11 @@ parse_opt (int key, char *arg, struct argp_state *state)
|
||||||
{
|
{
|
||||||
case 'd':
|
case 'd':
|
||||||
++debug_level;
|
++debug_level;
|
||||||
go_background = 0;
|
run_mode = RUN_DEBUG;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'F':
|
||||||
|
run_mode = RUN_FOREGROUND;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'f':
|
case 'f':
|
||||||
|
|
Loading…
Reference in New Issue