X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=include%2Fatalk%2Fadouble.h;h=3bc262190570e2ca2e582fb1aebacb4356d03ae4;hb=be4c7009bc01f39e8b256ff05045871f55df61e1;hp=8e00a31854eab6201350e4a44641d22e41c3ef3b;hpb=d8736f77764e18812d1c05769bd211b56539d1c1;p=netatalk.git diff --git a/include/atalk/adouble.h b/include/atalk/adouble.h index 8e00a318..3bc26219 100644 --- a/include/atalk/adouble.h +++ b/include/atalk/adouble.h @@ -1,5 +1,5 @@ /* - * $Id: adouble.h,v 1.25 2005-05-03 14:55:12 didg Exp $ + * $Id: adouble.h,v 1.32 2006-09-29 09:44:59 didg Exp $ * Copyright (c) 1990,1991 Regents of The University of Michigan. * All Rights Reserved. * @@ -80,9 +80,12 @@ /* version info */ #define AD_VERSION1 0x00010000 +#define SFM_VERSION AD_VERSION1 + #define AD_VERSION2 0x00020000 #define AD_VERSION2_OSX 0x00020001 #define AD_VERSION1_ADS 0x00010002 +#define AD_VERSION1_SFM 0x00010003 #define AD_VERSION AD_VERSION2 /* @@ -112,12 +115,14 @@ #define ADEID_PRIVINO 17 #define ADEID_PRIVSYN 18 /* in synch with database */ #define ADEID_PRIVID 19 +#define ADEID_SFMRESERVE1 20 +#define ADEID_SFMRESERVE2 21 #define AD_DEV 0x80444556 #define AD_INO 0x80494E4F #define AD_SYN 0x8053594E #define AD_ID 0x8053567E -#define ADEID_MAX 20 +#define ADEID_MAX 22 #endif /* magic */ @@ -125,6 +130,7 @@ #define AD_APPLEDOUBLE_MAGIC 0x00051607 #define AD_MAGIC AD_APPLEDOUBLE_MAGIC +#define SFM_MAGIC 0x00504641 /* sizes of relevant entry bits */ #define ADEDLEN_MAGIC 4 @@ -159,6 +165,10 @@ #define ADEID_NUM_V1 5 #define ADEID_NUM_V2 13 +// #define ADEID_NUM_SFM 5 +/* sizeof SFM meta data */ +#define AD_SFM_LEN 60 + /* 589 */ #define AD_DATASZ1 (AD_HEADER_LEN + ADEDLEN_NAME + ADEDLEN_COMMENT +ADEDLEN_FILEI +ADEDLEN_FINDERI+\ ADEID_NUM_V1*AD_ENTRY_LEN) @@ -239,14 +249,22 @@ struct ad_fd { int adf_refcount, adf_lockcount, adf_lockmax; }; +/* fork attribute */ +#define ATTRBIT_DOPEN (1<<3) /* data fork already open */ +#define ATTRBIT_ROPEN (1<<4) /* resource fork already open */ + /* some header protection */ #define AD_INITED 0xad494e54 /* ad"INT" */ +struct adouble_fops; + struct adouble { u_int32_t ad_magic; u_int32_t ad_version; char ad_filler[ 16 ]; struct ad_entry ad_eid[ ADEID_MAX ]; - struct ad_fd ad_df, ad_hf; + struct ad_fd ad_data_fork, ad_resource_fork, ad_metadata_fork; + struct ad_fd *ad_md; /* either ad_resource or ad_metadata */ + int ad_flags; unsigned int ad_inited; int ad_options; @@ -254,8 +272,12 @@ struct adouble { off_t ad_rlen; /* ressource fork len with AFP 3.0 the header parameter size is too small. */ - char *(*ad_path)(const char *, int); - int (*ad_mkrf)(char *); + char *ad_m_name; /* mac name for open fork */ + int ad_m_namelen; + struct adouble_fops *ad_ops; + + + u_int16_t ad_open_forks; /* open forks (by others) */ #ifdef USE_MMAPPED_HEADERS char *ad_data; @@ -264,17 +286,37 @@ struct adouble { #endif }; +struct adouble_fops { + char *(*ad_path)(const char *, int); + int (*ad_mkrf)(char *); + + int (*ad_rebuild_header)(struct adouble *); + int (*ad_check_header)(struct adouble *, struct stat *); + int (*ad_header_read)(struct adouble *, struct stat *); + + int (*ad_header_upgrade)(struct adouble *, char *); + +}; + #define ADFLAGS_DF (1<<0) -#define ADFLAGS_HF (1<<1) +#define ADFLAGS_HF (1<<1) #define ADFLAGS_DIR (1<<2) #define ADFLAGS_NOADOUBLE (1<<3) #define ADFLAGS_V1COMPAT (1<<4) #define ADFLAGS_NOHF (1<<5) /* not an error if no ressource fork */ #define ADFLAGS_RDONLY (1<<6) /* don't try readwrite */ +#define ADFLAGS_OPENFORKS (1<<7) /* check for open fork in ad_metadata function */ +#define ADFLAGS_RF (1<<8) +#define ADFLAGS_MD ADFLAGS_HF /* (1<<9) */ +#define ADFLAGS_CREATE (1<<9) /* adouble v2 cnid cache */ #define ADVOL_NODEV (1 << 0) #define ADVOL_CACHE (1 << 1) +/* adouble unix priv */ +#define ADVOL_UNIXPRIV (1 << 2) +/* dot files (.DS_Store) are invisible) */ +#define ADVOL_INVDOTS (1 << 3) /* lock flags */ #define ADLOCK_CLR (0) @@ -356,8 +398,10 @@ struct adouble { #define AD_AFPFILEI_GROUP (1 << 1) /* ignore group */ #define AD_AFPFILEI_BLANKACCESS (1 << 2) /* blank access permissions */ -#define ad_dfileno(ad) ((ad)->ad_df.adf_fd) -#define ad_hfileno(ad) ((ad)->ad_hf.adf_fd) +#define ad_data_fileno(ad) ((ad)->ad_data_fork.adf_fd) +#define ad_reso_fileno(ad) ((ad)->ad_resource_fork.adf_fd) +#define ad_meta_fileno(ad) ((ad)->ad_md->adf_fd) + #define ad_getversion(ad) ((ad)->ad_version) #define ad_getentrylen(ad,eid) ((ad)->ad_eid[(eid)].ade_len) @@ -366,14 +410,17 @@ struct adouble { #define ad_getentryoff(ad,eid) ((ad)->ad_eid[(eid)].ade_off) #define ad_entry(ad,eid) ((caddr_t)(ad)->ad_data + \ (ad)->ad_eid[(eid)].ade_off) -#define ad_getoflags(ad,adf) (((adf)&ADFLAGS_HF) ? \ - (ad)->ad_hf.adf_flags : (ad)->ad_df.adf_flags) -#define ad_get_HF_flags(ad) ((ad)->ad_hf.adf_flags) +#define ad_get_HF_flags(ad) ((ad)->ad_resource_fork.adf_flags) +#define ad_get_MD_flags(ad) ((ad)->ad_md->adf_flags) + +/* ad_flush.c -/* ad_flush.c */ -extern void ad_rebuild_header __P((struct adouble *)); -extern int ad_flush __P((struct adouble *, int)); +*/ +extern int ad_rebuild_adouble_header __P((struct adouble *)); +extern int ad_rebuild_sfm_header __P((struct adouble *)); + +extern int ad_flush __P((struct adouble *)); extern int ad_close __P((struct adouble *, int)); /* ad_lock.c */ @@ -401,6 +448,7 @@ extern char *ad_dir __P((const char *)); extern char *ad_path __P((const char *, int)); extern char *ad_path_osx __P((const char *, int)); extern char *ad_path_ads __P((const char *, int)); +extern char *ad_path_sfm __P((const char *, int)); extern int ad_mode __P((const char *, int)); extern int ad_mkdir __P((const char *, int)); @@ -411,11 +459,13 @@ extern int ad_refresh __P((struct adouble *)); extern int ad_stat __P((const char *, struct stat *)); extern int ad_metadata __P((const char *, int, struct adouble *)); -#if 0 -#define ad_metadata(name, flags, adp) ad_open(name, ADFLAGS_HF|(flags), O_RDONLY, 0666, adp) -#endif +#define ad_open_metadata(name, flags, mode, adp)\ + ad_open(name, ADFLAGS_MD|(flags), O_RDWR |(mode), 0666, (adp)) + +#define ad_close_metadata(adp) ad_close( (adp), ADFLAGS_MD) -/* extend header to RW if R or W (W if R for locking), +/* build a resource fork mode from the data fork mode: + * remove X mode and extend header to RW if R or W (W if R for locking), */ #ifndef ATACC #ifndef __inline__ @@ -423,9 +473,7 @@ extern int ad_metadata __P((const char *, int, struct adouble *)); #endif static __inline__ mode_t ad_hf_mode (mode_t mode) { -#if 0 - mode |= S_IRUSR; -#endif + mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH); /* fnctl lock need write access */ if ((mode & S_IRUSR)) mode |= S_IWUSR;