|
version 1.1.2.3, 2010/10/27 13:50:03
|
version 1.1.2.4, 2010/10/27 15:23:49
|
|
Line 2
|
Line 2
|
| #include "dwds.h" |
#include "dwds.h" |
| |
|
| |
|
| int Verbose, Kill; | sl_config cfg; |
| char szConfig[MAXPATHLEN] = DWDS_CONFIG; | int Verbose, Kill, nif; |
| | char **ifs, szConfig[MAXPATHLEN] = DWDS_CONFIG; |
| | struct dwds_if *wds; |
| extern char compiled[], compiledby[], compilehost[]; |
extern char compiled[], compiledby[], compilehost[]; |
| |
|
| |
|
|
Line 20 Usage()
|
Line 22 Usage()
|
| "\n", compiled, compiledby, compilehost); |
"\n", compiled, compiledby, compilehost); |
| } |
} |
| |
|
| |
static void |
| |
sigHandler(int sig) |
| |
{ |
| |
int stat; |
| |
const u_char *v; |
| |
char szStr[STRSIZ]; |
| |
|
| |
switch (sig) { |
| |
case SIGHUP: |
| |
UnloadConfig(&cfg); |
| |
if (LoadConfig(szConfig, &cfg)) { |
| |
printf("Error:: can`t load config %s ...\n", szConfig); |
| |
Kill++; |
| |
} else { |
| |
closelog(); |
| |
|
| |
cfg_LoadAttribute(&cfg, CFG("dwds"), CFG("name"), CFG(szStr), STRSIZ, DWDS_NAME); |
| |
openlog(szStr, LOG_PID | LOG_CONS, LOG_DAEMON); |
| |
v = cfg_GetAttribute(&cfg, CFG("dwds"), CFG("syslog_upto")); |
| |
setlogmask(v ? strtol((char*) v, NULL, 0) : 0); |
| |
} |
| |
break; |
| |
case SIGTERM: |
| |
Kill++; |
| |
break; |
| |
case SIGCHLD: |
| |
while (waitpid(-1, &stat, WNOHANG) > 0); |
| |
break; |
| |
} |
| |
} |
| |
|
| |
static int |
| |
RtMsg(struct rt_msghdr *msg, size_t len) |
| |
{ |
| |
return 0; |
| |
} |
| |
|
| // --------------------------------------------------------------- |
// --------------------------------------------------------------- |
| |
|
| int |
int |
| main(int argc, char **argv) |
main(int argc, char **argv) |
| { |
{ |
| char ch, fg = 0; | char ch, szStr[STRSIZ], fg = 0; |
| | const u_char *v, msg[2048]; |
| | int s; |
| | struct sigaction sa; |
| | size_t len; |
| |
|
| while ((ch = getopt(argc, argv, "hvfc:")) != -1) |
while ((ch = getopt(argc, argv, "hvfc:")) != -1) |
| switch (ch) { |
switch (ch) { |
|
Line 49 main(int argc, char **argv)
|
Line 92 main(int argc, char **argv)
|
| printf("Error:: not specified interface for use ...\n"); |
printf("Error:: not specified interface for use ...\n"); |
| Usage(); |
Usage(); |
| return 1; |
return 1; |
| |
} else { |
| |
nif = argc; |
| |
ifs = argv; |
| } |
} |
| |
if (LoadConfig(szConfig, &cfg)) { |
| |
printf("Error:: can`t load config %s ...\n", szConfig); |
| |
return 1; |
| |
} |
| |
|
| |
if (fg) |
| |
switch (fork()) { |
| |
case -1: |
| |
printf("Error:: when fork() #%d - %s\n", errno, strerror(errno)); |
| |
UnloadConfig(&cfg); |
| |
return 2; |
| |
case 0 : |
| |
VERB(1) printf("Going to shadow land ...\n"); |
| |
|
| |
setsid(); |
| |
|
| |
memset(&sa, 0, sizeof sa); |
| |
sa.sa_handler = sigHandler; |
| |
sigemptyset(&sa.sa_mask); |
| |
sigaction(SIGHUP, &sa, NULL); |
| |
sigaction(SIGTERM, &sa, NULL); |
| |
sigaction(SIGCHLD, &sa, NULL); |
| |
break; |
| |
default: |
| |
goto end; |
| |
} |
| |
|
| |
cfg_LoadAttribute(&cfg, CFG("dwds"), CFG("name"), CFG(szStr), STRSIZ, DWDS_NAME); |
| |
openlog(szStr, LOG_PID | LOG_CONS, LOG_DAEMON); |
| |
v = cfg_GetAttribute(&cfg, CFG("dwds"), CFG("syslog_upto")); |
| |
setlogmask(v ? strtol((char*) v, NULL, 0) : 0); |
| |
|
| |
s = socket(PF_ROUTE, SOCK_RAW, 0); |
| |
if (s == -1) { |
| |
syslog(LOG_ERR, "Error:: socket() #%d - %s\n", errno, strerror(errno)); |
| |
goto end; |
| |
} |
| |
|
| |
while (!Kill) { |
| |
len = read(s, (void*) msg, sizeof msg); |
| |
if (len == -1) { |
| |
syslog(LOG_ERR, "Error:: read() #%d - %s\n", errno, strerror(errno)); |
| |
Kill++; |
| |
} else |
| |
RtMsg((struct rt_msghdr*) msg, len); |
| |
} |
| |
|
| |
close(s); |
| |
end: |
| |
closelog(); |
| |
UnloadConfig(&cfg); |
| return 0; |
return 0; |
| } |
} |