}
}
if ( ad_meta_fileno( &ad ) == -1 ) { /* Hard META / HF */
- /* on noadouble volumes, just creating the data fork is ok */
- if (vol_noadouble(vol)) {
- ad_close( &ad, ADFLAGS_DF );
- goto createfile_done;
- }
/* FIXME with hard create on an existing file, we already
* corrupted the data file.
*/
uint32_t aint;
uint32_t upriv;
uint16_t upriv_bit = 0;
-
- struct utimbuf ut;
-
+ struct utimbuf ut;
int change_mdate = 0;
int change_parent_mdate = 0;
int newdate = 0;
uint16_t bitmap = f_bitmap;
uint32_t cdate,bdate;
u_char finder_buf[32];
+ int symlinked = 0;
#ifdef DEBUG
LOG(log_debug9, logtype_afpd, "begin setfilparams:");
case FILPBIT_FINFO :
change_mdate = 1;
memcpy(finder_buf, buf, 32 );
- if (memcmp(buf,"slnkrhap",8)==0 && !S_ISLNK(path->st.st_mode)){
- // SLFINFO
+ if (memcmp(buf, "slnkrhap", 8) == 0 && !S_ISLNK(path->st.st_mode)) {
int fp;
ssize_t len;
int erc=1;
char buf[PATH_MAX+1];
- if ((fp=open(path->u_name,O_RDONLY))>=0){
- if ((len=read(fp,buf,PATH_MAX+1))){
- if (unlink(path->u_name)==0){
- buf[len]=0;
+ if ((fp = open(path->u_name, O_RDONLY)) >= 0) {
+ if ((len = read(fp, buf, PATH_MAX+1))) {
+ if (unlink(path->u_name) == 0) {
+ buf[len] = 0;
erc = symlink(buf, path->u_name);
if (!erc)
of_stat(path);
}
close(fp);
}
- if (erc!=0){
+ if (erc != 0) {
err=AFPERR_BITMAP;
goto setfilparam_done;
}
+ symlinked = 1;
}
buf += 32;
break;
* - change of modification date
* - UNIX privs (Bug-ID #2863424)
*/
- if (!vol_noadouble(vol) && (f_bitmap & ~(1<<FILPBIT_MDATE | 1<<FILPBIT_UNIXPR))) {
+ if (!symlinked && f_bitmap & ~(1<<FILPBIT_MDATE | 1<<FILPBIT_UNIXPR)) {
LOG(log_debug, logtype_afpd, "setfilparams: need adouble access");
return AFPERR_ACCESS;
}
adp = of_ad(s_vol, s_path, &ad);
- if (ad_open(adp, s_path->u_name, ADFLAGS_DF | ADFLAGS_HF | ADFLAGS_NOHF | ADFLAGS_RDONLY) < 0) {
+ if (ad_open(adp, s_path->u_name, ADFLAGS_DF | ADFLAGS_HF | ADFLAGS_NOHF | ADFLAGS_RDONLY | ADFLAGS_SETSHRMD) < 0) {
return AFPERR_DENYCONF;
}
denyreadset = (ad_testlock(adp, ADEID_DFORK, AD_FILELOCK_DENY_RD) != 0 ||
int err = 0;
char filebuf[8192];
int sfd, dfd;
-
+ off_t soff, doff;
+
if (eid == ADEID_DFORK) {
sfd = ad_data_fileno(ads);
dfd = ad_data_fileno(add);
dfd = ad_reso_fileno(add);
}
- if ((off_t)-1 == lseek(sfd, ad_getentryoff(ads, eid), SEEK_SET))
+ if (add->ad_version == AD_VERSION2)
+ soff = doff = ad_getentryoff(ads, eid);
+ else {
+ if (eid == ADEID_DFORK)
+ soff = doff = ad_getentryoff(ads, eid);
+ else {
+#ifdef HAVE_EAFD
+ soff = doff = 0;
+#else
+ soff = doff = ADEDOFF_RFORK_OSX;
+#endif
+ }
+ }
+
+ if ((off_t)-1 == lseek(sfd, soff, SEEK_SET))
return -1;
- if ((off_t)-1 == lseek(dfd, ad_getentryoff(add, eid), SEEK_SET))
+ if ((off_t)-1 == lseek(dfd, doff, SEEK_SET))
return -1;
#if 0 /* ifdef SENDFILE_FLAVOR_LINUX */
adp = &ads;
}
- adflags = ADFLAGS_DF;
+ adflags = ADFLAGS_DF | ADFLAGS_RF | ADFLAGS_NORF;
if (newname) {
adflags |= ADFLAGS_HF;
}
goto done;
}
- if (ad_meta_fileno(adp) == -1 && ad_reso_fileno(adp) == -1) { /* META / HF */
+ if (!AD_RSRC_OPEN(adp))
/* no resource fork, don't create one for dst file */
- adflags &= ~ADFLAGS_HF;
- }
+ adflags &= ~ADFLAGS_RF;
stat_result = fstat(ad_data_fileno(adp), &st); /* saving stat exit code, thus saving us on one more stat later on */
}
return AFPERR_EXIST;
}
+
+ if (AD_RSRC_OPEN(adp))
+ err = copy_fork(ADEID_RFORK, &add, adp);
- /*
- * XXX if the source and the dest don't use the same resource type it's broken
- */
- if (ad_reso_fileno(adp) == -1 || 0 == (err = copy_fork(ADEID_RFORK, &add, adp))){
- /* copy the data fork */
- if ((err = copy_fork(ADEID_DFORK, &add, adp)) == 0) {
- if (ad_meta_fileno(adp) != -1)
- err = d_vol->vfs->vfs_copyfile(d_vol, sfd, src, dst);
- }
- }
+ if (err == 0)
+ err = copy_fork(ADEID_DFORK, &add, adp);
- if (err < 0) {
+ if ((err == 0) && (ad_meta_fileno(adp) != -1))
+ err = d_vol->vfs->vfs_copyfile(d_vol, sfd, src, dst);
+
+ if (err < 0)
ret_err = errno;
- }
if (!ret_err && newname && (adflags & ADFLAGS_HF)) {
/* set the new name in the resource fork */