pcfilep.h revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* 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 */