
On 07/20/2018 04:57 AM, AKASHI Takahiro wrote:
FAT file system's long file name support is a bit complicated and has some restrictions on its naming. We should be careful about it especially for write as it may easily end up with wrong file system.
normalize_longname() check for the rules and normalize a file name if necessary. Please note, however, that this function is yet to be extended to fully comply with the standard.
Signed-off-by: AKASHI Takahiro takahiro.akashi@linaro.org
The patch has to be rebased on current master due to
fs: fat: cannot write to subdirectories 0dc1bfb7302d220a48364263d5632d6d572b069b
which has been merged into U-Boot master.
fs/fat/fat_write.c | 52 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 8 deletions(-)
diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c index 3b77557b3e..6c715a70f4 100644 --- a/fs/fat/fat_write.c +++ b/fs/fat/fat_write.c @@ -899,6 +899,44 @@ static dir_entry *find_directory_entry(fsdata *mydata, int startsect, return NULL; }
+static int normalize_longname(char *l_filename, const char *filename) +{
- const char *p, legal[] = "!#$%&'()-.@^`_{}~";
The logic below gets simpler if you define the illegal characters like in the aforementioned patch.
Best regards
Heinrich
- char c;
- int name_len;
- /* Check that the filename is valid */
- for (p = filename; p < filename + strlen(filename); p++) {
c = *p;
if (('0' <= c) && (c <= '9'))
continue;
if (('A' <= c) && (c <= 'Z'))
continue;
if (('a' <= c) && (c <= 'z'))
continue;
if (strchr(legal, c))
continue;
/* extended code */
if ((0x80 <= c) && (c <= 0xff))
continue;
return -1;
- }
<snip />