mirror of
https://github.com/servalproject/serval-dna.git
synced 2024-12-18 20:57:56 +00:00
Improve Rhizome DB path configuration
Change the default 'rhizome.datastore_path' to "rhizome", ie, a sub-
directory of the instance directory.
Add a new erename() operation to "os.h".
Clean up the code around the fix 39f582cca
(two commits ago) for a bug
introduced in 2014: the 'rhizome.db' file was always being created in
the instance directory, regardless of the setting of the
'rhizome.datastore_path' config option.
Whenever the Rhizome database is opened (by the server or by a CLI
invocation), if the database file does not exist but there is a
'rhizome.db' file in the legacy location, then move that file (and any
accompanying "blob" and "hash" sub-directories) to the configured
location.
Update copyright notices.
This commit is contained in:
parent
9ba27b28a0
commit
faa0f392c5
@ -448,12 +448,12 @@ ATOM(bool_t, enable, 1, boolean,, "If true, server opens
|
|||||||
ATOM(bool_t, fetch, 1, boolean,, "If false, no new bundles will be fetched from peers")
|
ATOM(bool_t, fetch, 1, boolean,, "If false, no new bundles will be fetched from peers")
|
||||||
ATOM(bool_t, reliable_clock, 1, boolean,, "If false, consider the system clock to be unreliable for generating timestamps")
|
ATOM(bool_t, reliable_clock, 1, boolean,, "If false, consider the system clock to be unreliable for generating timestamps")
|
||||||
ATOM(bool_t, clean_on_open, 0, boolean,, "If true, Rhizome database is cleaned at start of every command")
|
ATOM(bool_t, clean_on_open, 0, boolean,, "If true, Rhizome database is cleaned at start of every command")
|
||||||
STRING(256, datastore_path, "", str_nonempty,, "Path of rhizome storage directory, absolute or relative to instance directory")
|
STRING(256, datastore_path, RHIZOME_DEFAULT_PATH, str_nonempty,, "Path of rhizome storage directory, absolute or relative to instance directory")
|
||||||
ATOM(uint64_t, database_size, UINT64_MAX, uint64_scaled,, "Maximum size of database in bytes")
|
ATOM(uint64_t, database_size, UINT64_MAX, uint64_scaled,, "Maximum size of database in bytes")
|
||||||
ATOM(uint64_t, min_free_space, 100*1024*1024, uint64_scaled,, "Minimum free space to preserve on the disk")
|
ATOM(uint64_t, min_free_space, 100*1024*1024, uint64_scaled,, "Minimum free space to preserve on the disk")
|
||||||
ATOM(uint32_t, max_blob_size, 128 * 1024, uint32_scaled,, "Store payloads larger than this in files not SQLite blobs")
|
ATOM(uint32_t, max_blob_size, 128 * 1024, uint32_scaled,, "Store payloads larger than this in files not SQLite blobs")
|
||||||
ATOM(uint64_t, idle_timeout, RHIZOME_IDLE_TIMEOUT, uint64_scaled,, "Rhizome transfer timeout if no data received.")
|
ATOM(uint64_t, idle_timeout, RHIZOME_IDLE_TIMEOUT, uint64_scaled,, "Rhizome transfer timeout if no data received.")
|
||||||
ATOM(uint32_t, fetch_delay_ms, 50, uint32_nonzero,, "Delay from receiving first bundle advert to initiating fetch")
|
ATOM(uint32_t, fetch_delay_ms, 50, uint32_nonzero,, "Delay from receiving first bundle advert to initiating fetch")
|
||||||
SUB_STRUCT(rhizome_direct, direct,)
|
SUB_STRUCT(rhizome_direct, direct,)
|
||||||
SUB_STRUCT(rhizome_api, api,)
|
SUB_STRUCT(rhizome_api, api,)
|
||||||
SUB_STRUCT(rhizome_http, http,)
|
SUB_STRUCT(rhizome_http, http,)
|
||||||
|
65
instance.c
65
instance.c
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Serval DNA instance paths
|
Serval DNA instance paths
|
||||||
Copyright (C) 2012-2015 Serval Project Inc.
|
Copyright (C) 2012-2015 Serval Project Inc.
|
||||||
|
Copyright (C) 2016-2018 Flinders University
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License
|
modify it under the terms of the GNU General Public License
|
||||||
@ -23,6 +24,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "instance.h"
|
#include "instance.h"
|
||||||
|
#include "conf.h"
|
||||||
#include "str.h"
|
#include "str.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
@ -105,20 +107,21 @@ void set_instance_path(const char *path)
|
|||||||
know_instancepath = 1;
|
know_instancepath = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vformf_basepath(struct __sourceloc __whence, strbuf b, const char *basepath, const char *fmt, va_list ap)
|
static int vformf_path(struct __sourceloc __whence, strbuf b, const char *fhs_path, const char *configured_path, const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
if (fmt)
|
const char *ipath = instance_path();
|
||||||
strbuf_va_vprintf(b, fmt, ap);
|
strbuf_path_join(b, ipath ? ipath : fhs_path, NULL);
|
||||||
if (!strbuf_overrun(b) && (strbuf_len(b) == 0 || strbuf_str(b)[0] != '/')) {
|
if (configured_path)
|
||||||
strbuf_reset(b);
|
strbuf_path_join(b, configured_path, NULL);
|
||||||
strbuf_puts(b, basepath);
|
assert(strbuf_str(b)[0] == '/');
|
||||||
if (fmt) {
|
int fmt_overrun = 0;
|
||||||
if (strbuf_substr(b, -1)[0] != '/')
|
if (fmt) {
|
||||||
strbuf_putc(b, '/');
|
strbuf sb = strbuf_alloca(strbuf_size(b));
|
||||||
strbuf_va_vprintf(b, fmt, ap);
|
strbuf_va_vprintf(sb, fmt, ap);
|
||||||
}
|
strbuf_path_join(b, strbuf_str(sb), NULL);
|
||||||
|
fmt_overrun = strbuf_overrun(sb);
|
||||||
}
|
}
|
||||||
if (!strbuf_overrun(b))
|
if (!strbuf_overrun(b) && !fmt_overrun)
|
||||||
return 1;
|
return 1;
|
||||||
WHYF("instance path overflow (strlen %lu, sizeof buffer %lu): %s",
|
WHYF("instance path overflow (strlen %lu, sizeof buffer %lu): %s",
|
||||||
(unsigned long)strbuf_count(b),
|
(unsigned long)strbuf_count(b),
|
||||||
@ -127,28 +130,11 @@ static int vformf_basepath(struct __sourceloc __whence, strbuf b, const char *ba
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _formf_path(struct __sourceloc __whence, char *buf, size_t bufsiz, const char *basepath, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
va_start(ap, fmt);
|
|
||||||
int ret = vformf_basepath(__whence, strbuf_local(buf, bufsiz), basepath, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vformf_path(struct __sourceloc __whence, strbuf b, const char *syspath, const char *fmt, va_list ap)
|
|
||||||
{
|
|
||||||
const char *ipath = instance_path();
|
|
||||||
if (!ipath)
|
|
||||||
ipath=syspath;
|
|
||||||
return vformf_basepath(__whence, b, ipath, fmt, ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
int _formf_serval_etc_path(struct __sourceloc __whence, char *buf, size_t bufsiz, const char *fmt, ...)
|
int _formf_serval_etc_path(struct __sourceloc __whence, char *buf, size_t bufsiz, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_ETC_PATH, fmt, ap);
|
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_ETC_PATH, NULL, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -164,7 +150,7 @@ int _formf_serval_run_path(struct __sourceloc __whence, char *buf, size_t bufsiz
|
|||||||
|
|
||||||
int _vformf_serval_run_path(struct __sourceloc __whence, char *buf, size_t bufsiz, const char *fmt, va_list ap)
|
int _vformf_serval_run_path(struct __sourceloc __whence, char *buf, size_t bufsiz, const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
return vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_RUN_PATH, fmt, ap);
|
return vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_RUN_PATH, NULL, fmt, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
strbuf strbuf_system_log_path(strbuf sb)
|
strbuf strbuf_system_log_path(strbuf sb)
|
||||||
@ -188,7 +174,7 @@ int _formf_serval_cache_path(struct __sourceloc __whence, char *buf, size_t bufs
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_CACHE_PATH, fmt, ap);
|
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_CACHE_PATH, NULL, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -197,7 +183,16 @@ int _formf_rhizome_store_path(struct __sourceloc __whence, char *buf, size_t buf
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), RHIZOME_STORE_PATH, fmt, ap);
|
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), RHIZOME_STORE_PATH, config.rhizome.datastore_path, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _formf_rhizome_store_legacy_path(struct __sourceloc __whence, char *buf, size_t bufsiz, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), RHIZOME_STORE_PATH, NULL, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -206,7 +201,7 @@ int _formf_serval_tmp_path(struct __sourceloc __whence, char *buf, size_t bufsiz
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_TMP_PATH, fmt, ap);
|
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_TMP_PATH, NULL, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -215,7 +210,7 @@ int _formf_servald_proc_path(struct __sourceloc __whence, char *buf, size_t bufs
|
|||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_RUN_PATH "/proc", fmt, ap);
|
int ret = vformf_path(__whence, strbuf_local(buf, bufsiz), SERVAL_RUN_PATH "/proc", NULL, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
43
instance.h
43
instance.h
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Serval DNA instance paths
|
Serval DNA instance paths
|
||||||
Copyright (C) 2014-2015 Serval Project Inc.
|
Copyright (C) 2014-2015 Serval Project Inc.
|
||||||
Copyright (C) 2016 Flinders University
|
Copyright (C) 2016-2018 Flinders University
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License
|
modify it under the terms of the GNU General Public License
|
||||||
@ -31,8 +31,14 @@ void set_instance_path(const char *path);
|
|||||||
|
|
||||||
int create_serval_instance_dir();
|
int create_serval_instance_dir();
|
||||||
|
|
||||||
int _formf_path(struct __sourceloc __whence, char *buf, size_t bufsiz, const char *basepath, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,5,6)));
|
/* Macros for forming the absolute paths of various files into a given char*
|
||||||
|
* buffer. Evaluates to true if the pathname fits into the provided buffer,
|
||||||
|
* false (0) otherwise (after logging an error).
|
||||||
|
*
|
||||||
|
* The "legacy" path functions/macros are exclusively used to provide
|
||||||
|
* compatibility with earlier versions of Serval DNA, and may be deleted once
|
||||||
|
* no longer needed.
|
||||||
|
*/
|
||||||
int _formf_serval_etc_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
int _formf_serval_etc_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
||||||
int _formf_serval_run_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
int _formf_serval_run_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
||||||
int _vformf_serval_run_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, va_list);
|
int _vformf_serval_run_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, va_list);
|
||||||
@ -40,27 +46,30 @@ int _formf_serval_cache_path(struct __sourceloc, char *buf, size_t bufsiz, const
|
|||||||
int _formf_serval_tmp_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
int _formf_serval_tmp_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
||||||
int _formf_servald_proc_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
int _formf_servald_proc_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
||||||
int _formf_rhizome_store_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
int _formf_rhizome_store_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
||||||
|
int _formf_rhizome_store_legacy_path(struct __sourceloc, char *buf, size_t bufsiz, const char *fmt, ...) __attribute__((__ATTRIBUTE_format(printf,4,5)));
|
||||||
|
|
||||||
#define formf_path(buf,bufsz,basepath,fmt,...) _formf_path(__WHENCE__, buf, bufsz, basepath, fmt, ##__VA_ARGS__)
|
#define formf_serval_etc_path(buf,bufsz,fmt,...) _formf_serval_etc_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
||||||
|
#define formf_serval_run_path(buf,bufsz,fmt,...) _formf_serval_run_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
||||||
#define formf_serval_etc_path(buf,bufsz,fmt,...) _formf_serval_etc_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
#define vformf_serval_run_path(buf,bufsz,fmt,ap) _vformf_serval_run_path(__WHENCE__, buf, bufsz, fmt, ap)
|
||||||
#define formf_serval_run_path(buf,bufsz,fmt,...) _formf_serval_run_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
#define formf_serval_cache_path(buf,bufsz,fmt,...) _formf_serval_cache_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
||||||
#define vformf_serval_run_path(buf,bufsz,fmt,ap) _vformf_serval_run_path(__WHENCE__, buf, bufsz, fmt, ap)
|
#define formf_serval_tmp_path(buf,bufsz,fmt,...) _formf_serval_tmp_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
||||||
#define formf_serval_cache_path(buf,bufsz,fmt,...) _formf_serval_cache_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
#define formf_servald_proc_path(buf,bufsz,fmt,...) _formf_servald_proc_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
||||||
#define formf_serval_tmp_path(buf,bufsz,fmt,...) _formf_serval_tmp_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
#define formf_rhizome_store_path(buf,bufsz,fmt,...) _formf_rhizome_store_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
||||||
#define formf_servald_proc_path(buf,bufsz,fmt,...) _formf_servald_proc_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
#define formf_rhizome_store_legacy_path(buf,bufsz,fmt,...) _formf_rhizome_store_legacy_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
||||||
#define formf_rhizome_store_path(buf,bufsz,fmt,...) _formf_rhizome_store_path(__WHENCE__, buf, bufsz, fmt, ##__VA_ARGS__)
|
|
||||||
|
|
||||||
/* Handy macros for forming the absolute paths of various files, using a char[]
|
/* Handy macros for forming the absolute paths of various files, using a char[]
|
||||||
* buffer whose declaration is in scope (so that sizeof(buf) will work).
|
* buffer whose declaration is in scope (so that sizeof(buf) will work).
|
||||||
* Evaluates to true if the pathname fits into the provided buffer, false (0)
|
* Evaluates to true if the pathname fits into the provided buffer, false (0)
|
||||||
* otherwise (after logging an error).
|
* otherwise (after logging an error).
|
||||||
*/
|
*/
|
||||||
#define FORMF_SERVAL_ETC_PATH(buf,fmt,...) formf_serval_etc_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
#define FORMF_SERVAL_ETC_PATH(buf,fmt,...) formf_serval_etc_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
||||||
#define FORMF_SERVAL_RUN_PATH(buf,fmt,...) formf_serval_run_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
#define FORMF_SERVAL_RUN_PATH(buf,fmt,...) formf_serval_run_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
||||||
#define FORMF_SERVAL_CACHE_PATH(buf,fmt,...) formf_serval_cache_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
#define VFORMF_SERVAL_RUN_PATH(buf,fmt,ap) vformf_serval_run_path(buf, sizeof(buf), fmt, ap)
|
||||||
#define FORMF_SERVAL_TMP_PATH(buf,fmt,...) formf_serval_tmp_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
#define FORMF_SERVAL_CACHE_PATH(buf,fmt,...) formf_serval_cache_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
||||||
#define FORMF_SERVALD_PROC_PATH(buf,fmt,...) formf_servald_proc_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
#define FORMF_SERVAL_TMP_PATH(buf,fmt,...) formf_serval_tmp_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
||||||
|
#define FORMF_SERVALD_PROC_PATH(buf,fmt,...) formf_servald_proc_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
||||||
|
#define FORMF_RHIZOME_STORE_PATH(buf,fmt,...) formf_rhizome_store_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
||||||
|
#define FORMF_RHIZOME_STORE_LEGACY_PATH(buf,fmt,...) formf_rhizome_store_legacy_path(buf, sizeof(buf), fmt, ##__VA_ARGS__)
|
||||||
|
|
||||||
strbuf strbuf_system_log_path(strbuf sb);
|
strbuf strbuf_system_log_path(strbuf sb);
|
||||||
strbuf strbuf_serval_log_path(strbuf sb);
|
strbuf strbuf_serval_log_path(strbuf sb);
|
||||||
|
36
os.c
36
os.c
@ -1,6 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
Serval Distributed Numbering Architecture (DNA)
|
Serval DNA operating system services
|
||||||
Copyright (C) 2010 Paul Gardner-Stephen
|
Copyright (C) 2010 Paul Gardner-Stephen
|
||||||
|
Copyright (C) 2012-2015 Serval Project Inc.
|
||||||
|
Copyright (C) 2016-2018 Flinders University
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License
|
modify it under the terms of the GNU General Public License
|
||||||
@ -114,6 +116,15 @@ int _mkdirsn(struct __sourceloc whence, const char *path, size_t len, mode_t mod
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _erename(struct __sourceloc __whence, const char *oldpath, const char *newpath, int log_level)
|
||||||
|
{
|
||||||
|
if (log_level != LOG_LEVEL_SILENT)
|
||||||
|
LOGF(log_level, "rename %s -> %s", alloca_str_toprint(oldpath), alloca_str_toprint(newpath));
|
||||||
|
if (rename(oldpath, newpath) == -1)
|
||||||
|
return WHYF_perror("rename(%s,%s)", alloca_str_toprint(oldpath), alloca_str_toprint(newpath));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
time_ms_t gettime_ms()
|
time_ms_t gettime_ms()
|
||||||
{
|
{
|
||||||
struct timeval nowtv;
|
struct timeval nowtv;
|
||||||
@ -221,6 +232,7 @@ int get_file_meta(const char *path, struct file_meta *metap)
|
|||||||
return WHYF_perror("stat(%s)", path);
|
return WHYF_perror("stat(%s)", path);
|
||||||
*metap = FILE_META_NONEXIST;
|
*metap = FILE_META_NONEXIST;
|
||||||
} else {
|
} else {
|
||||||
|
metap->mode = st.st_mode;
|
||||||
metap->size = st.st_size;
|
metap->size = st.st_size;
|
||||||
metap->mtime.tv_sec = st.st_mtime;
|
metap->mtime.tv_sec = st.st_mtime;
|
||||||
// Truncate to whole seconds to ensure that this code will work on file systems that only have
|
// Truncate to whole seconds to ensure that this code will work on file systems that only have
|
||||||
@ -323,6 +335,24 @@ int alter_file_meta(const char *path, const struct file_meta *origp, struct file
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int file_exists(const char *path)
|
||||||
|
{
|
||||||
|
struct file_meta meta;
|
||||||
|
return get_file_meta(path, &meta) != -1 && is_file_meta_exists(&meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
int file_exists_is_regular(const char *path)
|
||||||
|
{
|
||||||
|
struct file_meta meta;
|
||||||
|
return get_file_meta(path, &meta) != -1 && is_file_meta_regular(&meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
int file_exists_is_directory(const char *path)
|
||||||
|
{
|
||||||
|
struct file_meta meta;
|
||||||
|
return get_file_meta(path, &meta) != -1 && !is_file_meta_directory(&meta);
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t get_self_executable_path(char *buf, size_t len)
|
ssize_t get_self_executable_path(char *buf, size_t len)
|
||||||
{
|
{
|
||||||
#if defined(linux)
|
#if defined(linux)
|
||||||
|
38
os.h
38
os.h
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Serval DNA native Operating System interface
|
Serval DNA native Operating System interface
|
||||||
Copyright (C) 2012 Serval Project Inc.
|
Copyright (C) 2012-2014 Serval Project Inc.
|
||||||
|
Copyright (C) 2017-2018 Flinders University
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License
|
modify it under the terms of the GNU General Public License
|
||||||
@ -25,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h> // for off64_t
|
#include <sys/types.h> // for off64_t
|
||||||
|
#include <sys/stat.h> // for S_IFMT etc.
|
||||||
#include <stdio.h> // for NULL
|
#include <stdio.h> // for NULL
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h> // for int64_t
|
#include <stdint.h> // for int64_t
|
||||||
@ -106,7 +108,9 @@ __SERVAL_DNA__OS_INLINE off64_t lseek64(int fd, off64_t offset, int whence) {
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The "e" variants log the error before returning -1.
|
/* Functions to create a directory and any missing parent directories. The "e"
|
||||||
|
* variants log the error before returning -1. The "_info" variants log all
|
||||||
|
* created directories at INFO level.
|
||||||
*/
|
*/
|
||||||
typedef void MKDIR_LOG_FUNC(struct __sourceloc, const char *, mode_t, void *);
|
typedef void MKDIR_LOG_FUNC(struct __sourceloc, const char *, mode_t, void *);
|
||||||
MKDIR_LOG_FUNC log_info_mkdir;
|
MKDIR_LOG_FUNC log_info_mkdir;
|
||||||
@ -130,6 +134,12 @@ int _emkdirsn(struct __sourceloc, const char *path, size_t len, mode_t mode, MKD
|
|||||||
#define emkdirs_info(path, mode) emkdirs_log((path), (mode), log_info_mkdir, NULL)
|
#define emkdirs_info(path, mode) emkdirs_log((path), (mode), log_info_mkdir, NULL)
|
||||||
#define emkdirsn_info(path, len, mode) emkdirsn_log((path), (len), (mode), log_info_mkdir, NULL)
|
#define emkdirsn_info(path, len, mode) emkdirsn_log((path), (len), (mode), log_info_mkdir, NULL)
|
||||||
|
|
||||||
|
/* Function to rename a file, logging any error before returning -1.
|
||||||
|
*/
|
||||||
|
int _erename(struct __sourceloc, const char *oldpath, const char *newpath, int log_level);
|
||||||
|
#define erename(oldpath, newpath) _erename(__WHENCE__, (oldpath), (newpath), LOG_LEVEL_SILENT)
|
||||||
|
#define erename_info(oldpath, newpath) _erename(__WHENCE__, (oldpath), (newpath), LOG_LEVEL_INFO)
|
||||||
|
|
||||||
/* Read the symbolic link into the supplied buffer and add a terminating nul.
|
/* Read the symbolic link into the supplied buffer and add a terminating nul.
|
||||||
* Logs an ERROR and returns -1 if the buffer is too short to hold the link
|
* Logs an ERROR and returns -1 if the buffer is too short to hold the link
|
||||||
* content and the terminating nul. If readlink(2) returns an error, then logs
|
* content and the terminating nul. If readlink(2) returns an error, then logs
|
||||||
@ -185,17 +195,30 @@ int malloc_read_whole_file(const char *path, unsigned char **bufp, size_t *sizp)
|
|||||||
struct file_meta {
|
struct file_meta {
|
||||||
struct timespec mtime;
|
struct timespec mtime;
|
||||||
off_t size;
|
off_t size;
|
||||||
|
mode_t mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FILE_META_UNKNOWN ((struct file_meta){ .mtime = { .tv_sec = -1, .tv_nsec = -1 }, .size = -1 })
|
#define FILE_META_UNKNOWN ((struct file_meta){ .mtime = { .tv_sec = -1, .tv_nsec = -1 }, .size = -1, .mode = -1 })
|
||||||
|
|
||||||
// A non-existent file is treated as size == 0 and an impossible modification
|
// A non-existent file is treated as size == 0 and an impossible modification
|
||||||
// time, so that cmp_file_meta() will not compare it as equal with any existing
|
// time, so that cmp_file_meta() will not compare it as equal with any existing
|
||||||
// file.
|
// file.
|
||||||
#define FILE_META_NONEXIST ((struct file_meta){ .mtime = { .tv_sec = -1, .tv_nsec = -1 }, .size = 0 })
|
#define FILE_META_NONEXIST ((struct file_meta){ .mtime = { .tv_sec = -1, .tv_nsec = -1 }, .size = 0, .mode = 0 })
|
||||||
|
|
||||||
__SERVAL_DNA__OS_INLINE int is_file_meta_nonexist(const struct file_meta *m) {
|
__SERVAL_DNA__OS_INLINE int is_file_meta_nonexist(const struct file_meta *m) {
|
||||||
return m->mtime.tv_sec == -1 && m->mtime.tv_nsec == -1 && m->size == 0;
|
return m->mtime.tv_sec == -1 && m->mtime.tv_nsec == -1 && m->size == 0 && m->mode == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__SERVAL_DNA__OS_INLINE int is_file_meta_exists(const struct file_meta *m) {
|
||||||
|
return m->mtime.tv_sec != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
__SERVAL_DNA__OS_INLINE int is_file_meta_regular(const struct file_meta *m) {
|
||||||
|
return is_file_meta_exists(m) && (m->mode & S_IFMT) == S_IFREG;
|
||||||
|
}
|
||||||
|
|
||||||
|
__SERVAL_DNA__OS_INLINE int is_file_meta_directory(const struct file_meta *m) {
|
||||||
|
return is_file_meta_exists(m) && (m->mode & S_IFMT) == S_IFDIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_file_meta(const char *path, struct file_meta *metap);
|
int get_file_meta(const char *path, struct file_meta *metap);
|
||||||
@ -205,6 +228,11 @@ int cmp_file_meta(const struct file_meta *a, const struct file_meta *b);
|
|||||||
// by bumping the file's modification time or altering its inode.
|
// by bumping the file's modification time or altering its inode.
|
||||||
int alter_file_meta(const char *path, const struct file_meta *origp, struct file_meta *metap);
|
int alter_file_meta(const char *path, const struct file_meta *origp, struct file_meta *metap);
|
||||||
|
|
||||||
|
// Convenience functions based on get_file_meta().
|
||||||
|
int file_exists(const char *path);
|
||||||
|
int file_exists_is_regular(const char *path);
|
||||||
|
int file_exists_is_directory(const char *path);
|
||||||
|
|
||||||
/* Fill the given buffer with the nul-terminated absolute path of the calling
|
/* Fill the given buffer with the nul-terminated absolute path of the calling
|
||||||
* process's executable. Logs an error and returns -1 if the executable cannot
|
* process's executable. Logs an error and returns -1 if the executable cannot
|
||||||
* be determined or the supplied buffer is too short. Otherwise returns the
|
* be determined or the supplied buffer is too short. Otherwise returns the
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Serval DNA Rhizome file distribution
|
Serval DNA Rhizome file distribution
|
||||||
|
Copyright (C) 2016-2018 Flinders University
|
||||||
Copyright (C) 2010-2014 Serval Project Inc.
|
Copyright (C) 2010-2014 Serval Project Inc.
|
||||||
Copyright (C) 2010 Paul Gardner-Stephen
|
Copyright (C) 2010 Paul Gardner-Stephen
|
||||||
|
|
||||||
@ -337,19 +338,18 @@ int rhizome_configure();
|
|||||||
int rhizome_enabled();
|
int rhizome_enabled();
|
||||||
int rhizome_fetch_delay_ms();
|
int rhizome_fetch_delay_ms();
|
||||||
|
|
||||||
|
#define RHIZOME_DEFAULT_PATH "rhizome"
|
||||||
#define RHIZOME_BLOB_SUBDIR "blob"
|
#define RHIZOME_BLOB_SUBDIR "blob"
|
||||||
#define RHIZOME_HASH_SUBDIR "hash"
|
#define RHIZOME_HASH_SUBDIR "hash"
|
||||||
|
|
||||||
struct rhizome_database{
|
struct rhizome_database {
|
||||||
|
char dir_path[1024];
|
||||||
sqlite3 *db;
|
sqlite3 *db;
|
||||||
serval_uuid_t uuid;
|
serval_uuid_t uuid;
|
||||||
char folder[1024];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern __thread struct rhizome_database rhizome_database;
|
extern __thread struct rhizome_database rhizome_database;
|
||||||
|
|
||||||
#define FORMF_RHIZOME_STORE_PATH(buf,fmt,...) formf_path((buf), sizeof(buf), rhizome_database.folder, (fmt), ##__VA_ARGS__)
|
|
||||||
|
|
||||||
int rhizome_opendb();
|
int rhizome_opendb();
|
||||||
int rhizome_close_db();
|
int rhizome_close_db();
|
||||||
void verify_bundles();
|
void verify_bundles();
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Serval DNA - Rhizome command line interface
|
Serval DNA - Rhizome command line interface
|
||||||
Copyright (C) 2014 Serval Project Inc.
|
Copyright (C) 2014 Serval Project Inc.
|
||||||
|
Copyright (C) 2016-2017 Flinders University
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License
|
modify it under the terms of the GNU General Public License
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Serval DNA - Rhizome database operations
|
Serval DNA - Rhizome database operations
|
||||||
Copyright (C) 2012-2014 Serval Project Inc.
|
Copyright (C) 2012-2014 Serval Project Inc.
|
||||||
|
Copyright (C) 2016-2018 Flinders University
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License
|
modify it under the terms of the GNU General Public License
|
||||||
@ -37,7 +38,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|||||||
|
|
||||||
static int rhizome_delete_manifest_retry(sqlite_retry_state *retry, const rhizome_bid_t *bidp);
|
static int rhizome_delete_manifest_retry(sqlite_retry_state *retry, const rhizome_bid_t *bidp);
|
||||||
|
|
||||||
__thread struct rhizome_database rhizome_database = {NULL,{{{0}}},{0}};
|
__thread struct rhizome_database rhizome_database = {
|
||||||
|
.dir_path = "",
|
||||||
|
.db = NULL,
|
||||||
|
.uuid = SERVAL_UUID_INVALID
|
||||||
|
};
|
||||||
|
|
||||||
static time_ms_t rhizomeRetryLimit = -1;
|
static time_ms_t rhizomeRetryLimit = -1;
|
||||||
|
|
||||||
int is_debug_rhizome()
|
int is_debug_rhizome()
|
||||||
@ -235,65 +241,82 @@ int rhizome_opendb()
|
|||||||
|
|
||||||
IN();
|
IN();
|
||||||
|
|
||||||
if (sodium_init()==-1)
|
if (sodium_init() == -1)
|
||||||
RETURN(WHY("Failed to initialise libsodium"));
|
RETURN(WHY("Failed to initialise libsodium"));
|
||||||
|
|
||||||
if (!formf_rhizome_store_path(rhizome_database.folder, sizeof rhizome_database.folder, "%s", config.rhizome.datastore_path))
|
// Work out the absolute path of the directory that contains all the database
|
||||||
RETURN (-1);
|
// files/subdirectories.
|
||||||
DEBUGF(rhizome, "Rhizome datastore path = %s", alloca_str_toprint(rhizome_database.folder));
|
if (!FORMF_RHIZOME_STORE_PATH(rhizome_database.dir_path, "%s", ""))
|
||||||
if (emkdirs_info(rhizome_database.folder, 0700)==-1)
|
|
||||||
RETURN (-1);
|
|
||||||
char dbpath[1024];
|
|
||||||
|
|
||||||
if (!FORMF_RHIZOME_STORE_PATH(dbpath, "rhizome.db"))
|
|
||||||
RETURN(-1);
|
RETURN(-1);
|
||||||
|
DEBUGF(rhizome, "Rhizome store directory path = %s", alloca_str_toprint(rhizome_database.dir_path));
|
||||||
struct file_meta meta;
|
|
||||||
if (get_file_meta(dbpath, &meta) == -1)
|
// Work out the absolute paths of the database file and subdirectories.
|
||||||
|
char dbpath[sizeof rhizome_database.dir_path];
|
||||||
|
char blobpath[sizeof rhizome_database.dir_path];
|
||||||
|
char hashpath[sizeof rhizome_database.dir_path];
|
||||||
|
char temppath[sizeof rhizome_database.dir_path];
|
||||||
|
int db_exists = 0;
|
||||||
|
{
|
||||||
|
struct file_meta dbmeta;
|
||||||
|
if ( !FORMF_RHIZOME_STORE_PATH(dbpath, "rhizome.db")
|
||||||
|
|| !FORMF_RHIZOME_STORE_PATH(blobpath, RHIZOME_BLOB_SUBDIR)
|
||||||
|
|| !FORMF_RHIZOME_STORE_PATH(hashpath, RHIZOME_HASH_SUBDIR)
|
||||||
|
|| !FORMF_RHIZOME_STORE_PATH(temppath, "sqlite3tmp")
|
||||||
|
|| get_file_meta(dbpath, &dbmeta) == -1)
|
||||||
|
RETURN(-1);
|
||||||
|
db_exists = is_file_meta_exists(&dbmeta);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create missing store directory.
|
||||||
|
if (emkdirs_info(rhizome_database.dir_path, 0700) == -1)
|
||||||
RETURN(-1);
|
RETURN(-1);
|
||||||
|
|
||||||
if (meta.mtime.tv_sec == -1 && config.rhizome.datastore_path[0]){
|
// If the database file does not exist, then SQLite will create it. However, in 2014 a bug was
|
||||||
// Move the database after datastore path is set for the first time
|
// introduced that always created the database file in the instance directory, regardless of the
|
||||||
// This is mostly here to transparently fix a bug where we were ignoring the config value
|
// setting of the 'rhizome.datastore_path' config option. This bug has now been fixed, so in
|
||||||
char src[1024];
|
// order to preserve the Rhizome data store when upgrading from an earlier (buggy) version, if
|
||||||
char dest[1024];
|
// there is a database file at this "legacy" location, then move it into the correct, configured
|
||||||
if (formf_rhizome_store_path(src, sizeof src, "rhizome.db")
|
// location, instead of creating a fresh (empty) database file.
|
||||||
&& strcmp(dbpath, src)!=0
|
if (!db_exists) {
|
||||||
&& get_file_meta(src, &meta)==0
|
char legacy_dbpath[sizeof rhizome_database.dir_path];
|
||||||
&& meta.mtime.tv_sec != -1){
|
if (FORMF_RHIZOME_STORE_LEGACY_PATH(legacy_dbpath, "rhizome.db")
|
||||||
|
&& strcmp(legacy_dbpath, dbpath) != 0
|
||||||
INFOF("Moving rhizome store from %s to %s", src, dbpath);
|
&& file_exists(legacy_dbpath)
|
||||||
if (rename(src, dbpath))
|
) {
|
||||||
WHYF_perror("rename(%s, %s)", src, dbpath);
|
INFOF("Recover legacy Rhizome SQLite database");
|
||||||
|
// Move the legacy database file to its correct location.
|
||||||
if (formf_rhizome_store_path(src, sizeof src, RHIZOME_BLOB_SUBDIR)
|
if (erename_info(legacy_dbpath, dbpath) == -1)
|
||||||
&& FORMF_RHIZOME_STORE_PATH(dest, RHIZOME_BLOB_SUBDIR)
|
RETURN(-1);
|
||||||
&& rename(src, dest)
|
// Move any legacy "blob" and "hash" subdirectories too, if they are present.
|
||||||
&& errno!=ENOENT){
|
char legacy_dirpath[sizeof rhizome_database.dir_path];
|
||||||
WHYF_perror("rename(%s, %s)", src, dest);
|
if ( !file_exists(blobpath)
|
||||||
}
|
&& FORMF_RHIZOME_STORE_LEGACY_PATH(legacy_dirpath, RHIZOME_BLOB_SUBDIR)
|
||||||
|
&& file_exists(legacy_dirpath))
|
||||||
if (formf_rhizome_store_path(src, sizeof src, RHIZOME_HASH_SUBDIR)
|
erename_info(legacy_dirpath, blobpath);
|
||||||
&& FORMF_RHIZOME_STORE_PATH(dest, RHIZOME_HASH_SUBDIR)
|
if ( !file_exists(hashpath)
|
||||||
&& rename(src, dest)
|
&& FORMF_RHIZOME_STORE_LEGACY_PATH(legacy_dirpath, RHIZOME_HASH_SUBDIR)
|
||||||
&& errno!=ENOENT){
|
&& file_exists(legacy_dirpath))
|
||||||
WHYF_perror("rename(%s, %s)", src, dest);
|
erename_info(legacy_dirpath, hashpath);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
INFOF("Creating Rhizome SQLite database: %s", dbpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sqlite3_temp_directory){
|
// Create missing sub-directories.
|
||||||
char tmp[1024];
|
if ( emkdirs_info(blobpath, 0700) == -1
|
||||||
if (!FORMF_RHIZOME_STORE_PATH(tmp, "sqlite3tmp"))
|
|| emkdirs_info(hashpath, 0700) == -1
|
||||||
RETURN(-1);
|
|| emkdirs_info(temppath, 0700) == -1)
|
||||||
if (emkdirs_info(tmp, 0700) == -1)
|
RETURN(-1);
|
||||||
RETURN(-1);
|
|
||||||
sqlite3_temp_directory = sqlite3_mprintf("%s", tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlite3_config(SQLITE_CONFIG_LOG,sqlite_log,NULL);
|
// Inform SQLite of its temporary directory.
|
||||||
|
assert(!sqlite3_temp_directory);
|
||||||
|
sqlite3_temp_directory = sqlite3_mprintf("%s", temppath);
|
||||||
|
|
||||||
if (sqlite3_open(dbpath,&rhizome_database.db)){
|
// Set up SQLite logging.
|
||||||
|
sqlite3_config(SQLITE_CONFIG_LOG, sqlite_log, NULL);
|
||||||
|
|
||||||
|
// Open the SQLite database file, creating it if necessary.
|
||||||
|
if (sqlite3_open(dbpath, &rhizome_database.db)){
|
||||||
RETURN(WHYF("SQLite could not open database %s: %s", dbpath, sqlite3_errmsg(rhizome_database.db)));
|
RETURN(WHYF("SQLite could not open database %s: %s", dbpath, sqlite3_errmsg(rhizome_database.db)));
|
||||||
}
|
}
|
||||||
sqlite3_trace_v2(rhizome_database.db, SQLITE_TRACE_STMT, sqlite_trace_callback, NULL);
|
sqlite3_trace_v2(rhizome_database.db, SQLITE_TRACE_STMT, sqlite_trace_callback, NULL);
|
||||||
@ -304,7 +327,7 @@ int rhizome_opendb()
|
|||||||
|
|
||||||
/* Read Rhizome configuration */
|
/* Read Rhizome configuration */
|
||||||
DEBUGF(rhizome, "Rhizome will use %"PRIu64"B of storage for its database.", (uint64_t) config.rhizome.database_size);
|
DEBUGF(rhizome, "Rhizome will use %"PRIu64"B of storage for its database.", (uint64_t) config.rhizome.database_size);
|
||||||
|
|
||||||
sqlite_retry_state retry = SQLITE_RETRY_STATE_DEFAULT;
|
sqlite_retry_state retry = SQLITE_RETRY_STATE_DEFAULT;
|
||||||
|
|
||||||
uint64_t version;
|
uint64_t version;
|
||||||
@ -358,7 +381,7 @@ int rhizome_opendb()
|
|||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "CREATE INDEX IF NOT EXISTS IDX_MANIFESTS_HASH ON MANIFESTS(filehash);", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "CREATE INDEX IF NOT EXISTS IDX_MANIFESTS_HASH ON MANIFESTS(filehash);", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=1;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=1;", END);
|
||||||
}
|
}
|
||||||
if (version<2 && meta.mtime.tv_sec != -1){
|
if (version<2 && db_exists){
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN service text;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN service text;", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN name text;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN name text;", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN sender text collate nocase;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN sender text collate nocase;", END);
|
||||||
@ -369,28 +392,28 @@ int rhizome_opendb()
|
|||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "CREATE INDEX IF NOT EXISTS IDX_MANIFESTS_ID_VERSION ON MANIFESTS(id, version);", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "CREATE INDEX IF NOT EXISTS IDX_MANIFESTS_ID_VERSION ON MANIFESTS(id, version);", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=3;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=3;", END);
|
||||||
}
|
}
|
||||||
if (version<4 && meta.mtime.tv_sec != -1){
|
if (version<4 && db_exists){
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN tail integer;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN tail integer;", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=4;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=4;", END);
|
||||||
}
|
}
|
||||||
if (version<5 && meta.mtime.tv_sec != -1){
|
if (version<5 && db_exists){
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "CREATE TABLE IF NOT EXISTS IDENTITY(uuid text not null); ", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "CREATE TABLE IF NOT EXISTS IDENTITY(uuid text not null); ", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=5;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=5;", END);
|
||||||
}
|
}
|
||||||
if (version<6 && meta.mtime.tv_sec != -1){
|
if (version<6 && db_exists){
|
||||||
// we've always been at war with eurasia
|
// we've always been at war with eurasia
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "DROP TABLE IF EXISTS GROUPLIST; ", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "DROP TABLE IF EXISTS GROUPLIST; ", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "DROP TABLE IF EXISTS GROUPMEMBERSHIPS; ", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "DROP TABLE IF EXISTS GROUPMEMBERSHIPS; ", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "DROP TABLE IF EXISTS VERIFICATIONS; ", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "DROP TABLE IF EXISTS VERIFICATIONS; ", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "DROP TABLE IF EXISTS FILEMANIFESTS;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "DROP TABLE IF EXISTS FILEMANIFESTS;", END);
|
||||||
}
|
}
|
||||||
if (version<7 && meta.mtime.tv_sec != -1){
|
if (version<7 && db_exists){
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE FILES ADD COLUMN last_verified integer;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE FILES ADD COLUMN last_verified integer;", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=7;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "PRAGMA user_version=7;", END);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version<8){
|
if (version<8){
|
||||||
if (meta.mtime.tv_sec != -1)
|
if (db_exists)
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN manifest_hash text collate nocase;", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "ALTER TABLE MANIFESTS ADD COLUMN manifest_hash text collate nocase;", END);
|
||||||
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "CREATE INDEX IF NOT EXISTS IDX_MANIFEST_HASH ON MANIFESTS(manifest_hash);", END);
|
sqlite_exec_void_loglevel(LOG_LEVEL_WARN, "CREATE INDEX IF NOT EXISTS IDX_MANIFEST_HASH ON MANIFESTS(manifest_hash);", END);
|
||||||
|
|
||||||
@ -448,7 +471,7 @@ int rhizome_close_db()
|
|||||||
IN();
|
IN();
|
||||||
if (rhizome_database.db) {
|
if (rhizome_database.db) {
|
||||||
rhizome_cache_close();
|
rhizome_cache_close();
|
||||||
|
|
||||||
if (!sqlite3_get_autocommit(rhizome_database.db)){
|
if (!sqlite3_get_autocommit(rhizome_database.db)){
|
||||||
WHY("Uncommitted transaction!");
|
WHY("Uncommitted transaction!");
|
||||||
sqlite_exec_void("ROLLBACK;", END);
|
sqlite_exec_void("ROLLBACK;", END);
|
||||||
@ -461,11 +484,11 @@ int rhizome_close_db()
|
|||||||
int r = sqlite3_close(rhizome_database.db);
|
int r = sqlite3_close(rhizome_database.db);
|
||||||
if (r != SQLITE_OK)
|
if (r != SQLITE_OK)
|
||||||
RETURN(WHYF("Failed to close sqlite database, %s",sqlite3_errmsg(rhizome_database.db)));
|
RETURN(WHYF("Failed to close sqlite database, %s",sqlite3_errmsg(rhizome_database.db)));
|
||||||
}
|
rhizome_database.db = NULL;
|
||||||
rhizome_database.db=NULL;
|
assert(sqlite3_temp_directory);
|
||||||
if (sqlite3_temp_directory)
|
|
||||||
sqlite3_free(sqlite3_temp_directory);
|
sqlite3_free(sqlite3_temp_directory);
|
||||||
sqlite3_temp_directory=NULL;
|
sqlite3_temp_directory = NULL;
|
||||||
|
}
|
||||||
RETURN(0);
|
RETURN(0);
|
||||||
OUT();
|
OUT();
|
||||||
}
|
}
|
||||||
|
@ -195,8 +195,8 @@ static uint64_t store_get_free_space()
|
|||||||
#if defined(HAVE_SYS_STATVFS_H) || (defined(HAVE_SYS_STAT_H) && defined(HAVE_SYS_VFS_H))
|
#if defined(HAVE_SYS_STATVFS_H) || (defined(HAVE_SYS_STAT_H) && defined(HAVE_SYS_VFS_H))
|
||||||
else {
|
else {
|
||||||
struct statvfs stats;
|
struct statvfs stats;
|
||||||
if (statvfs(rhizome_database.folder, &stats)==-1)
|
if (statvfs(rhizome_database.dir_path, &stats)==-1)
|
||||||
WARNF_perror("statvfs(%s)", rhizome_database.folder);
|
WARNF_perror("statvfs(%s)", alloca_str_toprint(rhizome_database.dir_path));
|
||||||
else
|
else
|
||||||
space = stats.f_frsize * (uint64_t)stats.f_bavail;
|
space = stats.f_frsize * (uint64_t)stats.f_bavail;
|
||||||
}
|
}
|
||||||
|
@ -69,6 +69,8 @@ typedef struct serval_uuid {
|
|||||||
} u;
|
} u;
|
||||||
} serval_uuid_t;
|
} serval_uuid_t;
|
||||||
|
|
||||||
|
#define SERVAL_UUID_INVALID { .u = { .record = { .clock_seq_hi_and_reserved = 0 } } }
|
||||||
|
|
||||||
enum serval_uuid_version {
|
enum serval_uuid_version {
|
||||||
UUID_VERSION_UNSUPPORTED = 0,
|
UUID_VERSION_UNSUPPORTED = 0,
|
||||||
UUID_VERSION_TIME_BASED = 1,
|
UUID_VERSION_TIME_BASED = 1,
|
||||||
|
2
socket.c
2
socket.c
@ -53,7 +53,7 @@ int _make_local_sockaddr(struct __sourceloc __whence, struct socket_address *add
|
|||||||
addr->local.sun_family = AF_UNIX;
|
addr->local.sun_family = AF_UNIX;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
int r = vformf_serval_run_path(addr->local.sun_path, sizeof addr->local.sun_path, fmt, ap);
|
int r = VFORMF_SERVAL_RUN_PATH(addr->local.sun_path, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
if (!r)
|
if (!r)
|
||||||
return WHY("socket name overflow");
|
return WHY("socket name overflow");
|
||||||
|
@ -235,7 +235,7 @@ strip_signatures() {
|
|||||||
get_external_blob_path(){
|
get_external_blob_path(){
|
||||||
local _var="$1"
|
local _var="$1"
|
||||||
local _hash="$2"
|
local _hash="$2"
|
||||||
local _filepath="$SERVALINSTANCE_PATH/blob/${_hash:0:2}/${_hash:2:2}/${_hash:4}"
|
local _filepath="$SERVALINSTANCE_PATH/rhizome/blob/${_hash:0:2}/${_hash:2:2}/${_hash:4}"
|
||||||
if [ -n "$_var" ]; then
|
if [ -n "$_var" ]; then
|
||||||
eval "$_var=\$_filepath"
|
eval "$_var=\$_filepath"
|
||||||
fi
|
fi
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
# Tests for Serval rhizome command-line operations.
|
# Tests for Serval rhizome command-line operations.
|
||||||
#
|
#
|
||||||
# Copyright 2012-2015 Serval Project, Inc.
|
# Copyright 2012-2015 Serval Project, Inc.
|
||||||
|
# Copyright 2016-2018 Flinders University
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU General Public License
|
# modify it under the terms of the GNU General Public License
|
||||||
@ -310,14 +311,17 @@ setup_MoveDatabaseFolder() {
|
|||||||
executeOk_servald config set rhizome.max_blob_size 0
|
executeOk_servald config set rhizome.max_blob_size 0
|
||||||
echo "A test file" >file1
|
echo "A test file" >file1
|
||||||
executeOk_servald rhizome add file "$SIDA" file1 file1.manifest
|
executeOk_servald rhizome add file "$SIDA" file1 file1.manifest
|
||||||
|
assert --stderr [ -e "$SERVALINSTANCE_PATH/rhizome/rhizome.db" ]
|
||||||
|
executeOk mv "$SERVALINSTANCE_PATH/rhizome/"* "$SERVALINSTANCE_PATH"
|
||||||
|
executeOk rmdir "$SERVALINSTANCE_PATH/rhizome/"
|
||||||
}
|
}
|
||||||
test_MoveDatabaseFolder() {
|
test_MoveDatabaseFolder() {
|
||||||
executeOk_servald config \
|
executeOk_servald config set rhizome.datastore_path "moved"
|
||||||
set rhizome.datastore_path "$instance_dir/moved_rhizome"
|
|
||||||
executeOk_servald rhizome list
|
executeOk_servald rhizome list
|
||||||
assert_rhizome_list --fromhere=1 --author="$SIDA" file1
|
assert_rhizome_list --fromhere=1 --author="$SIDA" file1
|
||||||
assert [ ! -e "$instance_dir/rhizome.db" ]
|
assert --stderr [ ! -e "$SERVALINSTANCE_PATH/rhizome/rhizome.db" ]
|
||||||
assert [ -e "$instance_dir/moved_rhizome/rhizome.db" ]
|
assert --stderr [ -e "$SERVALINSTANCE_PATH/moved/rhizome.db" ]
|
||||||
|
tfw_cat --stderr
|
||||||
}
|
}
|
||||||
|
|
||||||
doc_CleanVerify="Verify all bundles"
|
doc_CleanVerify="Verify all bundles"
|
||||||
@ -1147,10 +1151,10 @@ test_JournalAppendNoHash() {
|
|||||||
assert_stdout_add_file file1
|
assert_stdout_add_file file1
|
||||||
extract_stdout_manifestid BID
|
extract_stdout_manifestid BID
|
||||||
extract_stdout_filehash HASH
|
extract_stdout_filehash HASH
|
||||||
assert [ $(find "$SERVALINSTANCE_PATH/hash" -type f| wc -l) -eq 1 ]
|
assert [ $(find "$SERVALINSTANCE_PATH/rhizome/hash" -type f| wc -l) -eq 1 ]
|
||||||
executeOk_servald rhizome journal append "$SIDA" "$BID" file2
|
executeOk_servald rhizome journal append "$SIDA" "$BID" file2
|
||||||
tfw_cat --stdout --stderr
|
tfw_cat --stdout --stderr
|
||||||
assert [ $(find "$SERVALINSTANCE_PATH/hash" -type f| wc -l) -eq 2 ]
|
assert [ $(find "$SERVALINSTANCE_PATH/rhizome/hash" -type f| wc -l) -eq 2 ]
|
||||||
assertStderrGrep 'Reusing journal'
|
assertStderrGrep 'Reusing journal'
|
||||||
executeOk_servald rhizome extract file "$BID" filex
|
executeOk_servald rhizome extract file "$BID" filex
|
||||||
tfw_cat --stdout --stderr
|
tfw_cat --stdout --stderr
|
||||||
@ -1178,7 +1182,7 @@ setup_JournalAppendSharedPayload() {
|
|||||||
extract_stdout_filehash HASH12
|
extract_stdout_filehash HASH12
|
||||||
get_external_blob_path blob_file12 "$HASH12"
|
get_external_blob_path blob_file12 "$HASH12"
|
||||||
assert cmp file12 "$blob_file12"
|
assert cmp file12 "$blob_file12"
|
||||||
assert [ $(find "$SERVALINSTANCE_PATH/blob" -type f| wc -l) -eq 2 ]
|
assert [ $(find "$SERVALINSTANCE_PATH/rhizome/blob" -type f| wc -l) -eq 2 ]
|
||||||
}
|
}
|
||||||
test_JournalAppendSharedPayload() {
|
test_JournalAppendSharedPayload() {
|
||||||
executeOk_servald rhizome journal append "$SIDA" "" file1
|
executeOk_servald rhizome journal append "$SIDA" "" file1
|
||||||
@ -1186,14 +1190,14 @@ test_JournalAppendSharedPayload() {
|
|||||||
assert_stdout_add_file file1
|
assert_stdout_add_file file1
|
||||||
extract_stdout_filehash addedhash
|
extract_stdout_filehash addedhash
|
||||||
assert [ "$addedhash" = "$HASH1" ]
|
assert [ "$addedhash" = "$HASH1" ]
|
||||||
assert [ $(find "$SERVALINSTANCE_PATH/blob" -type f| wc -l) -eq 2 ]
|
assert [ $(find "$SERVALINSTANCE_PATH/rhizome/blob" -type f| wc -l) -eq 2 ]
|
||||||
extract_stdout_manifestid BID
|
extract_stdout_manifestid BID
|
||||||
executeOk_servald rhizome journal append "$SIDA" "$BID" file2
|
executeOk_servald rhizome journal append "$SIDA" "$BID" file2
|
||||||
tfw_cat --stdout --stderr
|
tfw_cat --stdout --stderr
|
||||||
assert_stdout_add_file file12 !name
|
assert_stdout_add_file file12 !name
|
||||||
extract_stdout_filehash addedhash
|
extract_stdout_filehash addedhash
|
||||||
assert [ "$addedhash" = "$HASH12" ]
|
assert [ "$addedhash" = "$HASH12" ]
|
||||||
assert [ $(find "$SERVALINSTANCE_PATH/blob" -type f| wc -l) -eq 2 ]
|
assert [ $(find "$SERVALINSTANCE_PATH/rhizome/blob" -type f| wc -l) -eq 2 ]
|
||||||
}
|
}
|
||||||
|
|
||||||
doc_JournalAddCreate="Cannot create a journal using file add"
|
doc_JournalAddCreate="Cannot create a journal using file add"
|
||||||
@ -1478,8 +1482,8 @@ setup_ImportOwnBundle() {
|
|||||||
extract_manifest_filehash filehash fileB.manifest
|
extract_manifest_filehash filehash fileB.manifest
|
||||||
extract_manifest_BK BK fileB.manifest
|
extract_manifest_BK BK fileB.manifest
|
||||||
extract_manifest_date date fileB.manifest
|
extract_manifest_date date fileB.manifest
|
||||||
assert [ -e "$SERVALINSTANCE_PATH/rhizome.db" ]
|
assert [ -e "$SERVALINSTANCE_PATH/rhizome/rhizome.db" ]
|
||||||
rm -f "$SERVALINSTANCE_PATH/rhizome.db"
|
rm -f "$SERVALINSTANCE_PATH/rhizome/rhizome.db"
|
||||||
executeOk_servald rhizome list
|
executeOk_servald rhizome list
|
||||||
assert_rhizome_list
|
assert_rhizome_list
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user