mirror of
https://github.com/servalproject/serval-dna.git
synced 2024-12-19 05:07:56 +00:00
Improve rhizome manifest debugging
Move rhizome_new_manifest() out of rhizome_read_manifest_file() so that the out-of-manifest report shows the names of the functions where the manifests were really allocated.
This commit is contained in:
parent
c0ac693957
commit
49aec4d331
@ -1146,19 +1146,19 @@ int app_rhizome_add_file(int argc, const char *const *argv, struct command_line_
|
|||||||
return -1;
|
return -1;
|
||||||
/* Create a new manifest that will represent the file. If a manifest file was supplied, then read
|
/* Create a new manifest that will represent the file. If a manifest file was supplied, then read
|
||||||
* it, otherwise create a blank manifest. */
|
* it, otherwise create a blank manifest. */
|
||||||
rhizome_manifest *m = NULL;
|
|
||||||
int manifest_file_supplied = 0;
|
int manifest_file_supplied = 0;
|
||||||
if (manifestpath[0] && access(manifestpath, R_OK) == 0) {
|
rhizome_manifest *m = rhizome_new_manifest();
|
||||||
if (debug & DEBUG_RHIZOME) DEBUGF("reading manifest from %s", manifestpath);
|
|
||||||
m = rhizome_read_manifest_file(manifestpath, 0, 0); // no verify
|
|
||||||
if (!m)
|
|
||||||
return WHY("Manifest file could not be loaded -- not added to rhizome");
|
|
||||||
manifest_file_supplied = 1;
|
|
||||||
} else {
|
|
||||||
if (debug & DEBUG_RHIZOME) DEBUGF("manifest file %s does not exist", manifestpath);
|
|
||||||
m = rhizome_new_manifest();
|
|
||||||
if (!m)
|
if (!m)
|
||||||
return WHY("Manifest struct could not be allocated -- not added to rhizome");
|
return WHY("Manifest struct could not be allocated -- not added to rhizome");
|
||||||
|
if (manifestpath[0] && access(manifestpath, R_OK) == 0) {
|
||||||
|
if (debug & DEBUG_RHIZOME) DEBUGF("reading manifest from %s", manifestpath);
|
||||||
|
if (rhizome_read_manifest_file(m, manifestpath, 0, 0) == -1) { // no verify
|
||||||
|
rhizome_manifest_free(m);
|
||||||
|
return WHY("Manifest file could not be loaded -- not added to rhizome");
|
||||||
|
}
|
||||||
|
manifest_file_supplied = 1;
|
||||||
|
} else {
|
||||||
|
if (debug & DEBUG_RHIZOME) DEBUGF("manifest file %s does not exist -- creating new manifest", manifestpath);
|
||||||
}
|
}
|
||||||
/* Fill in a few missing manifest fields, to make it easier to use when adding new files:
|
/* Fill in a few missing manifest fields, to make it easier to use when adding new files:
|
||||||
- the default service is FILE
|
- the default service is FILE
|
||||||
|
@ -52,9 +52,13 @@ int rhizome_bundle_import(rhizome_manifest *m_in, rhizome_manifest **m_out,
|
|||||||
/* Read manifest file if no manifest was given */
|
/* Read manifest file if no manifest was given */
|
||||||
rhizome_manifest *m = m_in;
|
rhizome_manifest *m = m_in;
|
||||||
if (!m_in) {
|
if (!m_in) {
|
||||||
m = rhizome_read_manifest_file(manifestname, 0 /* file not buffer */, RHIZOME_VERIFY);
|
m = rhizome_new_manifest();
|
||||||
if (!m)
|
if (!m)
|
||||||
|
return WHY("Out of manifests.");
|
||||||
|
if (rhizome_read_manifest_file(m, manifestname, 0 /* file not buffer */, RHIZOME_VERIFY) == -1) {
|
||||||
|
rhizome_manifest_free(m);
|
||||||
return WHY("Could not read manifest file.");
|
return WHY("Could not read manifest file.");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (debug&DEBUG_RHIZOMESYNC)
|
if (debug&DEBUG_RHIZOMESYNC)
|
||||||
DEBUGF("Importing direct from manifest structure fileHashedP=%d", m->fileHashedP);
|
DEBUGF("Importing direct from manifest structure fileHashedP=%d", m->fileHashedP);
|
||||||
|
@ -199,7 +199,7 @@ int rhizome_write_manifest_file(rhizome_manifest *m, const char *filename);
|
|||||||
int rhizome_manifest_sign(rhizome_manifest *m,const char *authoring_sid);
|
int rhizome_manifest_sign(rhizome_manifest *m,const char *authoring_sid);
|
||||||
int rhizome_drop_stored_file(char *id,int maximum_priority);
|
int rhizome_drop_stored_file(char *id,int maximum_priority);
|
||||||
int rhizome_manifest_priority(char *id);
|
int rhizome_manifest_priority(char *id);
|
||||||
rhizome_manifest *rhizome_read_manifest_file(const char *filename, int bufferPAndSize, int flags);
|
int rhizome_read_manifest_file(rhizome_manifest *m, const char *filename, int bufferPAndSize, int flags);
|
||||||
int rhizome_hash_file(const char *filename,char *hash_out);
|
int rhizome_hash_file(const char *filename,char *hash_out);
|
||||||
char *rhizome_manifest_get(const rhizome_manifest *m, const char *var, char *out, int maxlen);
|
char *rhizome_manifest_get(const rhizome_manifest *m, const char *var, char *out, int maxlen);
|
||||||
long long rhizome_manifest_get_ll(rhizome_manifest *m, const char *var);
|
long long rhizome_manifest_get_ll(rhizome_manifest *m, const char *var);
|
||||||
|
@ -21,25 +21,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||||||
#include "rhizome.h"
|
#include "rhizome.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
rhizome_manifest *rhizome_read_manifest_file(const char *filename, int bufferP, int flags)
|
int rhizome_read_manifest_file(rhizome_manifest *m, const char *filename, int bufferP, int flags)
|
||||||
{
|
{
|
||||||
if (bufferP>MAX_MANIFEST_BYTES) return NULL;
|
if (bufferP>MAX_MANIFEST_BYTES) return WHY("Buffer too big");
|
||||||
|
if (!m) return WHY("Null manifest");
|
||||||
rhizome_manifest *m = rhizome_new_manifest();
|
|
||||||
if (!m) return NULL;
|
|
||||||
|
|
||||||
if (bufferP) {
|
if (bufferP) {
|
||||||
m->manifest_bytes=bufferP;
|
m->manifest_bytes=bufferP;
|
||||||
memcpy(m->manifestdata, filename, m->manifest_bytes);
|
memcpy(m->manifestdata, filename, m->manifest_bytes);
|
||||||
} else {
|
} else {
|
||||||
FILE *f = fopen(filename, "r");
|
FILE *f = fopen(filename, "r");
|
||||||
if (!f) {
|
if (f == NULL)
|
||||||
WHYF("Could not open manifest file %s for reading.", filename);
|
return WHYF("Could not open manifest file %s for reading.", filename);
|
||||||
rhizome_manifest_free(m);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
m->manifest_bytes = fread(m->manifestdata, 1, MAX_MANIFEST_BYTES, f);
|
m->manifest_bytes = fread(m->manifestdata, 1, MAX_MANIFEST_BYTES, f);
|
||||||
fclose(f);
|
int ret = 0;
|
||||||
|
if (m->manifest_bytes == -1)
|
||||||
|
ret = WHY_perror("fread");
|
||||||
|
if (fclose(f) == EOF)
|
||||||
|
ret = WHY_perror("fclose");
|
||||||
|
if (ret == -1)
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
m->manifest_all_bytes=m->manifest_bytes;
|
m->manifest_all_bytes=m->manifest_bytes;
|
||||||
@ -148,7 +149,7 @@ rhizome_manifest *rhizome_read_manifest_file(const char *filename, int bufferP,
|
|||||||
|
|
||||||
m->manifest_bytes=end_of_text;
|
m->manifest_bytes=end_of_text;
|
||||||
|
|
||||||
return m;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rhizome_strn_is_file_hash(const char *text)
|
int rhizome_strn_is_file_hash(const char *text)
|
||||||
@ -309,9 +310,9 @@ rhizome_manifest *_rhizome_new_manifest(const char *filename, const char *funcna
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
logMessage(LOG_LEVEL_ERROR, filename, line, funcname, "%s(): no free manifest records, this probably indicates a memory leak", __FUNCTION__);
|
logMessage(LOG_LEVEL_ERROR, filename, line, funcname, "%s(): no free manifest records, this probably indicates a memory leak", __FUNCTION__);
|
||||||
WHYF(" Manifest Slot# | Last allocated by");
|
WHYF(" Slot# | Last allocated by");
|
||||||
for(i=0;i<MAX_RHIZOME_MANIFESTS;i++) {
|
for(i=0;i<MAX_RHIZOME_MANIFESTS;i++) {
|
||||||
WHYF(" %-14d | %s:%d in %s()",
|
WHYF(" %-5d | %s:%d in %s()",
|
||||||
i,
|
i,
|
||||||
manifest_alloc_sourcefiles[i],
|
manifest_alloc_sourcefiles[i],
|
||||||
manifest_alloc_lines[i],
|
manifest_alloc_lines[i],
|
||||||
|
@ -617,11 +617,19 @@ int rhizome_list_manifests(const char *service, const char *sender_sid, const ch
|
|||||||
ret = WHY("Incorrect statement column");
|
ret = WHY("Incorrect statement column");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
rhizome_manifest *m = rhizome_new_manifest();
|
||||||
|
if (m == NULL) {
|
||||||
|
ret = WHY("Out of manifests");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const char *q_manifestid = (const char *) sqlite3_column_text(statement, 2);
|
||||||
const char *manifestblob = (char *) sqlite3_column_blob(statement, 3);
|
const char *manifestblob = (char *) sqlite3_column_blob(statement, 3);
|
||||||
size_t manifestblobsize = sqlite3_column_bytes(statement, 3); // must call after sqlite3_column_blob()
|
size_t manifestblobsize = sqlite3_column_bytes(statement, 3); // must call after sqlite3_column_blob()
|
||||||
rhizome_manifest *m = rhizome_read_manifest_file(manifestblob, manifestblobsize, 0);
|
if (rhizome_read_manifest_file(m, manifestblob, manifestblobsize, 0) == -1) {
|
||||||
const char *blob_service = rhizome_manifest_get(m, "service", NULL, 0);
|
WARNF("MANIFESTS row id=%s has invalid manifest blob -- skipped", q_manifestid);
|
||||||
|
} else {
|
||||||
int match = 1;
|
int match = 1;
|
||||||
|
const char *blob_service = rhizome_manifest_get(m, "service", NULL, 0);
|
||||||
if (service[0] && !(blob_service && strcasecmp(service, blob_service) == 0))
|
if (service[0] && !(blob_service && strcasecmp(service, blob_service) == 0))
|
||||||
match = 0;
|
match = 0;
|
||||||
if (match && sender_sid[0]) {
|
if (match && sender_sid[0]) {
|
||||||
@ -639,14 +647,15 @@ int rhizome_list_manifests(const char *service, const char *sender_sid, const ch
|
|||||||
long long blob_date = rhizome_manifest_get_ll(m, "date");
|
long long blob_date = rhizome_manifest_get_ll(m, "date");
|
||||||
cli_puts(blob_service ? blob_service : ""); cli_delim(":");
|
cli_puts(blob_service ? blob_service : ""); cli_delim(":");
|
||||||
cli_puts((const char *)sqlite3_column_text(statement, 0)); cli_delim(":");
|
cli_puts((const char *)sqlite3_column_text(statement, 0)); cli_delim(":");
|
||||||
cli_puts((const char *)sqlite3_column_text(statement, 2)); cli_delim(":");
|
cli_puts(q_manifestid); cli_delim(":");
|
||||||
cli_printf("%lld", (long long) sqlite3_column_int64(statement, 4)); cli_delim(":");
|
cli_printf("%lld", (long long) sqlite3_column_int64(statement, 4)); cli_delim(":");
|
||||||
cli_printf("%lld", (long long) sqlite3_column_int64(statement, 5)); cli_delim(":");
|
cli_printf("%lld", (long long) sqlite3_column_int64(statement, 5)); cli_delim(":");
|
||||||
cli_printf("%u", sqlite3_column_int(statement, 1)); cli_delim(":");
|
cli_printf("%u", sqlite3_column_int(statement, 1)); cli_delim(":");
|
||||||
cli_printf("%lld", blob_date); cli_delim(":");
|
cli_printf("%lld", blob_date); cli_delim(":");
|
||||||
cli_puts(blob_name ? blob_name : ""); cli_delim("\n");
|
cli_puts(blob_name ? blob_name : ""); cli_delim("\n");
|
||||||
}
|
}
|
||||||
rhizome_manifest_free(m);
|
}
|
||||||
|
if (m) rhizome_manifest_free(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize(statement);
|
sqlite3_finalize(statement);
|
||||||
@ -919,7 +928,14 @@ int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found)
|
|||||||
const char *manifestblob = (char *) sqlite3_column_blob(statement, 1);
|
const char *manifestblob = (char *) sqlite3_column_blob(statement, 1);
|
||||||
size_t manifestblobsize = sqlite3_column_bytes(statement, 1); // must call after sqlite3_column_blob()
|
size_t manifestblobsize = sqlite3_column_bytes(statement, 1); // must call after sqlite3_column_blob()
|
||||||
long long q_version = sqlite3_column_int64(statement, 2);
|
long long q_version = sqlite3_column_int64(statement, 2);
|
||||||
rhizome_manifest *blob_m = rhizome_read_manifest_file(manifestblob, manifestblobsize, 0);
|
rhizome_manifest *blob_m = rhizome_new_manifest();
|
||||||
|
if (blob_m == NULL) {
|
||||||
|
ret = WHY("Out of manifests");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (rhizome_read_manifest_file(blob_m, manifestblob, manifestblobsize, 0) == -1) {
|
||||||
|
WARNF("MANIFESTS row id=%s has invalid manifest blob -- skipped", q_manifestid);
|
||||||
|
} else {
|
||||||
const char *blob_service = rhizome_manifest_get(blob_m, "service", NULL, 0);
|
const char *blob_service = rhizome_manifest_get(blob_m, "service", NULL, 0);
|
||||||
const char *blob_id = rhizome_manifest_get(blob_m, "id", NULL, 0);
|
const char *blob_id = rhizome_manifest_get(blob_m, "id", NULL, 0);
|
||||||
long long blob_version = rhizome_manifest_get_ll(blob_m, "version");
|
long long blob_version = rhizome_manifest_get_ll(blob_m, "version");
|
||||||
@ -987,7 +1003,8 @@ int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rhizome_manifest_free(blob_m);
|
}
|
||||||
|
if (blob_m) rhizome_manifest_free(blob_m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlite3_finalize(statement);
|
sqlite3_finalize(statement);
|
||||||
@ -1030,11 +1047,16 @@ int rhizome_retrieve_manifest(const char *manifestid, rhizome_manifest **mp)
|
|||||||
ret = WHY("Incorrect statement column");
|
ret = WHY("Incorrect statement column");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
const char *q_manifestid = (const char *) sqlite3_column_text(statement, 0);
|
||||||
const char *manifestblob = (char *) sqlite3_column_blob(statement, 1);
|
const char *manifestblob = (char *) sqlite3_column_blob(statement, 1);
|
||||||
size_t manifestblobsize = sqlite3_column_bytes(statement, 1); // must call after sqlite3_column_blob()
|
size_t manifestblobsize = sqlite3_column_bytes(statement, 1); // must call after sqlite3_column_blob()
|
||||||
if (mp) {
|
if (mp) {
|
||||||
m = rhizome_read_manifest_file(manifestblob, manifestblobsize, 0);
|
m = rhizome_new_manifest();
|
||||||
if (m == NULL) {
|
if (m == NULL) {
|
||||||
|
WARNF("MANIFESTS row id=%s has invalid manifest blob -- skipped", q_manifestid);
|
||||||
|
ret = WHY("Out of manifests");
|
||||||
|
} else if (rhizome_read_manifest_file(m, manifestblob, manifestblobsize, 0) == -1) {
|
||||||
|
WARNF("MANIFESTS row id=%s has invalid manifest blob -- skipped", q_manifestid);
|
||||||
ret = WHY("Invalid manifest blob from database");
|
ret = WHY("Invalid manifest blob from database");
|
||||||
} else {
|
} else {
|
||||||
ret = 1;
|
ret = 1;
|
||||||
@ -1063,7 +1085,7 @@ int rhizome_retrieve_manifest(const char *manifestid, rhizome_manifest **mp)
|
|||||||
cli_puts("service"); cli_delim(":");
|
cli_puts("service"); cli_delim(":");
|
||||||
cli_puts(blob_service); cli_delim("\n");
|
cli_puts(blob_service); cli_delim("\n");
|
||||||
cli_puts("manifestid"); cli_delim(":");
|
cli_puts("manifestid"); cli_delim(":");
|
||||||
cli_puts((const char *)sqlite3_column_text(statement, 0)); cli_delim("\n");
|
cli_puts(q_manifestid); cli_delim("\n");
|
||||||
cli_puts("version"); cli_delim(":");
|
cli_puts("version"); cli_delim(":");
|
||||||
cli_printf("%lld", (long long) sqlite3_column_int64(statement, 2)); cli_delim("\n");
|
cli_printf("%lld", (long long) sqlite3_column_int64(statement, 2)); cli_delim("\n");
|
||||||
cli_puts("inserttime"); cli_delim(":");
|
cli_puts("inserttime"); cli_delim(":");
|
||||||
|
@ -341,12 +341,16 @@ int overlay_rhizome_saw_advertisements(int i,overlay_frame *f, long long now)
|
|||||||
otherwise happen.
|
otherwise happen.
|
||||||
But we do need to make sure that at least one signature is there.
|
But we do need to make sure that at least one signature is there.
|
||||||
*/
|
*/
|
||||||
m=rhizome_read_manifest_file((char *)&f->payload->bytes[ofs],
|
m = rhizome_new_manifest();
|
||||||
manifest_length,RHIZOME_DONTVERIFY);
|
|
||||||
if (!m) {
|
if (!m) {
|
||||||
WHY("Out of manifests");
|
WHY("Out of manifests");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (rhizome_read_manifest_file(m, (char *)&f->payload->bytes[ofs], manifest_length, RHIZOME_DONTVERIFY) == -1) {
|
||||||
|
WHY("Error importing manifest body");
|
||||||
|
rhizome_manifest_free(m);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
/* Crude signature presence test */
|
/* Crude signature presence test */
|
||||||
for(i=m->manifest_all_bytes-1;i>0;i--)
|
for(i=m->manifest_all_bytes-1;i>0;i--)
|
||||||
if (!m->manifestdata[i]) {
|
if (!m->manifestdata[i]) {
|
||||||
@ -404,23 +408,25 @@ int overlay_rhizome_saw_advertisements(int i,overlay_frame *f, long long now)
|
|||||||
/* Okay, so the manifest looks like it is potentially interesting to us,
|
/* Okay, so the manifest looks like it is potentially interesting to us,
|
||||||
i.e., we don't already have it or a later version of it.
|
i.e., we don't already have it or a later version of it.
|
||||||
Now reread the manifest, this time verifying signatures */
|
Now reread the manifest, this time verifying signatures */
|
||||||
m=rhizome_read_manifest_file((char *)&f->payload->bytes[ofs],
|
if ((m = rhizome_new_manifest()) == NULL)
|
||||||
manifest_length,RHIZOME_VERIFY);
|
WHY("Out of manifests");
|
||||||
if (m->errors) {
|
else if (rhizome_read_manifest_file(m, (char *)&f->payload->bytes[ofs], manifest_length, RHIZOME_VERIFY) == -1) {
|
||||||
|
WHY("Error importing manifest body");
|
||||||
|
rhizome_manifest_free(m);
|
||||||
|
m = NULL;
|
||||||
|
} else if (m->errors) {
|
||||||
if (debug&DEBUG_RHIZOME) DEBUGF("Verifying manifest %s revealed errors -- not storing.", manifest_id);
|
if (debug&DEBUG_RHIZOME) DEBUGF("Verifying manifest %s revealed errors -- not storing.", manifest_id);
|
||||||
rhizome_queue_ignore_manifest(m,(struct sockaddr_in*)f->recvaddr,60000);
|
rhizome_queue_ignore_manifest(m,(struct sockaddr_in*)f->recvaddr,60000);
|
||||||
rhizome_manifest_free(m);
|
rhizome_manifest_free(m);
|
||||||
|
m = NULL;
|
||||||
} else {
|
} else {
|
||||||
if (debug&DEBUG_RHIZOME) DEBUGF("Verifying manifest %s revealed no errors -- will try to store.", manifest_id);
|
if (debug&DEBUG_RHIZOME) DEBUGF("Verifying manifest %s revealed no errors -- will try to store.", manifest_id);
|
||||||
|
|
||||||
/* Add manifest to import queue. We need to know originating IPv4 address
|
/* Add manifest to import queue. We need to know originating IPv4 address
|
||||||
so that we can transfer by HTTP. */
|
so that we can transfer by HTTP. */
|
||||||
if (0) DEBUG("Suggesting fetching of a bundle");
|
if (0) DEBUG("Suggesting fetching of a bundle");
|
||||||
rhizome_suggest_queue_manifest_import(m,(struct sockaddr_in *)f->recvaddr);
|
rhizome_suggest_queue_manifest_import(m,(struct sockaddr_in *)f->recvaddr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
rhizome_manifest_free(m);
|
|
||||||
|
|
||||||
if (!manifest_length) {
|
if (!manifest_length) {
|
||||||
WHY("Infinite loop in packet decoding");
|
WHY("Infinite loop in packet decoding");
|
||||||
|
Loading…
Reference in New Issue
Block a user