- if ((mkdir(vol->v_dbpath, 0755)) != 0) {
- dbd_log( LOGSTD, "Can't create dbpath \"%s\": %s", vol->v_dbpath, strerror(errno));
- exit(EXIT_FAILURE);
- }
- }
-
- /* Put "/.AppleDB" at end of volpath, get path from volinfo file */
- if ( (strlen(vol->v_dbpath) + strlen("/.AppleDB")) > MAXPATHLEN ) {
- dbd_log( LOGSTD, "Volume pathname too long");
- exit(EXIT_FAILURE);
- }
- strncpy(dbpath, vol->v_dbpath, MAXPATHLEN - strlen("/.AppleDB"));
- strcat(dbpath, "/.AppleDB");
-
- /* Check or create dbpath */
- int dbdirfd = open(dbpath, O_RDONLY);
- if (dbdirfd == -1 && errno == ENOENT) {
- if (errno == ENOENT) {
- if ((mkdir(dbpath, 0755)) != 0) {
- dbd_log( LOGSTD, "Can't create .AppleDB for \"%s\": %s", dbpath, strerror(errno));
- exit(EXIT_FAILURE);
- }
- } else {
- dbd_log( LOGSTD, "Somethings wrong with .AppleDB for \"%s\", giving up: %s", dbpath, strerror(errno));
- exit(EXIT_FAILURE);
- }
- } else {
- close(dbdirfd);
- }
-
- /* Get db lock */
- if ((db_locked = get_lock(LOCK_EXCL, dbpath)) == -1)
- goto exit_noenv;
- if (db_locked != LOCK_EXCL) {
- /* Couldn't get exclusive lock, try shared lock if -e wasn't requested */
- if (exclusive) {
- dbd_log(LOGSTD, "Database is in use and exlusive was requested");
- goto exit_noenv;
- }
- if ((db_locked = get_lock(LOCK_SHRD, NULL)) != LOCK_SHRD)
- goto exit_noenv;
- }
-
- /* Check if -f is requested and wipe db if yes */
- if ((flags & DBD_FLAGS_FORCE) && rebuild) {
- char cmd[8 + MAXPATHLEN];
- if ((db_locked = get_lock(LOCK_FREE, NULL)) != 0)
- goto exit_noenv;
-
- snprintf(cmd, 8 + MAXPATHLEN, "rm -rf \"%s\"", dbpath);
- dbd_log( LOGDEBUG, "Removing old database of volume: '%s'", volpath);
- system(cmd);
- if ((mkdir(dbpath, 0755)) != 0) {
- dbd_log( LOGSTD, "Can't create dbpath \"%s\": %s", dbpath, strerror(errno));
- exit(EXIT_FAILURE);
- }
- dbd_log( LOGDEBUG, "Removed old database.");
- if ((db_locked = get_lock(LOCK_EXCL, dbpath)) == -1)
- goto exit_noenv;
- }
-
- /*
- Lets start with the BerkeleyDB stuff
- */
- if ( ! nocniddb) {
- if ((dbd = dbif_init(dbpath, "cnid2.db")) == NULL)
- goto exit_noenv;
-
- if (dbif_env_open(dbd,
- &db_param,
- (db_locked == LOCK_EXCL) ? (DBOPTIONS | DB_RECOVER) : DBOPTIONS) < 0) {
- dbd_log( LOGSTD, "error opening database!");
- goto exit_noenv;
- }
-
- if (db_locked == LOCK_EXCL)
- dbd_log( LOGDEBUG, "Finished recovery.");
-
- if (dbif_open(dbd, NULL, rebuildindexes) < 0) {
- dbif_close(dbd);
- goto exit_failure;
- }
-
- /* Prepare upgrade ? We're done */
- if (prep_upgrade) {
- (void)dbif_txn_close(dbd, 1);
- goto cleanup;
- }
- }
-
- /* Downgrade db lock if not running exclusive */
- if (!exclusive && (db_locked == LOCK_EXCL)) {
- if (get_lock(LOCK_UNLOCK, NULL) != 0)
- goto exit_failure;
- if (get_lock(LOCK_SHRD, NULL) != LOCK_SHRD)
- goto exit_failure;