Merge branch 'lw/daemon-log-destination'
The log from "git daemon" can be redirected with a new option; one relevant use case is to send the log to standard error (instead of syslog) when running it from inetd. * lw/daemon-log-destination: daemon: add --log-destination=(stderr|syslog|none)
This commit is contained in:
commit
c2bd43d66d
@ -20,6 +20,7 @@ SYNOPSIS
|
|||||||
[--inetd |
|
[--inetd |
|
||||||
[--listen=<host_or_ipaddr>] [--port=<n>]
|
[--listen=<host_or_ipaddr>] [--port=<n>]
|
||||||
[--user=<user> [--group=<group>]]]
|
[--user=<user> [--group=<group>]]]
|
||||||
|
[--log-destination=(stderr|syslog|none)]
|
||||||
[<directory>...]
|
[<directory>...]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
@ -80,7 +81,8 @@ OPTIONS
|
|||||||
do not have the 'git-daemon-export-ok' file.
|
do not have the 'git-daemon-export-ok' file.
|
||||||
|
|
||||||
--inetd::
|
--inetd::
|
||||||
Have the server run as an inetd service. Implies --syslog.
|
Have the server run as an inetd service. Implies --syslog (may be
|
||||||
|
overridden with `--log-destination=`).
|
||||||
Incompatible with --detach, --port, --listen, --user and --group
|
Incompatible with --detach, --port, --listen, --user and --group
|
||||||
options.
|
options.
|
||||||
|
|
||||||
@ -110,8 +112,28 @@ OPTIONS
|
|||||||
zero for no limit.
|
zero for no limit.
|
||||||
|
|
||||||
--syslog::
|
--syslog::
|
||||||
Log to syslog instead of stderr. Note that this option does not imply
|
Short for `--log-destination=syslog`.
|
||||||
--verbose, thus by default only error conditions will be logged.
|
|
||||||
|
--log-destination=<destination>::
|
||||||
|
Send log messages to the specified destination.
|
||||||
|
Note that this option does not imply --verbose,
|
||||||
|
thus by default only error conditions will be logged.
|
||||||
|
The <destination> must be one of:
|
||||||
|
+
|
||||||
|
--
|
||||||
|
stderr::
|
||||||
|
Write to standard error.
|
||||||
|
Note that if `--detach` is specified,
|
||||||
|
the process disconnects from the real standard error,
|
||||||
|
making this destination effectively equivalent to `none`.
|
||||||
|
syslog::
|
||||||
|
Write to syslog, using the `git-daemon` identifier.
|
||||||
|
none::
|
||||||
|
Disable all logging.
|
||||||
|
--
|
||||||
|
+
|
||||||
|
The default destination is `syslog` if `--inetd` or `--detach` is specified,
|
||||||
|
otherwise `stderr`.
|
||||||
|
|
||||||
--user-path::
|
--user-path::
|
||||||
--user-path=<path>::
|
--user-path=<path>::
|
||||||
|
46
daemon.c
46
daemon.c
@ -9,7 +9,12 @@
|
|||||||
#define initgroups(x, y) (0) /* nothing */
|
#define initgroups(x, y) (0) /* nothing */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int log_syslog;
|
static enum log_destination {
|
||||||
|
LOG_DESTINATION_UNSET = -1,
|
||||||
|
LOG_DESTINATION_NONE = 0,
|
||||||
|
LOG_DESTINATION_STDERR = 1,
|
||||||
|
LOG_DESTINATION_SYSLOG = 2,
|
||||||
|
} log_destination = LOG_DESTINATION_UNSET;
|
||||||
static int verbose;
|
static int verbose;
|
||||||
static int reuseaddr;
|
static int reuseaddr;
|
||||||
static int informative_errors;
|
static int informative_errors;
|
||||||
@ -25,6 +30,7 @@ static const char daemon_usage[] =
|
|||||||
" [--access-hook=<path>]\n"
|
" [--access-hook=<path>]\n"
|
||||||
" [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>]\n"
|
" [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>]\n"
|
||||||
" [--detach] [--user=<user> [--group=<group>]]\n"
|
" [--detach] [--user=<user> [--group=<group>]]\n"
|
||||||
|
" [--log-destination=(stderr|syslog|none)]\n"
|
||||||
" [<directory>...]";
|
" [<directory>...]";
|
||||||
|
|
||||||
/* List of acceptable pathname prefixes */
|
/* List of acceptable pathname prefixes */
|
||||||
@ -74,11 +80,14 @@ static const char *get_ip_address(struct hostinfo *hi)
|
|||||||
|
|
||||||
static void logreport(int priority, const char *err, va_list params)
|
static void logreport(int priority, const char *err, va_list params)
|
||||||
{
|
{
|
||||||
if (log_syslog) {
|
switch (log_destination) {
|
||||||
|
case LOG_DESTINATION_SYSLOG: {
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
vsnprintf(buf, sizeof(buf), err, params);
|
vsnprintf(buf, sizeof(buf), err, params);
|
||||||
syslog(priority, "%s", buf);
|
syslog(priority, "%s", buf);
|
||||||
} else {
|
break;
|
||||||
|
}
|
||||||
|
case LOG_DESTINATION_STDERR:
|
||||||
/*
|
/*
|
||||||
* Since stderr is set to buffered mode, the
|
* Since stderr is set to buffered mode, the
|
||||||
* logging of different processes will not overlap
|
* logging of different processes will not overlap
|
||||||
@ -88,6 +97,11 @@ static void logreport(int priority, const char *err, va_list params)
|
|||||||
vfprintf(stderr, err, params);
|
vfprintf(stderr, err, params);
|
||||||
fputc('\n', stderr);
|
fputc('\n', stderr);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
break;
|
||||||
|
case LOG_DESTINATION_NONE:
|
||||||
|
break;
|
||||||
|
case LOG_DESTINATION_UNSET:
|
||||||
|
BUG("log destination not initialized correctly");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1286,7 +1300,6 @@ int cmd_main(int argc, const char **argv)
|
|||||||
}
|
}
|
||||||
if (!strcmp(arg, "--inetd")) {
|
if (!strcmp(arg, "--inetd")) {
|
||||||
inetd_mode = 1;
|
inetd_mode = 1;
|
||||||
log_syslog = 1;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "--verbose")) {
|
if (!strcmp(arg, "--verbose")) {
|
||||||
@ -1294,9 +1307,22 @@ int cmd_main(int argc, const char **argv)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "--syslog")) {
|
if (!strcmp(arg, "--syslog")) {
|
||||||
log_syslog = 1;
|
log_destination = LOG_DESTINATION_SYSLOG;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (skip_prefix(arg, "--log-destination=", &v)) {
|
||||||
|
if (!strcmp(v, "syslog")) {
|
||||||
|
log_destination = LOG_DESTINATION_SYSLOG;
|
||||||
|
continue;
|
||||||
|
} else if (!strcmp(v, "stderr")) {
|
||||||
|
log_destination = LOG_DESTINATION_STDERR;
|
||||||
|
continue;
|
||||||
|
} else if (!strcmp(v, "none")) {
|
||||||
|
log_destination = LOG_DESTINATION_NONE;
|
||||||
|
continue;
|
||||||
|
} else
|
||||||
|
die("unknown log destination '%s'", v);
|
||||||
|
}
|
||||||
if (!strcmp(arg, "--export-all")) {
|
if (!strcmp(arg, "--export-all")) {
|
||||||
export_all_trees = 1;
|
export_all_trees = 1;
|
||||||
continue;
|
continue;
|
||||||
@ -1353,7 +1379,6 @@ int cmd_main(int argc, const char **argv)
|
|||||||
}
|
}
|
||||||
if (!strcmp(arg, "--detach")) {
|
if (!strcmp(arg, "--detach")) {
|
||||||
detach = 1;
|
detach = 1;
|
||||||
log_syslog = 1;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (skip_prefix(arg, "--user=", &v)) {
|
if (skip_prefix(arg, "--user=", &v)) {
|
||||||
@ -1399,7 +1424,14 @@ int cmd_main(int argc, const char **argv)
|
|||||||
usage(daemon_usage);
|
usage(daemon_usage);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (log_syslog) {
|
if (log_destination == LOG_DESTINATION_UNSET) {
|
||||||
|
if (inetd_mode || detach)
|
||||||
|
log_destination = LOG_DESTINATION_SYSLOG;
|
||||||
|
else
|
||||||
|
log_destination = LOG_DESTINATION_STDERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log_destination == LOG_DESTINATION_SYSLOG) {
|
||||||
openlog("git-daemon", LOG_PID, LOG_DAEMON);
|
openlog("git-daemon", LOG_PID, LOG_DAEMON);
|
||||||
set_die_routine(daemon_die);
|
set_die_routine(daemon_die);
|
||||||
} else
|
} else
|
||||||
|
Loading…
Reference in New Issue
Block a user