diff options
Diffstat (limited to 'tools/dosfstools/patches/0001-Add-OSX-support.patch')
-rw-r--r-- | tools/dosfstools/patches/0001-Add-OSX-support.patch | 1849 |
1 files changed, 0 insertions, 1849 deletions
diff --git a/tools/dosfstools/patches/0001-Add-OSX-support.patch b/tools/dosfstools/patches/0001-Add-OSX-support.patch deleted file mode 100644 index 71b8a956da..0000000000 --- a/tools/dosfstools/patches/0001-Add-OSX-support.patch +++ /dev/null @@ -1,1849 +0,0 @@ -From 92e55f1d1404e823b0a5fd6d0ea0b962de247e31 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= <noltari@gmail.com> -Date: Wed, 25 Feb 2015 17:00:32 +0100 -Subject: [PATCH] Add OSX support -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com> ---- - Makefile | 16 +- - src/boot.c | 1 + - src/common.h | 54 ++++- - src/file.c | 9 +- - src/file.h | 2 + - src/fsck.fat.h | 11 - - src/io.c | 4 +- - src/linux/fd.h | 383 ++++++++++++++++++++++++++++++ - src/linux/fs.h | 206 ++++++++++++++++ - src/linux/hdreg.h | 644 +++++++++++++++++++++++++++++++++++++++++++++++++++ - src/linux/magic.h | 76 ++++++ - src/linux/msdos_fs.h | 201 ++++++++++++++++ - src/mkfs.fat.c | 32 ++- - 13 files changed, 1603 insertions(+), 36 deletions(-) - create mode 100644 src/linux/fd.h - create mode 100644 src/linux/fs.h - create mode 100644 src/linux/hdreg.h - create mode 100644 src/linux/magic.h - create mode 100644 src/linux/msdos_fs.h - -diff --git a/Makefile b/Makefile -index 3cbdb76..b86111d 100644 ---- a/Makefile -+++ b/Makefile -@@ -27,10 +27,16 @@ SBINDIR = $(PREFIX)/sbin - DOCDIR = $(PREFIX)/share/doc - MANDIR = $(PREFIX)/share/man - -+UNAME_S := $(shell uname -s) -+ifeq ($(UNAME_S),Darwin) -+ CFLAGS += -D__osx__ -+ LDLIBS += -liconv -+endif -+ - #OPTFLAGS = -O2 -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 - OPTFLAGS = -O2 -fomit-frame-pointer -D_GNU_SOURCE $(shell getconf LFS_CFLAGS) - #WARNFLAGS = -Wall -pedantic -std=c99 --WARNFLAGS = -Wall -Wextra -Wno-sign-compare -Wno-missing-field-initializers -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -+WARNFLAGS = -Wall -Wextra -Wno-sign-compare -Wno-missing-field-initializers -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wimplicit-function-declaration - DEBUGFLAGS = -g - CFLAGS += $(OPTFLAGS) $(WARNFLAGS) $(DEBUGFLAGS) - -@@ -62,7 +68,8 @@ install-man: - for MANPAGE in manpages/en/*; \ - do \ - SECTION="8"; \ -- install -D -m 0644 $${MANPAGE} $(DESTDIR)/$(MANDIR)/man$${SECTION}/$$(basename $${MANPAGE}); \ -+ mkdir -p $(DESTDIR)/$(MANDIR)/man$${SECTION}/; \ -+ install -m 0644 $${MANPAGE} $(DESTDIR)/$(MANDIR)/man$${SECTION}/$$(basename $${MANPAGE}); \ - done - - for LANGUAGE in $(LANGUAGES); \ -@@ -70,7 +77,8 @@ install-man: - for MANPAGE in manpages/$${LANGUAGE}/*; \ - do \ - SECTION="8"; \ -- install -D -m 0644 $${MANPAGE} $(DESTDIR)/$(MANDIR)/$${LANGUAGE}/man$${SECTION}/$$(basename $${MANPAGE} .$${LANGUAGE}.$${SECTION}).$${SECTION}; \ -+ mkdir -p $(DESTDIR)/$(MANDIR)/$${LANGUAGE}/man$${SECTION}/; \ -+ install -m 0644 $${MANPAGE} $(DESTDIR)/$(MANDIR)/$${LANGUAGE}/man$${SECTION}/$$(basename $${MANPAGE} .$${LANGUAGE}.$${SECTION}).$${SECTION}; \ - done; \ - done - install-symlinks: install-bin install-man -@@ -127,7 +135,7 @@ uninstall-man: - for MANPAGE in manpages/en/*; \ - do \ - SECTION="8"; \ -- rm -f $(DESTDIR)/$(MANDIR}/man$${SECTION}/$$(basename $${MANPAGE} .en.$${SECTION}).$${SECTION}; \ -+ rm -f $(DESTDIR)/$(MANDIR)/man$${SECTION}/$$(basename $${MANPAGE} .en.$${SECTION}).$${SECTION}; \ - done - - for LANGUAGE in $(LANGUAGES); \ -diff --git a/src/boot.c b/src/boot.c -index be7bfb7..0c8b273 100644 ---- a/src/boot.c -+++ b/src/boot.c -@@ -31,6 +31,7 @@ - #include <time.h> - - #include "common.h" -+#include "linux/msdos_fs.h" - #include "fsck.fat.h" - #include "fat.h" - #include "io.h" -diff --git a/src/common.h b/src/common.h -index b127f63..e16c00c 100644 ---- a/src/common.h -+++ b/src/common.h -@@ -20,11 +20,61 @@ - can be found in /usr/share/common-licenses/GPL-3 file. - */ - --#include <asm/types.h> -- - #ifndef _COMMON_H - #define _COMMON_H - -+/* from linux/types.h */ -+#if defined(__linux__) -+ #include <linux/types.h> -+#elif defined(__osx__) -+ #include <stdint.h> -+ -+ typedef uint8_t __u8; -+ typedef uint16_t __u16; -+ typedef uint32_t __u32; -+ typedef uint64_t __u64; -+ -+ typedef int16_t __le16; -+ typedef int32_t __le32; -+ -+ /* from linux stdio.h */ -+ #ifndef loff_t -+ typedef long long loff_t; -+ #endif /* loff_t */ -+ -+ #ifndef off64_t -+ #ifdef _LP64 -+ typedef off_t off64_t; -+ #else -+ typedef __longlong_t off64_t; -+ #endif /* _LP64 */ -+ #endif /* off64_t */ -+ -+ /* from endian.h */ -+ #if defined(__APPLE__) && defined(__MACH__) -+ #include <libkern/OSByteOrder.h> -+ -+ #define htobe16(x) OSSwapHostToBigInt16(x) -+ #define htole16(x) OSSwapHostToLittleInt16(x) -+ #define be16toh(x) OSSwapBigToHostInt16(x) -+ #define le16toh(x) OSSwapLittleToHostInt16(x) -+ -+ #define htobe32(x) OSSwapHostToBigInt32(x) -+ #define htole32(x) OSSwapHostToLittleInt32(x) -+ #define be32toh(x) OSSwapBigToHostInt32(x) -+ #define le32toh(x) OSSwapLittleToHostInt32(x) -+ -+ #define htobe64(x) OSSwapHostToBigInt64(x) -+ #define htole64(x) OSSwapHostToLittleInt64(x) -+ #define be64toh(x) OSSwapBigToHostInt64(x) -+ #define le64toh(x) OSSwapLittleToHostInt64(x) -+ -+ #ifndef lseek64 -+ #define lseek64 lseek -+ #endif /* lseek64 */ -+ #endif /* __APPLE__ && __MACH__ */ -+#endif -+ - void die(const char *msg, ...) __attribute((noreturn)); - - /* Displays a prinf-style message and terminates the program. */ -diff --git a/src/file.c b/src/file.c -index 30adcde..1c1a5f0 100644 ---- a/src/file.c -+++ b/src/file.c -@@ -30,15 +30,8 @@ - #include <ctype.h> - #include <unistd.h> - --#define _LINUX_STAT_H /* hack to avoid inclusion of <linux/stat.h> */ --#define _LINUX_STRING_H_ /* hack to avoid inclusion of <linux/string.h> */ --#define _LINUX_FS_H /* hack to avoid inclusion of <linux/fs.h> */ -- --#include <asm/types.h> -- --#include <linux/msdos_fs.h> -- - #include "common.h" -+#include "linux/msdos_fs.h" - #include "file.h" - #include "charconv.h" - -diff --git a/src/file.h b/src/file.h -index 3adfc96..f5dec16 100644 ---- a/src/file.h -+++ b/src/file.h -@@ -23,6 +23,8 @@ - #ifndef _FILE_H - #define _FILE_H - -+#include "linux/msdos_fs.h" -+ - typedef enum { fdt_none, fdt_drop, fdt_undelete } FD_TYPE; - - typedef struct _fptr { -diff --git a/src/fsck.fat.h b/src/fsck.fat.h -index e5ade5b..274820a 100644 ---- a/src/fsck.fat.h -+++ b/src/fsck.fat.h -@@ -28,19 +28,8 @@ - #define _DOSFSCK_H - - #include <fcntl.h> --#include <sys/types.h> --#define _LINUX_STAT_H /* hack to avoid inclusion of <linux/stat.h> */ --#define _LINUX_STRING_H_ /* hack to avoid inclusion of <linux/string.h> */ --#define _LINUX_FS_H /* hack to avoid inclusion of <linux/fs.h> */ -- --#include <asm/types.h> --#include <asm/byteorder.h> -- --#include <linux/msdos_fs.h> -- - #include <stddef.h> - #include <stdint.h> --#include <endian.h> - - #define VFAT_LN_ATTR (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME) - -diff --git a/src/io.c b/src/io.c -index 3755ba5..fa96b62 100644 ---- a/src/io.c -+++ b/src/io.c -@@ -40,10 +40,10 @@ - #include <sys/ioctl.h> - #include <errno.h> - #include <fcntl.h> --#include <linux/fd.h> - --#include "fsck.fat.h" -+#include "linux/fd.h" - #include "common.h" -+#include "fsck.fat.h" - #include "io.h" - - typedef struct _change { -diff --git a/src/linux/fd.h b/src/linux/fd.h -new file mode 100644 -index 0000000..ffe33a6 ---- /dev/null -+++ b/src/linux/fd.h -@@ -0,0 +1,383 @@ -+#ifndef _LINUX_FD_H -+#define _LINUX_FD_H -+ -+#ifdef __linux__ -+#include <linux/ioctl.h> -+#endif -+ -+/* New file layout: Now the ioctl definitions immediately follow the -+ * definitions of the structures that they use */ -+ -+/* -+ * Geometry -+ */ -+struct floppy_struct { -+ unsigned int size, /* nr of sectors total */ -+ sect, /* sectors per track */ -+ head, /* nr of heads */ -+ track, /* nr of tracks */ -+ stretch; /* bit 0 !=0 means double track steps */ -+ /* bit 1 != 0 means swap sides */ -+ /* bits 2..9 give the first sector */ -+ /* number (the LSB is flipped) */ -+#define FD_STRETCH 1 -+#define FD_SWAPSIDES 2 -+#define FD_ZEROBASED 4 -+#define FD_SECTBASEMASK 0x3FC -+#define FD_MKSECTBASE(s) (((s) ^ 1) << 2) -+#define FD_SECTBASE(floppy) ((((floppy)->stretch & FD_SECTBASEMASK) >> 2) ^ 1) -+ -+ unsigned char gap, /* gap1 size */ -+ -+ rate, /* data rate. |= 0x40 for perpendicular */ -+#define FD_2M 0x4 -+#define FD_SIZECODEMASK 0x38 -+#define FD_SIZECODE(floppy) (((((floppy)->rate&FD_SIZECODEMASK)>> 3)+ 2) %8) -+#define FD_SECTSIZE(floppy) ( (floppy)->rate & FD_2M ? \ -+ 512 : 128 << FD_SIZECODE(floppy) ) -+#define FD_PERP 0x40 -+ -+ spec1, /* stepping rate, head unload time */ -+ fmt_gap; /* gap2 size */ -+ const char * name; /* used only for predefined formats */ -+}; -+ -+ -+/* commands needing write access have 0x40 set */ -+/* commands needing super user access have 0x80 set */ -+ -+#define FDCLRPRM _IO(2, 0x41) -+/* clear user-defined parameters */ -+ -+#define FDSETPRM _IOW(2, 0x42, struct floppy_struct) -+#define FDSETMEDIAPRM FDSETPRM -+/* set user-defined parameters for current media */ -+ -+#define FDDEFPRM _IOW(2, 0x43, struct floppy_struct) -+#define FDGETPRM _IOR(2, 0x04, struct floppy_struct) -+#define FDDEFMEDIAPRM FDDEFPRM -+#define FDGETMEDIAPRM FDGETPRM -+/* set/get disk parameters */ -+ -+ -+#define FDMSGON _IO(2,0x45) -+#define FDMSGOFF _IO(2,0x46) -+/* issue/don't issue kernel messages on media type change */ -+ -+ -+/* -+ * Formatting (obsolete) -+ */ -+#define FD_FILL_BYTE 0xF6 /* format fill byte. */ -+ -+struct format_descr { -+ unsigned int device,head,track; -+}; -+ -+#define FDFMTBEG _IO(2,0x47) -+/* begin formatting a disk */ -+#define FDFMTTRK _IOW(2,0x48, struct format_descr) -+/* format the specified track */ -+#define FDFMTEND _IO(2,0x49) -+/* end formatting a disk */ -+ -+ -+/* -+ * Error thresholds -+ */ -+struct floppy_max_errors { -+ unsigned int -+ abort, /* number of errors to be reached before aborting */ -+ read_track, /* maximal number of errors permitted to read an -+ * entire track at once */ -+ reset, /* maximal number of errors before a reset is tried */ -+ recal, /* maximal number of errors before a recalibrate is -+ * tried */ -+ -+ /* -+ * Threshold for reporting FDC errors to the console. -+ * Setting this to zero may flood your screen when using -+ * ultra cheap floppies ;-) -+ */ -+ reporting; -+ -+}; -+ -+#define FDSETEMSGTRESH _IO(2,0x4a) -+/* set fdc error reporting threshold */ -+ -+#define FDFLUSH _IO(2,0x4b) -+/* flush buffers for media; either for verifying media, or for -+ * handling a media change without closing the file descriptor */ -+ -+#define FDSETMAXERRS _IOW(2, 0x4c, struct floppy_max_errors) -+#define FDGETMAXERRS _IOR(2, 0x0e, struct floppy_max_errors) -+/* set/get abortion and read_track threshold. See also floppy_drive_params -+ * structure */ -+ -+ -+typedef char floppy_drive_name[16]; -+#define FDGETDRVTYP _IOR(2, 0x0f, floppy_drive_name) -+/* get drive type: 5 1/4 or 3 1/2 */ -+ -+ -+/* -+ * Drive parameters (user modifiable) -+ */ -+struct floppy_drive_params { -+ signed char cmos; /* CMOS type */ -+ -+ /* Spec2 is (HLD<<1 | ND), where HLD is head load time (1=2ms, 2=4 ms -+ * etc) and ND is set means no DMA. Hardcoded to 6 (HLD=6ms, use DMA). -+ */ -+ unsigned long max_dtr; /* Step rate, usec */ -+ unsigned long hlt; /* Head load/settle time, msec */ -+ unsigned long hut; /* Head unload time (remnant of -+ * 8" drives) */ -+ unsigned long srt; /* Step rate, usec */ -+ -+ unsigned long spinup; /* time needed for spinup (expressed -+ * in jiffies) */ -+ unsigned long spindown; /* timeout needed for spindown */ -+ unsigned char spindown_offset; /* decides in which position the disk -+ * will stop */ -+ unsigned char select_delay; /* delay to wait after select */ -+ unsigned char rps; /* rotations per second */ -+ unsigned char tracks; /* maximum number of tracks */ -+ unsigned long timeout; /* timeout for interrupt requests */ -+ -+ unsigned char interleave_sect; /* if there are more sectors, use -+ * interleave */ -+ -+ struct floppy_max_errors max_errors; -+ -+ char flags; /* various flags, including ftd_msg */ -+/* -+ * Announce successful media type detection and media information loss after -+ * disk changes. -+ * Also used to enable/disable printing of overrun warnings. -+ */ -+ -+#define FTD_MSG 0x10 -+#define FD_BROKEN_DCL 0x20 -+#define FD_DEBUG 0x02 -+#define FD_SILENT_DCL_CLEAR 0x4 -+#define FD_INVERTED_DCL 0x80 /* must be 0x80, because of hardware -+ considerations */ -+ -+ char read_track; /* use readtrack during probing? */ -+ -+/* -+ * Auto-detection. Each drive type has eight formats which are -+ * used in succession to try to read the disk. If the FDC cannot lock onto -+ * the disk, the next format is tried. This uses the variable 'probing'. -+ */ -+ short autodetect[8]; /* autodetected formats */ -+ -+ int checkfreq; /* how often should the drive be checked for disk -+ * changes */ -+ int native_format; /* native format of this drive */ -+}; -+ -+enum { -+ FD_NEED_TWADDLE_BIT, /* more magic */ -+ FD_VERIFY_BIT, /* inquire for write protection */ -+ FD_DISK_NEWCHANGE_BIT, /* change detected, and no action undertaken yet -+ * to clear media change status */ -+ FD_UNUSED_BIT, -+ FD_DISK_CHANGED_BIT, /* disk has been changed since last i/o */ -+ FD_DISK_WRITABLE_BIT /* disk is writable */ -+}; -+ -+#define FDSETDRVPRM _IOW(2, 0x90, struct floppy_drive_params) -+#define FDGETDRVPRM _IOR(2, 0x11, struct floppy_drive_params) -+/* set/get drive parameters */ -+ -+ -+/* -+ * Current drive state (not directly modifiable by user, readonly) -+ */ -+struct floppy_drive_struct { -+ unsigned long flags; -+/* values for these flags */ -+#define FD_NEED_TWADDLE (1 << FD_NEED_TWADDLE_BIT) -+#define FD_VERIFY (1 << FD_VERIFY_BIT) -+#define FD_DISK_NEWCHANGE (1 << FD_DISK_NEWCHANGE_BIT) -+#define FD_DISK_CHANGED (1 << FD_DISK_CHANGED_BIT) -+#define FD_DISK_WRITABLE (1 << FD_DISK_WRITABLE_BIT) -+ -+ unsigned long spinup_date; -+ unsigned long select_date; -+ unsigned long first_read_date; -+ short probed_format; -+ short track; /* current track */ -+ short maxblock; /* id of highest block read */ -+ short maxtrack; /* id of highest half track read */ -+ int generation; /* how many diskchanges? */ -+ -+/* -+ * (User-provided) media information is _not_ discarded after a media change -+ * if the corresponding keep_data flag is non-zero. Positive values are -+ * decremented after each probe. -+ */ -+ int keep_data; -+ -+ /* Prevent "aliased" accesses. */ -+ int fd_ref; -+ int fd_device; -+ unsigned long last_checked; /* when was the drive last checked for a disk -+ * change? */ -+ -+ char *dmabuf; -+ int bufblocks; -+}; -+ -+#define FDGETDRVSTAT _IOR(2, 0x12, struct floppy_drive_struct) -+#define FDPOLLDRVSTAT _IOR(2, 0x13, struct floppy_drive_struct) -+/* get drive state: GET returns the cached state, POLL polls for new state */ -+ -+ -+/* -+ * reset FDC -+ */ -+enum reset_mode { -+ FD_RESET_IF_NEEDED, /* reset only if the reset flags is set */ -+ FD_RESET_IF_RAWCMD, /* obsolete */ -+ FD_RESET_ALWAYS /* reset always */ -+}; -+#define FDRESET _IO(2, 0x54) -+ -+ -+/* -+ * FDC state -+ */ -+struct floppy_fdc_state { -+ int spec1; /* spec1 value last used */ -+ int spec2; /* spec2 value last used */ -+ int dtr; -+ unsigned char version; /* FDC version code */ -+ unsigned char dor; -+ unsigned long address; /* io address */ -+ unsigned int rawcmd:2; -+ unsigned int reset:1; -+ unsigned int need_configure:1; -+ unsigned int perp_mode:2; -+ unsigned int has_fifo:1; -+ unsigned int driver_version; /* version code for floppy driver */ -+#define FD_DRIVER_VERSION 0x100 -+/* user programs using the floppy API should use floppy_fdc_state to -+ * get the version number of the floppy driver that they are running -+ * on. If this version number is bigger than the one compiled into the -+ * user program (the FD_DRIVER_VERSION define), it should be prepared -+ * to bigger structures -+ */ -+ -+ unsigned char track[4]; -+ /* Position of the heads of the 4 units attached to this FDC, -+ * as stored on the FDC. In the future, the position as stored -+ * on the FDC might not agree with the actual physical -+ * position of these drive heads. By allowing such -+ * disagreement, it will be possible to reset the FDC without -+ * incurring the expensive cost of repositioning all heads. -+ * Right now, these positions are hard wired to 0. */ -+ -+}; -+ -+#define FDGETFDCSTAT _IOR(2, 0x15, struct floppy_fdc_state) -+ -+ -+/* -+ * Asynchronous Write error tracking -+ */ -+struct floppy_write_errors { -+ /* Write error logging. -+ * -+ * These fields can be cleared with the FDWERRORCLR ioctl. -+ * Only writes that were attempted but failed due to a physical media -+ * error are logged. write(2) calls that fail and return an error code -+ * to the user process are not counted. -+ */ -+ -+ unsigned int write_errors; /* number of physical write errors -+ * encountered */ -+ -+ /* position of first and last write errors */ -+ unsigned long first_error_sector; -+ int first_error_generation; -+ unsigned long last_error_sector; -+ int last_error_generation; -+ -+ unsigned int badness; /* highest retry count for a read or write -+ * operation */ -+}; -+ -+#define FDWERRORCLR _IO(2, 0x56) -+/* clear write error and badness information */ -+#define FDWERRORGET _IOR(2, 0x17, struct floppy_write_errors) -+/* get write error and badness information */ -+ -+ -+/* -+ * Raw commands -+ */ -+/* new interface flag: now we can do them in batches */ -+#define FDHAVEBATCHEDRAWCMD -+ -+struct floppy_raw_cmd { -+ unsigned int flags; -+#define FD_RAW_READ 1 -+#define FD_RAW_WRITE 2 -+#define FD_RAW_NO_MOTOR 4 -+#define FD_RAW_DISK_CHANGE 4 /* out: disk change flag was set */ -+#define FD_RAW_INTR 8 /* wait for an interrupt */ -+#define FD_RAW_SPIN 0x10 /* spin up the disk for this command */ -+#define FD_RAW_NO_MOTOR_AFTER 0x20 /* switch the motor off after command -+ * completion */ -+#define FD_RAW_NEED_DISK 0x40 /* this command needs a disk to be present */ -+#define FD_RAW_NEED_SEEK 0x80 /* this command uses an implied seek (soft) */ -+ -+/* more "in" flags */ -+#define FD_RAW_MORE 0x100 /* more records follow */ -+#define FD_RAW_STOP_IF_FAILURE 0x200 /* stop if we encounter a failure */ -+#define FD_RAW_STOP_IF_SUCCESS 0x400 /* stop if command successful */ -+#define FD_RAW_SOFTFAILURE 0x800 /* consider the return value for failure -+ * detection too */ -+ -+/* more "out" flags */ -+#define FD_RAW_FAILURE 0x10000 /* command sent to fdc, fdc returned error */ -+#define FD_RAW_HARDFAILURE 0x20000 /* fdc had to be reset, or timed out */ -+ -+ void *data; -+ char *kernel_data; /* location of data buffer in the kernel */ -+ struct floppy_raw_cmd *next; /* used for chaining of raw cmd's -+ * within the kernel */ -+ long length; /* in: length of dma transfer. out: remaining bytes */ -+ long phys_length; /* physical length, if different from dma length */ -+ int buffer_length; /* length of allocated buffer */ -+ -+ unsigned char rate; -+ unsigned char cmd_count; -+ unsigned char cmd[16]; -+ unsigned char reply_count; -+ unsigned char reply[16]; -+ int track; -+ int resultcode; -+ -+ int reserved1; -+ int reserved2; -+}; -+ -+#define FDRAWCMD _IO(2, 0x58) -+/* send a raw command to the fdc. Structure size not included, because of -+ * batches */ -+ -+#define FDTWADDLE _IO(2, 0x59) -+/* flicker motor-on bit before reading a sector. Experimental */ -+ -+ -+#define FDEJECT _IO(2, 0x5a) -+/* eject the disk */ -+ -+ -+ -+#endif /* _LINUX_FD_H */ -diff --git a/src/linux/fs.h b/src/linux/fs.h -new file mode 100644 -index 0000000..8639ce5 ---- /dev/null -+++ b/src/linux/fs.h -@@ -0,0 +1,206 @@ -+#ifndef _LINUX_FS_H -+#define _LINUX_FS_H -+ -+/* -+ * This file has definitions for some important file table -+ * structures etc. -+ */ -+ -+#ifdef __linux__ -+#include <linux/limits.h> -+#include <linux/ioctl.h> -+#include <linux/types.h> -+#endif -+ -+/* -+ * It's silly to have NR_OPEN bigger than NR_FILE, but you can change -+ * the file limit at runtime and only root can increase the per-process -+ * nr_file rlimit, so it's safe to set up a ridiculously high absolute -+ * upper limit on files-per-process. -+ * -+ * Some programs (notably those using select()) may have to be -+ * recompiled to take full advantage of the new limits.. -+ */ -+ -+/* Fixed constants first: */ -+#undef NR_OPEN -+#define INR_OPEN_CUR 1024 /* Initial setting for nfile rlimits */ -+#define INR_OPEN_MAX 4096 /* Hard limit for nfile rlimits */ -+ -+#define BLOCK_SIZE_BITS 10 -+#define BLOCK_SIZE (1<<BLOCK_SIZE_BITS) -+ -+#define SEEK_SET 0 /* seek relative to beginning of file */ -+#define SEEK_CUR 1 /* seek relative to current file position */ -+#define SEEK_END 2 /* seek relative to end of file */ -+#define SEEK_DATA 3 /* seek to the next data */ -+#define SEEK_HOLE 4 /* seek to the next hole */ -+#define SEEK_MAX SEEK_HOLE -+ -+struct fstrim_range { -+ __u64 start; -+ __u64 len; -+ __u64 minlen; -+}; -+ -+/* And dynamically-tunable limits and defaults: */ -+struct files_stat_struct { -+ unsigned long nr_files; /* read only */ -+ unsigned long nr_free_files; /* read only */ -+ unsigned long max_files; /* tunable */ -+}; -+ -+struct inodes_stat_t { -+ long nr_inodes; -+ long nr_unused; -+ long dummy[5]; /* padding for sysctl ABI compatibility */ -+}; -+ -+ -+#define NR_FILE 8192 /* this can well be larger on a larger system */ -+ -+ -+/* -+ * These are the fs-independent mount-flags: up to 32 flags are supported -+ */ -+#define MS_RDONLY 1 /* Mount read-only */ -+#define MS_NOSUID 2 /* Ignore suid and sgid bits */ -+#define MS_NODEV 4 /* Disallow access to device special files */ -+#define MS_NOEXEC 8 /* Disallow program execution */ -+#define MS_SYNCHRONOUS 16 /* Writes are synced at once */ -+#define MS_REMOUNT 32 /* Alter flags of a mounted FS */ -+#define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */ -+#define MS_DIRSYNC 128 /* Directory modifications are synchronous */ -+#define MS_NOATIME 1024 /* Do not update access times. */ -+#define MS_NODIRATIME 2048 /* Do not update directory access times */ -+#define MS_BIND 4096 -+#define MS_MOVE 8192 -+#define MS_REC 16384 -+#define MS_VERBOSE 32768 /* War is peace. Verbosity is silence. -+ MS_VERBOSE is deprecated. */ -+#define MS_SILENT 32768 -+#define MS_POSIXACL (1<<16) /* VFS does not apply the umask */ -+#define MS_UNBINDABLE (1<<17) /* change to unbindable */ -+#define MS_PRIVATE (1<<18) /* change to private */ -+#define MS_SLAVE (1<<19) /* change to slave */ -+#define MS_SHARED (1<<20) /* change to shared */ -+#define MS_RELATIME (1<<21) /* Update atime relative to mtime/ctime. */ -+#define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ -+#define MS_I_VERSION (1<<23) /* Update inode I_version field */ -+#define MS_STRICTATIME (1<<24) /* Always perform atime updates */ -+ -+/* These sb flags are internal to the kernel */ -+#define MS_NOSEC (1<<28) -+#define MS_BORN (1<<29) -+#define MS_ACTIVE (1<<30) -+#define MS_NOUSER (1<<31) -+ -+/* -+ * Superblock flags that can be altered by MS_REMOUNT -+ */ -+#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK|MS_I_VERSION) -+ -+/* -+ * Old magic mount flag and mask -+ */ -+#define MS_MGC_VAL 0xC0ED0000 -+#define MS_MGC_MSK 0xffff0000 -+ -+/* the read-only stuff doesn't really belong here, but any other place is -+ probably as bad and I don't want to create yet another include file. */ -+ -+#define BLKROSET _IO(0x12,93) /* set device read-only (0 = read-write) */ -+#define BLKROGET _IO(0x12,94) /* get read-only status (0 = read_write) */ -+#define BLKRRPART _IO(0x12,95) /* re-read partition table */ -+#define BLKGETSIZE _IO(0x12,96) /* return device size /512 (long *arg) */ -+#define BLKFLSBUF _IO(0x12,97) /* flush buffer cache */ -+#define BLKRASET _IO(0x12,98) /* set read ahead for block device */ -+#define BLKRAGET _IO(0x12,99) /* get current read ahead setting */ -+#define BLKFRASET _IO(0x12,100)/* set filesystem (mm/filemap.c) read-ahead */ -+#define BLKFRAGET _IO(0x12,101)/* get filesystem (mm/filemap.c) read-ahead */ -+#define BLKSECTSET _IO(0x12,102)/* set max sectors per request (ll_rw_blk.c) */ -+#define BLKSECTGET _IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */ -+#define BLKSSZGET _IO(0x12,104)/* get block device sector size */ -+#if 0 -+#define BLKPG _IO(0x12,105)/* See blkpg.h */ -+ -+/* Some people are morons. Do not use sizeof! */ -+ -+#define BLKELVGET _IOR(0x12,106,size_t)/* elevator get */ -+#define BLKELVSET _IOW(0x12,107,size_t)/* elevator set */ -+/* This was here just to show that the number is taken - -+ probably all these _IO(0x12,*) ioctls should be moved to blkpg.h. */ -+#endif -+/* A jump here: 108-111 have been used for various private purposes. */ -+#define BLKBSZGET _IOR(0x12,112,size_t) -+#define BLKBSZSET _IOW(0x12,113,size_t) -+#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size in bytes (u64 *arg) */ -+#define BLKTRACESETUP _IOWR(0x12,115,struct blk_user_trace_setup) -+#define BLKTRACESTART _IO(0x12,116) -+#define BLKTRACESTOP _IO(0x12,117) -+#define BLKTRACETEARDOWN _IO(0x12,118) -+#define BLKDISCARD _IO(0x12,119) -+#define BLKIOMIN _IO(0x12,120) -+#define BLKIOOPT _IO(0x12,121) -+#define BLKALIGNOFF _IO(0x12,122) -+#define BLKPBSZGET _IO(0x12,123) -+#define BLKDISCARDZEROES _IO(0x12,124) -+#define BLKSECDISCARD _IO(0x12,125) -+#define BLKROTATIONAL _IO(0x12,126) -+#define BLKZEROOUT _IO(0x12,127) -+ -+#define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ -+#define FIBMAP _IO(0x00,1) /* bmap access */ -+#define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */ -+#define FIFREEZE _IOWR('X', 119, int) /* Freeze */ -+#define FITHAW _IOWR('X', 120, int) /* Thaw */ -+#define FITRIM _IOWR('X', 121, struct fstrim_range) /* Trim */ -+ -+#define FS_IOC_GETFLAGS _IOR('f', 1, long) -+#define FS_IOC_SETFLAGS _IOW('f', 2, long) -+#define FS_IOC_GETVERSION _IOR('v', 1, long) -+#define FS_IOC_SETVERSION _IOW('v', 2, long) -+#define FS_IOC_FIEMAP _IOWR('f', 11, struct fiemap) -+#define FS_IOC32_GETFLAGS _IOR('f', 1, int) -+#define FS_IOC32_SETFLAGS _IOW('f', 2, int) -+#define FS_IOC32_GETVERSION _IOR('v', 1, int) -+#define FS_IOC32_SETVERSION _IOW('v', 2, int) -+ -+/* -+ * Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS) -+ */ -+#define FS_SECRM_FL 0x00000001 /* Secure deletion */ -+#define FS_UNRM_FL 0x00000002 /* Undelete */ -+#define FS_COMPR_FL 0x00000004 /* Compress file */ -+#define FS_SYNC_FL 0x00000008 /* Synchronous updates */ -+#define FS_IMMUTABLE_FL 0x00000010 /* Immutable file */ -+#define FS_APPEND_FL 0x00000020 /* writes to file may only append */ -+#define FS_NODUMP_FL 0x00000040 /* do not dump file */ -+#define FS_NOATIME_FL 0x00000080 /* do not update atime */ -+/* Reserved for compression usage... */ -+#define FS_DIRTY_FL 0x00000100 -+#define FS_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */ -+#define FS_NOCOMP_FL 0x00000400 /* Don't compress */ -+#define FS_ECOMPR_FL 0x00000800 /* Compression error */ -+/* End compression flags --- maybe not all used */ -+#define FS_BTREE_FL 0x00001000 /* btree format dir */ -+#define FS_INDEX_FL 0x00001000 /* hash-indexed directory */ -+#define FS_IMAGIC_FL 0x00002000 /* AFS directory */ -+#define FS_JOURNAL_DATA_FL 0x00004000 /* Reserved for ext3 */ -+#define FS_NOTAIL_FL 0x00008000 /* file tail should not be merged */ -+#define FS_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ -+#define FS_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ -+#define FS_EXTENT_FL 0x00080000 /* Extents */ -+#define FS_DIRECTIO_FL 0x00100000 /* Use direct i/o */ -+#define FS_NOCOW_FL 0x00800000 /* Do not cow file */ -+#define FS_RESERVED_FL 0x80000000 /* reserved for ext2 lib */ -+ -+#define FS_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ -+#define FS_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ -+ -+ -+#define SYNC_FILE_RANGE_WAIT_BEFORE 1 -+#define SYNC_FILE_RANGE_WRITE 2 -+#define SYNC_FILE_RANGE_WAIT_AFTER 4 -+ -+#endif /* _LINUX_FS_H */ -diff --git a/src/linux/hdreg.h b/src/linux/hdreg.h -new file mode 100644 -index 0000000..5f23b03 ---- /dev/null -+++ b/src/linux/hdreg.h -@@ -0,0 +1,644 @@ -+#ifndef _LINUX_HDREG_H -+#define _LINUX_HDREG_H -+ -+#ifdef __linux__ -+#include <linux/types.h> -+#endif -+ -+/* -+ * Command Header sizes for IOCTL commands -+ */ -+ -+#define HDIO_DRIVE_CMD_HDR_SIZE (4 * sizeof(__u8)) -+#define HDIO_DRIVE_HOB_HDR_SIZE (8 * sizeof(__u8)) -+#define HDIO_DRIVE_TASK_HDR_SIZE (8 * sizeof(__u8)) -+ -+#define IDE_DRIVE_TASK_NO_DATA 0 -+#define IDE_DRIVE_TASK_INVALID -1 -+#define IDE_DRIVE_TASK_SET_XFER 1 -+#define IDE_DRIVE_TASK_IN 2 -+#define IDE_DRIVE_TASK_OUT 3 -+#define IDE_DRIVE_TASK_RAW_WRITE 4 -+ -+/* -+ * Define standard taskfile in/out register -+ */ -+#define IDE_TASKFILE_STD_IN_FLAGS 0xFE -+#define IDE_HOB_STD_IN_FLAGS 0x3C -+#define IDE_TASKFILE_STD_OUT_FLAGS 0xFE -+#define IDE_HOB_STD_OUT_FLAGS 0x3C -+ -+typedef unsigned char task_ioreg_t; -+typedef unsigned long sata_ioreg_t; -+ -+typedef union ide_reg_valid_s { -+ unsigned all : 16; -+ struct { -+ unsigned data : 1; -+ unsigned error_feature : 1; -+ unsigned sector : 1; -+ unsigned nsector : 1; -+ unsigned lcyl : 1; -+ unsigned hcyl : 1; -+ unsigned select : 1; -+ unsigned status_command : 1; -+ -+ unsigned data_hob : 1; -+ unsigned error_feature_hob : 1; -+ unsigned sector_hob : 1; -+ unsigned nsector_hob : 1; -+ unsigned lcyl_hob : 1; -+ unsigned hcyl_hob : 1; -+ unsigned select_hob : 1; -+ unsigned control_hob : 1; -+ } b; -+} ide_reg_valid_t; -+ -+typedef struct ide_task_request_s { -+ __u8 io_ports[8]; -+ __u8 hob_ports[8]; /* bytes 6 and 7 are unused */ -+ ide_reg_valid_t out_flags; -+ ide_reg_valid_t in_flags; -+ int data_phase; -+ int req_cmd; -+ unsigned long out_size; -+ unsigned long in_size; -+} ide_task_request_t; -+ -+typedef struct ide_ioctl_request_s { -+ ide_task_request_t *task_request; -+ unsigned char *out_buffer; -+ unsigned char *in_buffer; -+} ide_ioctl_request_t; -+ -+struct hd_drive_cmd_hdr { -+ __u8 command; -+ __u8 sector_number; -+ __u8 feature; -+ __u8 sector_count; -+}; -+ -+typedef struct hd_drive_task_hdr { -+ __u8 data; -+ __u8 feature; -+ __u8 sector_count; -+ __u8 sector_number; -+ __u8 low_cylinder; -+ __u8 high_cylinder; -+ __u8 device_head; -+ __u8 command; -+} task_struct_t; -+ -+typedef struct hd_drive_hob_hdr { -+ __u8 data; -+ __u8 feature; -+ __u8 sector_count; -+ __u8 sector_number; -+ __u8 low_cylinder; -+ __u8 high_cylinder; -+ __u8 device_head; -+ __u8 control; -+} hob_struct_t; -+ -+#define TASKFILE_NO_DATA 0x0000 -+ -+#define TASKFILE_IN 0x0001 -+#define TASKFILE_MULTI_IN 0x0002 -+ -+#define TASKFILE_OUT 0x0004 -+#define TASKFILE_MULTI_OUT 0x0008 -+#define TASKFILE_IN_OUT 0x0010 -+ -+#define TASKFILE_IN_DMA 0x0020 -+#define TASKFILE_OUT_DMA 0x0040 -+#define TASKFILE_IN_DMAQ 0x0080 -+#define TASKFILE_OUT_DMAQ 0x0100 -+ -+#define TASKFILE_P_IN 0x0200 -+#define TASKFILE_P_OUT 0x0400 -+#define TASKFILE_P_IN_DMA 0x0800 -+#define TASKFILE_P_OUT_DMA 0x1000 -+#define TASKFILE_P_IN_DMAQ 0x2000 -+#define TASKFILE_P_OUT_DMAQ 0x4000 -+#define TASKFILE_48 0x8000 -+#define TASKFILE_INVALID 0x7fff -+ -+/* ATA/ATAPI Commands pre T13 Spec */ -+#define WIN_NOP 0x00 -+/* -+ * 0x01->0x02 Reserved -+ */ -+#define CFA_REQ_EXT_ERROR_CODE 0x03 /* CFA Request Extended Error Code */ -+/* -+ * 0x04->0x07 Reserved -+ */ -+#define WIN_SRST 0x08 /* ATAPI soft reset command */ -+#define WIN_DEVICE_RESET 0x08 -+/* -+ * 0x09->0x0F Reserved -+ */ -+#define WIN_RECAL 0x10 -+#define WIN_RESTORE WIN_RECAL -+/* -+ * 0x10->0x1F Reserved -+ */ -+#define WIN_READ 0x20 /* 28-Bit */ -+#define WIN_READ_ONCE 0x21 /* 28-Bit without retries */ -+#define WIN_READ_LONG 0x22 /* 28-Bit */ -+#define WIN_READ_LONG_ONCE 0x23 /* 28-Bit without retries */ -+#define WIN_READ_EXT 0x24 /* 48-Bit */ -+#define WIN_READDMA_EXT 0x25 /* 48-Bit */ -+#define WIN_READDMA_QUEUED_EXT 0x26 /* 48-Bit */ -+#define WIN_READ_NATIVE_MAX_EXT 0x27 /* 48-Bit */ -+/* -+ * 0x28 -+ */ -+#define WIN_MULTREAD_EXT 0x29 /* 48-Bit */ -+/* -+ * 0x2A->0x2F Reserved -+ */ -+#define WIN_WRITE 0x30 /* 28-Bit */ -+#define WIN_WRITE_ONCE 0x31 /* 28-Bit without retries */ -+#define WIN_WRITE_LONG 0x32 /* 28-Bit */ -+#define WIN_WRITE_LONG_ONCE 0x33 /* 28-Bit without retries */ -+#define WIN_WRITE_EXT 0x34 /* 48-Bit */ -+#define WIN_WRITEDMA_EXT 0x35 /* 48-Bit */ -+#define WIN_WRITEDMA_QUEUED_EXT 0x36 /* 48-Bit */ -+#define WIN_SET_MAX_EXT 0x37 /* 48-Bit */ -+#define CFA_WRITE_SECT_WO_ERASE 0x38 /* CFA Write Sectors without erase */ -+#define WIN_MULTWRITE_EXT 0x39 /* 48-Bit */ -+/* -+ * 0x3A->0x3B Reserved -+ */ -+#define WIN_WRITE_VERIFY 0x3C /* 28-Bit */ -+/* -+ * 0x3D->0x3F Reserved -+ */ -+#define WIN_VERIFY 0x40 /* 28-Bit - Read Verify Sectors */ -+#define WIN_VERIFY_ONCE 0x41 /* 28-Bit - without retries */ -+#define WIN_VERIFY_EXT 0x42 /* 48-Bit */ -+/* -+ * 0x43->0x4F Reserved -+ */ -+#define WIN_FORMAT 0x50 -+/* -+ * 0x51->0x5F Reserved -+ */ -+#define WIN_INIT 0x60 -+/* -+ * 0x61->0x5F Reserved -+ */ -+#define WIN_SEEK 0x70 /* 0x70-0x7F Reserved */ -+ -+#define CFA_TRANSLATE_SECTOR 0x87 /* CFA Translate Sector */ -+#define WIN_DIAGNOSE 0x90 -+#define WIN_SPECIFY 0x91 /* set drive geometry translation */ -+#define WIN_DOWNLOAD_MICROCODE 0x92 -+#define WIN_STANDBYNOW2 0x94 -+#define WIN_STANDBY2 0x96 -+#define WIN_SETIDLE2 0x97 -+#define WIN_CHECKPOWERMODE2 0x98 -+#define WIN_SLEEPNOW2 0x99 -+/* -+ * 0x9A VENDOR -+ */ -+#define WIN_PACKETCMD 0xA0 /* Send a packet command. */ -+#define WIN_PIDENTIFY 0xA1 /* identify ATAPI device */ -+#define WIN_QUEUED_SERVICE 0xA2 -+#define WIN_SMART 0xB0 /* self-monitoring and reporting */ -+#define CFA_ERASE_SECTORS 0xC0 -+#define WIN_MULTREAD 0xC4 /* read sectors using multiple mode*/ -+#define WIN_MULTWRITE 0xC5 /* write sectors using multiple mode */ -+#define WIN_SETMULT 0xC6 /* enable/disable multiple mode */ -+#define WIN_READDMA_QUEUED 0xC7 /* read sectors using Queued DMA transfers */ -+#define WIN_READDMA 0xC8 /* read sectors using DMA transfers */ -+#define WIN_READDMA_ONCE 0xC9 /* 28-Bit - without retries */ -+#define WIN_WRITEDMA 0xCA /* write sectors using DMA transfers */ -+#define WIN_WRITEDMA_ONCE 0xCB /* 28-Bit - without retries */ -+#define WIN_WRITEDMA_QUEUED 0xCC /* write sectors using Queued DMA transfers */ -+#define CFA_WRITE_MULTI_WO_ERASE 0xCD /* CFA Write multiple without erase */ -+#define WIN_GETMEDIASTATUS 0xDA -+#define WIN_ACKMEDIACHANGE 0xDB /* ATA-1, ATA-2 vendor */ -+#define WIN_POSTBOOT 0xDC -+#define WIN_PREBOOT 0xDD -+#define WIN_DOORLOCK 0xDE /* lock door on removable drives */ -+#define WIN_DOORUNLOCK 0xDF /* unlock door on removable drives */ -+#define WIN_STANDBYNOW1 0xE0 -+#define WIN_IDLEIMMEDIATE 0xE1 /* force drive to become "ready" */ -+#define WIN_STANDBY 0xE2 /* Set device in Standby Mode */ -+#define WIN_SETIDLE1 0xE3 -+#define WIN_READ_BUFFER 0xE4 /* force read only 1 sector */ -+#define WIN_CHECKPOWERMODE1 0xE5 -+#define WIN_SLEEPNOW1 0xE6 -+#define WIN_FLUSH_CACHE 0xE7 -+#define WIN_WRITE_BUFFER 0xE8 /* force write only 1 sector */ -+#define WIN_WRITE_SAME 0xE9 /* read ata-2 to use */ -+ /* SET_FEATURES 0x22 or 0xDD */ -+#define WIN_FLUSH_CACHE_EXT 0xEA /* 48-Bit */ -+#define WIN_IDENTIFY 0xEC /* ask drive to identify itself */ -+#define WIN_MEDIAEJECT 0xED -+#define WIN_IDENTIFY_DMA 0xEE /* same as WIN_IDENTIFY, but DMA */ -+#define WIN_SETFEATURES 0xEF /* set special drive features */ -+#define EXABYTE_ENABLE_NEST 0xF0 -+#define WIN_SECURITY_SET_PASS 0xF1 -+#define WIN_SECURITY_UNLOCK 0xF2 -+#define WIN_SECURITY_ERASE_PREPARE 0xF3 -+#define WIN_SECURITY_ERASE_UNIT 0xF4 -+#define WIN_SECURITY_FREEZE_LOCK 0xF5 -+#define WIN_SECURITY_DISABLE 0xF6 -+#define WIN_READ_NATIVE_MAX 0xF8 /* return the native maximum address */ -+#define WIN_SET_MAX 0xF9 -+#define DISABLE_SEAGATE 0xFB -+ -+/* WIN_SMART sub-commands */ -+ -+#define SMART_READ_VALUES 0xD0 -+#define SMART_READ_THRESHOLDS 0xD1 -+#define SMART_AUTOSAVE 0xD2 -+#define SMART_SAVE 0xD3 -+#define SMART_IMMEDIATE_OFFLINE 0xD4 -+#define SMART_READ_LOG_SECTOR 0xD5 -+#define SMART_WRITE_LOG_SECTOR 0xD6 -+#define SMART_WRITE_THRESHOLDS 0xD7 -+#define SMART_ENABLE 0xD8 -+#define SMART_DISABLE 0xD9 -+#define SMART_STATUS 0xDA -+#define SMART_AUTO_OFFLINE 0xDB -+ -+/* Password used in TF4 & TF5 executing SMART commands */ -+ -+#define SMART_LCYL_PASS 0x4F -+#define SMART_HCYL_PASS 0xC2 -+ -+/* WIN_SETFEATURES sub-commands */ -+#define SETFEATURES_EN_8BIT 0x01 /* Enable 8-Bit Transfers */ -+#define SETFEATURES_EN_WCACHE 0x02 /* Enable write cache */ -+#define SETFEATURES_DIS_DEFECT 0x04 /* Disable Defect Management */ -+#define SETFEATURES_EN_APM 0x05 /* Enable advanced power management */ -+#define SETFEATURES_EN_SAME_R 0x22 /* for a region ATA-1 */ -+#define SETFEATURES_DIS_MSN 0x31 /* Disable Media Status Notification */ -+#define SETFEATURES_DIS_RETRY 0x33 /* Disable Retry */ -+#define SETFEATURES_EN_AAM 0x42 /* Enable Automatic Acoustic Management */ -+#define SETFEATURES_RW_LONG 0x44 /* Set Length of VS bytes */ -+#define SETFEATURES_SET_CACHE 0x54 /* Set Cache segments to SC Reg. Val */ -+#define SETFEATURES_DIS_RLA 0x55 /* Disable read look-ahead feature */ -+#define SETFEATURES_EN_RI 0x5D /* Enable release interrupt */ -+#define SETFEATURES_EN_SI 0x5E /* Enable SERVICE interrupt */ -+#define SETFEATURES_DIS_RPOD 0x66 /* Disable reverting to power on defaults */ -+#define SETFEATURES_DIS_ECC 0x77 /* Disable ECC byte count */ -+#define SETFEATURES_DIS_8BIT 0x81 /* Disable 8-Bit Transfers */ -+#define SETFEATURES_DIS_WCACHE 0x82 /* Disable write cache */ -+#define SETFEATURES_EN_DEFECT 0x84 /* Enable Defect Management */ -+#define SETFEATURES_DIS_APM 0x85 /* Disable advanced power management */ -+#define SETFEATURES_EN_ECC 0x88 /* Enable ECC byte count */ -+#define SETFEATURES_EN_MSN 0x95 /* Enable Media Status Notification */ -+#define SETFEATURES_EN_RETRY 0x99 /* Enable Retry */ -+#define SETFEATURES_EN_RLA 0xAA /* Enable read look-ahead feature */ -+#define SETFEATURES_PREFETCH 0xAB /* Sets drive prefetch value */ -+#define SETFEATURES_EN_REST 0xAC /* ATA-1 */ -+#define SETFEATURES_4B_RW_LONG 0xBB /* Set Length of 4 bytes */ -+#define SETFEATURES_DIS_AAM 0xC2 /* Disable Automatic Acoustic Management */ -+#define SETFEATURES_EN_RPOD 0xCC /* Enable reverting to power on defaults */ -+#define SETFEATURES_DIS_RI 0xDD /* Disable release interrupt ATAPI */ -+#define SETFEATURES_EN_SAME_M 0xDD /* for a entire device ATA-1 */ -+#define SETFEATURES_DIS_SI 0xDE /* Disable SERVICE interrupt ATAPI */ -+ -+/* WIN_SECURITY sub-commands */ -+ -+#define SECURITY_SET_PASSWORD 0xBA -+#define SECURITY_UNLOCK 0xBB -+#define SECURITY_ERASE_PREPARE 0xBC -+#define SECURITY_ERASE_UNIT 0xBD -+#define SECURITY_FREEZE_LOCK 0xBE -+#define SECURITY_DISABLE_PASSWORD 0xBF -+ -+struct hd_geometry { -+ unsigned char heads; -+ unsigned char sectors; -+ unsigned short cylinders; -+ unsigned long start; -+}; -+ -+/* hd/ide ctl's that pass (arg) ptrs to user space are numbered 0x030n/0x031n */ -+#define HDIO_GETGEO 0x0301 /* get device geometry */ -+#define HDIO_GET_UNMASKINTR 0x0302 /* get current unmask setting */ -+#define HDIO_GET_MULTCOUNT 0x0304 /* get current IDE blockmode setting */ -+#define HDIO_GET_QDMA 0x0305 /* get use-qdma flag */ -+ -+#define HDIO_SET_XFER 0x0306 /* set transfer rate via proc */ -+ -+#define HDIO_OBSOLETE_IDENTITY 0x0307 /* OBSOLETE, DO NOT USE: returns 142 bytes */ -+#define HDIO_GET_KEEPSETTINGS 0x0308 /* get keep-settings-on-reset flag */ -+#define HDIO_GET_32BIT 0x0309 /* get current io_32bit setting */ -+#define HDIO_GET_NOWERR 0x030a /* get ignore-write-error flag */ -+#define HDIO_GET_DMA 0x030b /* get use-dma flag */ -+#define HDIO_GET_NICE 0x030c /* get nice flags */ -+#define HDIO_GET_IDENTITY 0x030d /* get IDE identification info */ -+#define HDIO_GET_WCACHE 0x030e /* get write cache mode on|off */ -+#define HDIO_GET_ACOUSTIC 0x030f /* get acoustic value */ -+#define HDIO_GET_ADDRESS 0x0310 /* */ -+ -+#define HDIO_GET_BUSSTATE 0x031a /* get the bus state of the hwif */ -+#define HDIO_TRISTATE_HWIF 0x031b /* execute a channel tristate */ -+#define HDIO_DRIVE_RESET 0x031c /* execute a device reset */ -+#define HDIO_DRIVE_TASKFILE 0x031d /* execute raw taskfile */ -+#define HDIO_DRIVE_TASK 0x031e /* execute task and special drive command */ -+#define HDIO_DRIVE_CMD 0x031f /* execute a special drive command */ -+#define HDIO_DRIVE_CMD_AEB HDIO_DRIVE_TASK -+ -+/* hd/ide ctl's that pass (arg) non-ptr values are numbered 0x032n/0x033n */ -+#define HDIO_SET_MULTCOUNT 0x0321 /* change IDE blockmode */ -+#define HDIO_SET_UNMASKINTR 0x0322 /* permit other irqs during I/O */ -+#define HDIO_SET_KEEPSETTINGS 0x0323 /* keep ioctl settings on reset */ -+#define HDIO_SET_32BIT 0x0324 /* change io_32bit flags */ -+#define HDIO_SET_NOWERR 0x0325 /* change ignore-write-error flag */ -+#define HDIO_SET_DMA 0x0326 /* change use-dma flag */ -+#define HDIO_SET_PIO_MODE 0x0327 /* reconfig interface to new speed */ -+#define HDIO_SCAN_HWIF 0x0328 /* register and (re)scan interface */ -+#define HDIO_UNREGISTER_HWIF 0x032a /* unregister interface */ -+#define HDIO_SET_NICE 0x0329 /* set nice flags */ -+#define HDIO_SET_WCACHE 0x032b /* change write cache enable-disable */ -+#define HDIO_SET_ACOUSTIC 0x032c /* change acoustic behavior */ -+#define HDIO_SET_BUSSTATE 0x032d /* set the bus state of the hwif */ -+#define HDIO_SET_QDMA 0x032e /* change use-qdma flag */ -+#define HDIO_SET_ADDRESS 0x032f /* change lba addressing modes */ -+ -+/* bus states */ -+enum { -+ BUSSTATE_OFF = 0, -+ BUSSTATE_ON, -+ BUSSTATE_TRISTATE -+}; -+ -+/* hd/ide ctl's that pass (arg) ptrs to user space are numbered 0x033n/0x033n */ -+/* 0x330 is reserved - used to be HDIO_GETGEO_BIG */ -+/* 0x331 is reserved - used to be HDIO_GETGEO_BIG_RAW */ -+/* 0x338 is reserved - used to be HDIO_SET_IDE_SCSI */ -+/* 0x339 is reserved - used to be HDIO_SET_SCSI_IDE */ -+ -+#define __NEW_HD_DRIVE_ID -+ -+/* -+ * Structure returned by HDIO_GET_IDENTITY, as per ANSI NCITS ATA6 rev.1b spec. -+ * -+ * If you change something here, please remember to update fix_driveid() in -+ * ide/probe.c. -+ */ -+struct hd_driveid { -+ unsigned short config; /* lots of obsolete bit flags */ -+ unsigned short cyls; /* Obsolete, "physical" cyls */ -+ unsigned short reserved2; /* reserved (word 2) */ -+ unsigned short heads; /* Obsolete, "physical" heads */ -+ unsigned short track_bytes; /* unformatted bytes per track */ -+ unsigned short sector_bytes; /* unformatted bytes per sector */ -+ unsigned short sectors; /* Obsolete, "physical" sectors per track */ -+ unsigned short vendor0; /* vendor unique */ -+ unsigned short vendor1; /* vendor unique */ -+ unsigned short vendor2; /* Retired vendor unique */ -+ unsigned char serial_no[20]; /* 0 = not_specified */ -+ unsigned short buf_type; /* Retired */ -+ unsigned short buf_size; /* Retired, 512 byte increments -+ * 0 = not_specified -+ */ -+ unsigned short ecc_bytes; /* for r/w long cmds; 0 = not_specified */ -+ unsigned char fw_rev[8]; /* 0 = not_specified */ -+ unsigned char model[40]; /* 0 = not_specified */ -+ unsigned char max_multsect; /* 0=not_implemented */ -+ unsigned char vendor3; /* vendor unique */ -+ unsigned short dword_io; /* 0=not_implemented; 1=implemented */ -+ unsigned char vendor4; /* vendor unique */ -+ unsigned char capability; /* (upper byte of word 49) -+ * 3: IORDYsup -+ * 2: IORDYsw -+ * 1: LBA -+ * 0: DMA -+ */ -+ unsigned short reserved50; /* reserved (word 50) */ -+ unsigned char vendor5; /* Obsolete, vendor unique */ -+ unsigned char tPIO; /* Obsolete, 0=slow, 1=medium, 2=fast */ -+ unsigned char vendor6; /* Obsolete, vendor unique */ -+ unsigned char tDMA; /* Obsolete, 0=slow, 1=medium, 2=fast */ -+ unsigned short field_valid; /* (word 53) -+ * 2: ultra_ok word 88 -+ * 1: eide_ok words 64-70 -+ * 0: cur_ok words 54-58 -+ */ -+ unsigned short cur_cyls; /* Obsolete, logical cylinders */ -+ unsigned short cur_heads; /* Obsolete, l heads */ -+ unsigned short cur_sectors; /* Obsolete, l sectors per track */ -+ unsigned short cur_capacity0; /* Obsolete, l total sectors on drive */ -+ unsigned short cur_capacity1; /* Obsolete, (2 words, misaligned int) */ -+ unsigned char multsect; /* current multiple sector count */ -+ unsigned char multsect_valid; /* when (bit0==1) multsect is ok */ -+ unsigned int lba_capacity; /* Obsolete, total number of sectors */ -+ unsigned short dma_1word; /* Obsolete, single-word dma info */ -+ unsigned short dma_mword; /* multiple-word dma info */ -+ unsigned short eide_pio_modes; /* bits 0:mode3 1:mode4 */ -+ unsigned short eide_dma_min; /* min mword dma cycle time (ns) */ -+ unsigned short eide_dma_time; /* recommended mword dma cycle time (ns) */ -+ unsigned short eide_pio; /* min cycle time (ns), no IORDY */ -+ unsigned short eide_pio_iordy; /* min cycle time (ns), with IORDY */ -+ unsigned short words69_70[2]; /* reserved words 69-70 -+ * future command overlap and queuing -+ */ -+ unsigned short words71_74[4]; /* reserved words 71-74 -+ * for IDENTIFY PACKET DEVICE command -+ */ -+ unsigned short queue_depth; /* (word 75) -+ * 15:5 reserved -+ * 4:0 Maximum queue depth -1 -+ */ -+ unsigned short words76_79[4]; /* reserved words 76-79 */ -+ unsigned short major_rev_num; /* (word 80) */ -+ unsigned short minor_rev_num; /* (word 81) */ -+ unsigned short command_set_1; /* (word 82) supported -+ * 15: Obsolete -+ * 14: NOP command -+ * 13: READ_BUFFER -+ * 12: WRITE_BUFFER -+ * 11: Obsolete -+ * 10: Host Protected Area -+ * 9: DEVICE Reset -+ * 8: SERVICE Interrupt -+ * 7: Release Interrupt -+ * 6: look-ahead -+ * 5: write cache -+ * 4: PACKET Command -+ * 3: Power Management Feature Set -+ * 2: Removable Feature Set -+ * 1: Security Feature Set -+ * 0: SMART Feature Set -+ */ -+ unsigned short command_set_2; /* (word 83) -+ * 15: Shall be ZERO -+ * 14: Shall be ONE -+ * 13: FLUSH CACHE EXT -+ * 12: FLUSH CACHE -+ * 11: Device Configuration Overlay -+ * 10: 48-bit Address Feature Set -+ * 9: Automatic Acoustic Management -+ * 8: SET MAX security -+ * 7: reserved 1407DT PARTIES -+ * 6: SetF sub-command Power-Up -+ * 5: Power-Up in Standby Feature Set -+ * 4: Removable Media Notification -+ * 3: APM Feature Set -+ * 2: CFA Feature Set -+ * 1: READ/WRITE DMA QUEUED -+ * 0: Download MicroCode -+ */ -+ unsigned short cfsse; /* (word 84) -+ * cmd set-feature supported extensions -+ * 15: Shall be ZERO -+ * 14: Shall be ONE -+ * 13:6 reserved -+ * 5: General Purpose Logging -+ * 4: Streaming Feature Set -+ * 3: Media Card Pass Through -+ * 2: Media Serial Number Valid -+ * 1: SMART selt-test supported -+ * 0: SMART error logging -+ */ -+ unsigned short cfs_enable_1; /* (word 85) -+ * command set-feature enabled -+ * 15: Obsolete -+ * 14: NOP command -+ * 13: READ_BUFFER -+ * 12: WRITE_BUFFER -+ * 11: Obsolete -+ * 10: Host Protected Area -+ * 9: DEVICE Reset -+ * 8: SERVICE Interrupt -+ * 7: Release Interrupt -+ * 6: look-ahead -+ * 5: write cache -+ * 4: PACKET Command -+ * 3: Power Management Feature Set -+ * 2: Removable Feature Set -+ * 1: Security Feature Set -+ * 0: SMART Feature Set -+ */ -+ unsigned short cfs_enable_2; /* (word 86) -+ * command set-feature enabled -+ * 15: Shall be ZERO -+ * 14: Shall be ONE -+ * 13: FLUSH CACHE EXT -+ * 12: FLUSH CACHE -+ * 11: Device Configuration Overlay -+ * 10: 48-bit Address Feature Set -+ * 9: Automatic Acoustic Management -+ * 8: SET MAX security -+ * 7: reserved 1407DT PARTIES -+ * 6: SetF sub-command Power-Up -+ * 5: Power-Up in Standby Feature Set -+ * 4: Removable Media Notification -+ * 3: APM Feature Set -+ * 2: CFA Feature Set -+ * 1: READ/WRITE DMA QUEUED -+ * 0: Download MicroCode -+ */ -+ unsigned short csf_default; /* (word 87) -+ * command set-feature default -+ * 15: Shall be ZERO -+ * 14: Shall be ONE -+ * 13:6 reserved -+ * 5: General Purpose Logging enabled -+ * 4: Valid CONFIGURE STREAM executed -+ * 3: Media Card Pass Through enabled -+ * 2: Media Serial Number Valid -+ * 1: SMART selt-test supported -+ * 0: SMART error logging -+ */ -+ unsigned short dma_ultra; /* (word 88) */ -+ unsigned short trseuc; /* time required for security erase */ -+ unsigned short trsEuc; /* time required for enhanced erase */ -+ unsigned short CurAPMvalues; /* current APM values */ -+ unsigned short mprc; /* master password revision code */ -+ unsigned short hw_config; /* hardware config (word 93) -+ * 15: Shall be ZERO -+ * 14: Shall be ONE -+ * 13: -+ * 12: -+ * 11: -+ * 10: -+ * 9: -+ * 8: -+ * 7: -+ * 6: -+ * 5: -+ * 4: -+ * 3: -+ * 2: -+ * 1: -+ * 0: Shall be ONE -+ */ -+ unsigned short acoustic; /* (word 94) -+ * 15:8 Vendor's recommended value -+ * 7:0 current value -+ */ -+ unsigned short msrqs; /* min stream request size */ -+ unsigned short sxfert; /* stream transfer time */ -+ unsigned short sal; /* stream access latency */ -+ unsigned int spg; /* stream performance granularity */ -+ unsigned long long lba_capacity_2;/* 48-bit total number of sectors */ -+ unsigned short words104_125[22];/* reserved words 104-125 */ -+ unsigned short last_lun; /* (word 126) */ -+ unsigned short word127; /* (word 127) Feature Set -+ * Removable Media Notification -+ * 15:2 reserved -+ * 1:0 00 = not supported -+ * 01 = supported -+ * 10 = reserved -+ * 11 = reserved -+ */ -+ unsigned short dlf; /* (word 128) -+ * device lock function -+ * 15:9 reserved -+ * 8 security level 1:max 0:high -+ * 7:6 reserved -+ * 5 enhanced erase -+ * 4 expire -+ * 3 frozen -+ * 2 locked -+ * 1 en/disabled -+ * 0 capability -+ */ -+ unsigned short csfo; /* (word 129) -+ * current set features options -+ * 15:4 reserved -+ * 3: auto reassign -+ * 2: reverting -+ * 1: read-look-ahead -+ * 0: write cache -+ */ -+ unsigned short words130_155[26];/* reserved vendor words 130-155 */ -+ unsigned short word156; /* reserved vendor word 156 */ -+ unsigned short words157_159[3];/* reserved vendor words 157-159 */ -+ unsigned short cfa_power; /* (word 160) CFA Power Mode -+ * 15 word 160 supported -+ * 14 reserved -+ * 13 -+ * 12 -+ * 11:0 -+ */ -+ unsigned short words161_175[15];/* Reserved for CFA */ -+ unsigned short words176_205[30];/* Current Media Serial Number */ -+ unsigned short words206_254[49];/* reserved words 206-254 */ -+ unsigned short integrity_word; /* (word 255) -+ * 15:8 Checksum -+ * 7:0 Signature -+ */ -+}; -+ -+/* -+ * IDE "nice" flags. These are used on a per drive basis to determine -+ * when to be nice and give more bandwidth to the other devices which -+ * share the same IDE bus. -+ */ -+#define IDE_NICE_DSC_OVERLAP (0) /* per the DSC overlap protocol */ -+#define IDE_NICE_ATAPI_OVERLAP (1) /* not supported yet */ -+#define IDE_NICE_1 (3) /* when probably won't affect us much */ -+#define IDE_NICE_0 (2) /* when sure that it won't affect us */ -+#define IDE_NICE_2 (4) /* when we know it's on our expense */ -+ -+#endif /* _LINUX_HDREG_H */ -diff --git a/src/linux/magic.h b/src/linux/magic.h -new file mode 100644 -index 0000000..77c6031 ---- /dev/null -+++ b/src/linux/magic.h -@@ -0,0 +1,76 @@ -+#ifndef __LINUX_MAGIC_H__ -+#define __LINUX_MAGIC_H__ -+ -+#define ADFS_SUPER_MAGIC 0xadf5 -+#define AFFS_SUPER_MAGIC 0xadff -+#define AFS_SUPER_MAGIC 0x5346414F -+#define AUTOFS_SUPER_MAGIC 0x0187 -+#define CODA_SUPER_MAGIC 0x73757245 -+#define CRAMFS_MAGIC 0x28cd3d45 /* some random number */ -+#define CRAMFS_MAGIC_WEND 0x453dcd28 /* magic number with the wrong endianess */ -+#define DEBUGFS_MAGIC 0x64626720 -+#define SECURITYFS_MAGIC 0x73636673 -+#define SELINUX_MAGIC 0xf97cff8c -+#define SMACK_MAGIC 0x43415d53 /* "SMAC" */ -+#define RAMFS_MAGIC 0x858458f6 /* some random number */ -+#define TMPFS_MAGIC 0x01021994 -+#define HUGETLBFS_MAGIC 0x958458f6 /* some random number */ -+#define SQUASHFS_MAGIC 0x73717368 -+#define ECRYPTFS_SUPER_MAGIC 0xf15f -+#define EFS_SUPER_MAGIC 0x414A53 -+#define EXT2_SUPER_MAGIC 0xEF53 -+#define EXT3_SUPER_MAGIC 0xEF53 -+#define XENFS_SUPER_MAGIC 0xabba1974 -+#define EXT4_SUPER_MAGIC 0xEF53 -+#define BTRFS_SUPER_MAGIC 0x9123683E -+#define NILFS_SUPER_MAGIC 0x3434 -+#define F2FS_SUPER_MAGIC 0xF2F52010 -+#define HPFS_SUPER_MAGIC 0xf995e849 -+#define ISOFS_SUPER_MAGIC 0x9660 -+#define JFFS2_SUPER_MAGIC 0x72b6 -+#define PSTOREFS_MAGIC 0x6165676C -+#define EFIVARFS_MAGIC 0xde5e81e4 -+#define HOSTFS_SUPER_MAGIC 0x00c0ffee -+ -+#define MINIX_SUPER_MAGIC 0x137F /* minix v1 fs, 14 char names */ -+#define MINIX_SUPER_MAGIC2 0x138F /* minix v1 fs, 30 char names */ -+#define MINIX2_SUPER_MAGIC 0x2468 /* minix v2 fs, 14 char names */ -+#define MINIX2_SUPER_MAGIC2 0x2478 /* minix v2 fs, 30 char names */ -+#define MINIX3_SUPER_MAGIC 0x4d5a /* minix v3 fs, 60 char names */ -+ -+#define MSDOS_SUPER_MAGIC 0x4d44 /* MD */ -+#define NCP_SUPER_MAGIC 0x564c /* Guess, what 0x564c is :-) */ -+#define NFS_SUPER_MAGIC 0x6969 -+#define OPENPROM_SUPER_MAGIC 0x9fa1 -+#define QNX4_SUPER_MAGIC 0x002f /* qnx4 fs detection */ -+#define QNX6_SUPER_MAGIC 0x68191122 /* qnx6 fs detection */ -+ -+#define REISERFS_SUPER_MAGIC 0x52654973 /* used by gcc */ -+ /* used by file system utilities that -+ look at the superblock, etc. */ -+#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs" -+#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs" -+#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs" -+ -+#define SMB_SUPER_MAGIC 0x517B -+#define CGROUP_SUPER_MAGIC 0x27e0eb -+ -+ -+#define STACK_END_MAGIC 0x57AC6E9D -+ -+#define V9FS_MAGIC 0x01021997 -+ -+#define BDEVFS_MAGIC 0x62646576 -+#define BINFMTFS_MAGIC 0x42494e4d -+#define DEVPTS_SUPER_MAGIC 0x1cd1 -+#define FUTEXFS_SUPER_MAGIC 0xBAD1DEA -+#define PIPEFS_MAGIC 0x50495045 -+#define PROC_SUPER_MAGIC 0x9fa0 -+#define SOCKFS_MAGIC 0x534F434B -+#define SYSFS_MAGIC 0x62656572 -+#define USBDEVICE_SUPER_MAGIC 0x9fa2 -+#define MTD_INODE_FS_MAGIC 0x11307854 -+#define ANON_INODE_FS_MAGIC 0x09041934 -+#define BTRFS_TEST_MAGIC 0x73727279 -+ -+#endif /* __LINUX_MAGIC_H__ */ -diff --git a/src/linux/msdos_fs.h b/src/linux/msdos_fs.h -new file mode 100644 -index 0000000..635d905 ---- /dev/null -+++ b/src/linux/msdos_fs.h -@@ -0,0 +1,201 @@ -+#ifndef _LINUX_MSDOS_FS_H -+#define _LINUX_MSDOS_FS_H -+ -+#ifdef __linux__ -+#include <linux/types.h> -+#include <asm/byteorder.h> -+#endif -+#include "magic.h" -+ -+/* -+ * The MS-DOS filesystem constants/structures -+ */ -+ -+#define SECTOR_SIZE 512 /* sector size (bytes) */ -+#define SECTOR_BITS 9 /* log2(SECTOR_SIZE) */ -+#define MSDOS_DPB (MSDOS_DPS) /* dir entries per block */ -+#define MSDOS_DPB_BITS 4 /* log2(MSDOS_DPB) */ -+#define MSDOS_DPS (SECTOR_SIZE / sizeof(struct msdos_dir_entry)) -+#define MSDOS_DPS_BITS 4 /* log2(MSDOS_DPS) */ -+#define MSDOS_LONGNAME 256 /* maximum name length */ -+#define CF_LE_W(v) le16_to_cpu(v) -+#define CF_LE_L(v) le32_to_cpu(v) -+#define CT_LE_W(v) cpu_to_le16(v) -+#define CT_LE_L(v) cpu_to_le32(v) -+ -+#define MSDOS_ROOT_INO 1 /* The root inode number */ -+#define MSDOS_FSINFO_INO 2 /* Used for managing the FSINFO block */ -+ -+#define MSDOS_DIR_BITS 5 /* log2(sizeof(struct msdos_dir_entry)) */ -+ -+/* directory limit */ -+#define FAT_MAX_DIR_ENTRIES (65536) -+#define FAT_MAX_DIR_SIZE (FAT_MAX_DIR_ENTRIES << MSDOS_DIR_BITS) -+ -+#define ATTR_NONE 0 /* no attribute bits */ -+#define ATTR_RO 1 /* read-only */ -+#define ATTR_HIDDEN 2 /* hidden */ -+#define ATTR_SYS 4 /* system */ -+#define ATTR_VOLUME 8 /* volume label */ -+#define ATTR_DIR 16 /* directory */ -+#define ATTR_ARCH 32 /* archived */ -+ -+/* attribute bits that are copied "as is" */ -+#define ATTR_UNUSED (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN) -+/* bits that are used by the Windows 95/Windows NT extended FAT */ -+#define ATTR_EXT (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME) -+ -+#define CASE_LOWER_BASE 8 /* base is lower case */ -+#define CASE_LOWER_EXT 16 /* extension is lower case */ -+ -+#define DELETED_FLAG 0xe5 /* marks file as deleted when in name[0] */ -+#define IS_FREE(n) (!*(n) || *(n) == DELETED_FLAG) -+ -+#define FAT_LFN_LEN 255 /* maximum long name length */ -+#define MSDOS_NAME 11 /* maximum name length */ -+#define MSDOS_SLOTS 21 /* max # of slots for short and long names */ -+#define MSDOS_DOT ". " /* ".", padded to MSDOS_NAME chars */ -+#define MSDOS_DOTDOT ".. " /* "..", padded to MSDOS_NAME chars */ -+ -+#define FAT_FIRST_ENT(s, x) ((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \ -+ MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x)) -+ -+/* start of data cluster's entry (number of reserved clusters) */ -+#define FAT_START_ENT 2 -+ -+/* maximum number of clusters */ -+#define MAX_FAT12 0xFF4 -+#define MAX_FAT16 0xFFF4 -+#define MAX_FAT32 0x0FFFFFF6 -+#define MAX_FAT(s) (MSDOS_SB(s)->fat_bits == 32 ? MAX_FAT32 : \ -+ MSDOS_SB(s)->fat_bits == 16 ? MAX_FAT16 : MAX_FAT12) -+ -+/* bad cluster mark */ -+#define BAD_FAT12 0xFF7 -+#define BAD_FAT16 0xFFF7 -+#define BAD_FAT32 0x0FFFFFF7 -+ -+/* standard EOF */ -+#define EOF_FAT12 0xFFF -+#define EOF_FAT16 0xFFFF -+#define EOF_FAT32 0x0FFFFFFF -+ -+#define FAT_ENT_FREE (0) -+#define FAT_ENT_BAD (BAD_FAT32) -+#define FAT_ENT_EOF (EOF_FAT32) -+ -+#define FAT_FSINFO_SIG1 0x41615252 -+#define FAT_FSINFO_SIG2 0x61417272 -+#define IS_FSINFO(x) (le32_to_cpu((x)->signature1) == FAT_FSINFO_SIG1 \ -+ && le32_to_cpu((x)->signature2) == FAT_FSINFO_SIG2) -+ -+#define FAT_STATE_DIRTY 0x01 -+ -+struct __fat_dirent { -+ long d_ino; -+ long d_off; -+ unsigned short d_reclen; -+ char d_name[256]; /* We must not include limits.h! */ -+}; -+ -+/* -+ * ioctl commands -+ */ -+#define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct __fat_dirent[2]) -+#define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct __fat_dirent[2]) -+/* <linux/videotext.h> has used 0x72 ('r') in collision, so skip a few */ -+#define FAT_IOCTL_GET_ATTRIBUTES _IOR('r', 0x10, __u32) -+#define FAT_IOCTL_SET_ATTRIBUTES _IOW('r', 0x11, __u32) -+/*Android kernel has used 0x12, so we use 0x13*/ -+#define FAT_IOCTL_GET_VOLUME_ID _IOR('r', 0x13, __u32) -+ -+struct fat_boot_sector { -+ __u8 ignored[3]; /* Boot strap short or near jump */ -+ __u8 system_id[8]; /* Name - can be used to special case -+ partition manager volumes */ -+ __u8 sector_size[2]; /* bytes per logical sector */ -+ __u8 sec_per_clus; /* sectors/cluster */ -+ __le16 reserved; /* reserved sectors */ -+ __u8 fats; /* number of FATs */ -+ __u8 dir_entries[2]; /* root directory entries */ -+ __u8 sectors[2]; /* number of sectors */ -+ __u8 media; /* media code */ -+ __le16 fat_length; /* sectors/FAT */ -+ __le16 secs_track; /* sectors per track */ -+ __le16 heads; /* number of heads */ -+ __le32 hidden; /* hidden sectors (unused) */ -+ __le32 total_sect; /* number of sectors (if sectors == 0) */ -+ -+ union { -+ struct { -+ /* Extended BPB Fields for FAT16 */ -+ __u8 drive_number; /* Physical drive number */ -+ __u8 state; /* undocumented, but used -+ for mount state. */ -+ __u8 signature; /* extended boot signature */ -+ __u8 vol_id[4]; /* volume ID */ -+ __u8 vol_label[11]; /* volume label */ -+ __u8 fs_type[8]; /* file system type */ -+ /* other fiealds are not added here */ -+ } fat16; -+ -+ struct { -+ /* only used by FAT32 */ -+ __le32 length; /* sectors/FAT */ -+ __le16 flags; /* bit 8: fat mirroring, -+ low 4: active fat */ -+ __u8 version[2]; /* major, minor filesystem -+ version */ -+ __le32 root_cluster; /* first cluster in -+ root directory */ -+ __le16 info_sector; /* filesystem info sector */ -+ __le16 backup_boot; /* backup boot sector */ -+ __le16 reserved2[6]; /* Unused */ -+ /* Extended BPB Fields for FAT32 */ -+ __u8 drive_number; /* Physical drive number */ -+ __u8 state; /* undocumented, but used -+ for mount state. */ -+ __u8 signature; /* extended boot signature */ -+ __u8 vol_id[4]; /* volume ID */ -+ __u8 vol_label[11]; /* volume label */ -+ __u8 fs_type[8]; /* file system type */ -+ /* other fiealds are not added here */ -+ } fat32; -+ }; -+}; -+ -+struct fat_boot_fsinfo { -+ __le32 signature1; /* 0x41615252L */ -+ __le32 reserved1[120]; /* Nothing as far as I can tell */ -+ __le32 signature2; /* 0x61417272L */ -+ __le32 free_clusters; /* Free cluster count. -1 if unknown */ -+ __le32 next_cluster; /* Most recently allocated cluster */ -+ __le32 reserved2[4]; -+}; -+ -+struct msdos_dir_entry { -+ __u8 name[MSDOS_NAME];/* name and extension */ -+ __u8 attr; /* attribute bits */ -+ __u8 lcase; /* Case for base and extension */ -+ __u8 ctime_cs; /* Creation time, centiseconds (0-199) */ -+ __le16 ctime; /* Creation time */ -+ __le16 cdate; /* Creation date */ -+ __le16 adate; /* Last access date */ -+ __le16 starthi; /* High 16 bits of cluster in FAT32 */ -+ __le16 time,date,start;/* time, date and first cluster */ -+ __le32 size; /* file size (in bytes) */ -+}; -+ -+/* Up to 13 characters of the name */ -+struct msdos_dir_slot { -+ __u8 id; /* sequence number for slot */ -+ __u8 name0_4[10]; /* first 5 characters in name */ -+ __u8 attr; /* attribute byte */ -+ __u8 reserved; /* always 0 */ -+ __u8 alias_checksum; /* checksum for 8.3 alias */ -+ __u8 name5_10[12]; /* 6 more characters in name */ -+ __le16 start; /* starting cluster number, 0 in long slots */ -+ __u8 name11_12[4]; /* last 2 characters in name */ -+}; -+ -+#endif /* _LINUX_MSDOS_FS_H */ -diff --git a/src/mkfs.fat.c b/src/mkfs.fat.c -index e6f9390..ebdfdb5 100644 ---- a/src/mkfs.fat.c -+++ b/src/mkfs.fat.c -@@ -47,12 +47,6 @@ - #include "version.h" - - #include <fcntl.h> --#include <linux/hdreg.h> --#include <sys/mount.h> --#include <linux/fs.h> --#include <linux/fd.h> --#include <endian.h> --#include <mntent.h> - #include <signal.h> - #include <string.h> - #include <stdio.h> -@@ -60,15 +54,23 @@ - #include <sys/ioctl.h> - #include <sys/stat.h> - #include <sys/time.h> --#include <sys/types.h> - #include <unistd.h> - #include <time.h> - #include <errno.h> - #include <ctype.h> - #include <stdint.h> --#include <endian.h> - --#include <asm/types.h> -+#if defined(__linux__) -+ #include <mntent.h> -+#elif defined(__osx__) -+ #include <fstab.h> -+ #include <sys/mount.h> -+#endif -+ -+#include "common.h" -+#include "linux/fs.h" -+#include "linux/fd.h" -+#include "linux/hdreg.h" - - /* In earlier versions, an own llseek() was used, but glibc lseek() is - * sufficient (or even better :) for 64 bit offsets in the meantime */ -@@ -524,6 +526,7 @@ static uint64_t count_blocks(char *filename, int *remainder) - - static void check_mount(char *device_name) - { -+#if defined(__linux__) - FILE *f; - struct mntent *mnt; - -@@ -533,6 +536,17 @@ static void check_mount(char *device_name) - if (strcmp(device_name, mnt->mnt_fsname) == 0) - die("%s contains a mounted filesystem."); - endmntent(f); -+#elif defined(__osx__) -+ struct statfs* mounts; -+ int num_mounts = getmntinfo(&mounts, MNT_WAIT); -+ if (num_mounts < 0) -+ return; -+ for ( int i = 0; i < num_mounts; i++ ) -+ { -+ if (strcmp(device_name, mounts[i].f_mntfromname) == 0) -+ die("%s contains a mounted filesystem."); -+ } -+#endif - } - - /* Establish the geometry and media parameters for the device */ --- -1.9.1 - |