13cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
23cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * v1.0
33cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *
43cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Disk I/O include file for the ext2fs/DOS library.
53cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *
63cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Copyright (c) 1997 Mark Habersack
73cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *
8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %Begin-Header%
9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
10543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2.
11543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %End-Header%
123cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
13543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o
143cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifndef __diskio_h
153cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define __diskio_h
163cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifdef __TURBOC__
173cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifndef __LARGE__
183cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o# error "ext2fs/DOS library requires LARGE model!"
193cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif
203cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif
213cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
223cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifdef __TURBOC__
233cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#include "msdos.h"
243cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif
253cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
263cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
273cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * A helper structure used in LBA => CHS conversion
283cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
293cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'otypedef struct
303cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o{
313cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned short       cyl;     /* Cylinder (or track) */
323cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned short       head;
333cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned short       sector;
343cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned short       offset;  /* Offset of byte within the sector */
353cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o} CHS;
363cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
373cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
383cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * All partition data we need is here
393cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
403cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'otypedef struct
413cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o{
423cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  char                 *dev;  /* _Linux_ device name (like "/dev/hda1") */
433cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        phys;  /* Physical DOS drive number */
443cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned long        start; /* LBA address of partition start */
453cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned long        len;   /* length of partition in sectors */
463cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        pno;   /* Partition number (read from *dev) */
473cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
483cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  /* This partition's drive geometry */
493cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned short       cyls;
503cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned short       heads;
513cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned short       sects;
523cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o} PARTITION;
533cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
543cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
553cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * PC partition table entry format
563cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
573cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifdef __DJGPP__
583cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#pragma pack(1)
593cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif
603cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'otypedef struct
613cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o{
623cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        active;
633cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        start_head;
643cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        start_sec;
653cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        start_cyl;
663cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        type;
673cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        end_head;
683cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        end_sec;
693cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned char        end_cyl;
703cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned long        first_sec_rel;
713cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o  unsigned long        size;
723cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o} PTABLE_ENTRY;
733cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#ifdef __DJGPP__
743cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#pragma pack()
753cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif
763cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
773cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
783cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * INT 0x13 operation codes
793cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
803cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define DISK_READ          0x02
813cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define DISK_WRITE         0x03
823cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define DISK_GET_GEOMETRY  0x08
833cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define DISK_READY         0x10
843cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
853cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
863cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Errors to put in _dio_error
873cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
883cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_BADDEV         0x00000001L
893cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_HARDWARE       0x00000002L
903cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_NOTSUPP        0x00000003L
913cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_NOTEXT2FS      0x00000004L
923cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_EMPTYPART      0x00000005L
933cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define ERR_LINUXSWAP      0x00000006L
943cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
953cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
963cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Functions in diskio.c
973cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
983cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
993cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
1003cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Variable contains last module's error
1013cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
1023cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'oextern unsigned long        _dio_error;
1033cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
1043cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
1053cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * This one contains last hardware error (if _dio_error == ERR_HARDWARE)
1063cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
1073cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'oextern unsigned long        _dio_hw_error;
1083cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
1093cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
1103cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Macros to check for disk hardware errors
1113cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
1123cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_OK()             ((unsigned char)_dio_hw_error == 0x00)
1133cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_BAD_CMD()        ((unsigned char)_dio_hw_error == 0x01)
1143cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_NO_ADDR_MARK()   ((unsigned char)_dio_hw_error == 0x02)
1153cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_WRITE_PROT()     ((unsigned char)_dio_hw_error == 0x03)
1163cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_NO_SECTOR()      ((unsigned char)_dio_hw_error == 0x04)
1173cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_RESET_FAIL()     ((unsigned char)_dio_hw_error == 0x05)
1183cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DISK_CHANGED()   ((unsigned char)_dio_hw_error == 0x06)
1193cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DRIVE_FAIL()     ((unsigned char)_dio_hw_error == 0x07)
1203cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DMA_OVERRUN()    ((unsigned char)_dio_hw_error == 0x08)
1213cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DMA_BOUNDARY()   ((unsigned char)_dio_hw_error == 0x09)
1223cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_BAD_SECTOR()     ((unsigned char)_dio_hw_error == 0x0A)
1233cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_BAD_TRACK()      ((unsigned char)_dio_hw_error == 0x0B)
1243cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_UNSUPP_TRACK()   ((unsigned char)_dio_hw_error == 0x0C)
1253cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_BAD_CRC_ECC()    ((unsigned char)_dio_hw_error == 0x10)
1263cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_CRC_ECC_CORR()   ((unsigned char)_dio_hw_error == 0x11)
1273cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_CONTR_FAIL()     ((unsigned char)_dio_hw_error == 0x20)
1283cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_SEEK_FAIL()      ((unsigned char)_dio_hw_error == 0x40)
1293cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_ATTACH_FAIL()    ((unsigned char)_dio_hw_error == 0x80)
1303cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_DRIVE_NREADY()   ((unsigned char)_dio_hw_error == 0xAA)
1313cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_UNDEF_ERROR()    ((unsigned char)_dio_hw_error == 0xBB)
1323cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_WRITE_FAULT()    ((unsigned char)_dio_hw_error == 0xCC)
1333cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_STATUS_ERROR()   ((unsigned char)_dio_hw_error == 0xE0)
1343cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#define HW_SENSE_FAIL()     ((unsigned char)_dio_hw_error == 0xFF)
1353cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
1363cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
1373cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o/*
1383cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Open the specified partition.
1393cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * String 'dev' must have a format:
1403cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *
1413cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *  /dev/{sd|hd|fd}[X]
1423cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *
1433cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * where,
1443cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *
1453cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *  only one of the option in curly braces can be used and X is an optional
1463cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *  partition number for the given device. If X is not specified, function
1473cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *  scans the drive's partition table in search for the first Linux ext2fs
1483cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *  partition (signature 0x83). Along the way it dives into every extended
1493cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *  partition encountered.
1503cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *  Scan ends if either (a) there are no more used partition entries, or
1513cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *  (b) there is no Xth partition.
1523cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o *
1533cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o * Routine returns 0 on success and !=0 otherwise.
1543cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o */
1553cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'oint open_partition(char *dev);
1563cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o
1573cb6c5021d722e17b7105d1bc090880671f6fc6dTheodore Ts'o#endif /* __diskio_h */
158