patch-2.1.78 linux/include/linux/hfs_fs.h

Next file: linux/include/linux/hfs_fs_i.h
Previous file: linux/include/linux/genhd.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.77/linux/include/linux/hfs_fs.h linux/include/linux/hfs_fs.h
@@ -0,0 +1,362 @@
+/* 
+ * 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__
+
+#if defined(CONFIG_HFS_FS) || defined(CONFIG_HFS_FS_MODULE)
+
+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 *);
+extern void hfs_tolower(unsigned char *, int);
+
+/* 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 inode *, 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 *);
+
+#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;
+}
+
+static __inline__ struct dentry 
+*hfs_lookup_dentry(const char *name, const int len, 
+		   struct dentry *base)
+{
+  struct qstr this;
+
+  this.name = name;
+  this.len = len;
+  this.hash = full_name_hash(name, len);
+
+  return d_lookup(base, &this);
+}
+
+/* drop a dentry for one of the special subdirectories */
+static __inline__ void hfs_drop_special(const struct hfs_name *name,
+					struct dentry *base,
+					struct dentry *dentry)
+{
+  struct dentry *dparent, *de;
+  
+  dparent = hfs_lookup_dentry(name->Name, name->Len, base);
+  if (dparent) {
+    de = hfs_lookup_dentry(dentry->d_name.name, dentry->d_name.len,
+			   dparent);
+    dput(dparent);
+
+    if (de) {
+      if (!de->d_inode)
+	d_drop(de);
+      dput(de);
+    }
+  }
+}
+
+#endif
+#endif /* __KERNEL__ */
+
+#endif

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov