WvStreams
wvdbusd.cc
00001 #include "wvdbusserver.h"
00002 #include "wvstreamsdaemon.h"
00003 #include "wvautoconf.h"
00004 #include "wvx509mgr.h"
00005 #include "wvsslstream.h"
00006 #include "wvmoniker.h"
00007 #include "uniconfroot.h"
00008 
00009 
00010 static WvX509Mgr *cert = NULL;
00011 
00012 
00013 class WvDBusDaemon : public WvStreamsDaemon
00014 {
00015 public:
00016     WvDBusDaemon() :
00017         WvStreamsDaemon("WvDBusDaemon", WVPACKAGE_VERSION,
00018                         wv::bind(&WvDBusDaemon::cb, this)),
00019         log("WvDBusDaemon", WvLog::Debug), configfile("wvdbus.ini")
00020     {
00021         args.add_option('c', "config", "Specify path to configuration file",
00022                             "FILENAME", configfile);
00023         args.add_required_arg("MONIKER", true);
00024     }
00025     
00026     virtual ~WvDBusDaemon()
00027     {
00028         WVRELEASE(cert);
00029     }
00030     
00031     void cb()
00032     { 
00033         log("WvDBusDaemon starting.\n");
00034         conf.mount(WvString("ini:%s", configfile));
00035 
00036         if (!cert && conf["cert"].exists() && conf["privrsa"].exists())
00037         {
00038             cert = new WvX509Mgr;
00039             cert->decode(WvX509::CertPEM, *conf["cert"]);
00040             cert->decode(WvRSAKey::RsaPEM, *conf["privrsa"]);
00041 
00042             if (!cert->test())
00043             {
00044                 log("Certificate found in ini file, but failed to load!\n");
00045                 WVRELEASE(cert);
00046             }
00047             else
00048                 log("Certificate found in ini file, and loaded!\n");
00049         }
00050 
00051         WvDBusServer *s = new WvDBusServer;
00052         WvStringList::Iter i(extra_args());
00053         for (i.rewind(); i.next(); )
00054             s->listen(*i);
00055         add_die_stream(s, true, "DBus Server");
00056     }
00057 
00058 private:
00059     WvLog log;
00060     UniConfRoot conf;
00061     WvString configfile;
00062 };
00063 
00064 
00065 static IWvStream *dbus_serv_creator(WvStringParm s, IObject *obj)
00066 {
00067     return new WvSSLStream(IWvStream::create(s, obj), cert, 0, true);
00068 }
00069 
00070 static WvMoniker<IWvStream> sreg("sslserv", dbus_serv_creator, true);
00071 
00072 
00073 int main(int argc, char *argv[])
00074 {
00075     return WvDBusDaemon().run(argc, argv);
00076 }