hfs_fs.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:13k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.  * linux/include/linux/hfs_fs.h
  3.  *
  4.  * Copyright (C) 1995-1997  Paul H. Hargrove
  5.  * This file may be distributed under the terms of the GNU General Public License.
  6.  *
  7.  * The source code distribution of the Columbia AppleTalk Package for
  8.  * UNIX, version 6.0, (CAP) was used as a specification of the
  9.  * location and format of files used by CAP's Aufs.  No code from CAP
  10.  * appears in hfs_fs.  hfs_fs is not a work ``derived'' from CAP in
  11.  * the sense of intellectual property law.
  12.  *
  13.  * The source code distributions of Netatalk, versions 1.3.3b2 and
  14.  * 1.4b2, were used as a specification of the location and format of
  15.  * files used by Netatalk's afpd.  No code from Netatalk appears in
  16.  * hfs_fs.  hfs_fs is not a work ``derived'' from Netatalk in the
  17.  * sense of intellectual property law.
  18.  */
  19. #ifndef _LINUX_HFS_FS_H
  20. #define _LINUX_HFS_FS_H
  21. #include <linux/hfs_sysdep.h>
  22. /* magic numbers for Apple Double header files */
  23. #define HFS_DBL_MAGIC 0x00051607
  24. #define HFS_SNGL_MAGIC 0x00051600
  25. #define HFS_HDR_VERSION_1 0x00010000
  26. #define HFS_HDR_VERSION_2 0x00020000
  27. /* magic numbers for various internal structures */
  28. #define HFS_INO_MAGIC 0x4821
  29. #define HFS_SB_MAGIC 0x4822
  30. /* The space used for the AppleDouble or AppleSingle headers */
  31. #define HFS_DBL_HDR_LEN 1024
  32. /* The space used for the Netatalk header */
  33. #define HFS_NAT_HDR_LEN 1024  /* 589 for an exact match */
  34. /* Macros to extract CNID and file "type" from the Linux inode number */
  35. #define HFS_CNID(X) ((X) & 0x3FFFFFFF)
  36. #define HFS_ITYPE(X) ((X) & 0xC0000000)
  37. /* Macros to enumerate types */
  38. #define HFS_ITYPE_TO_INT(X) ((X) >> 30)
  39. #define HFS_INT_TO_ITYPE(X) ((X) << 30)
  40. /* generic ITYPEs */
  41. #define HFS_ITYPE_0 0x00000000
  42. #define HFS_ITYPE_1 0x40000000
  43. #define HFS_ITYPE_2 0x80000000
  44. #define HFS_ITYPE_3 0xC0000000
  45. #define HFS_ITYPE_NORM HFS_ITYPE_0 /* "normal" directory or file */
  46. /* ITYPEs for CAP */
  47. #define HFS_CAP_NORM HFS_ITYPE_0 /* data fork or normal directory */
  48. #define HFS_CAP_DATA HFS_ITYPE_0 /* data fork of file */
  49. #define HFS_CAP_NDIR HFS_ITYPE_0 /* normal directory */
  50. #define HFS_CAP_FNDR HFS_ITYPE_1 /* finder info for file or dir */
  51. #define HFS_CAP_RSRC HFS_ITYPE_2 /* resource fork of file */
  52. #define HFS_CAP_RDIR HFS_ITYPE_2 /* .resource directory */
  53. #define HFS_CAP_FDIR HFS_ITYPE_3 /* .finderinfo directory */
  54. /* ITYPEs for Apple Double */
  55. #define HFS_DBL_NORM HFS_ITYPE_0 /* data fork or directory */
  56. #define HFS_DBL_DATA HFS_ITYPE_0 /* data fork of file */
  57. #define HFS_DBL_DIR HFS_ITYPE_0 /* directory */
  58. #define HFS_DBL_HDR HFS_ITYPE_1 /* AD header of file or dir */
  59. /* ITYPEs for netatalk */
  60. #define HFS_NAT_NORM HFS_ITYPE_0 /* data fork or directory */
  61. #define HFS_NAT_DATA HFS_ITYPE_0 /* data fork of file */
  62. #define HFS_NAT_NDIR HFS_ITYPE_0 /* normal directory */
  63. #define HFS_NAT_HDR HFS_ITYPE_1 /* AD header of file or dir */
  64. #define HFS_NAT_HDIR HFS_ITYPE_2 /* directory holding AD headers */
  65. /* ITYPEs for Apple Single */
  66. #define HFS_SGL_NORM HFS_ITYPE_0 /* AppleSingle file or directory */
  67. #define HFS_SGL_SNGL HFS_ITYPE_0 /* AppleSingle file */
  68. #define HFS_SGL_DIR HFS_ITYPE_0 /* directory */
  69. #define HFS_SGL_DINF HFS_ITYPE_1 /* %DirInfo for directory */
  70. /* IDs for elements of an AppleDouble or AppleSingle header */
  71. #define HFS_HDR_DATA 1   /* data fork */
  72. #define HFS_HDR_RSRC 2   /* resource fork */
  73. #define HFS_HDR_FNAME 3   /* full (31-character) name */
  74. #define HFS_HDR_COMNT 4   /* comment */
  75. #define HFS_HDR_BWICN 5   /* b/w icon */
  76. #define HFS_HDR_CICON 6   /* color icon info */
  77. #define HFS_HDR_OLDI 7   /* old file info */
  78. #define HFS_HDR_DATES 8   /* file dates info */
  79. #define HFS_HDR_FINFO 9   /* Finder info */
  80. #define HFS_HDR_MACI 10  /* Macintosh info */
  81. #define HFS_HDR_PRODOSI 11  /* ProDOS info */
  82. #define HFS_HDR_MSDOSI  12  /* MSDOS info */
  83. #define HFS_HDR_SNAME   13  /* short name */
  84. #define HFS_HDR_AFPI    14  /* AFP file info */
  85. #define HFS_HDR_DID     15  /* directory id */
  86. #define HFS_HDR_MAX 16
  87. /*
  88.  * There are three time systems.  All three are based on seconds since
  89.  * a particular time/date.
  90.  * Unix: unsigned lil-endian since 00:00 GMT, Jan. 1, 1970
  91.  * mac: unsigned big-endian since 00:00 GMT, Jan. 1, 1904
  92.  * header:   SIGNED big-endian since 00:00 GMT, Jan. 1, 2000
  93.  *
  94.  */
  95. #define hfs_h_to_mtime(ARG) htonl((hfs_s32)ntohl(ARG)+3029529600U)
  96. #define hfs_m_to_htime(ARG) ((hfs_s32)htonl(ntohl(ARG)-3029529600U))
  97. #define hfs_h_to_utime(ARG) ((hfs_s32)hfs_to_utc(ntohl(ARG)+946684800U))
  98. #define hfs_u_to_htime(ARG) ((hfs_s32)htonl(hfs_from_utc(ARG)-946684800U))
  99. #define hfs_u_to_mtime(ARG) htonl(hfs_from_utc(ARG)+2082844800U)
  100. #define hfs_m_to_utime(ARG) (hfs_to_utc(ntohl(ARG)-2082844800U))
  101. /*======== Data structures kept in memory ========*/
  102. /*
  103.  * A descriptor for a single entry within the header of an
  104.  * AppleDouble or AppleSingle header file.
  105.  * An array of these make up a table of contents for the file.
  106.  */
  107. struct hfs_hdr_descr {
  108. hfs_u32 id; /* The Apple assigned ID for the entry type */
  109. hfs_u32 offset; /* The offset to reach the entry */
  110. hfs_u32 length; /* The length of the entry */
  111. };
  112. /*
  113.  * The info needed to reconstruct a given header layout
  114.  */
  115. struct hfs_hdr_layout {
  116. hfs_u32 magic; /* AppleSingle or AppleDouble */
  117. hfs_u32 version; /* 0x00010000 or 0x00020000 */
  118. hfs_u16 entries; /* How many entries used */
  119. struct hfs_hdr_descr
  120. descr[HFS_HDR_MAX]; /* Descriptors */
  121. struct hfs_hdr_descr
  122. *order[HFS_HDR_MAX]; /* 'descr' ordered by offset */
  123. };
  124. /* header layout for netatalk's v1 appledouble file format */
  125. struct hfs_nat_hdr {
  126. hfs_lword_t magic;
  127. hfs_lword_t version;
  128. hfs_byte_t homefs[16];
  129. hfs_word_t entries;
  130. hfs_byte_t descrs[12*5];
  131. hfs_byte_t real_name[255]; /* id=3 */
  132. hfs_byte_t comment[200]; /* id=4 XXX: not yet implemented */
  133. hfs_byte_t old_info[16]; /* id=7 */
  134. hfs_u8 finderinfo[32]; /* id=9 */
  135. };
  136. /* 
  137.  * Default header layout for Netatalk and AppleDouble
  138.  */
  139. struct hfs_dbl_hdr {
  140. hfs_lword_t magic;
  141. hfs_lword_t version;
  142. hfs_byte_t filler[16];
  143. hfs_word_t entries;
  144. hfs_byte_t descrs[12*HFS_HDR_MAX];
  145. hfs_byte_t real_name[255]; /* id=3 */
  146. hfs_byte_t comment[200]; /* id=4 XXX: not yet implemented */
  147. hfs_u32 create_time; /*            */
  148. hfs_u32 modify_time; /*  | id=8 (or 7) */
  149. hfs_u32 backup_time; /*  |           */
  150. hfs_u32         access_time;    /* /  (attributes with id=7) */
  151. hfs_u8 finderinfo[32]; /* id=9 */
  152. hfs_u32 fileinfo; /* id=10 */
  153.         hfs_u32         cnid;           /* id=15 */
  154. hfs_u8          short_name[12]; /* id=13 */
  155. hfs_u8          prodosi[8];     /* id=11 */
  156. };
  157. /* finder metadata for CAP */
  158. struct hfs_cap_info {
  159. hfs_byte_t fi_fndr[32]; /* Finder's info */
  160. hfs_word_t fi_attr; /* AFP attributes (f=file/d=dir) */
  161. #define HFS_AFP_INV             0x001   /* Invisible bit (f/d) */
  162. #define HFS_AFP_EXPFOLDER       0x002   /* exported folder (d) */
  163. #define HFS_AFP_MULTI           0x002   /* Multiuser bit (f) */
  164. #define HFS_AFP_SYS             0x004   /* System bit (f/d) */
  165. #define HFS_AFP_DOPEN           0x008   /* data fork already open (f) */
  166. #define HFS_AFP_MOUNTED         0x008   /* mounted folder (d) */
  167. #define HFS_AFP_ROPEN           0x010   /* resource fork already open (f) */
  168. #define HFS_AFP_INEXPFOLDER     0x010   /* folder in shared area (d) */
  169. #define HFS_AFP_WRI 0x020 /* Write inhibit bit (readonly) (f) */
  170. #define HFS_AFP_BACKUP          0x040   /* backup needed bit (f/d)  */
  171. #define HFS_AFP_RNI 0x080 /* Rename inhibit bit (f/d) */
  172. #define HFS_AFP_DEI 0x100 /* Delete inhibit bit (f/d) */
  173. #define HFS_AFP_NOCOPY          0x400   /* Copy protect bit (f) */
  174. #define HFS_AFP_RDONLY ( HFS_AFP_WRI|HFS_AFP_RNI|HFS_AFP_DEI)
  175. hfs_byte_t fi_magic1; /* Magic number: */
  176. #define HFS_CAP_MAGIC1 0xFF
  177. hfs_byte_t fi_version; /* Version of this structure: */
  178. #define HFS_CAP_VERSION 0x10
  179. hfs_byte_t fi_magic; /* Another magic number: */
  180. #define HFS_CAP_MAGIC 0xDA
  181. hfs_byte_t fi_bitmap; /* Bitmap of which names are valid: */
  182. #define HFS_CAP_SHORTNAME 0x01
  183. #define HFS_CAP_LONGNAME 0x02
  184. hfs_byte_t fi_shortfilename[12+1]; /* "short name" (unused) */
  185. hfs_byte_t fi_macfilename[32+1]; /* Original (Macintosh) name */
  186. hfs_byte_t fi_comln; /* Length of comment (always 0) */
  187. hfs_byte_t fi_comnt[200]; /* Finder comment (unused) */
  188. /* optional:  used by aufs only if compiled with USE_MAC_DATES */
  189. hfs_byte_t fi_datemagic; /* Magic number for dates extension: */
  190. #define HFS_CAP_DMAGIC 0xDA
  191. hfs_byte_t fi_datevalid; /* Bitmap of which dates are valid: */
  192. #define HFS_CAP_MDATE 0x01
  193. #define HFS_CAP_CDATE 0x02
  194. hfs_lword_t fi_ctime; /* Creation date (in AFP format) */
  195. hfs_lword_t fi_mtime; /* Modify date (in AFP format) */
  196. hfs_lword_t fi_utime; /* Un*x time of last mtime change */
  197. hfs_byte_t pad;
  198. };
  199. #ifdef __KERNEL__
  200. typedef ssize_t hfs_rwret_t;
  201. typedef size_t hfs_rwarg_t;
  202. #include <asm/uaccess.h>
  203. /* Some forward declarations */
  204. struct hfs_fork;
  205. struct hfs_cat_key;
  206. struct hfs_cat_entry;
  207. extern struct hfs_cat_entry *hfs_cat_get(struct hfs_mdb *,
  208.  const struct hfs_cat_key *);
  209. /* dir.c */
  210. extern int hfs_create(struct inode *, struct dentry *, int);
  211. extern int hfs_mkdir(struct inode *, struct dentry *, int);
  212. extern int hfs_unlink(struct inode *, struct dentry *);
  213. extern int hfs_rmdir(struct inode *, struct dentry *);
  214. extern int hfs_rename(struct inode *, struct dentry *,
  215.       struct inode *, struct dentry *);
  216. /* dir_cap.c */
  217. extern const struct hfs_name hfs_cap_reserved1[];
  218. extern const struct hfs_name hfs_cap_reserved2[];
  219. extern struct inode_operations hfs_cap_ndir_inode_operations;
  220. extern struct inode_operations hfs_cap_fdir_inode_operations;
  221. extern struct inode_operations hfs_cap_rdir_inode_operations;
  222. extern struct file_operations hfs_cap_dir_operations;
  223. extern void hfs_cap_drop_dentry(struct dentry *, const ino_t);
  224. /* dir_dbl.c */
  225. extern const struct hfs_name hfs_dbl_reserved1[];
  226. extern const struct hfs_name hfs_dbl_reserved2[];
  227. extern struct inode_operations hfs_dbl_dir_inode_operations;
  228. extern struct file_operations hfs_dbl_dir_operations;
  229. extern void hfs_dbl_drop_dentry(struct dentry *, const ino_t);
  230. /* dir_nat.c */
  231. extern const struct hfs_name hfs_nat_reserved1[];
  232. extern const struct hfs_name hfs_nat_reserved2[];
  233. extern struct inode_operations hfs_nat_ndir_inode_operations;
  234. extern struct inode_operations hfs_nat_hdir_inode_operations;
  235. extern struct file_operations hfs_nat_dir_operations;
  236. extern void hfs_nat_drop_dentry(struct dentry *, const ino_t);
  237. /* file.c */
  238. extern hfs_s32 hfs_do_read(struct inode *, struct hfs_fork *, hfs_u32,
  239.    char *, hfs_u32, int);
  240. extern hfs_s32 hfs_do_write(struct inode *, struct hfs_fork *, hfs_u32,
  241.     const char *, hfs_u32);
  242. extern void hfs_file_fix_mode(struct hfs_cat_entry *entry);
  243. extern struct inode_operations hfs_file_inode_operations;
  244. extern struct file_operations hfs_file_operations;
  245. /* file_cap.c */
  246. extern struct inode_operations hfs_cap_info_inode_operations;
  247. extern struct file_operations hfs_cap_info_operations;
  248. /* file_hdr.c */
  249. extern struct inode_operations hfs_hdr_inode_operations;
  250. extern struct file_operations hfs_hdr_operations;
  251. extern const struct hfs_hdr_layout hfs_dbl_fil_hdr_layout;
  252. extern const struct hfs_hdr_layout hfs_dbl_dir_hdr_layout;
  253. extern const struct hfs_hdr_layout hfs_nat_hdr_layout;
  254. extern const struct hfs_hdr_layout hfs_nat2_hdr_layout;
  255. extern const struct hfs_hdr_layout hfs_sngl_hdr_layout;
  256. extern void hdr_truncate(struct inode *,size_t);
  257. /* inode.c */
  258. extern void hfs_put_inode(struct inode *);
  259. extern int hfs_notify_change(struct dentry *, struct iattr *);
  260. extern int hfs_notify_change_cap(struct dentry *, struct iattr *);
  261. extern int hfs_notify_change_hdr(struct dentry *, struct iattr *);
  262. extern struct inode *hfs_iget(struct hfs_cat_entry *, ino_t, struct dentry *);
  263. extern void hfs_cap_ifill(struct inode *, ino_t, const int);
  264. extern void hfs_dbl_ifill(struct inode *, ino_t, const int);
  265. extern void hfs_nat_ifill(struct inode *, ino_t, const int);
  266. extern void hfs_sngl_ifill(struct inode *, ino_t, const int);
  267. /* super.c */
  268. extern struct super_block *hfs_read_super(struct super_block *,void *,int);
  269. /* trans.c */
  270. extern void hfs_colon2mac(struct hfs_name *, const char *, int);
  271. extern void hfs_prcnt2mac(struct hfs_name *, const char *, int);
  272. extern void hfs_triv2mac(struct hfs_name *, const char *, int);
  273. extern void hfs_latin2mac(struct hfs_name *, const char *, int);
  274. extern int hfs_mac2cap(char *, const struct hfs_name *);
  275. extern int hfs_mac2nat(char *, const struct hfs_name *);
  276. extern int hfs_mac2latin(char *, const struct hfs_name *);
  277. extern int hfs_mac2seven(char *, const struct hfs_name *);
  278. extern int hfs_mac2eight(char *, const struct hfs_name *);
  279. extern int hfs_mac2alpha(char *, const struct hfs_name *);
  280. extern int hfs_mac2triv(char *, const struct hfs_name *);
  281. extern void hfs_tolower(unsigned char *, int);
  282. #define HFS_I(X) (&((X)->u.hfs_i))
  283. #define HFS_SB(X) (&((X)->u.hfs_sb))
  284. static inline void hfs_nameout(struct inode *dir, struct hfs_name *out,
  285.    const char *in, int len) {
  286. HFS_SB(dir->i_sb)->s_nameout(out, in, len);
  287. }
  288. static inline int hfs_namein(struct inode *dir, char *out,
  289.  const struct hfs_name *in) {
  290. int len = HFS_SB(dir->i_sb)->s_namein(out, in);
  291. if (HFS_SB(dir->i_sb)->s_lowercase) {
  292. hfs_tolower(out, len);
  293. }
  294. return len;
  295. }
  296. #endif /* __KERNEL__ */
  297. #endif