- dbd_log( LOGSTD, "CNID mismatch for '%s/%s', db: %u, ad-file: %u", cwdbuf, name, ntohl(db_cnid), ntohl(ad_cnid));
- if ( ! (dbd_flags & DBD_FLAGS_SCAN)) {
- dbd_log(LOGSTD, "Updating AppleDouble file for '%s/%s' with CNID: %u from database",
- cwdbuf, name, ntohl(db_cnid));
- ad_init(&ad, myvol);
- if (ad_open(&ad, name, adflags | ADFLAGS_HF | ADFLAGS_RDWR) != 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(&ad, ADFLAGS_HF);
- }
- return db_cnid;
- } else if (ad_cnid && (db_cnid == 0)) {
- /* in ad-file but not in db */
- if ( ! (dbd_flags & DBD_FLAGS_SCAN)) {
- /* 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 (rply.result == 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 (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, myvol);
- if (ad_open(&ad, name, adflags | ADFLAGS_RDWR) != 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(&ad, ADFLAGS_HF);
- }
- return db_cnid;
- }
-
- dbd_log(LOGDEBUG, "CNID rebuild add '%s/%s' with CNID from ad-file %u",
- cwdbuf, name, ntohl(ad_cnid));
- rqst.cnid = ad_cnid;
- ret = dbd_rebuild_add(dbd, &rqst, &rply);
- if (dbif_txn_close(dbd, ret) != 0)
- return CNID_INVALID;
- }
- return ad_cnid;
- } else if ((db_cnid == 0) && (ad_cnid == 0)) {
- /* No CNID at all, we clearly have to allocate a fresh one... */
- /* Note: the next test will use this new CNID too! */
- if ( ! (dbd_flags & DBD_FLAGS_SCAN)) {
- /* add to db */
- 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 ((ad_cnid == 0) && db_cnid) {
- /* in db but zeroID in ad-file, write it to ad-file */
- if (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, myvol);
- if (ad_open(&ad, name, adflags | ADFLAGS_RDWR) != 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(&ad, ADFLAGS_HF);