syslogd(8) already supports *sending* log messages to non-

standard ports, but it can't *receive* them (port 514 is
hardcoded).  This commit adds that missing feature.

(NB:  I actually needed this feature for a server farm where
multiple jails run with shared IP addresses, and every jail
should have its own syslogd process.)

As a side effect, syslogd now compiles with WARNS=6.

Approved by:	des (mentor)
MFC after:	3 weeks
This commit is contained in:
Oliver Fromme 2010-08-07 16:20:12 +00:00
parent ce617aca0a
commit 974835c956
3 changed files with 60 additions and 9 deletions

View File

@ -12,7 +12,7 @@ SRCS= syslogd.c ttymsg.c
DPADD= ${LIBUTIL}
LDADD= -lutil
WARNS?= 3
WARNS?= 6
.if ${MK_INET6_SUPPORT} != "no"
CFLAGS+= -DINET6

View File

@ -171,10 +171,29 @@ The
options are ignored if the
.Fl s
option is also specified.
.It Fl b Ar bind_address
Specify one specific IP address or hostname to bind to.
If a hostname is specified,
the IPv4 or IPv6 address which corresponds to it is used.
.It Xo
.Fl b
.Sm off
.Ar bind_address Op : Ar service
.Sm on
.Xc
.It Xo
.Fl b
.Sm off
.Li : Ar service
.Sm on
.Xc
Bind to a specific address and/or port.
The address can be specified as a hostname,
and the port as a service name.
If an IPv6 address is specified, it should be enclosed with
.Ql \&[
and
.Ql \&] .
The default
.Ar service
is
.Ql syslog .
.It Fl C
Create log files that do not exist (permission is set to
.Li 0600 ) .

View File

@ -317,7 +317,7 @@ static void dodie(int);
static void dofsync(void);
static void domark(int);
static void fprintlog(struct filed *, int, const char *);
static int *socksetup(int, const char *);
static int *socksetup(int, char *);
static void init(int);
static void logerror(const char *);
static void logmsg(int, const char *, const char *, int);
@ -345,7 +345,8 @@ main(int argc, char *argv[])
struct sockaddr_storage frominet;
fd_set *fdsr = NULL;
char line[MAXLINE + 1];
const char *bindhostname, *hname;
char *bindhostname;
const char *hname;
struct timeval tv, *tvp;
struct sigaction sact;
struct funix *fx, *fx1;
@ -2605,16 +2606,47 @@ log_deadchild(pid_t pid, int status, const char *name)
}
static int *
socksetup(int af, const char *bindhostname)
socksetup(int af, char *bindhostname)
{
struct addrinfo hints, *res, *r;
const char *bindservice;
char *cp;
int error, maxs, *s, *socks;
/*
* We have to handle this case for backwards compatibility:
* If there are two (or more) colons but no '[' and ']',
* assume this is an inet6 address without a service.
*/
bindservice = "syslog";
if (bindhostname != NULL) {
#ifdef INET6
if (*bindhostname == '[' &&
(cp = strchr(bindhostname + 1, ']')) != NULL) {
++bindhostname;
*cp = '\0';
if (cp[1] == ':' && cp[2] != '\0')
bindservice = cp + 2;
} else {
#endif
cp = strchr(bindhostname, ':');
if (cp != NULL && strchr(cp + 1, ':') == NULL) {
*cp = '\0';
if (cp[1] != '\0')
bindservice = cp + 1;
if (cp == bindhostname)
bindhostname = NULL;
}
#ifdef INET6
}
#endif
}
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_PASSIVE;
hints.ai_family = af;
hints.ai_socktype = SOCK_DGRAM;
error = getaddrinfo(bindhostname, "syslog", &hints, &res);
error = getaddrinfo(bindhostname, bindservice, &hints, &res);
if (error) {
logerror(gai_strerror(error));
errno = 0;