OpenSolaris_b135/common/fs/pcfilep.h

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _PCFILEP_H
#define	_PCFILEP_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#define	MAX_DOSMOUNT_RETRIES 3

#define	TICKS_PER_SEC	18		/* It's really 18.2! */
#define	SECSIZ 512
#define	fat_bpc(i) (pi[(i)]->f_bpb.bs_spc * SECSIZ)

/*
 * Access permissions for dosAccess(), dosOpen()
 * NOTE: These permission need to match those for the DOS compiler.
 */
#define	FILE_EXISTS	1
#define	FILE_READ	0x0000
#define	FILE_WRITE	0x0001
#define	FILE_RDWR	0x0002
#define	FILE_APPEND	0x0008
#define	FILE_CREATE	0x0100
#define	FILE_TRUNC	0x0200

#define	TYPE_EMPTY	0x00		/* undefined partition */
#define	TYPE_DOS	0x13		/* causes fatInit() to search for */
					/* active partition */
#define	TYPE_DOS_12	0x01		/* partition with FAT12 filesys */
#define	TYPE_DOS_16	0x04		/* partition with FAT16 filesys */
#define	TYPE_DOS_EXT	0x05		/* not bootable, ignore */
#define	TYPE_HUGH	0x06		/* HUGH partition */
#define	TYPE_COMPAQ	0x12		/* Compaq's diag partition */
#define	TYPE_SOLARIS	0x82
#define	TYPE_SOLARIS_BOOT	0xBE	/* For "boot hill" project */

#define	FDISK_START	0x1be		/* location in first sector where */
					/* the fdisk starts. */

#define	FDISK_PARTS	4		/* Number of partitions in a fdisk */
#define	FDISK_ACTIVE	0x80		/* indicates partition is active */
#define	FDISK_INACTIVE	0x00		/*  " partition inactive */

#pragma pack(1)
struct _fdisk_partition_ {
	uchar_t	fd_active;
	uchar_t	fd_b_head;
	uchar_t	fd_b_sec;
	uchar_t	fd_b_cyl;
	uchar_t	fd_type;
	uchar_t	fd_e_head;
	uchar_t	fd_e_sec;
	uchar_t	fd_e_cyl;
	union {
		long	fd_start_sec_long;
		struct {
			ushort_t low;
			ushort_t high;
		} s;
	} u;
	long	fd_part_len;
};
#define	fd_start_sec u.fd_start_sec_long
#define	fd_partition fd_type
typedef struct _fdisk_partition_ _fdisk_t, *_fdisk_p;
#pragma pack()

#pragma pack(1)
struct _boot_sector_ {
	uchar_t	bs_jump_code[3];
	uchar_t	bs_oem_name[8];
	uchar_t	bs_bytes_sector[2];
	uchar_t	bs_spc;			/* ... sectors per cluster */
	uchar_t	bs_resv_sectors[2];
	uchar_t	bs_num_fats;
	uchar_t	bs_num_root_entries[2];
	uchar_t	bs_siv[2];			/* ... sectors in volume */
	uchar_t	bs_media;
	uchar_t	bs_spf[2];			/* ... sectors per fat */
	uchar_t	bs_sectors_per_track[2];
	uchar_t	bs_heads[2];
	/*
	 * Byte offset at this point is 28 so we can declare the next
	 * variable with the correct type and not worry about alignment.
	 */
	long	bs_hidden_sectors;
	long	bs_lsiv;		/* ... logical sectors in volume */
	uchar_t	bs_phys_drive_num;
	uchar_t	bs_reserved;
	uchar_t	bs_ext_signature;
	char	bs_volume_id[4];
	char	bs_volume_label[11];
	char	bs_type[8];

	/* ---- ADDED BY SUNSOFT FOR MDBOOT ---- */
	ushort_t	bs_offset_high;
	ushort_t	bs_offset_low;
};
#pragma pack()
typedef struct _boot_sector_  _boot_sector_t, *_boot_sector_p;

/*
 * Cluster types
 */
