|
@@ -1,7 +1,7 @@
|
|
-/* $Id: symux.c,v 1.39 2007/07/09 11:18:01 dijkstra Exp $ */
|
|
|
|
|
|
+/* $Id: symux.c,v 1.41 2007/11/29 13:55:30 dijkstra Exp $ */
|
|
|
|
|
|
/*
|
|
/*
|
|
- * Copyright (c) 2001-2006 Willem Dijkstra
|
|
|
|
|
|
+ * Copyright (c) 2001-2007 Willem Dijkstra
|
|
* All rights reserved.
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* Redistribution and use in source and binary forms, with or without
|
|
@@ -63,6 +63,7 @@ void signalhandler(int);
|
|
__END_DECLS
|
|
__END_DECLS
|
|
|
|
|
|
int flag_hup = 0;
|
|
int flag_hup = 0;
|
|
|
|
+int flag_testconf = 0;
|
|
fd_set fdset;
|
|
fd_set fdset;
|
|
int maxfd;
|
|
int maxfd;
|
|
|
|
|
|
@@ -97,10 +98,9 @@ huphandler(int s)
|
|
int
|
|
int
|
|
main(int argc, char *argv[])
|
|
main(int argc, char *argv[])
|
|
{
|
|
{
|
|
- struct symonpacket packet;
|
|
|
|
struct packedstream ps;
|
|
struct packedstream ps;
|
|
char *cfgfile;
|
|
char *cfgfile;
|
|
- char *cfgpath;
|
|
|
|
|
|
+ char *cfgpath = NULL;
|
|
char *stringbuf;
|
|
char *stringbuf;
|
|
char *stringptr;
|
|
char *stringptr;
|
|
int maxstringlen;
|
|
int maxstringlen;
|
|
@@ -129,11 +129,12 @@ main(int argc, char *argv[])
|
|
|
|
|
|
cfgfile = SYMUX_CONFIG_FILE;
|
|
cfgfile = SYMUX_CONFIG_FILE;
|
|
|
|
|
|
- while ((ch = getopt(argc, argv, "df:lv")) != -1) {
|
|
|
|
|
|
+ while ((ch = getopt(argc, argv, "df:ltv")) != -1) {
|
|
switch (ch) {
|
|
switch (ch) {
|
|
case 'd':
|
|
case 'd':
|
|
flag_debug = 1;
|
|
flag_debug = 1;
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case 'f':
|
|
case 'f':
|
|
if (optarg && optarg[0] != '/') {
|
|
if (optarg && optarg[0] != '/') {
|
|
/* cfg path needs to be absolute, we will be a daemon soon */
|
|
/* cfg path needs to be absolute, we will be a daemon soon */
|
|
@@ -154,9 +155,15 @@ main(int argc, char *argv[])
|
|
} else
|
|
} else
|
|
cfgfile = xstrdup(optarg);
|
|
cfgfile = xstrdup(optarg);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case 'l':
|
|
case 'l':
|
|
flag_list = 1;
|
|
flag_list = 1;
|
|
break;
|
|
break;
|
|
|
|
+
|
|
|
|
+ case 't':
|
|
|
|
+ flag_testconf = 1;
|
|
|
|
+ break;
|
|
|
|
+
|
|
case 'v':
|
|
case 'v':
|
|
info("symux version %s", SYMUX_VERSION);
|
|
info("symux version %s", SYMUX_VERSION);
|
|
default:
|
|
default:
|
|
@@ -201,6 +208,10 @@ main(int argc, char *argv[])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (flag_testconf) {
|
|
|
|
+ info("%s: ok", cfgfile);
|
|
|
|
+ exit(EX_OK);
|
|
|
|
+ }
|
|
|
|
|
|
setegid(getgid());
|
|
setegid(getgid());
|
|
setgid(getgid());
|
|
setgid(getgid());
|
|
@@ -226,9 +237,10 @@ main(int argc, char *argv[])
|
|
|
|
|
|
mux = SLIST_FIRST(&mul);
|
|
mux = SLIST_FIRST(&mul);
|
|
|
|
|
|
- churnbuflen = calculate_churnbuffer(&mux->sol);
|
|
|
|
|
|
+ churnbuflen = strlen_sourcelist(&mux->sol);
|
|
debug("size of churnbuffer = %d", churnbuflen);
|
|
debug("size of churnbuffer = %d", churnbuflen);
|
|
initshare(churnbuflen);
|
|
initshare(churnbuflen);
|
|
|
|
+ init_symux_packet(mux);
|
|
|
|
|
|
/* catch signals */
|
|
/* catch signals */
|
|
signal(SIGHUP, huphandler);
|
|
signal(SIGHUP, huphandler);
|
|
@@ -249,7 +261,7 @@ main(int argc, char *argv[])
|
|
rrderrors = 0;
|
|
rrderrors = 0;
|
|
/* main loop */
|
|
/* main loop */
|
|
for (;;) { /* FOREVER */
|
|
for (;;) { /* FOREVER */
|
|
- wait_for_traffic(mux, &source, &packet);
|
|
|
|
|
|
+ wait_for_traffic(mux, &source);
|
|
|
|
|
|
if (flag_hup == 1) {
|
|
if (flag_hup == 1) {
|
|
flag_hup = 0;
|
|
flag_hup = 0;
|
|
@@ -266,6 +278,7 @@ main(int argc, char *argv[])
|
|
mux = SLIST_FIRST(&mul);
|
|
mux = SLIST_FIRST(&mul);
|
|
get_symon_sockets(mux);
|
|
get_symon_sockets(mux);
|
|
get_client_socket(mux);
|
|
get_client_socket(mux);
|
|
|
|
+ init_symux_packet(mux);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
|
|
|
|
@@ -277,11 +290,11 @@ main(int argc, char *argv[])
|
|
* the hasseling with stringptr.
|
|
* the hasseling with stringptr.
|
|
*/
|
|
*/
|
|
|
|
|
|
- offset = mux->offset;
|
|
|
|
|
|
+ offset = mux->packet.offset;
|
|
maxstringlen = shared_getmaxlen();
|
|
maxstringlen = shared_getmaxlen();
|
|
/* put time:ip: into shared region */
|
|
/* put time:ip: into shared region */
|
|
slot = master_forbidread();
|
|
slot = master_forbidread();
|
|
- timestamp = (time_t) packet.header.timestamp;
|
|
|
|
|
|
+ timestamp = (time_t) mux->packet.header.timestamp;
|
|
stringbuf = shared_getmem(slot);
|
|
stringbuf = shared_getmem(slot);
|
|
debug("stringbuf = 0x%08x", stringbuf);
|
|
debug("stringbuf = 0x%08x", stringbuf);
|
|
snprintf(stringbuf, maxstringlen, "%s;", source->addr);
|
|
snprintf(stringbuf, maxstringlen, "%s;", source->addr);
|
|
@@ -290,12 +303,12 @@ main(int argc, char *argv[])
|
|
maxstringlen -= strlen(stringbuf);
|
|
maxstringlen -= strlen(stringbuf);
|
|
stringptr = stringbuf + strlen(stringbuf);
|
|
stringptr = stringbuf + strlen(stringbuf);
|
|
|
|
|
|
- while (offset < packet.header.length) {
|
|
|
|
|
|
+ while (offset < mux->packet.header.length) {
|
|
bzero(&ps, sizeof(struct packedstream));
|
|
bzero(&ps, sizeof(struct packedstream));
|
|
- if (packet.header.symon_version == 1) {
|
|
|
|
- offset += sunpack1(packet.data + offset, &ps);
|
|
|
|
- } else if (packet.header.symon_version == 2) {
|
|
|
|
- offset += sunpack2(packet.data + offset, &ps);
|
|
|
|
|
|
+ if (mux->packet.header.symon_version == 1) {
|
|
|
|
+ offset += sunpack1(mux->packet.data + offset, &ps);
|
|
|
|
+ } else if (mux->packet.header.symon_version == 2) {
|
|
|
|
+ offset += sunpack2(mux->packet.data + offset, &ps);
|
|
} else {
|
|
} else {
|
|
debug("unsupported packet version - ignoring data");
|
|
debug("unsupported packet version - ignoring data");
|
|
ps.type = MT_EOT;
|
|
ps.type = MT_EOT;
|