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; |
} |
} |