From 4540def42682f2163ef4d41590b8ae7c28cd5cb5 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Sun, 18 Mar 2012 10:51:30 +0100 Subject: [PATCH 1/1] Fix removal of zero truncated rforks --- etc/afpd/fork.c | 11 ++--------- libatalk/adouble/ad_write.c | 21 ++++++++++++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/etc/afpd/fork.c b/etc/afpd/fork.c index b2e09193..bb7c6880 100644 --- a/etc/afpd/fork.c +++ b/etc/afpd/fork.c @@ -574,15 +574,8 @@ int afp_setforkparams(AFPObj *obj, char *ibuf, size_t ibuflen, char *rbuf _U_, s ad_tmplock(ofork->of_ad, eid, ADLOCK_WR, size, st_size -size, ofork->of_refnum) < 0) { goto afp_setfork_err; } - if (ofork->of_ad->ad_vers == AD_VERSION_EA) { -#if HAVE_EAFD - err = sys_lremovexattr(of_name(ofork), AD_EA_RESO); -#else - err = unlink(ofork->of_vol->ad_path(of_name(ofork), 0)); -#endif - } else { - err = ad_rtruncate(ofork->of_ad, size); - } + + err = ad_rtruncate(ofork->of_ad, size); if (st_size > size) ad_tmplock(ofork->of_ad, eid, ADLOCK_CLR, size, st_size -size, ofork->of_refnum); if (err < 0) diff --git a/libatalk/adouble/ad_write.c b/libatalk/adouble/ad_write.c index a142ef00..97667d47 100644 --- a/libatalk/adouble/ad_write.c +++ b/libatalk/adouble/ad_write.c @@ -162,14 +162,25 @@ char c = 0; /* ------------------------ */ int ad_rtruncate( struct adouble *ad, const off_t size) { - if (sys_ftruncate(ad_reso_fileno(ad), size + ad->ad_eid[ ADEID_RFORK ].ade_off ) < 0 ) { - LOG(log_error, logtype_default, "sys_ftruncate: %s", strerror(errno)); - return -1; + EC_INIT; + + if (ad->ad_vers == AD_VERSION_EA && size == 0) { +#if HAVE_EAFD + EC_NEG1( sys_lremovexattr(of_name(ofork), AD_EA_RESO) ); +#else + EC_NEG1( unlink(ad->ad_ops->ad_path(ad->ad_name, 0)) ); +#endif } - ad->ad_rlen = size; + EC_NEG1( sys_ftruncate(ad_reso_fileno(ad), size + ad->ad_eid[ ADEID_RFORK ].ade_off) ); - return 0; +EC_CLEANUP: + if (ret == 0) + ad->ad_rlen = size; + else + LOG(log_error, logtype_default, "ad_rtruncate(\"%s\"): %s", + fullpathname(ad->ad_name), strerror(errno)); + EC_EXIT; } int ad_dtruncate(struct adouble *ad, const off_t size) -- 2.39.2