- db->db_longname->set_bt_compare(db->db_longname, &compare_unicode);
- if ((rc = db->db_longname->open(db->db_longname, DBLONGNAME, NULL, DB_BTREE, open_flag, 0666)) != 0) {
- syslog(LOG_ERR, "cnid_open: Failed to open did/longname database: %s",
- db_strerror(rc));
- db->db_didname->close(db->db_didname, 0);
- db->db_macname->close(db->db_macname, 0);
- db->db_shortname->close(db->db_shortname, 0);
- goto fail_appinit;
- }
-#endif /* EXTENDED_DB */
-
- /* dev/ino reverse mapping. Use a hash for this one. */
- if ((rc = db_create(&db->db_devino, db->dbenv, 0)) != 0) {
- syslog(LOG_ERR, "cnid_open: Failed to create dev/ino database: %s",
- db_strerror(rc));
- db->db_didname->close(db->db_didname, 0);
-#ifdef EXTENDED_DB
- db->db_macname->close(db->db_macname, 0);
- db->db_shortname->close(db->db_shortname, 0);
- db->db_longname->close(db->db_longname, 0);
-#endif /* EXTENDED_DB */
- goto fail_appinit;
- }
+ memset(&key, 0, sizeof(key));
+ memset(&data, 0, sizeof(data));
+ memset(&altkey, 0, sizeof(key));
+ memset(&altdata, 0, sizeof(data));
+ memset(&dupdata, 0, sizeof(dupdata));
+ memset(&dupkey, 0, sizeof(dupkey));
+
+ /* close didname and devino, then recreate them */
+ if (db->db_didname) db->db_didname->close(db->db_didname, 0);
+ if (db->db_devino) db->db_devino->close(db->db_devino, 0);
+
+ if ((rc = db_create(&db->db_didname, db->dbenv, 0)) != 0) {
+ LOG(log_error, logtype_default, "cnid_rebuild: Failed to recreate did/name database: %s",
+ db_strerror(rc));
+ goto abort;
+ }
+
+ if ((rc = my_open(db->db_didname, DBDIDNAME, NULL, DB_HASH, DB_CREATE|DB_TRUNCATE, 0666 & ~mask))) {
+ LOG(log_error, logtype_default, "cnid_rebuild: Failed to open did/name database: %s",
+ db_strerror(rc));
+ goto abort;
+ }
+
+ if ((rc = db_create(&db->db_devino, db->dbenv, 0)) != 0) {
+ LOG(log_error, logtype_default, "cnid_rebuild: Failed to recreate dev/ino database: %s",
+ db_strerror(rc));
+ goto abort;
+ }
+
+ if ((rc = my_open(db->db_devino, DBDEVINO, NULL, DB_HASH, DB_CREATE|DB_TRUNCATE, 0666 & ~mask))) {
+ LOG(log_error, logtype_default, "cnid_rebuild: Failed to open dev/ino database: %s",
+ db_strerror(rc));
+ goto abort;
+ }
+
+ db->db_devino->sync( db->db_devino, 0);
+ db->db_didname->sync( db->db_didname, 0);
+
+
+ /* now create the temporary cnid database */
+ if ((rc = db_create(&tmpdb, db->dbenv, 0)) != 0) {
+ LOG(log_error, logtype_default, "cnid_rebuild: Failed to create tmp database: %s",
+ db_strerror(rc));
+ goto abort;
+ }
+
+ if ((rc = my_open(tmpdb, DBRECOVERFILE, NULL, DB_HASH, DB_CREATE|DB_TRUNCATE, 0666 & ~mask))) {
+ LOG(log_error, logtype_default, "cnid_rebuild: Failed to open recover database: %s",
+ db_strerror(rc));
+ goto abort;
+ }
+
+ /* add rootinfo and version to didname */
+ id = 0;
+ key.data = ROOTINFO_KEY;
+ key.size = ROOTINFO_KEYLEN;
+ data.data = &id;
+ data.size = sizeof(id);
+
+ if ((rc = db->db_didname->put(db->db_didname, NULL, &key, &data, 0))) {
+ LOG(log_error, logtype_default, "cnid_rebuild: Error adding ROOTINFO: %s", db_strerror(rc));
+ goto abort;
+ }
+
+ memset(&key, 0, sizeof(key));
+ memset(&data, 0, sizeof(data));
+ key.data = DBVERSION_KEY;
+ key.size = DBVERSION_KEYLEN;
+ version = htonl(DBVERSION);
+ data.data = &version;
+ data.size = sizeof(version);