#define	CLUSTER_AVAIL	0x00
#define	CLUSTER_RES_12_0	0x0ff0	/* 12bit fat, first reserved */
#define	CLUSTER_RES_12_6	0x0ff6	/* 12bit fat, last reserved */
#define	CLUSTER_RES_16_0	0xfff0	/* 16bit fat, first reserved */
#define	CLUSTER_RES_16_6	0xfff6	/* 16bit fat, last reserved */
#define	CLUSTER_BAD_12	0x0ff7	/* 12bit fat, bad entry */
#define	CLUSTER_BAD_16	0xfff7	/* 16bit fat, bad entry */
#define	CLUSTER_EOF		CLUSTER_EOF_16_0
#define	CLUSTER_MAX_12		0x0ff7	/* max clusters for 12bit fat */
#define	CLUSTER_EOF_12_0	0x0ff8	/* 12bit fat, EOF first entry */
#define	CLUSTER_EOF_12_8	0x0fff	/* 12bit fat, EOF last entry */
#define	CLUSTER_EOF_16_0	0xfff8	/* 16bit fat, EOF first entry */
#define	CLUSTER_EOF_16_8	0xffff	/* 16bit fat, EOF last entry */

/*
 * Cluster operations for allocation
 */
#define	CLUSTER_NOOP		0x0001	/* ... just allocate cluster */
#define	CLUSTER_ZEROFILL	0x0002	/* ... zero fill the alloc'd cluster */

#define	CLUSTER_FIRST		0x0002	/* ... first cluster number to search */
#define	CLUSTER_ROOTDIR		0x0000	/* ... root dir's cluster number */

/*
 * This structure is filled in by initFAT()
 */
struct _fat_controller_ {
	union {
		_boot_sector_t	fu_bpb;	 /* boot parameter block */
		uchar_t		fu_sector[SECSIZ];
	} fu;
	long		f_adjust;	/* starting sec for part. */
	long		f_rootsec;	/* root dir starting sec. */
	long		f_rootlen;	/* length of root in sectors */
	long		f_filesec;	/* adjustment for clusters */
	long		f_dclust;	/* cur dir cluster */
	int		f_nxtfree;	/* next free cluster */
	int		f_ncluster;	/* number of cluster in part */
	char		f_16bit:1,	/* 1 if 16bit fat entries */
			f_flush:1;	/* flush the fat */
};
typedef struct _fat_controller_ _fat_controller_t, *_fat_controller_p;

#define	f_bpb fu.fu_bpb
#define	f_sector fu.fu_sector

#define	NAMESIZ		8
#define	EXTSIZ		3
#pragma pack(1)
struct _dir_entry_ {
	char	d_name[NAMESIZ];
	char	d_ext[EXTSIZ];
	uchar_t	d_attr;
	char	d_res[10];
	short	d_time;
	short	d_date;
	ushort_t d_cluster;
	long	d_size;
};
#pragma pack()
typedef struct _dir_entry_ _dir_entry_t, *_dir_entry_p;

/*
 * Number of entries in one sector
 */
#define	DIRENTS (SECSIZ / sizeof (_dir_entry_t))

/*
 * Directory entry attributes
 */
#define	DE_READONLY		0x01
#define	DE_HIDDEN		0x02
#define	DE_SYSTEM		0x04
#define	DE_LABEL		0x08
#define	DE_DIRECTORY		0x10
#define	DE_ARCHIVE		0x20
#define	DE_RESERVED1		0x40
#define	DE_RESERVED2		0x80

#define	DE_IS_LFN (DE_READONLY | DE_HIDDEN | DE_SYSTEM | DE_LABEL)

struct _file_descriptor_ {
	struct _file_descriptor_ *f_forw; /* link to next file descriptor */
	int	f_desc;			/* descriptor number */
	long	f_startclust;		/* starting cluster number */
	long	f_off;			/* current offset */
	long	f_len;			/* size of file */
	long	f_index;		/* index into directory block */
	uchar_t	f_attr;			/* attributes */
	int	f_volidx;		/* Volume device index */
	char	*f_volname;		/* Name of volume */
};
typedef struct _file_descriptor_ _file_desc_t, *_file_desc_p;

#ifdef	__cplusplus
}
#endif

#endif	/* _PCFILEP_H */