summaryrefslogtreecommitdiff
path: root/netfs/daemon/daemon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'netfs/daemon/daemon.cpp')
-rw-r--r--netfs/daemon/daemon.cpp73
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);
+}