syslogd: don't die if remote host's IP cannot be resolved.
retry resolutions every two minutes instead. function old new delta syslogd_main 865 904 +39 timestamp_and_log 324 313 -11 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 39/-11) Total: 28 bytes
This commit is contained in:
parent
fb0eba706c
commit
4f2e8bc765
@ -42,7 +42,10 @@
|
|||||||
* (semaphores are down but do_mark routine tries to down them again) */
|
* (semaphores are down but do_mark routine tries to down them again) */
|
||||||
#undef SYSLOGD_MARK
|
#undef SYSLOGD_MARK
|
||||||
|
|
||||||
enum { MAX_READ = 256 };
|
enum {
|
||||||
|
MAX_READ = 256,
|
||||||
|
DNS_WAIT_SEC = 2 * 60,
|
||||||
|
};
|
||||||
|
|
||||||
/* Semaphore operation structures */
|
/* Semaphore operation structures */
|
||||||
struct shbuf_ds {
|
struct shbuf_ds {
|
||||||
@ -86,6 +89,12 @@ struct init_globals {
|
|||||||
|
|
||||||
struct globals {
|
struct globals {
|
||||||
GLOBALS
|
GLOBALS
|
||||||
|
|
||||||
|
#if ENABLE_FEATURE_REMOTE_LOG
|
||||||
|
unsigned last_dns_resolve;
|
||||||
|
char *remoteAddrStr;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLE_FEATURE_IPC_SYSLOG
|
#if ENABLE_FEATURE_IPC_SYSLOG
|
||||||
struct shbuf_ds *shbuf;
|
struct shbuf_ds *shbuf;
|
||||||
#endif
|
#endif
|
||||||
@ -128,6 +137,9 @@ static const struct init_globals init_data = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define G (*ptr_to_globals)
|
#define G (*ptr_to_globals)
|
||||||
|
#define INIT_G() do { \
|
||||||
|
PTR_TO_GLOBALS = memcpy(xzalloc(sizeof(G)), &init_data, sizeof(init_data)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
/* Options */
|
/* Options */
|
||||||
@ -140,7 +152,7 @@ enum {
|
|||||||
USE_FEATURE_ROTATE_LOGFILE(OPTBIT_filesize ,) // -s
|
USE_FEATURE_ROTATE_LOGFILE(OPTBIT_filesize ,) // -s
|
||||||
USE_FEATURE_ROTATE_LOGFILE(OPTBIT_rotatecnt ,) // -b
|
USE_FEATURE_ROTATE_LOGFILE(OPTBIT_rotatecnt ,) // -b
|
||||||
USE_FEATURE_REMOTE_LOG( OPTBIT_remote ,) // -R
|
USE_FEATURE_REMOTE_LOG( OPTBIT_remote ,) // -R
|
||||||
USE_FEATURE_REMOTE_LOG( OPTBIT_localtoo ,) // -L
|
USE_FEATURE_REMOTE_LOG( OPTBIT_locallog ,) // -L
|
||||||
USE_FEATURE_IPC_SYSLOG( OPTBIT_circularlog,) // -C
|
USE_FEATURE_IPC_SYSLOG( OPTBIT_circularlog,) // -C
|
||||||
|
|
||||||
OPT_mark = 1 << OPTBIT_mark ,
|
OPT_mark = 1 << OPTBIT_mark ,
|
||||||
@ -151,7 +163,7 @@ enum {
|
|||||||
OPT_filesize = USE_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_filesize )) + 0,
|
OPT_filesize = USE_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_filesize )) + 0,
|
||||||
OPT_rotatecnt = USE_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_rotatecnt )) + 0,
|
OPT_rotatecnt = USE_FEATURE_ROTATE_LOGFILE((1 << OPTBIT_rotatecnt )) + 0,
|
||||||
OPT_remotelog = USE_FEATURE_REMOTE_LOG( (1 << OPTBIT_remote )) + 0,
|
OPT_remotelog = USE_FEATURE_REMOTE_LOG( (1 << OPTBIT_remote )) + 0,
|
||||||
OPT_locallog = USE_FEATURE_REMOTE_LOG( (1 << OPTBIT_localtoo )) + 0,
|
OPT_locallog = USE_FEATURE_REMOTE_LOG( (1 << OPTBIT_locallog )) + 0,
|
||||||
OPT_circularlog = USE_FEATURE_IPC_SYSLOG( (1 << OPTBIT_circularlog)) + 0,
|
OPT_circularlog = USE_FEATURE_IPC_SYSLOG( (1 << OPTBIT_circularlog)) + 0,
|
||||||
};
|
};
|
||||||
#define OPTION_STR "m:nO:l:S" \
|
#define OPTION_STR "m:nO:l:S" \
|
||||||
@ -163,12 +175,11 @@ enum {
|
|||||||
#define OPTION_DECL *opt_m, *opt_l \
|
#define OPTION_DECL *opt_m, *opt_l \
|
||||||
USE_FEATURE_ROTATE_LOGFILE(,*opt_s) \
|
USE_FEATURE_ROTATE_LOGFILE(,*opt_s) \
|
||||||
USE_FEATURE_ROTATE_LOGFILE(,*opt_b) \
|
USE_FEATURE_ROTATE_LOGFILE(,*opt_b) \
|
||||||
USE_FEATURE_REMOTE_LOG( ,*opt_R) \
|
|
||||||
USE_FEATURE_IPC_SYSLOG( ,*opt_C = NULL)
|
USE_FEATURE_IPC_SYSLOG( ,*opt_C = NULL)
|
||||||
#define OPTION_PARAM &opt_m, &G.logFilePath, &opt_l \
|
#define OPTION_PARAM &opt_m, &G.logFilePath, &opt_l \
|
||||||
USE_FEATURE_ROTATE_LOGFILE(,&opt_s) \
|
USE_FEATURE_ROTATE_LOGFILE(,&opt_s) \
|
||||||
USE_FEATURE_ROTATE_LOGFILE(,&opt_b) \
|
USE_FEATURE_ROTATE_LOGFILE(,&opt_b) \
|
||||||
USE_FEATURE_REMOTE_LOG( ,&opt_R) \
|
USE_FEATURE_REMOTE_LOG( ,&G.remoteAddrStr) \
|
||||||
USE_FEATURE_IPC_SYSLOG( ,&opt_C)
|
USE_FEATURE_IPC_SYSLOG( ,&opt_C)
|
||||||
|
|
||||||
|
|
||||||
@ -387,6 +398,9 @@ static void timestamp_and_log(int pri, char *msg, int len)
|
|||||||
{
|
{
|
||||||
char *timestamp;
|
char *timestamp;
|
||||||
|
|
||||||
|
if (ENABLE_FEATURE_REMOTE_LOG && !(option_mask32 & OPT_locallog))
|
||||||
|
return;
|
||||||
|
|
||||||
if (len < 16 || msg[3] != ' ' || msg[6] != ' '
|
if (len < 16 || msg[3] != ' ' || msg[6] != ' '
|
||||||
|| msg[9] != ':' || msg[12] != ':' || msg[15] != ' '
|
|| msg[9] != ':' || msg[12] != ':' || msg[15] != ' '
|
||||||
) {
|
) {
|
||||||
@ -400,8 +414,6 @@ static void timestamp_and_log(int pri, char *msg, int len)
|
|||||||
timestamp[15] = '\0';
|
timestamp[15] = '\0';
|
||||||
|
|
||||||
/* Log message locally (to file or shared mem) */
|
/* Log message locally (to file or shared mem) */
|
||||||
if (!ENABLE_FEATURE_REMOTE_LOG || (option_mask32 & OPT_locallog)) {
|
|
||||||
if (LOG_PRI(pri) < G.logLevel) {
|
|
||||||
if (option_mask32 & OPT_small)
|
if (option_mask32 & OPT_small)
|
||||||
sprintf(G.printbuf, "%s %s\n", timestamp, msg);
|
sprintf(G.printbuf, "%s %s\n", timestamp, msg);
|
||||||
else {
|
else {
|
||||||
@ -411,8 +423,6 @@ static void timestamp_and_log(int pri, char *msg, int len)
|
|||||||
}
|
}
|
||||||
log_locally(G.printbuf);
|
log_locally(G.printbuf);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void split_escape_and_log(char *tmpbuf, int len)
|
static void split_escape_and_log(char *tmpbuf, int len)
|
||||||
{
|
{
|
||||||
@ -443,7 +453,9 @@ static void split_escape_and_log(char *tmpbuf, int len)
|
|||||||
*q++ = c;
|
*q++ = c;
|
||||||
}
|
}
|
||||||
*q = '\0';
|
*q = '\0';
|
||||||
|
|
||||||
/* Now log it */
|
/* Now log it */
|
||||||
|
if (LOG_PRI(pri) < G.logLevel)
|
||||||
timestamp_and_log(pri, G.parsebuf, q - G.parsebuf);
|
timestamp_and_log(pri, G.parsebuf, q - G.parsebuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -495,6 +507,24 @@ static NOINLINE int create_socket(void)
|
|||||||
return sock_fd;
|
return sock_fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ENABLE_FEATURE_REMOTE_LOG
|
||||||
|
static int try_to_resolve_remote(void)
|
||||||
|
{
|
||||||
|
if (!G.remoteAddr) {
|
||||||
|
unsigned now = monotonic_sec();
|
||||||
|
|
||||||
|
/* Don't resolve name too often - DNS timeouts can be big */
|
||||||
|
if ((now - G.last_dns_resolve) < DNS_WAIT_SEC)
|
||||||
|
return -1;
|
||||||
|
G.last_dns_resolve = now;
|
||||||
|
G.remoteAddr = host2sockaddr(G.remoteAddrStr, 514);
|
||||||
|
if (!G.remoteAddr)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return socket(G.remoteAddr->sa.sa_family, SOCK_DGRAM, 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void do_syslogd(void) ATTRIBUTE_NORETURN;
|
static void do_syslogd(void) ATTRIBUTE_NORETURN;
|
||||||
static void do_syslogd(void)
|
static void do_syslogd(void)
|
||||||
{
|
{
|
||||||
@ -505,10 +535,7 @@ static void do_syslogd(void)
|
|||||||
signal(SIGTERM, quit_signal);
|
signal(SIGTERM, quit_signal);
|
||||||
signal(SIGQUIT, quit_signal);
|
signal(SIGQUIT, quit_signal);
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
signal(SIGCHLD, SIG_IGN);
|
/* signal(SIGCHLD, SIG_IGN); - why? */
|
||||||
#ifdef SIGCLD
|
|
||||||
signal(SIGCLD, SIG_IGN);
|
|
||||||
#endif
|
|
||||||
#ifdef SYSLOGD_MARK
|
#ifdef SYSLOGD_MARK
|
||||||
signal(SIGALRM, do_mark);
|
signal(SIGALRM, do_mark);
|
||||||
alarm(G.markInterval);
|
alarm(G.markInterval);
|
||||||
@ -554,19 +581,21 @@ static void do_syslogd(void)
|
|||||||
#if ENABLE_FEATURE_REMOTE_LOG
|
#if ENABLE_FEATURE_REMOTE_LOG
|
||||||
/* We are not modifying log messages in any way before send */
|
/* We are not modifying log messages in any way before send */
|
||||||
/* Remote site cannot trust _us_ anyway and need to do validation again */
|
/* Remote site cannot trust _us_ anyway and need to do validation again */
|
||||||
if (G.remoteAddr) {
|
if (G.remoteAddrStr) {
|
||||||
if (-1 == G.remoteFD) {
|
if (-1 == G.remoteFD) {
|
||||||
G.remoteFD = socket(G.remoteAddr->sa.sa_family, SOCK_DGRAM, 0);
|
G.remoteFD = try_to_resolve_remote();
|
||||||
|
if (-1 == G.remoteFD)
|
||||||
|
goto no_luck;
|
||||||
}
|
}
|
||||||
if (-1 != G.remoteFD) {
|
|
||||||
/* send message to remote logger, ignore possible error */
|
/* send message to remote logger, ignore possible error */
|
||||||
sendto(G.remoteFD, G.recvbuf, sz, MSG_DONTWAIT,
|
sendto(G.remoteFD, G.recvbuf, sz, MSG_DONTWAIT,
|
||||||
&G.remoteAddr->sa, G.remoteAddr->len);
|
&G.remoteAddr->sa, G.remoteAddr->len);
|
||||||
}
|
no_luck: ;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (!ENABLE_FEATURE_REMOTE_LOG || (option_mask32 & OPT_locallog))
|
||||||
split_escape_and_log(G.recvbuf, sz);
|
split_escape_and_log(G.recvbuf, sz);
|
||||||
} /* for */
|
} /* for (;;) */
|
||||||
}
|
}
|
||||||
|
|
||||||
int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int syslogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
@ -575,7 +604,10 @@ int syslogd_main(int argc, char **argv)
|
|||||||
char OPTION_DECL;
|
char OPTION_DECL;
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
PTR_TO_GLOBALS = memcpy(xzalloc(sizeof(G)), &init_data, sizeof(init_data));
|
INIT_G();
|
||||||
|
#if ENABLE_FEATURE_REMOTE_LOG
|
||||||
|
G.last_dns_resolve = monotonic_sec() - DNS_WAIT_SEC - 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* do normal option parsing */
|
/* do normal option parsing */
|
||||||
opt_complementary = "=0"; /* no non-option params */
|
opt_complementary = "=0"; /* no non-option params */
|
||||||
@ -595,12 +627,6 @@ int syslogd_main(int argc, char **argv)
|
|||||||
if (option_mask32 & OPT_rotatecnt) // -b
|
if (option_mask32 & OPT_rotatecnt) // -b
|
||||||
G.logFileRotate = xatou_range(opt_b, 0, 99);
|
G.logFileRotate = xatou_range(opt_b, 0, 99);
|
||||||
#endif
|
#endif
|
||||||
#if ENABLE_FEATURE_REMOTE_LOG
|
|
||||||
if (option_mask32 & OPT_remotelog) { // -R
|
|
||||||
G.remoteAddr = xhost2sockaddr(opt_R, 514);
|
|
||||||
}
|
|
||||||
//if (option_mask32 & OPT_locallog) // -L
|
|
||||||
#endif
|
|
||||||
#if ENABLE_FEATURE_IPC_SYSLOG
|
#if ENABLE_FEATURE_IPC_SYSLOG
|
||||||
if (opt_C) // -Cn
|
if (opt_C) // -Cn
|
||||||
G.shm_size = xatoul_range(opt_C, 4, INT_MAX/1024) * 1024;
|
G.shm_size = xatoul_range(opt_C, 4, INT_MAX/1024) * 1024;
|
||||||
|
Loading…
Reference in New Issue
Block a user