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:
Daniel Adolfsson 2011-09-17 16:37:24 +02:00
parent 70933e0830
commit eefa9cb881
8 changed files with 95 additions and 33 deletions

View File

@ -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))

View File

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

View File

@ -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

View File

@ -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

View File

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

View File

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

View File

@ -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:

View File

@ -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();
} }