- /* Before we do anything else, check if there is an instance of cnid_dbd
- running already and silently exit if yes. */
- lockfd = get_lock();
+ /* Get db lock */
+ if ((db_locked = get_lock(LOCK_EXCL, dbpath)) == -1) {
+ LOG(log_error, logtype_cnid, "main: fatal db lock error");
+ exit(1);
+ }
+ if (db_locked != LOCK_EXCL) {
+ /* Couldn't get exclusive lock, try shared lock */
+ if ((db_locked = get_lock(LOCK_SHRD, NULL)) != LOCK_SHRD) {
+ LOG(log_error, logtype_cnid, "main: fatal db lock error");
+ exit(1);
+ }
+ }
+
+ if (delete_bdb && (db_locked == LOCK_EXCL)) {
+ LOG(log_warning, logtype_cnid, "main: too many CNID db opening attempts, wiping the slate clean");
+ chdir(dbpath);
+ system("rm -f cnid2.db lock log.* __db.*");
+ if ((db_locked = get_lock(LOCK_EXCL, dbpath)) != LOCK_EXCL) {
+ LOG(log_error, logtype_cnid, "main: fatal db lock error");
+ exit(EXIT_FAILURE);
+ }
+ }