+ /* Ensure the cnid from the ad-file is not already occupied by another file */
+ dbd_log(LOGDEBUG, "Checking whether CNID %u from ad-file is occupied",
+ ntohl(ad_cnid));
+
+ rqst.cnid = ad_cnid;
+ ret = dbd_resolve(dbd, &rqst, &rply);
+ if (ret == CNID_DBD_RES_OK) {
+ /* Occupied! Choose another, update ad-file */
+ ret = dbd_add(dbd, &rqst, &rply, 1);
+ if (dbif_txn_close(dbd, ret) != 0)
+ return CNID_INVALID;
+ db_cnid = rply.cnid;
+ dbd_log(LOGSTD, "New CNID for '%s/%s': %u", cwdbuf, name, ntohl(db_cnid));
+
+ if ((myvolinfo->v_flags & AFPVOL_CACHE)
+ && ADFILE_OK
+ && ( ! (dbd_flags & DBD_FLAGS_SCAN))) {
+ dbd_log(LOGSTD, "Writing CNID data for '%s/%s' to AppleDouble file",
+ cwdbuf, name, ntohl(db_cnid));
+ ad_init(&ad, myvolinfo->v_adouble, myvolinfo->v_ad_options);
+ if (ad_open_metadata( name, adflags, O_RDWR, &ad) != 0) {
+ dbd_log(LOGSTD, "Error opening AppleDouble file for '%s/%s': %s",
+ cwdbuf, name, strerror(errno));
+ return CNID_INVALID;
+ }
+ ad_setid( &ad, st->st_dev, st->st_ino, db_cnid, did, stamp);
+ ad_flush(&ad);
+ ad_close_metadata(&ad);
+ }
+ return db_cnid;
+ }
+
+ dbd_log(LOGDEBUG, "CNID rebuild add '%s/%s' with CNID from ad-file %u",
+ cwdbuf, name, ntohl(ad_cnid));