|
|
|
|
@ -1925,6 +1925,49 @@ public:
|
|
|
|
|
delete [] buf; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void writeStateObject(enum ZT_StateObjectType type,uint64_t id,const void *data,int len) |
|
|
|
|
{ |
|
|
|
|
char p[4096]; |
|
|
|
|
bool secure = false; |
|
|
|
|
switch(type) { |
|
|
|
|
case ZT_STATE_OBJECT_IDENTITY_PUBLIC: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "identity.public",_homePath.c_str()); |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_IDENTITY_SECRET: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "identity.secret",_homePath.c_str()); |
|
|
|
|
secure = true; |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_PEER_IDENTITY: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "iddb.d/%.10llx",_homePath.c_str(),(unsigned long long)id); |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_NETWORK_CONFIG: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "networks.d/%.16llx.conf",_homePath.c_str(),(unsigned long long)id); |
|
|
|
|
secure = true; |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_PLANET: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "planet",_homePath.c_str()); |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_MOON: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "moons.d/%.16llx.moon",_homePath.c_str(),(unsigned long long)id); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
p[0] = (char)0; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if (p[0]) { |
|
|
|
|
FILE *f = fopen(p,"w"); |
|
|
|
|
if (f) { |
|
|
|
|
if (fwrite(data,len,1,f) != 1) |
|
|
|
|
fprintf(stderr,"WARNING: unable to write to file: %s (I/O error)" ZT_EOL_S,p); |
|
|
|
|
fclose(f); |
|
|
|
|
if (secure) |
|
|
|
|
OSUtils::lockDownFile(p,false); |
|
|
|
|
} else { |
|
|
|
|
fprintf(stderr,"WARNING: unable to write to file: %s (unable to open)" ZT_EOL_S,p); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// =========================================================================
|
|
|
|
|
// Handlers for Node and Phy<> callbacks
|
|
|
|
|
// =========================================================================
|
|
|
|
|
@ -2229,8 +2272,10 @@ public:
|
|
|
|
|
((uint64_t)data[32] << 8) | |
|
|
|
|
(uint64_t)data[33] |
|
|
|
|
); |
|
|
|
|
if (_node->processStateUpdate((void *)0,(ZT_StateObjectType)data[25],objId,data + 34,(unsigned int)(mlen - 34)) == ZT_RESULT_OK) |
|
|
|
|
if (_node->processStateUpdate((void *)0,(ZT_StateObjectType)data[25],objId,data + 34,(unsigned int)(mlen - 34)) == ZT_RESULT_OK) { |
|
|
|
|
writeStateObject((ZT_StateObjectType)data[25],objId,data + 34,(unsigned int)(mlen - 34)); |
|
|
|
|
replicateStateObjectToCluster((ZT_StateObjectType)data[25],objId,data + 34,(unsigned int)(mlen - 34),tc->clusterMemberId); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
@ -2453,29 +2498,41 @@ public:
|
|
|
|
|
|
|
|
|
|
inline void nodeStatePutFunction(enum ZT_StateObjectType type,uint64_t id,const void *data,int len) |
|
|
|
|
{ |
|
|
|
|
writeStateObject(type,id,data,len); |
|
|
|
|
replicateStateObjectToCluster(type,id,data,len,0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline int nodeStateGetFunction(enum ZT_StateObjectType type,uint64_t id,void *data,unsigned int maxlen) |
|
|
|
|
{ |
|
|
|
|
char p[4096]; |
|
|
|
|
FILE *f = (FILE *)0; |
|
|
|
|
switch(type) { |
|
|
|
|
case ZT_STATE_OBJECT_IDENTITY_PUBLIC: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "identity.public",_homePath.c_str()); |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_IDENTITY_SECRET: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "identity.secret",_homePath.c_str()); |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_PEER_IDENTITY: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "iddb.d/%.10llx",_homePath.c_str(),(unsigned long long)id); |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_NETWORK_CONFIG: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "networks.d/%.16llx.conf",_homePath.c_str(),(unsigned long long)id); |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_PLANET: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "planet",_homePath.c_str()); |
|
|
|
|
break; |
|
|
|
|
case ZT_STATE_OBJECT_MOON: |
|
|
|
|
Utils::snprintf(p,sizeof(p),"%s" ZT_PATH_SEPARATOR_S "moons.d/%.16llx.moon",_homePath.c_str(),(unsigned long long)id); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
FILE *f = fopen(p,"r"); |
|
|
|
|
if (f) { |
|
|
|
|
int n = (int)fread(data,1,maxlen,f); |
|
|
|
|
fclose(f); |
|
|
|
|
if (n >= 0) |
|
|
|
|
return n; |
|
|
|
|
} |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|