|
|
@ -130,7 +130,7 @@
|
|
|
|
#define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); }
|
|
|
|
#define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* File shareing feature */
|
|
|
|
/* File sharing feature */
|
|
|
|
#if _FS_SHARE
|
|
|
|
#if _FS_SHARE
|
|
|
|
#if _FS_READONLY
|
|
|
|
#if _FS_READONLY
|
|
|
|
#error _FS_SHARE must be 0 on read-only cfg.
|
|
|
|
#error _FS_SHARE must be 0 on read-only cfg.
|
|
|
@ -417,7 +417,7 @@ typedef struct {
|
|
|
|
#define BPB_FSVer 42 /* File system version (2) */
|
|
|
|
#define BPB_FSVer 42 /* File system version (2) */
|
|
|
|
#define BPB_RootClus 44 /* Root dir first cluster (4) */
|
|
|
|
#define BPB_RootClus 44 /* Root dir first cluster (4) */
|
|
|
|
#define BPB_FSInfo 48 /* Offset of FSInfo sector (2) */
|
|
|
|
#define BPB_FSInfo 48 /* Offset of FSInfo sector (2) */
|
|
|
|
#define BPB_BkBootSec 50 /* Offset of backup boot sectot (2) */
|
|
|
|
#define BPB_BkBootSec 50 /* Offset of backup boot sector (2) */
|
|
|
|
#define BS_DrvNum32 64 /* Physical drive number (2) */
|
|
|
|
#define BS_DrvNum32 64 /* Physical drive number (2) */
|
|
|
|
#define BS_BootSig32 66 /* Extended boot signature (1) */
|
|
|
|
#define BS_BootSig32 66 /* Extended boot signature (1) */
|
|
|
|
#define BS_VolID32 67 /* Volume serial number (4) */
|
|
|
|
#define BS_VolID32 67 /* Volume serial number (4) */
|
|
|
@ -448,7 +448,7 @@ typedef struct {
|
|
|
|
#define LDIR_FstClusLO 26 /* Filled by zero (0) */
|
|
|
|
#define LDIR_FstClusLO 26 /* Filled by zero (0) */
|
|
|
|
#define SZ_DIR 32 /* Size of a directory entry */
|
|
|
|
#define SZ_DIR 32 /* Size of a directory entry */
|
|
|
|
#define LLE 0x40 /* Last long entry flag in LDIR_Ord */
|
|
|
|
#define LLE 0x40 /* Last long entry flag in LDIR_Ord */
|
|
|
|
#define DDE 0xE5 /* Deleted directory enrty mark in DIR_Name[0] */
|
|
|
|
#define DDE 0xE5 /* Deleted directory entry mark in DIR_Name[0] */
|
|
|
|
#define NDDE 0x05 /* Replacement of a character collides with DDE */
|
|
|
|
#define NDDE 0x05 /* Replacement of a character collides with DDE */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -593,7 +593,7 @@ void unlock_fs (
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/* File shareing control functions */
|
|
|
|
/* File sharing control functions */
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
#if _FS_SHARE
|
|
|
|
#if _FS_SHARE
|
|
|
|
|
|
|
|
|
|
|
@ -819,7 +819,7 @@ DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, Else:Cluster status
|
|
|
|
BYTE *p;
|
|
|
|
BYTE *p;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (clst < 2 || clst >= fs->n_fatent) /* Chack range */
|
|
|
|
if (clst < 2 || clst >= fs->n_fatent) /* Check range */
|
|
|
|
return 1;
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
|
|
|
|
switch (fs->fs_type) {
|
|
|
|
switch (fs->fs_type) {
|
|
|
@ -1040,7 +1040,7 @@ DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */
|
|
|
|
tbl = fp->cltbl + 1; /* Top of CLMT */
|
|
|
|
tbl = fp->cltbl + 1; /* Top of CLMT */
|
|
|
|
cl = ofs / SS(fp->fs) / fp->fs->csize; /* Cluster order from top of the file */
|
|
|
|
cl = ofs / SS(fp->fs) / fp->fs->csize; /* Cluster order from top of the file */
|
|
|
|
for (;;) {
|
|
|
|
for (;;) {
|
|
|
|
ncl = *tbl++; /* Number of cluters in the fragment */
|
|
|
|
ncl = *tbl++; /* Number of clusters in the fragment */
|
|
|
|
if (!ncl) return 0; /* End of table? (error) */
|
|
|
|
if (!ncl) return 0; /* End of table? (error) */
|
|
|
|
if (cl < ncl) break; /* In this fragment? */
|
|
|
|
if (cl < ncl) break; /* In this fragment? */
|
|
|
|
cl -= ncl; tbl++; /* Next fragment */
|
|
|
|
cl -= ncl; tbl++; /* Next fragment */
|
|
|
@ -1941,7 +1941,7 @@ FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */
|
|
|
|
res = dir_find(dj); /* Find it */
|
|
|
|
res = dir_find(dj); /* Find it */
|
|
|
|
ns = *(dj->fn+NS);
|
|
|
|
ns = *(dj->fn+NS);
|
|
|
|
if (res != FR_OK) { /* Failed to find the object */
|
|
|
|
if (res != FR_OK) { /* Failed to find the object */
|
|
|
|
if (res != FR_NO_FILE) break; /* Abort if any hard error occured */
|
|
|
|
if (res != FR_NO_FILE) break; /* Abort if any hard error occurred */
|
|
|
|
/* Object not found */
|
|
|
|
/* Object not found */
|
|
|
|
if (_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exit */
|
|
|
|
if (_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exit */
|
|
|
|
dj->sclust = 0; dj->dir = 0; /* It is the root dir */
|
|
|
|
dj->sclust = 0; dj->dir = 0; /* It is the root dir */
|
|
|
@ -2059,7 +2059,7 @@ FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */
|
|
|
|
if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */
|
|
|
|
if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */
|
|
|
|
return FR_WRITE_PROTECTED;
|
|
|
|
return FR_WRITE_PROTECTED;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/* Search FAT partition on the drive. Supports only generic partitionings, FDISK and SFD. */
|
|
|
|
/* Search FAT partition on the drive. Supports only generic partitioning, FDISK and SFD. */
|
|
|
|
fmt = check_fs(fs, bsect = 0); /* Check sector 0 if it is a VBR */
|
|
|
|
fmt = check_fs(fs, bsect = 0); /* Check sector 0 if it is a VBR */
|
|
|
|
if (fmt == 1) { /* Not an FAT-VBR, the disk may be partitioned */
|
|
|
|
if (fmt == 1) { /* Not an FAT-VBR, the disk may be partitioned */
|
|
|
|
/* Check the partition listed in top of the partition table */
|
|
|
|
/* Check the partition listed in top of the partition table */
|
|
|
@ -2950,7 +2950,7 @@ FRESULT f_lseek (
|
|
|
|
|
|
|
|
|
|
|
|
#if _FS_MINIMIZE <= 1
|
|
|
|
#if _FS_MINIMIZE <= 1
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/* Create a Directroy Object */
|
|
|
|
/* Create a Directory Object */
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
FRESULT f_opendir (
|
|
|
|
FRESULT f_opendir (
|
|
|
@ -2990,7 +2990,7 @@ FRESULT f_opendir (
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/* Read Directory Entry in Sequense */
|
|
|
|
/* Read Directory Entry in Sequence */
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
FRESULT f_readdir (
|
|
|
|
FRESULT f_readdir (
|
|
|
@ -3297,7 +3297,7 @@ FRESULT f_mkdir (
|
|
|
|
mem_set(dir, 0, SS(dj.fs));
|
|
|
|
mem_set(dir, 0, SS(dj.fs));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */
|
|
|
|
if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directory */
|
|
|
|
if (res != FR_OK) {
|
|
|
|
if (res != FR_OK) {
|
|
|
|
remove_chain(dj.fs, dcl); /* Could not register, remove cluster chain */
|
|
|
|
remove_chain(dj.fs, dcl); /* Could not register, remove cluster chain */
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -3361,7 +3361,7 @@ FRESULT f_chmod (
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/* Change Timestamp */
|
|
|
|
/* Change Time-stamp */
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
|
|
FRESULT f_utime (
|
|
|
|
FRESULT f_utime (
|
|
|
@ -3633,9 +3633,9 @@ FRESULT f_mkfs (
|
|
|
|
return FR_MKFS_ABORTED;
|
|
|
|
return FR_MKFS_ABORTED;
|
|
|
|
|
|
|
|
|
|
|
|
/* Create partition table if required */
|
|
|
|
/* Create partition table if required */
|
|
|
|
if (sfd) { /* No patition table (SFD) */
|
|
|
|
if (sfd) { /* No partition table (SFD) */
|
|
|
|
md = 0xF0;
|
|
|
|
md = 0xF0;
|
|
|
|
} else { /* With patition table (FDISK) */
|
|
|
|
} else { /* With partition table (FDISK) */
|
|
|
|
DWORD n_disk = b_vol + n_vol;
|
|
|
|
DWORD n_disk = b_vol + n_vol;
|
|
|
|
|
|
|
|
|
|
|
|
mem_set(fs->win, 0, SS(fs));
|
|
|
|
mem_set(fs->win, 0, SS(fs));
|
|
|
@ -3785,18 +3785,18 @@ TCHAR* f_gets (
|
|
|
|
#if _LFN_UNICODE /* Read a character in UTF-8 encoding */
|
|
|
|
#if _LFN_UNICODE /* Read a character in UTF-8 encoding */
|
|
|
|
if (c >= 0x80) {
|
|
|
|
if (c >= 0x80) {
|
|
|
|
if (c < 0xC0) continue; /* Skip stray trailer */
|
|
|
|
if (c < 0xC0) continue; /* Skip stray trailer */
|
|
|
|
if (c < 0xE0) { /* Two-byte sequense */
|
|
|
|
if (c < 0xE0) { /* Two-byte sequence */
|
|
|
|
f_read(fil, s, 1, &rc);
|
|
|
|
f_read(fil, s, 1, &rc);
|
|
|
|
if (rc != 1) break;
|
|
|
|
if (rc != 1) break;
|
|
|
|
c = ((c & 0x1F) << 6) | (s[0] & 0x3F);
|
|
|
|
c = ((c & 0x1F) << 6) | (s[0] & 0x3F);
|
|
|
|
if (c < 0x80) c = '?';
|
|
|
|
if (c < 0x80) c = '?';
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
if (c < 0xF0) { /* Three-byte sequense */
|
|
|
|
if (c < 0xF0) { /* Three-byte sequence */
|
|
|
|
f_read(fil, s, 2, &rc);
|
|
|
|
f_read(fil, s, 2, &rc);
|
|
|
|
if (rc != 2) break;
|
|
|
|
if (rc != 2) break;
|
|
|
|
c = (c << 12) | ((s[0] & 0x3F) << 6) | (s[1] & 0x3F);
|
|
|
|
c = (c << 12) | ((s[0] & 0x3F) << 6) | (s[1] & 0x3F);
|
|
|
|
if (c < 0x800) c = '?';
|
|
|
|
if (c < 0x800) c = '?';
|
|
|
|
} else { /* Reject four-byte sequense */
|
|
|
|
} else { /* Reject four-byte sequence */
|
|
|
|
c = '?';
|
|
|
|
c = '?';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -3945,7 +3945,7 @@ int f_printf (
|
|
|
|
case 'D' : /* Signed decimal */
|
|
|
|
case 'D' : /* Signed decimal */
|
|
|
|
case 'U' : /* Unsigned decimal */
|
|
|
|
case 'U' : /* Unsigned decimal */
|
|
|
|
r = 10; break;
|
|
|
|
r = 10; break;
|
|
|
|
case 'X' : /* Hexdecimal */
|
|
|
|
case 'X' : /* Hexadecimal */
|
|
|
|
r = 16; break;
|
|
|
|
r = 16; break;
|
|
|
|
default: /* Unknown type (passthrough) */
|
|
|
|
default: /* Unknown type (passthrough) */
|
|
|
|
cc = f_putc(c, fil); continue;
|
|
|
|
cc = f_putc(c, fil); continue;
|
|
|
|