X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fcnid_dbd%2Fcmd_dbd.c;h=57c56e08daf2e3e833c5100135dae8f696157694;hb=06b7f576daa4a127964febf210869f4729235dc3;hp=f915b9961f973bd0a1af4b42af4dcdda473260d6;hpb=85db46c7b9519df030c43608a06d8d30175b78e4;p=netatalk.git diff --git a/etc/cnid_dbd/cmd_dbd.c b/etc/cnid_dbd/cmd_dbd.c index f915b996..57c56e08 100644 --- a/etc/cnid_dbd/cmd_dbd.c +++ b/etc/cnid_dbd/cmd_dbd.c @@ -82,6 +82,7 @@ int nocniddb = 0; /* Dont open CNID database, only scan filesystem */ volatile sig_atomic_t alarmed; +struct volinfo volinfo; /* needed by pack.c:idxname() */ static DBD *dbd; static int verbose; /* Logging flag */ @@ -90,6 +91,8 @@ static struct db_param db_param = { NULL, /* Volume dirpath */ 1, /* bdb logfile autoremove */ 64 * 1024, /* bdb cachesize (64 MB) */ + DEFAULT_MAXLOCKS, /* maxlocks */ + DEFAULT_MAXLOCKOBJS, /* maxlockobjs */ 0, /* flush_interval */ 0, /* flush_frequency */ 1000, /* txn_frequency */ @@ -98,7 +101,7 @@ static struct db_param db_param = { -1, /* idle_timeout */ -1 /* max_vols */ }; -static char dbpath[PATH_MAX]; /* Path to the dbd database */ +static char dbpath[MAXPATHLEN+1]; /* Path to the dbd database */ /* Provide some logging @@ -279,7 +282,6 @@ int main(int argc, char **argv) int dump=0, scan=0, rebuild=0, prep_upgrade=0, rebuildindexes=0, dumpindexes=0, force=0; dbd_flags_t flags = 0; char *volpath; - struct volinfo volinfo; int cdir; if (geteuid() != 0) { @@ -383,12 +385,25 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } + /* Enuser dbpath is there, create if necessary */ + struct stat st; + if (stat(volinfo.v_dbpath, &st) != 0) { + if (errno != ENOENT) { + dbd_log( LOGSTD, "Can't stat dbpath \"%s\": %s", volinfo.v_dbpath, strerror(errno)); + exit(EXIT_FAILURE); + } + if ((mkdir(volinfo.v_dbpath, 0755)) != 0) { + dbd_log( LOGSTD, "Can't create dbpath \"%s\": %s", dbpath, strerror(errno)); + exit(EXIT_FAILURE); + } + } + /* Put "/.AppleDB" at end of volpath, get path from volinfo file */ - if ( (strlen(volinfo.v_dbpath) + strlen("/.AppleDB")) > (PATH_MAX - 1) ) { + if ( (strlen(volinfo.v_dbpath) + strlen("/.AppleDB")) > MAXPATHLEN ) { dbd_log( LOGSTD, "Volume pathname too long"); exit(EXIT_FAILURE); } - strncpy(dbpath, volinfo.v_dbpath, PATH_MAX - 9 - 1); + strncpy(dbpath, volinfo.v_dbpath, MAXPATHLEN - strlen("/.AppleDB")); strcat(dbpath, "/.AppleDB"); /* Check or create dbpath */ @@ -407,10 +422,15 @@ int main(int argc, char **argv) close(dbdirfd); } + /* + Before we do anything else, check if there is an instance of cnid_dbd + running already and silently exit if yes. + */ + lockfd = get_lock(dbpath); + /* Prepare upgrade ? */ if (prep_upgrade) { - lockfd = get_lock(dbpath); - if (dbif_prep_upgrade(dbpath)) + if (dbif_env_remove(dbpath)) goto exit_failure; goto exit_success; } @@ -418,18 +438,14 @@ int main(int argc, char **argv) /* Check if -f is requested and wipe db if yes */ if ((flags & DBD_FLAGS_FORCE) && rebuild && (volinfo.v_flags & AFPVOL_CACHE)) { char cmd[8 + MAXPATHLEN]; - snprintf(cmd, 8 + MAXPATHLEN, "rm -f %s/*", dbpath); + close(lockfd); + snprintf(cmd, 8 + MAXPATHLEN, "rm -f \"%s/*\"", dbpath); dbd_log( LOGDEBUG, "Removing old database of volume: '%s'", volpath); system(cmd); dbd_log( LOGDEBUG, "Removed old database."); + lockfd = get_lock(dbpath); } - /* - Before we do anything else, check if there is an instance of cnid_dbd - running already and silently exit if yes. - */ - lockfd = get_lock(dbpath); - /* Lets start with the BerkeleyDB stuff */ @@ -449,11 +465,6 @@ int main(int argc, char **argv) dbif_close(dbd); goto exit_failure; } - - if (dbd_stamp(dbd) < 0) { - dbif_close(dbd); - goto exit_failure; - } } /* Now execute given command scan|rebuild|dump */