diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1998-03-17 22:05:47 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1998-03-17 22:05:47 +0000 |
commit | 27cfca1ec98e91261b1a5355d10a8996464b63af (patch) | |
tree | 8e895a53e372fa682b4c0a585b9377d67ed70d0e /include/linux/hfs_fs.h | |
parent | 6a76fb7214c477ccf6582bd79c5b4ccc4f9c41b1 (diff) |
Look Ma' what I found on my harddisk ...
o New faster syscalls for 2.1.x, too
o Upgrade to 2.1.89.
Don't try to run this. It's flaky as hell. But feel free to debug ...
Diffstat (limited to 'include/linux/hfs_fs.h')
-rw-r--r-- | include/linux/hfs_fs.h | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/include/linux/hfs_fs.h b/include/linux/hfs_fs.h new file mode 100644 index 000000000..de51db0b1 --- /dev/null +++ b/include/linux/hfs_fs.h @@ -0,0 +1,324 @@ +/* + * linux/include/linux/hfs_fs.h + * + * Copyright (C) 1995-1997 Paul H. Hargrove + * This file may be distributed under the terms of the GNU Public License. + * + * The source code distribution of the Columbia AppleTalk Package for + * UNIX, version 6.0, (CAP) was used as a specification of the + * location and format of files used by CAP's Aufs. No code from CAP + * appears in hfs_fs. hfs_fs is not a work ``derived'' from CAP in + * the sense of intellectual property law. + * + * The source code distributions of Netatalk, versions 1.3.3b2 and + * 1.4b2, were used as a specification of the location and format of + * files used by Netatalk's afpd. No code from Netatalk appears in + * hfs_fs. hfs_fs is not a work ``derived'' from Netatalk in the + * sense of intellectual property law. + */ + +#ifndef _LINUX_HFS_FS_H +#define _LINUX_HFS_FS_H + +#include <linux/hfs_sysdep.h> + +/* magic numbers for Apple Double header files */ +#define HFS_DBL_MAGIC 0x00051607 +#define HFS_SNGL_MAGIC 0x00051600 +#define HFS_HDR_VERSION_1 0x00010000 +#define HFS_HDR_VERSION_2 0x00020000 + +/* magic numbers for various internal structures */ +#define HFS_INO_MAGIC 0x4821 +#define HFS_SB_MAGIC 0x4822 + +/* The space used for the AppleDouble or AppleSingle headers */ +#define HFS_DBL_HDR_LEN 1024 + +/* The space used for the Netatalk header */ +#define HFS_NAT_HDR_LEN 1024 /* 589 for an exact match */ + +/* Macros to extract CNID and file "type" from the Linux inode number */ +#define HFS_CNID(X) ((X) & 0x3FFFFFFF) +#define HFS_ITYPE(X) ((X) & 0xC0000000) + +/* Macros to enumerate types */ +#define HFS_ITYPE_TO_INT(X) ((X) >> 30) +#define HFS_INT_TO_ITYPE(X) ((X) << 30) + +/* generic ITYPEs */ +#define HFS_ITYPE_0 0x00000000 +#define HFS_ITYPE_1 0x40000000 +#define HFS_ITYPE_2 0x80000000 +#define HFS_ITYPE_3 0xC0000000 +#define HFS_ITYPE_NORM HFS_ITYPE_0 /* "normal" directory or file */ + +/* ITYPEs for CAP */ +#define HFS_CAP_NORM HFS_ITYPE_0 /* data fork or normal directory */ +#define HFS_CAP_DATA HFS_ITYPE_0 /* data fork of file */ +#define HFS_CAP_NDIR HFS_ITYPE_0 /* normal directory */ +#define HFS_CAP_FNDR HFS_ITYPE_1 /* finder info for file or dir */ +#define HFS_CAP_RSRC HFS_ITYPE_2 /* resource fork of file */ +#define HFS_CAP_RDIR HFS_ITYPE_2 /* .resource directory */ +#define HFS_CAP_FDIR HFS_ITYPE_3 /* .finderinfo directory */ + +/* ITYPEs for Apple Double */ +#define HFS_DBL_NORM HFS_ITYPE_0 /* data fork or directory */ +#define HFS_DBL_DATA HFS_ITYPE_0 /* data fork of file */ +#define HFS_DBL_DIR HFS_ITYPE_0 /* directory */ +#define HFS_DBL_HDR HFS_ITYPE_1 /* AD header of file or dir */ + +/* ITYPEs for netatalk */ +#define HFS_NAT_NORM HFS_ITYPE_0 /* data fork or directory */ +#define HFS_NAT_DATA HFS_ITYPE_0 /* data fork of file */ +#define HFS_NAT_NDIR HFS_ITYPE_0 /* normal directory */ +#define HFS_NAT_HDR HFS_ITYPE_1 /* AD header of file or dir */ +#define HFS_NAT_HDIR HFS_ITYPE_2 /* directory holding AD headers */ + +/* ITYPEs for Apple Single */ +#define HFS_SGL_NORM HFS_ITYPE_0 /* AppleSingle file or directory */ +#define HFS_SGL_SNGL HFS_ITYPE_0 /* AppleSingle file */ +#define HFS_SGL_DIR HFS_ITYPE_0 /* directory */ +#define HFS_SGL_DINF HFS_ITYPE_1 /* %DirInfo for directory */ + +/* IDs for elements of an AppleDouble or AppleSingle header */ +#define HFS_HDR_DATA 1 +#define HFS_HDR_RSRC 2 +#define HFS_HDR_FNAME 3 +#define HFS_HDR_COMNT 4 +#define HFS_HDR_BWICN 5 +#define HFS_HDR_CICON 6 +#define HFS_HDR_OLDI 7 +#define HFS_HDR_DATES 8 +#define HFS_HDR_FINFO 9 +#define HFS_HDR_MACI 10 +#define HFS_HDR_MAX 10 + +/* + * There are three time systems. All three are based on seconds since + * a particular time/date. + * Unix: unsigned lil-endian since 00:00 GMT, Jan. 1, 1970 + * mac: unsigned big-endian since 00:00 GMT, Jan. 1, 1904 + * header: SIGNED big-endian since 00:00 GMT, Jan. 1, 2000 + * + */ +#define hfs_h_to_mtime(ARG) htonl((hfs_s32)ntohl(ARG)+3029529600U) +#define hfs_m_to_htime(ARG) ((hfs_s32)htonl(ntohl(ARG)-3029529600U)) +#define hfs_h_to_utime(ARG) ((hfs_s32)ntohl(ARG)+946684800U) +#define hfs_u_to_htime(ARG) ((hfs_s32)htonl((ARG)-946684800U)) +#define hfs_u_to_mtime(ARG) htonl((ARG)+2082844800U) +#define hfs_m_to_utime(ARG) (ntohl(ARG)-2082844800U) + +/*======== Data structures kept in memory ========*/ + +/* + * A descriptor for a single entry within the header of an + * AppleDouble or AppleSingle header file. + * An array of these make up a table of contents for the file. + */ +struct hfs_hdr_descr { + hfs_u32 id; /* The Apple assigned ID for the entry type */ + hfs_u32 offset; /* The offset to reach the entry */ + hfs_u32 length; /* The length of the entry */ +}; + +/* + * The info needed to reconstruct a given header layout + */ +struct hfs_hdr_layout { + hfs_u32 magic; /* AppleSingle or AppleDouble */ + hfs_u32 version; /* 0x00010000 or 0x00020000 */ + hfs_u16 entries; /* How many entries used */ + struct hfs_hdr_descr + descr[HFS_HDR_MAX]; /* Descriptors */ + struct hfs_hdr_descr + *order[HFS_HDR_MAX]; /* 'descr' ordered by offset */ +}; + +/* + * Default header layout for Netatalk + */ +struct hfs_nat_hdr { + hfs_lword_t magic; + hfs_lword_t version; + hfs_byte_t homefs[16]; + hfs_word_t entries; + hfs_byte_t descrs[60]; + hfs_byte_t real_name[255]; /* id=3 */ + hfs_byte_t comment[200]; /* id=4 XXX: not yet implemented */ + hfs_lword_t create_time; /* \ */ + hfs_lword_t modify_time; /* | */ + hfs_lword_t backup_time; /* | id=7 */ + hfs_word_t filler; /* | */ + hfs_word_t attr; /* / */ + hfs_byte_t finderinfo[32]; /* id=9 */ +}; + +/* + * Default header layout for AppleDouble + */ +struct hfs_dbl_hdr { + hfs_lword_t magic; + hfs_lword_t version; + hfs_byte_t filler[16]; + hfs_word_t entries; + hfs_byte_t descrs[12*HFS_HDR_MAX]; + hfs_u32 create_time; /* \ */ + hfs_u32 modify_time; /* | id=8 */ + hfs_u32 backup_time; /* | */ + hfs_u32 access_time; /* / */ + hfs_u8 finderinfo[32]; /* id=9 */ + hfs_u32 fileinfo; /* id=10 */ + hfs_u8 real_name[32]; /* id=3 */ + hfs_u8 comment[200]; /* id=4 XXX: not yet implemented */ +}; + +/* finder metadata for CAP */ +struct hfs_cap_info { + hfs_byte_t fi_fndr[32]; /* Finder's info */ + hfs_word_t fi_attr; /* AFP attributes */ +#define HFS_AFP_WRI 0x020 /* Write inhibit bit */ +#define HFS_AFP_RNI 0x080 /* Rename inhibit bit (AFP >= 2.0) */ +#define HFS_AFP_DEI 0x100 /* Delete inhibit bit (AFP >= 2.0) */ +#define HFS_AFP_RDONLY ( HFS_AFP_WRI|HFS_AFP_RNI|HFS_AFP_DEI) + hfs_byte_t fi_magic1; /* Magic number: */ +#define HFS_CAP_MAGIC1 0xFF + hfs_byte_t fi_version; /* Version of this structure: */ +#define HFS_CAP_VERSION 0x10 + hfs_byte_t fi_magic; /* Another magic number: */ +#define HFS_CAP_MAGIC 0xDA + hfs_byte_t fi_bitmap; /* Bitmap of which names are valid: */ +#define HFS_CAP_SHORTNAME 0x01 +#define HFS_CAP_LONGNAME 0x02 + hfs_byte_t fi_shortfilename[12+1]; /* "short name" (unused) */ + hfs_byte_t fi_macfilename[32+1]; /* Original (Macintosh) name */ + hfs_byte_t fi_comln; /* Length of comment (always 0) */ + hfs_byte_t fi_comnt[200]; /* Finder comment (unused) */ + /* optional: used by aufs only if compiled with USE_MAC_DATES */ + hfs_byte_t fi_datemagic; /* Magic number for dates extension: */ +#define HFS_CAP_DMAGIC 0xDA + hfs_byte_t fi_datevalid; /* Bitmap of which dates are valid: */ +#define HFS_CAP_MDATE 0x01 +#define HFS_CAP_CDATE 0x02 + hfs_lword_t fi_ctime; /* Creation date (in AFP format) */ + hfs_lword_t fi_mtime; /* Modify date (in AFP format) */ + hfs_lword_t fi_utime; /* Un*x time of last mtime change */ + hfs_byte_t pad; +}; + +#ifdef __KERNEL__ + +typedef ssize_t hfs_rwret_t; +typedef size_t hfs_rwarg_t; + +#include <asm/uaccess.h> + +/* Some forward declarations */ +struct hfs_fork; +struct hfs_cat_key; +struct hfs_cat_entry; +extern struct hfs_cat_entry *hfs_cat_get(struct hfs_mdb *, + const struct hfs_cat_key *); + +/* dir.c */ +extern hfs_rwret_t hfs_dir_read(struct file *, char *, hfs_rwarg_t, + loff_t *); +extern int hfs_create(struct inode *, struct dentry *, int); +extern int hfs_mkdir(struct inode *, struct dentry *, int); +extern int hfs_mknod(struct inode *, struct dentry *, int, int); +extern int hfs_unlink(struct inode *, struct dentry *); +extern int hfs_rmdir(struct inode *, struct dentry *); +extern int hfs_rename(struct inode *, struct dentry *, + struct inode *, struct dentry *); + +/* dir_cap.c */ +extern const struct hfs_name hfs_cap_reserved1[]; +extern const struct hfs_name hfs_cap_reserved2[]; +extern struct inode_operations hfs_cap_ndir_inode_operations; +extern struct inode_operations hfs_cap_fdir_inode_operations; +extern struct inode_operations hfs_cap_rdir_inode_operations; +extern void hfs_cap_drop_dentry(const ino_t, struct dentry *); + +/* dir_dbl.c */ +extern const struct hfs_name hfs_dbl_reserved1[]; +extern const struct hfs_name hfs_dbl_reserved2[]; +extern struct inode_operations hfs_dbl_dir_inode_operations; +extern void hfs_dbl_drop_dentry(const ino_t, struct dentry *); + +/* dir_nat.c */ +extern const struct hfs_name hfs_nat_reserved1[]; +extern const struct hfs_name hfs_nat_reserved2[]; +extern struct inode_operations hfs_nat_ndir_inode_operations; +extern struct inode_operations hfs_nat_hdir_inode_operations; +extern void hfs_nat_drop_dentry(const ino_t, struct dentry *); + +/* dir_sngl.c */ +extern const struct hfs_name hfs_sngl_reserved1[]; +extern const struct hfs_name hfs_sngl_reserved2[]; +extern struct inode_operations hfs_sngl_dir_inode_operations; + +/* file.c */ +extern hfs_s32 hfs_do_read(struct inode *, struct hfs_fork *, hfs_u32, + char *, hfs_u32, int); +extern hfs_s32 hfs_do_write(struct inode *, struct hfs_fork *, hfs_u32, + const char *, hfs_u32); +extern void hfs_file_fix_mode(struct hfs_cat_entry *entry); +extern struct inode_operations hfs_file_inode_operations; + +/* file_cap.c */ +extern struct inode_operations hfs_cap_info_inode_operations; + +/* file_hdr.c */ +extern struct inode_operations hfs_hdr_inode_operations; +extern const struct hfs_hdr_layout hfs_dbl_fil_hdr_layout; +extern const struct hfs_hdr_layout hfs_dbl_dir_hdr_layout; +extern const struct hfs_hdr_layout hfs_nat_hdr_layout; +extern const struct hfs_hdr_layout hfs_sngl_hdr_layout; + +/* inode.c */ +extern void hfs_put_inode(struct inode *); +extern int hfs_notify_change(struct dentry *, struct iattr *); +extern struct inode *hfs_iget(struct hfs_cat_entry *, ino_t, struct dentry *); + +extern void hfs_cap_ifill(struct inode *, ino_t); +extern void hfs_dbl_ifill(struct inode *, ino_t); +extern void hfs_nat_ifill(struct inode *, ino_t); +extern void hfs_sngl_ifill(struct inode *, ino_t); + +/* super.c */ +extern struct super_block *hfs_read_super(struct super_block *,void *,int); +extern int init_hfs_fs(void); + +/* trans.c */ +extern void hfs_colon2mac(struct hfs_name *, const char *, int); +extern void hfs_prcnt2mac(struct hfs_name *, const char *, int); +extern void hfs_triv2mac(struct hfs_name *, const char *, int); +extern void hfs_latin2mac(struct hfs_name *, const char *, int); +extern int hfs_mac2cap(char *, const struct hfs_name *); +extern int hfs_mac2nat(char *, const struct hfs_name *); +extern int hfs_mac2latin(char *, const struct hfs_name *); +extern int hfs_mac2seven(char *, const struct hfs_name *); +extern int hfs_mac2eight(char *, const struct hfs_name *); +extern int hfs_mac2alpha(char *, const struct hfs_name *); +extern int hfs_mac2triv(char *, const struct hfs_name *); +extern void hfs_tolower(unsigned char *, int); + +#define HFS_I(X) (&((X)->u.hfs_i)) +#define HFS_SB(X) (&((X)->u.hfs_sb)) + +extern __inline__ void hfs_nameout(struct inode *dir, struct hfs_name *out, + const char *in, int len) { + HFS_SB(dir->i_sb)->s_nameout(out, in, len); +} + +extern __inline__ int hfs_namein(struct inode *dir, char *out, + const struct hfs_name *in) { + int len = HFS_SB(dir->i_sb)->s_namein(out, in); + if (HFS_SB(dir->i_sb)->s_lowercase) { + hfs_tolower(out, len); + } + return len; +} + +#endif /* __KERNEL__ */ +#endif |