X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=include%2Fatalk%2Fadouble.h;h=fd870876cd18698fa1790128178fbc6b07150c4e;hb=40ec781c1ddb2686c589e4184bc08fa266f28b40;hp=5b276a5a27a2e8255266eb5bbf810e3c0b19c2b8;hpb=6f45d8eaada82e401ecde525c689a67148b3ba1e;p=netatalk.git diff --git a/include/atalk/adouble.h b/include/atalk/adouble.h index 5b276a5a..fd870876 100644 --- a/include/atalk/adouble.h +++ b/include/atalk/adouble.h @@ -49,7 +49,6 @@ /* version info */ #define AD_VERSION2 0x00020000 -#define AD_VERSION2_OSX 0x00020001 #define AD_VERSION_EA 0x00020002 /* default */ @@ -155,6 +154,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 +171,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; @@ -198,9 +200,6 @@ struct adouble { struct ad_fd ad_data_fork; /* the data fork */ - struct ad_fd ad_metadata_fork; /* adouble:v2 -> unused * - * adouble:ea -> fd unused, only flags used */ - struct ad_fd ad_resource_fork; /* adouble:v2 -> the adouble file * * adouble:ea -> the EA fd */ @@ -208,13 +207,16 @@ struct adouble { * adouble:ea -> ad_resource_fork */ struct ad_fd *ad_mdp; /* adouble:v2 -> ad_resource_fork * - * adouble:ea -> ad_metadata_fork */ + * adouble:ea -> ad_data_fork */ int ad_vers; /* Our adouble version info (AD_VERSION*) */ int ad_adflags; /* ad_open flags adflags like ADFLAGS_DIR */ uint32_t ad_inited; int ad_options; int ad_refcount; /* multiple forks may open one adouble */ + int ad_data_refcount; + int ad_meta_refcount; + int ad_reso_refcount; off_t ad_rlen; /* ressource fork len with AFP 3.0 * * the header parameter size is too small. */ char *ad_name; /* name in server encoding (usually UTF8) */ @@ -245,6 +247,7 @@ struct adouble { #define ADVOL_NODEV (1 << 0) #define ADVOL_UNIXPRIV (1 << 2) /* adouble unix priv */ #define ADVOL_INVDOTS (1 << 3) /* dot files (.DS_Store) are invisible) */ +#define ADVOL_FOLLO_SYML (1 << 4) /* lock flags */ #define ADLOCK_CLR (0) @@ -348,10 +351,10 @@ 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 */ -#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) +/* -1: not open, AD_SYMLINK (-2): it's a symlink */ +#define AD_DATA_OPEN(ad) (((ad)->ad_data_refcount) && (ad_data_fileno(ad) >= 0)) +#define AD_META_OPEN(ad) (((ad)->ad_meta_refcount) && (ad_meta_fileno(ad) >= 0)) +#define AD_RSRC_OPEN(ad) (((ad)->ad_reso_refcount) && (ad_reso_fileno(ad) >= 0)) #define ad_getversion(ad) ((ad)->ad_version) @@ -367,6 +370,8 @@ struct adouble { #define ad_ref(ad) (ad)->ad_refcount++ #define ad_unref(ad) --((ad)->ad_refcount) +#define ad_get_syml_opt(ad) (((ad)->ad_options & ADVOL_FOLLO_SYML) ? 0 : O_NOFOLLOW) + /* ad_flush.c */ extern int ad_rebuild_adouble_header_v2(struct adouble *); extern int ad_rebuild_adouble_header_ea(struct adouble *); @@ -403,8 +408,12 @@ extern int ad_stat (const char *, struct stat *); extern int ad_metadata (const char *, int, struct adouble *); extern int ad_metadataat (int, const char *, int, struct adouble *); extern mode_t ad_hf_mode(mode_t mode); -extern int ad_convert(const char *path, const struct stat *sp, const struct vol *vol); extern int ad_valid_header_osx(const char *path); +extern off_t ad_reso_size(const char *path, int adflags, struct adouble *ad); + +/* ad_conv.c */ +extern int ad_convert(const char *path, const struct stat *sp, const struct vol *vol, const char **newpath); + /* ad_read.c/ad_write.c */ extern int sys_ftruncate(int fd, off_t length); extern ssize_t ad_read(struct adouble *, uint32_t, off_t, char *, size_t); @@ -429,7 +438,7 @@ extern int ad_setdate(struct adouble *, unsigned int, uint32_t); extern int ad_getdate(const struct adouble *, unsigned int, uint32_t *); /* ad_attr.c */ -extern int ad_setattr(const struct adouble *, uint16_t); +extern int ad_setattr(const struct adouble *, const uint16_t); extern int ad_getattr(const struct adouble *, uint16_t *); extern int ad_setname(struct adouble *, const char *); extern int ad_setid(struct adouble *, dev_t dev, ino_t ino, uint32_t, uint32_t, const void *);