+ /* Sanity checks to ensure we can touch this volume */
+ if (volinfo.v_vfs_ea != AFPVOL_EA_AD && volinfo.v_vfs_ea != AFPVOL_EA_SYS) {
+ dbd_log( LOGSTD, "Unknown Extended Attributes option: %u", volinfo.v_vfs_ea);
+ 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")) > MAXPATHLEN ) {
+ dbd_log( LOGSTD, "Volume pathname too long");
+ exit(EXIT_FAILURE);
+ }
+ strncpy(dbpath, volinfo.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_failure;
+ 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_failure;
+ }
+ if ((db_locked = get_lock(LOCK_SHRD, NULL)) != LOCK_SHRD)
+ goto exit_failure;
+ }
+
+ /* Prepare upgrade ? */
+ if (prep_upgrade) {
+ if (dbif_env_remove(dbpath))
+ goto exit_failure;
+ goto exit_success;
+ }
+
+ /* 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];
+ if ((db_locked = get_lock(LOCK_FREE, NULL)) != 0)
+ goto exit_failure;
+
+ 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_failure;
+ }
+