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