root/usr/src/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

#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 */