summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-04-09 19:58:04 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-04-09 19:58:04 -0700
commit38200cc6a55c3b11502a78251c2bdf09960a2a03 (patch)
tree71731aa9dff009f769a53c9f1fd5c1a6ee4f74c5 /service
parent6615a70027003a3896e51f713b109839dea03bfc (diff)
downloadinfinitytier-38200cc6a55c3b11502a78251c2bdf09960a2a03.tar.gz
infinitytier-38200cc6a55c3b11502a78251c2bdf09960a2a03.zip
Add data store functions to service/One, and shelve old main.cpp since it will get rebuilt.
Diffstat (limited to 'service')
-rw-r--r--service/One.cpp97
-rw-r--r--service/One.hpp5
2 files changed, 100 insertions, 2 deletions
diff --git a/service/One.cpp b/service/One.cpp
index c34f8f57..4d8a2d48 100644
--- a/service/One.cpp
+++ b/service/One.cpp
@@ -64,6 +64,7 @@ class OneImpl : public One
{
public:
OneImpl(const char *hp,unsigned int port,NetworkConfigMaster *master,const char *overrideRootTopology) :
+ _homePath((hp) ? hp : "."),
_phy(SphyOnDatagramFunction,SphyOnTcpConnectFunction,SphyOnTcpAcceptFunction,SphyOnTcpCloseFunction,SphyOnTcpDataFunction,SphyOnTcpWritableFunction,true),
_master(master),
_overrideRootTopology((overrideRootTopology) ? overrideRootTopology : ""),
@@ -138,10 +139,9 @@ public:
inline void phyOnDatagramFunction(PhySocket *sock,const struct sockaddr *from,void *data,unsigned long len)
{
- InetAddress fromss(from);
ZT1_ResultCode rc = _node->processWirePacket(
OSUtils::now(),
- (const struct sockaddr_storage *)&fromss,
+ (const struct sockaddr_storage *)&from, // Phy<> uses sockaddr_storage, so it'll always be that big
0,
data,
len,
@@ -207,10 +207,66 @@ public:
inline long nodeDataStoreGetFunction(const char *name,void *buf,unsigned long bufSize,unsigned long readIndex,unsigned long *totalSize)
{
+ std::string p(_homePath);
+ p.push_back(ZT_PATH_SEPARATOR);
+ char lastc = (char)0;
+ for(const char *n=name;(*n);++n) {
+ if ((*n == '.')&&(lastc == '.'))
+ return -2; // security sanity check-- don't allow ../ stuff even though there's really no way Node will ever do this
+ p.push_back((*n == '/') ? ZT_PATH_SEPARATOR : *n);
+ lastc = *n;
+ }
+
+ FILE *f = fopen(p.c_str(),"rb");
+ if (!f)
+ return -1;
+ if (fseek(f,0,SEEK_END) != 0) {
+ fclose(f);
+ return -2;
+ }
+ long ts = ftell(f);
+ if (ts < 0) {
+ fclose(f);
+ return -2;
+ }
+ *totalSize = (unsigned long)ts;
+ if (fseek(f,(long)readIndex,SEEK_SET) != 0) {
+ fclose(f);
+ return -2;
+ }
+ long n = (long)fread(buf,1,bufSize,f);
+ fclose(f);
+ return n;
}
inline int nodeDataStorePutFunction(const char *name,const void *data,unsigned long len,int secure)
{
+ std::string p(_homePath);
+ p.push_back(ZT_PATH_SEPARATOR);
+ char lastc = (char)0;
+ for(const char *n=name;(*n);++n) {
+ if ((*n == '.')&&(lastc == '.'))
+ return -2; // security sanity check-- don't allow ../ stuff even though there's really no way Node will ever do this
+ p.push_back((*n == '/') ? ZT_PATH_SEPARATOR : *n);
+ lastc = *n;
+ }
+
+ if (!data) {
+ OSUtils::rm(p.c_str());
+ return 0;
+ }
+
+ FILE *f = fopen(p.c_str(),"wb");
+ if (!f)
+ return -1;
+ if (fwrite(data,len,1,f) != 1) {
+ fclose(f);
+ return 0;
+ } else {
+ fclose(f);
+ OSUtils::rm(p.c_str());
+ return -1;
+ }
}
inline int nodeWirePacketSendFunction(const struct sockaddr_storage *addr,unsigned int desperation,const void *data,unsigned int len)
@@ -229,6 +285,8 @@ public:
inline void nodeVirtualNetworkFrameFunction(uint64_t nwid,uint64_t sourceMac,uint64_t destMac,unsigned int etherType,unsigned int vlanId,const void *data,unsigned int len)
{
+ fprintf(stderr,"VIRTUAL NETWORK FRAME from %.16llx : %.12llx -> %.12llx %.4x %u bytes",nwid,sourceMac,destMac,etherType,len);
+ fflush(stderr);
}
void threadMain()
@@ -274,6 +332,7 @@ public:
}
private:
+ const std::string _homePath;
SimpleFunctionPhy _phy;
NetworkConfigMaster *_master;
std::string _overrideRootTopology;
@@ -319,6 +378,40 @@ static int SnodeWirePacketSendFunction(ZT1_Node *node,void *uptr,const struct so
static void SnodeVirtualNetworkFrameFunction(ZT1_Node *node,void *uptr,uint64_t nwid,uint64_t sourceMac,uint64_t destMac,unsigned int etherType,unsigned int vlanId,const void *data,unsigned int len)
{ reinterpret_cast<OneImpl *>(uptr)->nodeVirtualNetworkFrameFunction(nwid,sourceMac,destMac,etherType,vlanId,data,len); }
+std::string One::platformDefaultHomePath()
+{
+#ifdef __UNIX_LIKE__
+
+#ifdef __APPLE__
+ // /Library/... on Apple
+ return std::string("/Library/Application Support/ZeroTier/One");
+#else
+
+#ifdef __FreeBSD__
+ // FreeBSD likes /var/db instead of /var/lib
+ return std::string("/var/db/zerotier-one");
+#else
+ // Use /var/lib for Linux and other *nix
+ return std::string("/var/lib/zerotier-one");
+#endif
+
+#endif
+
+#else // not __UNIX_LIKE__
+
+#ifdef __WINDOWS__
+ // Look up app data folder on Windows, e.g. C:\ProgramData\...
+ char buf[16384];
+ if (SUCCEEDED(SHGetFolderPathA(NULL,CSIDL_COMMON_APPDATA,NULL,0,buf)))
+ return (std::string(buf) + "\\ZeroTier\\One");
+ else return std::string("C:\\ZeroTier\\One");
+#else
+#error Unknown platform, please define a default home path!
+#endif
+
+#endif // __UNIX_LIKE__ or not...
+}
+
One *One::newInstance(const char *hp,unsigned int port,NetworkConfigMaster *master,const char *overrideRootTopology) { return new OneImpl(hp,port,master,overrideRootTopology); }
One::~One() {}
diff --git a/service/One.hpp b/service/One.hpp
index 3992ae39..29dec67f 100644
--- a/service/One.hpp
+++ b/service/One.hpp
@@ -68,6 +68,11 @@ public:
};
/**
+ * @return Platform default home path
+ */
+ static std::string platformDefaultHomePath();
+
+ /**
* Create and start a new instance of the service
*
* @param hp Home path