diff options
Diffstat (limited to 'netfs/daemon/daemon.cpp')
-rw-r--r-- | netfs/daemon/daemon.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/netfs/daemon/daemon.cpp b/netfs/daemon/daemon.cpp new file mode 100644 index 0000000..0cbe2ad --- /dev/null +++ b/netfs/daemon/daemon.cpp @@ -0,0 +1,73 @@ +#include "pch.hpp" +#include <Ice/Ice.h> +#include <boost/foreach.hpp> +#include <boost/crc.hpp> +#include "daemon.h" +#include "daemonConfig.h" +#include "daemonService.h" +#include "daemonVolume.h" + +int16_t +makeHostID() +{ + char buf[128]; + gethostname(buf, sizeof(buf)); + boost::crc_basic<16> crc_ccitt1( 0x1021, 0xFFFF, 0, false, false ); + crc_ccitt1.process_bytes(buf, sizeof(buf)); + return crc_ccitt1.checksum(); +} + +// name = NetFSDaemonAdapter +void +NetFSDaemon::start(const std::string & name, const Ice::CommunicatorPtr & ic, const Ice::StringSeq&) +{ + Ice::PropertiesPtr props = ic->getProperties(); + dc = DaemonConfig::Load(props->getProperty("NetFSD.ConfigPath")); + + int16_t hostseed = makeHostID(); + adapter = ic->createObjectAdapterWithEndpoints(name, dc->self->iceEndpoint); + adapter->add(new ServiceServer(hostseed, dc), ic->stringToIdentity("Service")); + adapter->activate(); +} + +void +NetFSDaemon::stop() +{ + adapter->deactivate(); +} + +extern "C" { + IceBox::Service * + createNetFSDaemon(Ice::CommunicatorPtr) + { + return new NetFSDaemon(); + } +} + +TempPrivs::TempPrivs(uid_t u, gid_t g) : + myu(u), oldu(geteuid()), + myg(g), oldg(getegid()) +{ + if (setegid(myg)) + throw NetFS::SystemError(errno); + if (seteuid(myu)) + throw NetFS::SystemError(errno); +} + +TempPrivs::TempPrivs(const NetFS::ReqEnv & re, const UserEntCache * uec, const GroupEntCache * gec) : + myu(uec->getID(re.user)), oldu(geteuid()), + myg(gec->getID(re.grp)), oldg(getegid()) +{ + if (setegid(myg)) + throw NetFS::SystemError(errno); + if (seteuid(myu)) + throw NetFS::SystemError(errno); +} + +TempPrivs::~TempPrivs() +{ + if (seteuid(oldu)) + throw NetFS::SystemError(errno); + if (setegid(oldg)) + throw NetFS::SystemError(errno); +} |