summaryrefslogtreecommitdiffstats
path: root/usr.sbin/syslogd/syslogd.c
diff options
context:
space:
mode:
authorolli <olli@FreeBSD.org>2010-08-07 16:20:12 +0000
committerolli <olli@FreeBSD.org>2010-08-07 16:20:12 +0000
commitdf9856d691fbca1e8ff4b45603ecfbdd68871ea0 (patch)
tree4049e8751d59c1b4729c17a0cbab04c84dc26601 /usr.sbin/syslogd/syslogd.c
parent14181a6158ab7f64400289d8431445b3079ef76a (diff)
downloadFreeBSD-src-df9856d691fbca1e8ff4b45603ecfbdd68871ea0.zip
FreeBSD-src-df9856d691fbca1e8ff4b45603ecfbdd68871ea0.tar.gz
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
Diffstat (limited to 'usr.sbin/syslogd/syslogd.c')
-rw-r--r--usr.sbin/syslogd/syslogd.c40
1 files changed, 36 insertions, 4 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index b803969..e97f8dc 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -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;
OpenPOWER on IntegriCloud