1 /* 2 * v1.0 3 * 4 * Disk I/O include file for the ext2fs/DOS library. 5 * 6 * Copyright (c) 1997 Mark Habersack 7 * This file may be distributed under the terms of the GNU Public License. 8 * 9 */ 10 #ifndef __diskio_h 11 #define __diskio_h 12 #ifdef __TURBOC__ 13 #ifndef __LARGE__ 14 # error "ext2fs/DOS library requires LARGE model!" 15 #endif 16 #endif 17 18 #ifdef __TURBOC__ 19 #include "msdos.h" 20 #endif 21 22 /* 23 * A helper structure used in LBA => CHS conversion 24 */ 25 typedef struct 26 { 27 unsigned short cyl; /* Cylinder (or track) */ 28 unsigned short head; 29 unsigned short sector; 30 unsigned short offset; /* Offset of byte within the sector */ 31 } CHS; 32 33 /* 34 * All partition data we need is here 35 */ 36 typedef struct 37 { 38 char *dev; /* _Linux_ device name (like "/dev/hda1") */ 39 unsigned char phys; /* Physical DOS drive number */ 40 unsigned long start; /* LBA address of partition start */ 41 unsigned long len; /* length of partition in sectors */ 42 unsigned char pno; /* Partition number (read from *dev) */ 43 44 /* This partition's drive geometry */ 45 unsigned short cyls; 46 unsigned short heads; 47 unsigned short sects; 48 } PARTITION; 49 50 /* 51 * PC partition table entry format 52 */ 53 #ifdef __DJGPP__ 54 #pragma pack(1) 55 #endif 56 typedef struct 57 { 58 unsigned char active; 59 unsigned char start_head; 60 unsigned char start_sec; 61 unsigned char start_cyl; 62 unsigned char type; 63 unsigned char end_head; 64 unsigned char end_sec; 65 unsigned char end_cyl; 66 unsigned long first_sec_rel; 67 unsigned long size; 68 } PTABLE_ENTRY; 69 #ifdef __DJGPP__ 70 #pragma pack() 71 #endif 72 73 /* 74 * INT 0x13 operation codes 75 */ 76 #define DISK_READ 0x02 77 #define DISK_WRITE 0x03 78 #define DISK_GET_GEOMETRY 0x08 79 #define DISK_READY 0x10 80 81 /* 82 * Errors to put in _dio_error 83 */ 84 #define ERR_BADDEV 0x00000001L 85 #define ERR_HARDWARE 0x00000002L 86 #define ERR_NOTSUPP 0x00000003L 87 #define ERR_NOTEXT2FS 0x00000004L 88 #define ERR_EMPTYPART 0x00000005L 89 #define ERR_LINUXSWAP 0x00000006L 90 91 /* 92 * Functions in diskio.c 93 */ 94 95 /* 96 * Variable contains last module's error 97 */ 98 extern unsigned long _dio_error; 99 100 /* 101 * This one contains last hardware error (if _dio_error == ERR_HARDWARE) 102 */ 103 extern unsigned long _dio_hw_error; 104 105 /* 106 * Macros to check for disk hardware errors 107 */ 108 #define HW_OK() ((unsigned char)_dio_hw_error == 0x00) 109 #define HW_BAD_CMD() ((unsigned char)_dio_hw_error == 0x01) 110 #define HW_NO_ADDR_MARK() ((unsigned char)_dio_hw_error == 0x02) 111 #define HW_WRITE_PROT() ((unsigned char)_dio_hw_error == 0x03) 112 #define HW_NO_SECTOR() ((unsigned char)_dio_hw_error == 0x04) 113 #define HW_RESET_FAIL() ((unsigned char)_dio_hw_error == 0x05) 114 #define HW_DISK_CHANGED() ((unsigned char)_dio_hw_error == 0x06) 115 #define HW_DRIVE_FAIL() ((unsigned char)_dio_hw_error == 0x07) 116 #define HW_DMA_OVERRUN() ((unsigned char)_dio_hw_error == 0x08) 117 #define HW_DMA_BOUNDARY() ((unsigned char)_dio_hw_error == 0x09) 118 #define HW_BAD_SECTOR() ((unsigned char)_dio_hw_error == 0x0A) 119 #define HW_BAD_TRACK() ((unsigned char)_dio_hw_error == 0x0B) 120 #define HW_UNSUPP_TRACK() ((unsigned char)_dio_hw_error == 0x0C) 121 #define HW_BAD_CRC_ECC() ((unsigned char)_dio_hw_error == 0x10) 122 #define HW_CRC_ECC_CORR() ((unsigned char)_dio_hw_error == 0x11) 123 #define HW_CONTR_FAIL() ((unsigned char)_dio_hw_error == 0x20) 124 #define HW_SEEK_FAIL() ((unsigned char)_dio_hw_error == 0x40) 125 #define HW_ATTACH_FAIL() ((unsigned char)_dio_hw_error == 0x80) 126 #define HW_DRIVE_NREADY() ((unsigned char)_dio_hw_error == 0xAA) 127 #define HW_UNDEF_ERROR() ((unsigned char)_dio_hw_error == 0xBB) 128 #define HW_WRITE_FAULT() ((unsigned char)_dio_hw_error == 0xCC) 129 #define HW_STATUS_ERROR() ((unsigned char)_dio_hw_error == 0xE0) 130 #define HW_SENSE_FAIL() ((unsigned char)_dio_hw_error == 0xFF) 131 132 133 /* 134 * Open the specified partition. 135 * String 'dev' must have a format: 136 * 137 * /dev/{sd|hd|fd}[X] 138 * 139 * where, 140 * 141 * only one of the option in curly braces can be used and X is an optional 142 * partition number for the given device. If X is not specified, function 143 * scans the drive's partition table in search for the first Linux ext2fs 144 * partition (signature 0x83). Along the way it dives into every extended 145 * partition encountered. 146 * Scan ends if either (a) there are no more used partition entries, or 147 * (b) there is no Xth partition. 148 * 149 * Routine returns 0 on success and !=0 otherwise. 150 */ 151 int open_partition(char *dev); 152 153 #endif /* __diskio_h */ 154