/* * v1.0 * * Disk I/O include file for the ext2fs/DOS library. * * Copyright (c) 1997 Mark Habersack * This file may be distributed under the terms of the GNU Public License. * */ #ifndef __diskio_h #define __diskio_h #ifdef __TURBOC__ #ifndef __LARGE__ # error "ext2fs/DOS library requires LARGE model!" #endif #endif #ifdef __TURBOC__ #include "msdos.h" #endif /* * A helper structure used in LBA => CHS conversion */ typedef struct { unsigned short cyl; /* Cylinder (or track) */ unsigned short head; unsigned short sector; unsigned short offset; /* Offset of byte within the sector */ } CHS; /* * All partition data we need is here */ typedef struct { char *dev; /* _Linux_ device name (like "/dev/hda1") */ unsigned char phys; /* Physical DOS drive number */ unsigned long start; /* LBA address of partition start */ unsigned long len; /* length of partition in sectors */ unsigned char pno; /* Partition number (read from *dev) */ /* This partition's drive geometry */ unsigned short cyls; unsigned short heads; unsigned short sects; } PARTITION; /* * PC partition table entry format */ #ifdef __DJGPP__ #pragma pack(1) #endif typedef struct { unsigned char active; unsigned char start_head; unsigned char start_sec; unsigned char start_cyl; unsigned char type; unsigned char end_head; unsigned char end_sec; unsigned char end_cyl; unsigned long first_sec_rel; unsigned long size; } PTABLE_ENTRY; #ifdef __DJGPP__ #pragma pack() #endif /* * INT 0x13 operation codes */ #define DISK_READ 0x02 #define DISK_WRITE 0x03 #define DISK_GET_GEOMETRY 0x08 #define DISK_READY 0x10 /* * Errors to put in _dio_error */ #define ERR_BADDEV 0x00000001L #define ERR_HARDWARE 0x00000002L #define ERR_NOTSUPP 0x00000003L #define ERR_NOTEXT2FS 0x00000004L #define ERR_EMPTYPART 0x00000005L #define ERR_LINUXSWAP 0x00000006L /* * Functions in diskio.c */ /* * Variable contains last module's error */ extern unsigned long _dio_error; /* * This one contains last hardware error (if _dio_error == ERR_HARDWARE) */ extern unsigned long _dio_hw_error; /* * Macros to check for disk hardware errors */ #define HW_OK() ((unsigned char)_dio_hw_error == 0x00) #define HW_BAD_CMD() ((unsigned char)_dio_hw_error == 0x01) #define HW_NO_ADDR_MARK() ((unsigned char)_dio_hw_error == 0x02) #define HW_WRITE_PROT() ((unsigned char)_dio_hw_error == 0x03) #define HW_NO_SECTOR() ((unsigned char)_dio_hw_error == 0x04) #define HW_RESET_FAIL() ((unsigned char)_dio_hw_error == 0x05) #define HW_DISK_CHANGED() ((unsigned char)_dio_hw_error == 0x06) #define HW_DRIVE_FAIL() ((unsigned char)_dio_hw_error == 0x07) #define HW_DMA_OVERRUN() ((unsigned char)_dio_hw_error == 0x08) #define HW_DMA_BOUNDARY() ((unsigned char)_dio_hw_error == 0x09) #define HW_BAD_SECTOR() ((unsigned char)_dio_hw_error == 0x0A) #define HW_BAD_TRACK() ((unsigned char)_dio_hw_error == 0x0B) #define HW_UNSUPP_TRACK() ((unsigned char)_dio_hw_error == 0x0C) #define HW_BAD_CRC_ECC() ((unsigned char)_dio_hw_error == 0x10) #define HW_CRC_ECC_CORR() ((unsigned char)_dio_hw_error == 0x11) #define HW_CONTR_FAIL() ((unsigned char)_dio_hw_error == 0x20) #define HW_SEEK_FAIL() ((unsigned char)_dio_hw_error == 0x40) #define HW_ATTACH_FAIL() ((unsigned char)_dio_hw_error == 0x80) #define HW_DRIVE_NREADY() ((unsigned char)_dio_hw_error == 0xAA) #define HW_UNDEF_ERROR() ((unsigned char)_dio_hw_error == 0xBB) #define HW_WRITE_FAULT() ((unsigned char)_dio_hw_error == 0xCC) #define HW_STATUS_ERROR() ((unsigned char)_dio_hw_error == 0xE0) #define HW_SENSE_FAIL() ((unsigned char)_dio_hw_error == 0xFF) /* * Open the specified partition. * String 'dev' must have a format: * * /dev/{sd|hd|fd}[X] * * where, * * only one of the option in curly braces can be used and X is an optional * partition number for the given device. If X is not specified, function * scans the drive's partition table in search for the first Linux ext2fs * partition (signature 0x83). Along the way it dives into every extended * partition encountered. * Scan ends if either (a) there are no more used partition entries, or * (b) there is no Xth partition. * * Routine returns 0 on success and !=0 otherwise. */ int open_partition(char *dev); #endif /* __diskio_h */