- * Copyright (C) 2004, 2005, 2007, 2008 Richard Kettlewell
+ * Copyright (C) 2004, 2005, 2007-2011 Richard Kettlewell
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static const struct option options[] = {
{ "help", no_argument, 0, 'h' },
{ "version", no_argument, 0, 'V' },
static const struct option options[] = {
{ "help", no_argument, 0, 'h' },
{ "version", no_argument, 0, 'V' },
{ "recover-fatal", no_argument, 0, 'R' },
{ "recompute-aliases", no_argument, 0, 'a' },
{ "remove-pathless", no_argument, 0, 'P' },
{ "recover-fatal", no_argument, 0, 'R' },
{ "recompute-aliases", no_argument, 0, 'a' },
{ "remove-pathless", no_argument, 0, 'P' },
" --recover, -r Run database recovery\n"
" --recompute-aliases, -a Recompute aliases\n"
" --remove-pathless, -P Remove pathless tracks\n"
" --recover, -r Run database recovery\n"
" --recompute-aliases, -a Recompute aliases\n"
" --remove-pathless, -P Remove pathless tracks\n"
|| sink_writec(s, '\n') < 0
|| urlencode(s, d.data, d.size)
|| sink_writec(s, '\n') < 0)
|| sink_writec(s, '\n') < 0
|| urlencode(s, d.data, d.size)
|| sink_writec(s, '\n') < 0)
err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d),
DB_NEXT);
}
err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d),
DB_NEXT);
}
- fatal(0, "error reading %s: %s", dbname, db_strerror(err));
+ disorder_fatal(0, "error reading %s: %s", dbname, db_strerror(err));
for(;;) {
tid = trackdb_begin_transaction();
if(fseek(fp, 0, SEEK_SET) < 0)
for(;;) {
tid = trackdb_begin_transaction();
if(fseek(fp, 0, SEEK_SET) < 0)
for(size_t n = 0; n < NDBTABLE; ++n)
if(dump_one(s, tag,
dbtable[n].letter, dbtable[n].dbname, *dbtable[n].db,
for(size_t n = 0; n < NDBTABLE; ++n)
if(dump_one(s, tag,
dbtable[n].letter, dbtable[n].dbname, *dbtable[n].db,
cursor = trackdb_opencursor(trackdb_tracksdb, tid);
if((err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d),
DB_FIRST)) == DB_LOCK_DEADLOCK) {
cursor = trackdb_opencursor(trackdb_tracksdb, tid);
if((err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d),
DB_FIRST)) == DB_LOCK_DEADLOCK) {
alias = !!kvp_get(data, "_alias_for");
pathless = !kvp_get(data, "_path");
if(pathless && !remove_pathless)
alias = !!kvp_get(data, "_alias_for");
pathless = !kvp_get(data, "_path");
if(pathless && !remove_pathless)
if(alias || (remove_pathless && pathless)) {
switch(err = cursor->c_del(cursor, 0)) {
case 0: break;
case DB_LOCK_DEADLOCK:
if(alias || (remove_pathless && pathless)) {
switch(err = cursor->c_del(cursor, 0)) {
case 0: break;
case DB_LOCK_DEADLOCK:
}
}
err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d), DB_NEXT);
}
if(err == DB_LOCK_DEADLOCK) {
}
}
err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d), DB_NEXT);
}
if(err == DB_LOCK_DEADLOCK) {
switch(err = db->truncate(db, tid, &count, 0)) {
case 0: break;
case DB_LOCK_DEADLOCK:
switch(err = db->truncate(db, tid, &count, 0)) {
case 0: break;
case DB_LOCK_DEADLOCK:
if(inputline(tag, fp, &s, '\n')) return -1;
dynstr_init(&d);
if(urldecode(sink_dynstr(&d), s, strlen(s)))
if(inputline(tag, fp, &s, '\n')) return -1;
dynstr_init(&d);
if(urldecode(sink_dynstr(&d), s, strlen(s)))
if((err = truncdb(tid, trackdb_prefsdb))) return err;
if((err = truncdb(tid, trackdb_globaldb))) return err;
if((err = truncdb(tid, trackdb_searchdb))) return err;
if((err = truncdb(tid, trackdb_prefsdb))) return err;
if((err = truncdb(tid, trackdb_globaldb))) return err;
if((err = truncdb(tid, trackdb_searchdb))) return err;
- error(0, "error updating %s: %s", dbname, db_strerror(err));
+ disorder_error(0, "error updating %s: %s", dbname, db_strerror(err));
- fatal(0, "error updating %s: %s", dbname, db_strerror(err));
+ disorder_fatal(0, "error updating %s: %s", dbname, db_strerror(err));
cursor = trackdb_opencursor(trackdb_tracksdb, tid);
if((err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d),
DB_FIRST)) == DB_LOCK_DEADLOCK) goto done;
cursor = trackdb_opencursor(trackdb_tracksdb, tid);
if((err = cursor->c_get(cursor, prepare_data(&k), prepare_data(&d),
DB_FIRST)) == DB_LOCK_DEADLOCK) goto done;
track = xstrndup(k.data, k.size);
if(!kvp_get(data, "_alias_for")) {
if(!(path = kvp_get(data, "_path")))
track = xstrndup(k.data, k.size);
if(!kvp_get(data, "_alias_for")) {
if(!(path = kvp_get(data, "_path")))
trackdb_commit_transaction(tid);
}
int main(int argc, char **argv) {
int n, dump = 0, undump = 0, recover = TRACKDB_NO_RECOVER, recompute = 0;
int remove_pathless = 0, fd;
trackdb_commit_transaction(tid);
}
int main(int argc, char **argv) {
int n, dump = 0, undump = 0, recover = TRACKDB_NO_RECOVER, recompute = 0;
int remove_pathless = 0, fd;
- while((n = getopt_long(argc, argv, "hVc:dDurRaP", options, 0)) >= 0) {
+ if(!setlocale(LC_CTYPE, ""))
+ disorder_error(errno, "error calling setlocale");
+ while((n = getopt_long(argc, argv, "hVc:dDurRaPR", options, 0)) >= 0) {
case 'd': dump = 1; break;
case 'u': undump = 1; break;
case 'D': debugging = 1; break;
case 'd': dump = 1; break;
case 'u': undump = 1; break;
case 'D': debugging = 1; break;
- if(config_read(0, NULL)) fatal(0, "cannot read configuration");
- trackdb_init(recover|TRACKDB_MAY_CREATE);
- trackdb_open(TRACKDB_NO_UPGRADE);
+ config_per_user = 0;
+ if(config_read(0, NULL))
+ disorder_fatal(0, "cannot read configuration");
if(dump) {
/* We write to a temporary file and rename into place. We make
* sure the permissions are tight from the start. */
byte_xasprintf(&tmp, "%s.%lx.tmp", path, (unsigned long)getpid());
if((fd = open(tmp, O_CREAT|O_TRUNC|O_WRONLY, 0600)) < 0)
if(dump) {
/* We write to a temporary file and rename into place. We make
* sure the permissions are tight from the start. */
byte_xasprintf(&tmp, "%s.%lx.tmp", path, (unsigned long)getpid());
if((fd = open(tmp, O_CREAT|O_TRUNC|O_WRONLY, 0600)) < 0)
- fatal(errno, "fdopen on %s", tmp);
+ disorder_fatal(errno, "fdopen on %s", tmp);
+ trackdb_init(recover|TRACKDB_MAY_CREATE);
+ trackdb_open(TRACKDB_NO_UPGRADE);
- fatal(errno, "error renaming %s to %s", tmp, path);
+ disorder_fatal(errno, "error renaming %s to %s", tmp, path);
+ /* Open the dump file before changing UID */
+ if(!(fp = fopen(path, "r")))
+ disorder_fatal(errno, "error opening %s", path);
+ if(changeuid)
+ become_mortal();
- if(getuid() == 0) info("you might need to chown database files");
- if(!(fp = fopen(path, "r"))) fatal(errno, "error opening %s", path);
+ if(getuid() == 0)
+ disorder_info("you might need to chown database files");
+ trackdb_init(recover|TRACKDB_MAY_CREATE);
+ trackdb_open(TRACKDB_NO_UPGRADE);
do_undump(fp, path, remove_pathless);
xfclose(fp);
} else if(recompute) {
do_recompute(remove_pathless);
}
trackdb_close();
do_undump(fp, path, remove_pathless);
xfclose(fp);
} else if(recompute) {
do_recompute(remove_pathless);
}
trackdb_close();