]> arthur.barton.de Git - netatalk.git/blobdiff - include/atalk/adouble.h
for .xx files don't set invisible bit if create by netatalk
[netatalk.git] / include / atalk / adouble.h
index 8e00a31854eab6201350e4a44641d22e41c3ef3b..3bc262190570e2ca2e582fb1aebacb4356d03ae4 100644 (file)
@@ -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.
  *
 
 /* 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
 
 /*
 #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 */
 #define AD_APPLEDOUBLE_MAGIC 0x00051607
 #define AD_MAGIC            AD_APPLEDOUBLE_MAGIC
 
+#define SFM_MAGIC            0x00504641 
 
 /* sizes of relevant entry bits */
 #define ADEDLEN_MAGIC       4
 #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;