Multiple changes
* Add '-d' to "daemonize". Will also enable syslogging. * Fix a couple of bugs in 'session'. * Clean up 'log', and use LOG_* macros instead. * Add syslog(bool) to 'log' to enable/disable the use of syslog.
This commit is contained in:
parent
70933e0830
commit
eefa9cb881
@ -542,7 +542,7 @@ int iface::poll_all()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(std::list<strong_ptr<session> >::iterator s_it = ifa->_sessions.begin();
|
for(std::list<weak_ptr<session> >::iterator s_it = ifa->_sessions.begin();
|
||||||
s_it != ifa->_sessions.end(); s_it++)
|
s_it != ifa->_sessions.end(); s_it++)
|
||||||
{
|
{
|
||||||
if(((*s_it)->taddr() == taddr) && ((*s_it)->status() == session::WAITING))
|
if(((*s_it)->taddr() == taddr) && ((*s_it)->status() == session::WAITING))
|
||||||
|
@ -61,7 +61,7 @@ private:
|
|||||||
|
|
||||||
// An array of sessions that are monitoring this interface for
|
// An array of sessions that are monitoring this interface for
|
||||||
// ND_NEIGHBOR_ADVERT messages.
|
// ND_NEIGHBOR_ADVERT messages.
|
||||||
std::list<strong_ptr<session> > _sessions;
|
std::list<weak_ptr<session> > _sessions;
|
||||||
|
|
||||||
strong_ptr<proxy> _pr;
|
strong_ptr<proxy> _pr;
|
||||||
|
|
||||||
|
35
src/log.cc
35
src/log.cc
@ -15,6 +15,7 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
|
#include <syslog.h>
|
||||||
|
|
||||||
#include "ndppd.h"
|
#include "ndppd.h"
|
||||||
|
|
||||||
@ -25,24 +26,30 @@ __NDPPD_NS_BEGIN
|
|||||||
const char *log::_level_str[] =
|
const char *log::_level_str[] =
|
||||||
{
|
{
|
||||||
"fatal",
|
"fatal",
|
||||||
|
"alert",
|
||||||
|
"critical",
|
||||||
"error",
|
"error",
|
||||||
"warning",
|
"warning",
|
||||||
"bug",
|
|
||||||
"notice",
|
"notice",
|
||||||
"info",
|
"info",
|
||||||
"debug"
|
"debug"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool log::_syslog = false;
|
||||||
|
|
||||||
void log::puts(int level, const char *str)
|
void log::puts(int level, const char *str)
|
||||||
{
|
{
|
||||||
const char *ls;
|
const char *ls;
|
||||||
|
|
||||||
if((level < 0) || (level >= MAX_L))
|
if((level < 0) || (level > LOG_DEBUG))
|
||||||
ls = "unknown";
|
ls = "unknown";
|
||||||
else
|
else
|
||||||
ls = _level_str[level];
|
ls = _level_str[level];
|
||||||
|
|
||||||
fprintf(stderr, "% 7s : %s\n", ls, str);
|
if(_syslog)
|
||||||
|
::syslog(level, "(%s) %s", ls, str);
|
||||||
|
else
|
||||||
|
fprintf(stderr, "(% 8s) %s\n", ls, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void log::printf(int level, const char *fmt, ...)
|
void log::printf(int level, const char *fmt, ...)
|
||||||
@ -55,11 +62,31 @@ void log::printf(int level, const char *fmt, ...)
|
|||||||
|
|
||||||
if(vsnprintf(buf, sizeof(buf), fmt, args) > 0)
|
if(vsnprintf(buf, sizeof(buf), fmt, args) > 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
puts(level, buf);
|
puts(level, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void log::syslog(bool sl)
|
||||||
|
{
|
||||||
|
if(sl == _syslog)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(_syslog = sl)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
setlogmask(LOG_UPTO(LOG_DEBUG));
|
||||||
|
openlog("ndppd", LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
|
||||||
|
#else
|
||||||
|
setlogmask(LOG_UPTO(LOG_INFO));
|
||||||
|
openlog("ndppd", LOG_CONS, LOG_USER);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
closelog();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
__NDPPD_NS_END
|
__NDPPD_NS_END
|
||||||
|
31
src/log.h
31
src/log.h
@ -16,18 +16,19 @@
|
|||||||
#ifndef __NDPPD_LOG_H
|
#ifndef __NDPPD_LOG_H
|
||||||
#define __NDPPD_LOG_H
|
#define __NDPPD_LOG_H
|
||||||
|
|
||||||
|
#include <syslog.h>
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#define DBG(...) log::printf(log::L_DEBUG, __VA_ARGS__)
|
#define DBG(...) log::printf(LOG_DEBUG, __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define DBG(...)
|
#define DBG(...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ERR(...) log::printf(log::L_ERROR, __VA_ARGS__)
|
#define ERR(...) log::printf(LOG_ERR, __VA_ARGS__)
|
||||||
#define WRN(...) log::printf(log::L_WARNING, __VA_ARGS__)
|
#define WRN(...) log::printf(LOG_WARNING, __VA_ARGS__)
|
||||||
#define BUG(...) log::printf(log::L_BUG, __VA_ARGS__)
|
#define CRT(...) log::printf(LOG_CRIT, __VA_ARGS__)
|
||||||
#define NFO(...) log::printf(log::L_INFO, __VA_ARGS__)
|
#define NFO(...) log::printf(LOG_INFO, __VA_ARGS__)
|
||||||
#define NCE(...) log::printf(log::L_NOTICE, __VA_ARGS__)
|
#define NCE(...) log::printf(LOG_NOTICE, __VA_ARGS__)
|
||||||
#define FTL(...) log::printf(log::L_FATAL, __VA_ARGS__)
|
|
||||||
|
|
||||||
__NDPPD_NS_BEGIN
|
__NDPPD_NS_BEGIN
|
||||||
|
|
||||||
@ -36,22 +37,14 @@ class log
|
|||||||
private:
|
private:
|
||||||
static const char *_level_str[];
|
static const char *_level_str[];
|
||||||
|
|
||||||
public:
|
static bool _syslog;
|
||||||
enum
|
|
||||||
{
|
|
||||||
L_FATAL,
|
|
||||||
L_ERROR,
|
|
||||||
L_WARNING,
|
|
||||||
L_BUG,
|
|
||||||
L_NOTICE,
|
|
||||||
L_INFO,
|
|
||||||
L_DEBUG,
|
|
||||||
MAX_L
|
|
||||||
};
|
|
||||||
|
|
||||||
|
public:
|
||||||
static void puts(int level, const char *str);
|
static void puts(int level, const char *str);
|
||||||
|
|
||||||
static void printf(int level, const char *fmt, ...);
|
static void printf(int level, const char *fmt, ...);
|
||||||
|
|
||||||
|
static void syslog(bool enable);
|
||||||
};
|
};
|
||||||
|
|
||||||
__NDPPD_NS_END
|
__NDPPD_NS_END
|
||||||
|
48
src/ndppd.cc
48
src/ndppd.cc
@ -19,17 +19,40 @@
|
|||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "ndppd.h"
|
#include "ndppd.h"
|
||||||
|
|
||||||
using namespace ndppd;
|
using namespace ndppd;
|
||||||
|
|
||||||
|
int daemonize()
|
||||||
|
{
|
||||||
|
pid_t pid = fork();
|
||||||
|
|
||||||
|
if(pid < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if(pid > 0)
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
pid_t sid = setsid();
|
||||||
|
|
||||||
|
if(sid < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
close(STDIN_FILENO);
|
||||||
|
close(STDOUT_FILENO);
|
||||||
|
close(STDERR_FILENO);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[], char *env[])
|
int main(int argc, char *argv[], char *env[])
|
||||||
{
|
{
|
||||||
// std::string config_path("/etc/ndppd.conf");
|
// std::string config_path("/etc/ndppd.conf");
|
||||||
std::string config_path("../ndppd.conf");
|
std::string config_path("../ndppd.conf");
|
||||||
|
bool daemon = false;
|
||||||
std::cout << "ndppd - NDP Proxy Daemon" << std::endl;
|
|
||||||
std::cout << "Version " NDPPD_VERSION << std::endl;
|
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
@ -38,10 +61,11 @@ int main(int argc, char *argv[], char *env[])
|
|||||||
static struct option long_options[] =
|
static struct option long_options[] =
|
||||||
{
|
{
|
||||||
{ "config", 1, 0, 'c' },
|
{ "config", 1, 0, 'c' },
|
||||||
|
{ "daemon", 0, 0, 'd' },
|
||||||
{ 0, 0, 0, 0}
|
{ 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
c = getopt_long(argc, argv, "c:v", long_options, &opt);
|
c = getopt_long(argc, argv, "c:d", long_options, &opt);
|
||||||
|
|
||||||
if(c == -1)
|
if(c == -1)
|
||||||
break;
|
break;
|
||||||
@ -56,6 +80,22 @@ int main(int argc, char *argv[], char *env[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
config_path = optarg;
|
config_path = optarg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
daemon = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(daemon)
|
||||||
|
{
|
||||||
|
log::syslog(true);
|
||||||
|
|
||||||
|
if(daemonize() < 0)
|
||||||
|
{
|
||||||
|
ERR("Failed to daemonize process");
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ void proxy::handle_solicit(const address& saddr, const address& daddr,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case session::VALID:
|
case session::VALID:
|
||||||
(*sit)->send_solicit();
|
(*sit)->send_advert();
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -32,14 +32,14 @@ class rule;
|
|||||||
class proxy
|
class proxy
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
weak_ptr<proxy> _ptr;
|
||||||
|
|
||||||
strong_ptr<iface> _ifa;
|
strong_ptr<iface> _ifa;
|
||||||
|
|
||||||
std::list<strong_ptr<rule> > _rules;
|
std::list<strong_ptr<rule> > _rules;
|
||||||
|
|
||||||
std::list<strong_ptr<session> > _sessions;
|
std::list<strong_ptr<session> > _sessions;
|
||||||
|
|
||||||
weak_ptr<proxy> _ptr;
|
|
||||||
|
|
||||||
proxy();
|
proxy();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -50,6 +50,8 @@ void session::update_all(int elapsed_time)
|
|||||||
|
|
||||||
session::~session()
|
session::~session()
|
||||||
{
|
{
|
||||||
|
DBG("session::~session() this=%x", this);
|
||||||
|
|
||||||
_sessions.remove(_ptr);
|
_sessions.remove(_ptr);
|
||||||
|
|
||||||
for(std::list<strong_ptr<iface> >::iterator it = _ifaces.begin();
|
for(std::list<strong_ptr<iface> >::iterator it = _ifaces.begin();
|
||||||
@ -109,7 +111,7 @@ void session::send_advert()
|
|||||||
void session::handle_advert()
|
void session::handle_advert()
|
||||||
{
|
{
|
||||||
_status = VALID;
|
_status = VALID;
|
||||||
_ttl = 500;
|
_ttl = 30 * 1000;
|
||||||
|
|
||||||
send_advert();
|
send_advert();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user