Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

uniconfdaemon.cc

Go to the documentation of this file.
00001 /*
00002  * Worldvisions Weaver Software
00003  *   Copyright (C) 1997 - 2002 Net Integration Technologies Inc.
00004  *
00005  * Daemon program for the uniconf configuration system.
00006  */
00007 #include "uniconfdaemon.h"
00008 #include "uniconfdaemonconn.h"
00009 #include "uniconfpamconn.h"
00010 #include "wvunixsocket.h"
00011 #include "wvtcp.h"
00012 #include "wvsslstream.h"
00013 
00014 
00015 UniConfDaemon::UniConfDaemon(const UniConf &_cfg, bool auth)
00016     : cfg(_cfg), log("UniConfDaemon"), debug(log.split(WvLog::Debug1)),
00017       closed(false), authenticate(auth)
00018 {
00019     debug("Starting.\n");
00020 }
00021 
00022 UniConfDaemon::~UniConfDaemon()
00023 {
00024     close();
00025 }
00026 
00027 
00028 void UniConfDaemon::close()
00029 {
00030     if (! closed)
00031     {
00032         closed = true;
00033         debug("Saving changes.\n");
00034         cfg.commit();
00035         debug("Done saving changes.\n");
00036     }
00037 }
00038 
00039 
00040 bool UniConfDaemon::isok() const
00041 {
00042     return !closed && WvStreamList::isok();
00043 }
00044 
00045 
00046 void UniConfDaemon::accept(WvStream *stream)
00047 {
00048     debug("Accepting connection from %s.\n", *stream->src());
00049     if (authenticate)
00050         append(new UniConfPamConn(stream, cfg), true);
00051     else
00052         append(new UniConfDaemonConn(stream, cfg), true);
00053 }
00054 
00055 
00056 void UniConfDaemon::unixcallback(WvStream &l, void *)
00057 {
00058     debug("Incoming Unix domain connection.\n");
00059     WvUnixListener *listener = static_cast<WvUnixListener*>(& l);
00060     WvStream *s = listener->accept();
00061     accept(s);
00062 }
00063 
00064 
00065 void UniConfDaemon::tcpcallback(WvStream &l, void *)
00066 {
00067     WvTCPListener *listener = static_cast<WvTCPListener*>(& l);
00068     WvStream *s = listener->accept();
00069     debug("Incoming TCP connection from %s.\n", *s->src());
00070     accept(s);
00071 }
00072 
00073 
00074 void UniConfDaemon::sslcallback(WvStream &l, void *userdata)
00075 {
00076     WvX509Mgr *x509 = static_cast<WvX509Mgr *>(userdata);
00077     WvTCPListener *listener = static_cast<WvTCPListener *>(&l);
00078     WvStream *s = listener->accept();
00079     debug("Incoming TCP/SSL connection from %s.\n", *s->src());
00080     accept(new WvSSLStream(s, x509, false, true));
00081 }
00082 
00083 
00084 bool UniConfDaemon::setupunixsocket(WvStringParm path)
00085 {
00086     WvUnixListener *listener = new WvUnixListener(path, 0755);
00087     if (! listener->isok())
00088     {
00089         log(WvLog::Error, "Could not create Unix domain socket: %s\n",
00090             listener->errstr());
00091         delete listener;
00092         return false;
00093     }
00094     listener->setcallback(WvStreamCallback(this,
00095         &UniConfDaemon::unixcallback), NULL);
00096     append(listener, true, "WvUnixListener");
00097     debug("Listening on Unix socket '%s'\n", path);
00098     return true;
00099 }
00100 
00101 
00102 bool UniConfDaemon::setuptcpsocket(const WvIPPortAddr &addr)
00103 {
00104     WvTCPListener *listener = new WvTCPListener(addr);
00105     if (! listener->isok())
00106     {
00107         log(WvLog::Error, "Could not create TCP socket: %s\n",
00108             listener->errstr());
00109         delete listener;
00110         return false;
00111     }
00112     listener->setcallback(WvStreamCallback(this,
00113         &UniConfDaemon::tcpcallback), NULL);
00114     append(listener, true, "WvTCPListener");
00115     debug("Listening for TCP at %s.\n", addr);
00116     return true;
00117 }
00118 
00119 
00120 bool UniConfDaemon::setupsslsocket(const WvIPPortAddr &addr, WvX509Mgr *x509)
00121 {
00122     WvTCPListener *listener = new WvTCPListener(addr);
00123     if (! listener->isok())
00124     {
00125         log(WvLog::Error, "Could not create SSL socket: %s\n",
00126             listener->errstr());
00127         delete listener;
00128         return false;
00129     }
00130     listener->setcallback(WvStreamCallback(this,
00131         &UniConfDaemon::sslcallback), x509);
00132     append(listener, true, "WvTCPListener(SSL)");
00133     debug("Listening for TCP/SSL at %s.\n", addr);
00134     return true;
00135 }

Generated on Sat Mar 13 14:55:19 2004 for WvStreams by doxygen 1.3.6-20040222