mirror of
https://github.com/owntone/owntone-server.git
synced 2025-01-13 07:53:23 -05:00
Remove provisions for multi-library support
It is now clear that multi-library support will not happen, so remove whatever provisions were in the code for that. It comes with a small change to the configuration file, too. With this, DB schema version went to 9.
This commit is contained in:
parent
d6285eef40
commit
19b6780a3c
@ -10,10 +10,10 @@ general {
|
||||
}
|
||||
|
||||
# Library configuration
|
||||
library "My Music" {
|
||||
library {
|
||||
# Name of the library as displayed by the clients
|
||||
# %l: library name ("My Music"), %h: hostname, %v: version
|
||||
name = "%l on %h"
|
||||
# %h: hostname, %v: version
|
||||
name = "My Music on %h"
|
||||
# TCP port to listen on. Default port is 3689 (daap)
|
||||
port = 3689
|
||||
# Password for the library. Optional.
|
||||
|
106
src/conffile.c
106
src/conffile.c
@ -50,7 +50,7 @@ static cfg_opt_t sec_general[] =
|
||||
/* library section structure */
|
||||
static cfg_opt_t sec_library[] =
|
||||
{
|
||||
CFG_STR("name", "%l on %h", CFGF_NONE),
|
||||
CFG_STR("name", "My Music on %h", CFGF_NONE),
|
||||
CFG_INT("port", 3689, CFGF_NONE),
|
||||
CFG_STR("password", NULL, CFGF_NONE),
|
||||
CFG_STR_LIST("directories", NULL, CFGF_NONE),
|
||||
@ -65,7 +65,7 @@ static cfg_opt_t sec_library[] =
|
||||
static cfg_opt_t toplvl_cfg[] =
|
||||
{
|
||||
CFG_SEC("general", sec_general, CFGF_NONE),
|
||||
CFG_SEC("library", sec_library, CFGF_MULTI | CFGF_TITLE),
|
||||
CFG_SEC("library", sec_library, CFGF_NONE),
|
||||
CFG_END()
|
||||
};
|
||||
|
||||
@ -101,7 +101,6 @@ static int
|
||||
conffile_expand_libname(cfg_t *lib)
|
||||
{
|
||||
char *libname;
|
||||
const char *title;
|
||||
char *hostname;
|
||||
char *s;
|
||||
char *d;
|
||||
@ -109,7 +108,6 @@ conffile_expand_libname(cfg_t *lib)
|
||||
struct utsname sysinfo;
|
||||
size_t len;
|
||||
size_t olen;
|
||||
size_t titlelen;
|
||||
size_t hostlen;
|
||||
size_t verlen;
|
||||
int ret;
|
||||
@ -122,8 +120,6 @@ conffile_expand_libname(cfg_t *lib)
|
||||
return 0;
|
||||
|
||||
/* Grab what we need */
|
||||
title = cfg_title(lib);
|
||||
|
||||
ret = uname(&sysinfo);
|
||||
if (ret != 0)
|
||||
{
|
||||
@ -133,7 +129,6 @@ conffile_expand_libname(cfg_t *lib)
|
||||
else
|
||||
hostname = sysinfo.nodename;
|
||||
|
||||
titlelen = strlen(title);
|
||||
hostlen = strlen(hostname);
|
||||
verlen = strlen(VERSION);
|
||||
|
||||
@ -154,10 +149,6 @@ conffile_expand_libname(cfg_t *lib)
|
||||
len += hostlen;
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
len += titlelen;
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
len += verlen;
|
||||
break;
|
||||
@ -191,11 +182,6 @@ conffile_expand_libname(cfg_t *lib)
|
||||
d += hostlen;
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
strcat(d, title);
|
||||
d += titlelen;
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
strcat(d, VERSION);
|
||||
d += verlen;
|
||||
@ -225,12 +211,6 @@ int
|
||||
conffile_load(char *file)
|
||||
{
|
||||
cfg_t *lib;
|
||||
int nlib;
|
||||
int *libports;
|
||||
int libport;
|
||||
int error;
|
||||
int i;
|
||||
int j;
|
||||
int ret;
|
||||
|
||||
cfg = cfg_init(toplvl_cfg, CFGF_NONE);
|
||||
@ -241,89 +221,39 @@ conffile_load(char *file)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_CONF, "Could not open config file %s\n", file);
|
||||
|
||||
cfg_free(cfg);
|
||||
return -1;
|
||||
goto out_fail;
|
||||
}
|
||||
else if (ret == CFG_PARSE_ERROR)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_CONF, "Parse error in config file %s\n", file);
|
||||
|
||||
cfg_free(cfg);
|
||||
return -1;
|
||||
goto out_fail;
|
||||
}
|
||||
|
||||
nlib = cfg_size(cfg, "library");
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
|
||||
DPRINTF(E_INFO, L_CONF, "%d music libraries configured\n", nlib);
|
||||
|
||||
libports = (int *)malloc(nlib * sizeof(int));
|
||||
memset(libports, 0, (nlib * sizeof(int)));
|
||||
|
||||
error = 0;
|
||||
for (i = 0; i < nlib; i++)
|
||||
if (cfg_size(lib, "directories") == 0)
|
||||
{
|
||||
lib = cfg_getnsec(cfg, "library", i);
|
||||
libport = cfg_getint(lib, "port");
|
||||
DPRINTF(E_FATAL, L_CONF, "No directories specified for library\n");
|
||||
|
||||
error = ((libport > 65535) || (libport < 1024));
|
||||
if (error)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_CONF, "Invalid port number for library '%s', must be between 1024 and 65535\n",
|
||||
cfg_title(lib));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check libraries ports */
|
||||
for (j = 0; j < i; j++)
|
||||
{
|
||||
error = (libports[j] == libport);
|
||||
if (error)
|
||||
break;
|
||||
}
|
||||
|
||||
if (error)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_CONF, "Port collision for library '%s' and library '%s'\n",
|
||||
cfg_title(cfg_getnsec(cfg, "library", j)), cfg_title(lib));
|
||||
DPRINTF(E_FATAL, L_CONF, "Port numbers must be unique accross all libraries\n");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
libports[i] = libport;
|
||||
|
||||
error = (cfg_size(lib, "directories") == 0);
|
||||
if (error)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_CONF, "No directories specified for library '%s'\n",
|
||||
cfg_title(lib));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Do keyword expansion on library names */
|
||||
ret = conffile_expand_libname(lib);
|
||||
if (ret != 0)
|
||||
{
|
||||
DPRINTF(E_FATAL, L_CONF, "Could not expand library name\n");
|
||||
|
||||
free(libports);
|
||||
cfg_free(cfg);
|
||||
return -1;
|
||||
}
|
||||
goto out_fail;
|
||||
}
|
||||
|
||||
free(libports);
|
||||
|
||||
if (error)
|
||||
/* Do keyword expansion on library names */
|
||||
ret = conffile_expand_libname(lib);
|
||||
if (ret != 0)
|
||||
{
|
||||
cfg_free(cfg);
|
||||
DPRINTF(E_FATAL, L_CONF, "Could not expand library name\n");
|
||||
|
||||
return -1;
|
||||
goto out_fail;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out_fail:
|
||||
cfg_free(cfg);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void
|
||||
|
12
src/db.c
12
src/db.c
@ -230,7 +230,6 @@ static struct col_type_map wi_cols_map[] =
|
||||
{ wi_offsetof(wd), DB_TYPE_INT },
|
||||
{ wi_offsetof(cookie), DB_TYPE_INT },
|
||||
{ wi_offsetof(path), DB_TYPE_STRING },
|
||||
{ wi_offsetof(libidx), DB_TYPE_INT },
|
||||
};
|
||||
|
||||
static __thread sqlite3 *hdl;
|
||||
@ -2842,12 +2841,12 @@ db_watch_clear(void)
|
||||
int
|
||||
db_watch_add(struct watch_info *wi)
|
||||
{
|
||||
#define Q_TMPL "INSERT INTO inotify (wd, cookie, path, libidx) VALUES (%d, 0, '%q', %d);"
|
||||
#define Q_TMPL "INSERT INTO inotify (wd, cookie, path) VALUES (%d, 0, '%q');"
|
||||
char *query;
|
||||
char *errmsg;
|
||||
int ret;
|
||||
|
||||
query = sqlite3_mprintf(Q_TMPL, wi->wd, wi->path, wi->libidx);
|
||||
query = sqlite3_mprintf(Q_TMPL, wi->wd, wi->path);
|
||||
if (!query)
|
||||
{
|
||||
DPRINTF(E_LOG, L_DB, "Out of memory for query string\n");
|
||||
@ -3479,8 +3478,7 @@ db_perthread_deinit(void)
|
||||
"CREATE TABLE IF NOT EXISTS inotify (" \
|
||||
" wd INTEGER PRIMARY KEY NOT NULL," \
|
||||
" cookie INTEGER NOT NULL," \
|
||||
" path VARCHAR(4096) NOT NULL," \
|
||||
" libidx INTEGER NOT NULL" \
|
||||
" path VARCHAR(4096) NOT NULL" \
|
||||
");"
|
||||
|
||||
#define I_PATH \
|
||||
@ -3532,9 +3530,9 @@ db_perthread_deinit(void)
|
||||
*/
|
||||
|
||||
|
||||
#define SCHEMA_VERSION 8
|
||||
#define SCHEMA_VERSION 9
|
||||
#define Q_SCVER \
|
||||
"INSERT INTO admin (key, value) VALUES ('schema_version', '8');"
|
||||
"INSERT INTO admin (key, value) VALUES ('schema_version', '9');"
|
||||
|
||||
struct db_init_query {
|
||||
char *query;
|
||||
|
1
src/db.h
1
src/db.h
@ -239,7 +239,6 @@ struct watch_info {
|
||||
int wd;
|
||||
char *path;
|
||||
uint32_t cookie;
|
||||
int libidx;
|
||||
};
|
||||
|
||||
#define wi_offsetof(field) offsetof(struct watch_info, field)
|
||||
|
@ -400,13 +400,13 @@ process_file(char *file, time_t mtime, off_t size, int compilation, int flags)
|
||||
|
||||
/* Thread: scan */
|
||||
static int
|
||||
check_compilation(int libidx, char *path)
|
||||
check_compilation(char *path)
|
||||
{
|
||||
cfg_t *lib;
|
||||
int ndirs;
|
||||
int i;
|
||||
|
||||
lib = cfg_getnsec(cfg, "library", libidx);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
ndirs = cfg_size(lib, "compilations");
|
||||
|
||||
for (i = 0; i < ndirs; i++)
|
||||
@ -420,7 +420,7 @@ check_compilation(int libidx, char *path)
|
||||
|
||||
/* Thread: scan */
|
||||
static void
|
||||
process_directory(int libidx, char *path, int flags)
|
||||
process_directory(char *path, int flags)
|
||||
{
|
||||
struct stacked_dir *bulkstack;
|
||||
cfg_t *lib;
|
||||
@ -437,7 +437,7 @@ process_directory(int libidx, char *path, int flags)
|
||||
int compilation;
|
||||
int ret;
|
||||
|
||||
lib = cfg_getnsec(cfg, "library", libidx);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
|
||||
if (flags & F_SCAN_BULK)
|
||||
{
|
||||
@ -468,7 +468,7 @@ process_directory(int libidx, char *path, int flags)
|
||||
}
|
||||
|
||||
/* Check for a compilation directory */
|
||||
compilation = check_compilation(libidx, path);
|
||||
compilation = check_compilation(path);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
@ -555,7 +555,6 @@ process_directory(int libidx, char *path, int flags)
|
||||
|
||||
if (!(flags & F_SCAN_RESCAN))
|
||||
{
|
||||
wi.libidx = libidx;
|
||||
wi.cookie = 0;
|
||||
wi.path = path;
|
||||
|
||||
@ -585,7 +584,6 @@ process_directory(int libidx, char *path, int flags)
|
||||
return;
|
||||
}
|
||||
|
||||
wi.libidx = libidx;
|
||||
wi.cookie = 0;
|
||||
wi.path = path;
|
||||
|
||||
@ -595,18 +593,18 @@ process_directory(int libidx, char *path, int flags)
|
||||
|
||||
/* Thread: scan */
|
||||
static void
|
||||
process_directories(int libidx, char *root, int flags)
|
||||
process_directories(char *root, int flags)
|
||||
{
|
||||
char *path;
|
||||
|
||||
process_directory(libidx, root, flags);
|
||||
process_directory(root, flags);
|
||||
|
||||
if (scan_exit)
|
||||
return;
|
||||
|
||||
while ((path = pop_dir(&dirstack)))
|
||||
{
|
||||
process_directory(libidx, path, flags);
|
||||
process_directory(path, flags);
|
||||
|
||||
free(path);
|
||||
|
||||
@ -621,44 +619,38 @@ static void
|
||||
bulk_scan(void)
|
||||
{
|
||||
cfg_t *lib;
|
||||
int nlib;
|
||||
int ndirs;
|
||||
char *path;
|
||||
char *deref;
|
||||
time_t start;
|
||||
int i;
|
||||
int j;
|
||||
|
||||
start = time(NULL);
|
||||
|
||||
playlists = NULL;
|
||||
dirstack = NULL;
|
||||
|
||||
nlib = cfg_size(cfg, "library");
|
||||
for (i = 0; i < nlib; i++)
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
|
||||
ndirs = cfg_size(lib, "directories");
|
||||
for (i = 0; i < ndirs; i++)
|
||||
{
|
||||
lib = cfg_getnsec(cfg, "library", i);
|
||||
path = cfg_getnstr(lib, "directories", i);
|
||||
|
||||
ndirs = cfg_size(lib, "directories");
|
||||
for (j = 0; j < ndirs; j++)
|
||||
deref = m_realpath(path);
|
||||
if (!deref)
|
||||
{
|
||||
path = cfg_getnstr(lib, "directories", j);
|
||||
DPRINTF(E_LOG, L_SCAN, "Skipping library directory %s, could not dereference: %s\n", path, strerror(errno));
|
||||
|
||||
deref = m_realpath(path);
|
||||
if (!deref)
|
||||
{
|
||||
DPRINTF(E_LOG, L_SCAN, "Skipping library directory %s, could not dereference: %s\n", path, strerror(errno));
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
process_directories(i, deref, F_SCAN_BULK);
|
||||
|
||||
free(deref);
|
||||
|
||||
if (scan_exit)
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
|
||||
process_directories(deref, F_SCAN_BULK);
|
||||
|
||||
free(deref);
|
||||
|
||||
if (scan_exit)
|
||||
return;
|
||||
}
|
||||
|
||||
if (playlists)
|
||||
@ -835,7 +827,7 @@ process_inotify_dir(struct watch_info *wi, char *path, struct inotify_event *ie)
|
||||
|
||||
if (ie->mask & IN_CREATE)
|
||||
{
|
||||
process_directories(wi->libidx, path, flags);
|
||||
process_directories(path, flags);
|
||||
|
||||
if (dirstack)
|
||||
DPRINTF(E_LOG, L_SCAN, "WARNING: unhandled leftover directories\n");
|
||||
@ -922,7 +914,7 @@ process_inotify_file(struct watch_info *wi, char *path, struct inotify_event *ie
|
||||
}
|
||||
}
|
||||
|
||||
compilation = check_compilation(wi->libidx, path);
|
||||
compilation = check_compilation(path);
|
||||
|
||||
process_file(file, sb.st_mtime, sb.st_size, compilation, 0);
|
||||
|
||||
@ -1214,8 +1206,7 @@ kqueue_cb(int fd, short event, void *arg)
|
||||
|
||||
while ((path = pop_dir(&rescan)))
|
||||
{
|
||||
/* FIXME: libidx for multi-library support */
|
||||
process_directories(0, path, 0);
|
||||
process_directories(path, 0);
|
||||
|
||||
free(path);
|
||||
|
||||
|
@ -363,7 +363,7 @@ process_track_file(plist_t trk, char *base)
|
||||
|
||||
free(location);
|
||||
|
||||
if (!cfg_getbool(cfg_getnsec(cfg, "library", 0), "itunes_overrides"))
|
||||
if (!cfg_getbool(cfg_getsec(cfg, "library"), "itunes_overrides"))
|
||||
return mfi_id;
|
||||
|
||||
/* Override our metadata with what's provided by iTunes */
|
||||
|
@ -1157,7 +1157,7 @@ httpd_init(void)
|
||||
goto evhttp_fail;
|
||||
}
|
||||
|
||||
port = cfg_getint(cfg_getnsec(cfg, "library", 0), "port");
|
||||
port = cfg_getint(cfg_getsec(cfg, "library"), "port");
|
||||
|
||||
/* evhttp doesn't support IPv6 yet, so this is expected to fail */
|
||||
bindv6 = evhttp_bind_socket(evhttpd, "::", port);
|
||||
|
@ -980,7 +980,7 @@ daap_reply_server_info(struct evhttp_request *req, struct evbuffer *evbuf, char
|
||||
/* We don't support updates atm */
|
||||
supports_update = 0;
|
||||
|
||||
lib = cfg_getnsec(cfg, "library", 0);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
passwd = cfg_getstr(lib, "password");
|
||||
name = cfg_getstr(lib, "name");
|
||||
|
||||
@ -1260,7 +1260,7 @@ daap_reply_dblist(struct evhttp_request *req, struct evbuffer *evbuf, char **uri
|
||||
if (!s)
|
||||
return;
|
||||
|
||||
lib = cfg_getnsec(cfg, "library", 0);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
name = cfg_getstr(lib, "name");
|
||||
namelen = strlen(name);
|
||||
|
||||
@ -2652,7 +2652,7 @@ daap_request(struct evhttp_request *req)
|
||||
}
|
||||
|
||||
/* Check authentication */
|
||||
lib = cfg_getnsec(cfg, "library", 0);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
passwd = cfg_getstr(lib, "password");
|
||||
|
||||
/* No authentication for these URIs */
|
||||
|
@ -276,7 +276,7 @@ rsp_reply_info(struct evhttp_request *req, char **uri, struct evkeyvalq *query)
|
||||
|
||||
songcount = db_files_get_count();
|
||||
|
||||
lib = cfg_getnsec(cfg, "library", 0);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
library = cfg_getstr(lib, "name");
|
||||
|
||||
/* We'd use mxmlNewXML(), but then we can't put any attributes
|
||||
@ -872,7 +872,7 @@ rsp_request(struct evhttp_request *req)
|
||||
}
|
||||
|
||||
/* Check authentication */
|
||||
lib = cfg_getnsec(cfg, "library", 0);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
passwd = cfg_getstr(lib, "password");
|
||||
if (passwd)
|
||||
{
|
||||
|
@ -242,7 +242,7 @@ register_services(char *ffid, int no_rsp, int no_daap)
|
||||
|
||||
srand((unsigned int)time(NULL));
|
||||
|
||||
lib = cfg_getnsec(cfg, "library", 0);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
|
||||
libname = cfg_getstr(lib, "name");
|
||||
hash = djb_hash(libname, strlen(libname));
|
||||
|
@ -820,7 +820,7 @@ remote_pairing_init(void)
|
||||
goto mdns_browse_fail;
|
||||
}
|
||||
|
||||
libname = cfg_getstr(cfg_getnsec(cfg, "library", 0), "name");
|
||||
libname = cfg_getstr(cfg_getsec(cfg, "library"), "name");
|
||||
libhash = murmur_hash64(libname, strlen(libname), 0);
|
||||
|
||||
#ifdef USE_EVENTFD
|
||||
|
@ -531,7 +531,7 @@ transcode_needed(struct evkeyvalq *headers, char *file_codectype)
|
||||
|
||||
DPRINTF(E_DBG, L_XCODE, "Determining transcoding status for codectype %s\n", file_codectype);
|
||||
|
||||
lib = cfg_getnsec(cfg, "library", 0);
|
||||
lib = cfg_getsec(cfg, "library");
|
||||
|
||||
size = cfg_size(lib, "no_transcode");
|
||||
if (size > 0)
|
||||
|
Loading…
Reference in New Issue
Block a user