summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Jaeger <aj@suse.de>2012-05-09 16:54:38 +0200
committerAndreas Jaeger <aj@suse.de>2012-05-09 16:54:38 +0200
commitbb90b80baa683336584716122f529b039c48d3af (patch)
treeda09c7c3b2c6aafe2da66c44b871790eb99271a9
parent1a4b75a190006bb013a61f2031a4de86e93a629f (diff)
downloadglibc-bb90b80baa683336584716122f529b039c48d3af.tar.gz
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.
-rw-r--r--ChangeLog10
-rw-r--r--nscd/nscd.c59
2 files changed, 53 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 99283e2f82..7cee81a624 100644
--- a/ChangeLog
+++ b/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>
[BZ #14083]
diff --git a/nscd/nscd.c b/nscd/nscd.c
index 9cd7273bbf..38a1421082 100644
--- a/nscd/nscd.c
+++ b/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.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
@@ -71,7 +71,19 @@ thread_info_t thread_info;
int do_shutdown;
int disabled_passwd;
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;
@@ -103,6 +115,8 @@ static const struct argp_option options[] =
N_("Read configuration data from NAME") },
{ "debug", 'd', NULL, 0,
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") },
{ "shutdown", 'K', NULL, 0, N_("Shut the server down") },
{ "statistics", 'g', NULL, 0, N_("Print current configuration statistics") },
@@ -173,16 +187,22 @@ main (int argc, char **argv)
/* Determine page size. */
pagesize_m1 = getpagesize () - 1;
- /* Behave like a daemon. */
- if (go_background)
+ if ((run_mode == RUN_DAEMONIZE) || (run_mode == RUN_FOREGROUND))
{
int i;
+ pid_t pid;
- pid_t pid = fork ();
- if (pid == -1)
- error (EXIT_FAILURE, errno, _("cannot fork"));
- if (pid != 0)
- exit (0);
+ /* Behave like a daemon. */
+ if (run_mode == RUN_DAEMONIZE)
+ {
+ pid = fork ();
+ 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);
if (nullfd != -1)
@@ -233,11 +253,14 @@ main (int argc, char **argv)
for (i = min_close_fd; i < getdtablesize (); i++)
close (i);
- pid = fork ();
- if (pid == -1)
- error (EXIT_FAILURE, errno, _("cannot fork"));
- if (pid != 0)
- exit (0);
+ if (run_mode == RUN_DAEMONIZE)
+ {
+ pid = fork ();
+ if (pid == -1)
+ error (EXIT_FAILURE, errno, _("cannot fork"));
+ if (pid != 0)
+ exit (0);
+ }
setsid ();
@@ -259,7 +282,7 @@ main (int argc, char **argv)
signal (SIGTSTP, SIG_IGN);
}
else
- /* In foreground mode we are not paranoid. */
+ /* In debug mode we are not paranoid. */
paranoia = 0;
signal (SIGINT, termination_handler);
@@ -308,7 +331,11 @@ parse_opt (int key, char *arg, struct argp_state *state)
{
case 'd':
++debug_level;
- go_background = 0;
+ run_mode = RUN_DEBUG;
+ break;
+
+ case 'F':
+ run_mode = RUN_FOREGROUND;
break;
case 'f':