embox
1/**
2* @file
3* @brief
4*
5* @date 14.08.2012
6* @author Andrey Gazukin
7*/
8
9#include <stdio.h>10#include <string.h>11#include <stdlib.h>12#include <errno.h>13
14#include <fs/hlpr_path.h>15
16#include "fat.h"17
18int fat_check_filename(char *filename) {19char *point;20int len;21int extlen;22/* filename.ext <= 8 + 3 + dot */23if(MSDOS_NAME + 1 < (len = strlen(filename))) {24return ENAMETOOLONG;25}26point = filename + len;27extlen = 0;28
29/* set point to a dot */30do {31if(*point == '.') {32break;33}34point --;35extlen++;36
37} while (point > filename);38
39if(*point == '.') {40if(extlen > 4) {41/* normal only if name is .filename */42if(point != filename) {43return EINVAL;44}45} else {46if(len - extlen > 8) {47return ENAMETOOLONG;48}49if(1 >= extlen) {50return EINVAL;51}52}53} else if(len > 8) {54return ENAMETOOLONG;55}56return 0;57}
58
59void fat_get_filename(char *tmppath, char *filename) {60char *p;61
62p = tmppath;63/* strip leading path separators */64while (*tmppath == DIR_SEPARATOR){65strcpy((char *) tmppath, (char *) tmppath + 1);66}67while (*(p++));68p--;69while (p > tmppath && *p != DIR_SEPARATOR) {70p--;71}72
73if (*p == DIR_SEPARATOR) {74p++;75}76
77return;78}
79
80void fat_set_filetime(struct fat_dirent *de) {81/* TODO set normal time */82de->crttime_l = 0x20; /* 01:01:00am, Jan 1, 2006. */83de->crttime_h = 0x08;84de->crtdate_l = 0x11;85de->crtdate_h = 0x34;86de->lstaccdate_l = 0x11;87de->lstaccdate_h = 0x34;88de->wrttime_l = 0x20;89de->wrttime_h = 0x08;90de->wrtdate_l = 0x11;91de->wrtdate_h = 0x34;92}
93
94/*
95* Convert a filename element from canonical (8.3) to directory entry (11)
96* form src must point to the first non-separator character.
97* dest must point to a 12-byte buffer.
98*/
99char *path_canonical_to_dir(char *dest, char *src) {100
101memset(dest, (int)' ', MSDOS_NAME);102dest[MSDOS_NAME] = 0;103
104for (int i = 0; i <= 11; i++) {105if (!*src) {106break;107}108if (*src == '/') {109break;110}111if (*src == '.') {112i = 7;113src++;114continue;115}116if (*src >= 'a' && *src <='z') {117*(dest + i) = (*src - 'a') + 'A';118} else {119*(dest + i) = *src;120}121src++;122}123
124return dest;125}
126
127/*
128* Convert a filename element from directory entry (11) to canonical (8.3)
129*/
130char *path_dir_to_canonical(char *dest, char *src, char dir) {131int i;132char *dst;133
134dst = dest;135memset(dest, 0, MSDOS_NAME + 2);136for (i = 0; i < 8; i++) {137if (*src != ' ') {138*dst = *src;139if (*dst >= 'A' && *dst <='Z') {140*dst = (*dst - 'A') + 'a';141}142dst++;143}144src++;145}146if ((*src != ' ') && (0 == dir)) {147*dst++ = '.';148}149for (i = 0; i < 3; i++) {150if (*src != ' ') {151*dst = *src;152if (*dst >= 'A' && *dst <='Z') {153*dst = (*dst - 'A') + 'a';154}155dst++;156}157src++;158}159return dest;160}
161
162
163