|  | /* | 
|  | * (C) Copyright 2002 | 
|  | * Stäubli Faverges - <www.staubli.com> | 
|  | * Pierre AUBERT  p.aubert@staubli.com | 
|  | * | 
|  | * See file CREDITS for list of people who contributed to this | 
|  | * project. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU General Public License as | 
|  | * published by the Free Software Foundation; either version 2 of | 
|  | * the License, or (at your option) any later version. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | * GNU General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License | 
|  | * along with this program; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 
|  | * MA 02111-1307 USA | 
|  | */ | 
|  |  | 
|  | #ifndef _DOS_H_ | 
|  | #define _DOS_H_ | 
|  |  | 
|  | /* Definitions for Dos diskettes                                             */ | 
|  |  | 
|  | /* General definitions                                                       */ | 
|  | #define SZ_STD_SECTOR   512             /* Standard sector size              */ | 
|  | #define MDIR_SIZE	32		/* Direntry size                     */ | 
|  | #define FAT_BITS        12              /* Diskette use 12 bits fat          */ | 
|  |  | 
|  | #define MAX_PATH	128		/* Max size of the MSDOS PATH        */ | 
|  | #define MAX_DIR_SECS	64		/* Taille max d'un repertoire (en    */ | 
|  | /* secteurs)                         */ | 
|  | /* Misc. definitions                                                         */ | 
|  | #define DELMARK         '\xe5' | 
|  | #define EXTENDED_BOOT   (0x29) | 
|  | #define MEDIA_STD       (0xf0) | 
|  | #define JUMP_0_1        (0xe9) | 
|  | #define JUMP_0_2        (0xeb) | 
|  |  | 
|  | /* Boot size is 256 bytes, but we need to read almost a sector, then | 
|  | assume bootsize is 512                                                    */ | 
|  | #define BOOTSIZE        512 | 
|  |  | 
|  | /* Fat definitions for 12 bits fat                                           */ | 
|  | #define FAT12_MAX_NB    4086 | 
|  | #define FAT12_LAST      0x0ff6 | 
|  | #define FAT12_END       0x0fff | 
|  |  | 
|  | /* file attributes                                                           */ | 
|  | #define ATTR_READONLY           0x01 | 
|  | #define ATTR_HIDDEN             0x02 | 
|  | #define ATTR_SYSTEM             0x04 | 
|  | #define ATTR_VOLUME             0x08 | 
|  | #define ATTR_DIRECTORY          0x10 | 
|  | #define ATTR_ARCHIVE            0x20 | 
|  | #define ATTR_VSE                0x0f | 
|  |  | 
|  | /* Name format                                                               */ | 
|  | #define EXTCASE                 0x10 | 
|  | #define BASECASE                0x8 | 
|  |  | 
|  | /* Definition of the boot sector                                             */ | 
|  | #define BANNER_LG               8 | 
|  | #define LABEL_LG                11 | 
|  |  | 
|  | typedef struct bootsector | 
|  | { | 
|  | unsigned char jump [3];	/* 0  Jump to boot code                      */ | 
|  | char banner [BANNER_LG];	/* 3  OEM name & version                     */ | 
|  | unsigned short secsiz;	/* 11 Bytes per sector hopefully 512         */ | 
|  | unsigned char clsiz;	/* 13 Cluster size in sectors                */ | 
|  | unsigned short nrsvsect;	/* 14 Number of reserved (boot) sectors      */ | 
|  | unsigned char nfat;		/* 16 Number of FAT tables hopefully 2       */ | 
|  | unsigned short dirents;	/* 17 Number of directory slots              */ | 
|  | unsigned short psect;	/* 19 Total sectors on disk                  */ | 
|  | unsigned char descr;	/* 21 Media descriptor=first byte of FAT     */ | 
|  | unsigned short fatlen;	/* 22 Sectors in FAT                         */ | 
|  | unsigned short nsect;	/* 24 Sectors/track                          */ | 
|  | unsigned short nheads;	/* 26 Heads                                  */ | 
|  | unsigned int nhs;	        /* 28 number of hidden sectors               */ | 
|  | unsigned int bigsect;	/* 32 big total sectors                      */ | 
|  | unsigned char physdrive;	/* 36 physical drive ?                       */ | 
|  | unsigned char reserved;	/* 37 reserved                               */ | 
|  | unsigned char dos4;		/* 38 dos > 4.0 diskette                     */ | 
|  | unsigned int serial;        /* 39 serial number                          */ | 
|  | char label [LABEL_LG];	/* 43 disk label                             */ | 
|  | char fat_type [8];		/* 54 FAT type                               */ | 
|  | unsigned char res_2m;	/* 62 reserved by 2M                         */ | 
|  | unsigned char CheckSum;	/* 63 2M checksum (not used)                 */ | 
|  | unsigned char fmt_2mf;	/* 64 2MF format version                     */ | 
|  | unsigned char wt;		/* 65 1 if write track after format          */ | 
|  | unsigned char rate_0;	/* 66 data transfer rate on track 0          */ | 
|  | unsigned char rate_any;	/* 67 data transfer rate on track<>0         */ | 
|  | unsigned short BootP;	/* 68 offset to boot program                 */ | 
|  | unsigned short Infp0;	/* 70 T1: information for track 0            */ | 
|  | unsigned short InfpX;	/* 72 T2: information for track<>0           */ | 
|  | unsigned short InfTm;	/* 74 T3: track sectors size table           */ | 
|  | unsigned short DateF;	/* 76 Format date                            */ | 
|  | unsigned short TimeF;	/* 78 Format time                            */ | 
|  | unsigned char junk [BOOTSIZE - 80];	/* 80 remaining data                 */ | 
|  | } __attribute__ ((packed)) BootSector_t; | 
|  |  | 
|  | /* Structure d'une entree de repertoire                                      */ | 
|  | typedef struct directory { | 
|  | char name [8];		/* file name                                 */ | 
|  | char ext [3];		/* file extension                            */ | 
|  | unsigned char attr;		/* attribute byte                            */ | 
|  | unsigned char Case;		/* case of short filename                    */ | 
|  | unsigned char reserved [9];	/* ??                                        */ | 
|  | unsigned char time [2];	/* time stamp                                */ | 
|  | unsigned char date [2];	/* date stamp                                */ | 
|  | unsigned short start;	/* starting cluster number                   */ | 
|  | unsigned int size;	        /* size of the file                          */ | 
|  | } __attribute__ ((packed))  Directory_t; | 
|  |  | 
|  |  | 
|  |  | 
|  | #define MAX_VFAT_SUBENTRIES 20 | 
|  | #define VSE_NAMELEN 13 | 
|  |  | 
|  | #define VSE1SIZE 5 | 
|  | #define VSE2SIZE 6 | 
|  | #define VSE3SIZE 2 | 
|  |  | 
|  | #define VBUFSIZE ((MAX_VFAT_SUBENTRIES * VSE_NAMELEN) + 1) | 
|  |  | 
|  | #define MAX_VNAMELEN (255) | 
|  |  | 
|  | #define VSE_PRESENT 0x01 | 
|  | #define VSE_LAST 0x40 | 
|  | #define VSE_MASK 0x1f | 
|  |  | 
|  | /* Flag used by vfat_lookup                                                  */ | 
|  | #define DO_OPEN         1 | 
|  | #define ACCEPT_PLAIN    0x20 | 
|  | #define ACCEPT_DIR      0x10 | 
|  | #define ACCEPT_LABEL    0x08 | 
|  | #define SINGLE          2 | 
|  | #define MATCH_ANY       0x40 | 
|  |  | 
|  | struct vfat_subentry { | 
|  | unsigned char id;		        /* VSE_LAST pour la fin, VSE_MASK    */ | 
|  | /* pour un VSE                       */ | 
|  | char text1 [VSE1SIZE * 2];          /* Caracteres encodes sur 16 bits    */ | 
|  | unsigned char attribute;	        /* 0x0f pour les VFAT                */ | 
|  | unsigned char hash1;		/* toujours 0                        */ | 
|  | unsigned char sum;		        /* Checksum du nom court             */ | 
|  | char text2 [VSE2SIZE * 2];          /* Caracteres encodes sur 16 bits    */ | 
|  | unsigned char sector_l;             /* 0 pour les VFAT                   */ | 
|  | unsigned char sector_u;		/* 0 pour les VFAT                   */ | 
|  | char text3 [VSE3SIZE * 2];          /* Caracteres encodes sur 16 bits    */ | 
|  | } __attribute__ ((packed)) ; | 
|  |  | 
|  | struct vfat_state { | 
|  | char name [VBUFSIZE]; | 
|  | int status;             /* is now a bit map of 32 bits                   */ | 
|  | int subentries; | 
|  | unsigned char sum;      /* no need to remember the sum for each          */ | 
|  | /*   entry, it is the same anyways               */ | 
|  | } __attribute__ ((packed)) ; | 
|  |  | 
|  | /* Conversion macros                                                         */ | 
|  | #define	DOS_YEAR(dir) (((dir)->date[1] >> 1) + 1980) | 
|  | #define	DOS_MONTH(dir) (((((dir)->date[1]&0x1) << 3) + ((dir)->date[0] >> 5))) | 
|  | #define	DOS_DAY(dir) ((dir)->date[0] & 0x1f) | 
|  | #define	DOS_HOUR(dir) ((dir)->time[1] >> 3) | 
|  | #define	DOS_MINUTE(dir) (((((dir)->time[1]&0x7) << 3) + ((dir)->time[0] >> 5))) | 
|  | #define	DOS_SEC(dir) (((dir)->time[0] & 0x1f) * 2) | 
|  |  | 
|  |  | 
|  | #endif | 
|  |  |