From 0b1a78f3547a6b331b8c152a1b846ba2c6f725e8 Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Sun, 29 Apr 2012 14:10:40 +0200 Subject: [PATCH] Use define AD_SYMLINK for symlinks --- etc/afpd/fork.c | 2 +- include/atalk/adouble.h | 7 +++++-- libatalk/adouble/ad_flush.c | 4 ++-- libatalk/adouble/ad_lock.c | 3 +-- libatalk/adouble/ad_open.c | 4 ++-- libatalk/adouble/ad_write.c | 3 +-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/etc/afpd/fork.c b/etc/afpd/fork.c index 58eb9b67..c09ff578 100644 --- a/etc/afpd/fork.c +++ b/etc/afpd/fork.c @@ -165,7 +165,7 @@ static int fork_setmode(const AFPObj *obj, struct adouble *adp, int eid, int acc int fd = (eid == ADEID_DFORK) ? ad_data_fileno(adp) : ad_reso_fileno(adp); - if (fd != -1 && fd != -2 && fcntl(fd, F_SHARE, &shmd) != 0) { + if (fd != -1 && fd != AD_SYMLINK && fcntl(fd, F_SHARE, &shmd) != 0) { LOG(log_debug, logtype_afpd, "fork_setmode: fcntl: %s", strerror(errno)); errno = EACCES; return -1; diff --git a/include/atalk/adouble.h b/include/atalk/adouble.h index f95279d7..44409ee2 100644 --- a/include/atalk/adouble.h +++ b/include/atalk/adouble.h @@ -155,6 +155,9 @@ #define ADEDOFF_FINDERI_OSX (AD_HEADER_LEN + ADEID_NUM_OSX*AD_ENTRY_LEN) #define ADEDOFF_RFORK_OSX (ADEDOFF_FINDERI_OSX + ADEDLEN_FINDERI) +/* special fd value used to indicate an open fork file is a (not open) symlink */ +#define AD_SYMLINK -2 + typedef uint32_t cnid_t; struct ad_entry { @@ -169,7 +172,7 @@ typedef struct adf_lock_t { } adf_lock_t; struct ad_fd { - int adf_fd; /* -1: invalid, -2: symlink */ + int adf_fd; /* -1: invalid, AD_SYMLINK: symlink */ char *adf_syml; int adf_flags; adf_lock_t *adf_lock; @@ -348,7 +351,7 @@ struct adouble { #define ad_reso_fileno(ad) ((ad)->ad_rfp->adf_fd) #define ad_meta_fileno(ad) ((ad)->ad_mdp->adf_fd) -/* -1 means not open, -2 is a symlink */ +/* -1: not open, AD_SYMLINK (-2): it's a symlink */ #define AD_DATA_OPEN(ad) ((ad)->ad_data_fork.adf_fd >= 0) #define AD_META_OPEN(ad) ((ad)->ad_mdp->adf_fd >= 0) #define AD_RSRC_OPEN(ad) ((ad)->ad_rfp->adf_fd >= 0) diff --git a/libatalk/adouble/ad_flush.c b/libatalk/adouble/ad_flush.c index 86a624e0..eaf904ca 100644 --- a/libatalk/adouble/ad_flush.c +++ b/libatalk/adouble/ad_flush.c @@ -371,7 +371,7 @@ static int ad_data_closefd(struct adouble *ad) { int ret = 0; - if (ad_data_fileno(ad) == -2) { + if (ad_data_fileno(ad) == AD_SYMLINK) { free(ad->ad_data_fork.adf_syml); ad->ad_data_fork.adf_syml = NULL; } else { @@ -408,7 +408,7 @@ int ad_close(struct adouble *ad, int adflags) adflags |= ADFLAGS_HF; if ((adflags & ADFLAGS_DF) - && (ad_data_fileno(ad) >= 0 || ad_data_fileno(ad) == -2) /* -2 means symlink */ + && (ad_data_fileno(ad) >= 0 || ad_data_fileno(ad) == AD_SYMLINK) && --ad->ad_data_fork.adf_refcount == 0) { if (ad_data_closefd(ad) < 0) err = -1; diff --git a/libatalk/adouble/ad_lock.c b/libatalk/adouble/ad_lock.c index bdae8dc4..92f0ab89 100644 --- a/libatalk/adouble/ad_lock.c +++ b/libatalk/adouble/ad_lock.c @@ -71,8 +71,7 @@ static int set_lock(int fd, int cmd, struct flock *lock) shmdstrfromoff(lock->l_start), (intmax_t)lock->l_len); - if (fd == -2) { - /* We assign fd = -2 for symlinks -> do nothing */ + if (fd == AD_SYMLINK) { if (cmd == F_GETLK) lock->l_type = F_UNLCK; return 0; diff --git a/libatalk/adouble/ad_open.c b/libatalk/adouble/ad_open.c index 79016b5f..bde46e57 100644 --- a/libatalk/adouble/ad_open.c +++ b/libatalk/adouble/ad_open.c @@ -869,7 +869,7 @@ static int ad_open_df(const char *path, int adflags, mode_t mode, struct adouble EC_FAIL; } ad->ad_data_fork.adf_syml[lsz] = 0; - ad->ad_data_fork.adf_fd = -2; /* -2 means its a symlink */ + ad->ad_data_fork.adf_fd = AD_SYMLINK; break; default: EC_FAIL; @@ -1041,7 +1041,7 @@ static int ad_open_hf_ea(const char *path, int adflags, int mode, struct adouble oflags = O_NOFOLLOW | (ad2openflags(ad, ADFLAGS_DF, adflags) & ~(O_CREAT | O_TRUNC)); - if (ad_meta_fileno(ad) == -2) + if (ad_meta_fileno(ad) == AD_SYMLINK) /* symlink */ EC_EXIT; diff --git a/libatalk/adouble/ad_write.c b/libatalk/adouble/ad_write.c index 08554a27..bfed9b40 100644 --- a/libatalk/adouble/ad_write.c +++ b/libatalk/adouble/ad_write.c @@ -55,8 +55,7 @@ ssize_t ad_write(struct adouble *ad, uint32_t eid, off_t off, int end, const cha size_t roundup; off_t r_off; - if (ad_data_fileno(ad) == -2) { - /* It's a symlink */ + if (ad_data_fileno(ad) == AD_SYMLINK) { errno = EACCES; return -1; } -- 2.39.2