}
LOG(log_error, logtype_afpd, "Reopen volume %s using in memory temporary CNID DB.",
vol->v_path);
- vol->v_cdb = cnid_open(vol->v_path, vol->v_umask, "tdb", flags, NULL, NULL);
+ vol->v_cdb = cnid_open(vol, "tdb", flags);
if (vol->v_cdb) {
if (!(vol->v_flags & AFPVOL_TM)) {
vol->v_flags |= AFPVOL_RO;
ashort = htons(ATTRBIT_INVISIBLE);
} else
ashort = 0;
+ ashort &= ~htons(vol->v_ignattr);
#if 0
/* FIXME do we want a visual clue if the file is read only
*/
createfile_iderr:
ad_flush(&ad);
ad_close(&ad, ADFLAGS_DF|ADFLAGS_HF );
- fce_register(FCE_FILE_CREATE, fullpathname(upath), NULL, fce_file);
- sl_index_file(path);
+ fce_register(obj, FCE_FILE_CREATE, fullpathname(upath), NULL);
curdir->d_offcnt++;
setvoltime(obj, vol );
ad_getattr(adp, &bshort);
oshort = bshort;
if ( ntohs( ashort ) & ATTRBIT_SETCLR ) {
+ ashort &= ~htons(vol->v_ignattr);
bshort |= htons( ntohs( ashort ) & ~ATTRBIT_SETCLR );
} else {
bshort &= ~ashort;
WRITE lock on read only file.
*/
-static int check_attrib(struct adouble *adp)
+static int check_attrib(const struct vol *vol, struct adouble *adp)
{
uint16_t bshort = 0;
/*
* Does kFPDeleteInhibitBit (bit 8) set?
*/
- if ((bshort & htons(ATTRBIT_NODELETE))) {
+ if (!(vol->v_ignattr & ATTRBIT_NODELETE) && (bshort & htons(ATTRBIT_NODELETE))) {
return AFPERR_OLOCK;
}
- if ((bshort & htons(ATTRBIT_DOPEN | ATTRBIT_ROPEN))) {
+ if ((bshort & htons(ATTRBIT_DOPEN | ATTRBIT_ROPEN))) {
return AFPERR_BUSY;
}
return 0;
* ad_open would create a 0 byte resource fork
*/
if ( ad_metadataat(dirfd, file, ADFLAGS_CHECK_OF, &ad) == 0 ) {
- if ((err = check_attrib(&ad))) {
+ if ((err = check_attrib(vol, &ad))) {
ad_close(&ad, ADFLAGS_HF | ADFLAGS_CHECK_OF);
return err;
}
return( AFPERR_PARAM);
}
- if (vol->v_cdb == NULL || !(vol->v_cdb->flags & CNID_FLAG_PERSISTENT)) {
+ if (vol->v_cdb == NULL || !(vol->v_cdb->cnid_db_flags & CNID_FLAG_PERSISTENT)) {
return AFPERR_NOOP;
}
return( AFPERR_PARAM);
}
- if (vol->v_cdb == NULL || !(vol->v_cdb->flags & CNID_FLAG_PERSISTENT)) {
+ if (vol->v_cdb == NULL || !(vol->v_cdb->cnid_db_flags & CNID_FLAG_PERSISTENT)) {
return AFPERR_NOOP;
}
return( AFPERR_PARAM);
}
- if (vol->v_cdb == NULL || !(vol->v_cdb->flags & CNID_FLAG_PERSISTENT)) {
+ if (vol->v_cdb == NULL || !(vol->v_cdb->cnid_db_flags & CNID_FLAG_PERSISTENT)) {
return AFPERR_NOOP;
}
}
goto err_temp_to_dest;
}
+
+ if (AD_META_OPEN(adsp) || AD_META_OPEN(addp)) {
+ struct adouble adtmp;
+ bool opened_ads, opened_add;
+
+ ad_init(&adtmp, vol);
+ ad_init_offsets(&adtmp);
+
+ if (!AD_META_OPEN(adsp)) {
+ if (ad_open(adsp, p, ADFLAGS_HF) != 0)
+ return -1;
+ opened_ads = true;
+ }
+
+ if (!AD_META_OPEN(addp)) {
+ if (ad_open(addp, upath, ADFLAGS_HF) != 0)
+ return -1;
+ opened_add = true;
+ }
+
+ if (ad_copy_header(&adtmp, adsp) != 0)
+ goto err_temp_to_dest;
+ if (ad_copy_header(adsp, addp) != 0)
+ goto err_temp_to_dest;
+ if (ad_copy_header(addp, &adtmp) != 0)
+ goto err_temp_to_dest;
+ ad_flush(adsp);
+ ad_flush(addp);
+
+ if (opened_ads)
+ ad_close(adsp, ADFLAGS_HF);
+ if (opened_add)
+ ad_close(addp, ADFLAGS_HF);
+ }
+
+ /* FIXME: we should switch ressource fork too */
/* here we need to reopen if crossdev */
if (sid && ad_setid(addp, destst.st_dev, destst.st_ino, sid, sdir->d_did, vol->v_stamp))