summaryrefslogtreecommitdiff
path: root/usr/src/common/fs/pcfilep.h
blob: ba1024ccb7aa920422688282ac72f2fdaecc7aeb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*
 * 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 */