struct adouble ad, *adp;
int opened = 0;
int rc;
+ int flags;
LOG(log_debug, logtype_afpd, "getfilparams(\"%s\")", path->u_name);
if (opened) {
char *upath;
- int flags = (bitmap & (1 << FILPBIT_ATTR)) ? ADFLAGS_CHECK_OF : 0;
+ flags = (bitmap & (1 << FILPBIT_ATTR)) ? ADFLAGS_CHECK_OF : 0;
adp = of_ad(vol, path, &ad);
upath = path->u_name;
}
}
rc = getmetadata(vol, bitmap, path, dir, buf, buflen, adp);
- ad_close(adp, ADFLAGS_HF);
+ ad_close(adp, ADFLAGS_HF | flags);
return( rc );
}
if (NULL == ( s_path = cname( vol, dir, &ibuf )) )
return get_afp_errno(AFPERR_PARAM);
-
if ( *s_path->m_name == '\0' )
return( AFPERR_BADTYPE );
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 (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;
}
setvoltime(obj, d_vol );
copy_exit:
- ad_close( adp, ADFLAGS_DF |ADFLAGS_HF );
+ ad_close( adp, ADFLAGS_DF |ADFLAGS_HF | ADFLAGS_SETSHRMD);
return( retvalue );
}
dfd = ad_reso_fileno(add);
}
- 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
- }
- }
+ soff = doff = ad_getentryoff(ads, eid);
if ((off_t)-1 == lseek(sfd, soff, SEEK_SET))
return -1;
}
adflags = ADFLAGS_DF | ADFLAGS_RF | ADFLAGS_NORF;
- if (newname) {
- adflags |= ADFLAGS_HF;
- }
if (ad_openat(adp, sfd, src, adflags | ADFLAGS_NOHF | ADFLAGS_RDONLY) < 0) {
ret_err = errno;
}
ad_init(&add, d_vol);
- if (ad_open(&add, dst, adflags | ADFLAGS_RDWR | ADFLAGS_CREATE | ADFLAGS_EXCL, st.st_mode) < 0) {
+ if (ad_open(&add, dst, adflags | ADFLAGS_RDWR | ADFLAGS_CREATE | ADFLAGS_EXCL, st.st_mode | S_IRUSR | S_IWUSR) < 0) {
ret_err = errno;
ad_close( adp, adflags );
if (EEXIST != ret_err) {
return AFPERR_EXIST;
}
+#if 0
if (AD_RSRC_OPEN(adp))
err = copy_fork(ADEID_RFORK, &add, adp);
-
+#endif
+
if (err == 0)
err = copy_fork(ADEID_DFORK, &add, adp);
- if ((err == 0) && (ad_meta_fileno(adp) != -1))
+ if (err == 0)
err = d_vol->vfs->vfs_copyfile(d_vol, sfd, src, dst);
if (err < 0)
*/
if ( ad_metadataat(dirfd, file, ADFLAGS_CHECK_OF, &ad) == 0 ) {
if ((err = check_attrib(&ad))) {
- ad_close(&ad, ADFLAGS_HF);
+ ad_close(&ad, ADFLAGS_HF | ADFLAGS_CHECK_OF);
return err;
}
meta = 1;
end:
if (meta)
- ad_close(&ad, ADFLAGS_HF);
+ ad_close(&ad, ADFLAGS_HF | ADFLAGS_CHECK_OF);
if (adp)
ad_close( &ad, adflags ); /* ad_close removes locks if any */