Changeset 65ccd23 in mainline


Ignore:
Timestamp:
2011-06-10T17:17:24Z (13 years ago)
Author:
Oleg Romanenko <romanenko.oleg@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
da2f8d10
Parents:
34fdb75
Message:

Initial support for LFN. Long names could be read from
filesystem through common api: readdir()

Location:
uspace/srv/fs/fat
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/fat/fat_dentry.c

    r34fdb75 r65ccd23  
    219219fat_dentry_clsf_t fat_classify_dentry(const fat_dentry_t *d)
    220220{
    221 /*      if (d->attr == FAT_ATTR_LFN) { */
     221        if (d->attr == FAT_ATTR_LFN) {
    222222                /* long name entry */
    223 /*              if (d->attr & FAT_LFN_ERASED)
     223                if (d->attr & FAT_LFN_ERASED)
    224224                        return FAT_DENTRY_FREE;
    225225                else
    226226                        return FAT_DENTRY_LFN;
    227         }*/
     227        }
    228228        if (d->attr & FAT_ATTR_VOLLABEL) {
    229229                /* volume label entry */
  • uspace/srv/fs/fat/fat_dentry.h

    r34fdb75 r65ccd23  
    8888        FAT_DENTRY_LAST,
    8989        FAT_DENTRY_FREE,
    90         FAT_DENTRY_VALID
    91         /* FAT_DENTRY_LFN */
     90        FAT_DENTRY_VALID,
     91        FAT_DENTRY_LFN
    9292} fat_dentry_clsf_t;
    9393
  • uspace/srv/fs/fat/fat_ops.c

    r34fdb75 r65ccd23  
    5656#include <align.h>
    5757#include <malloc.h>
     58#include <str.h>
    5859
    5960#define FAT_NODE(node)  ((node) ? (fat_node_t *) (node)->data : NULL)
     
    642643                        d = ((fat_dentry_t *)b->data) + j;
    643644                        switch (fat_classify_dentry(d)) {
     645                        case FAT_DENTRY_LFN:
    644646                        case FAT_DENTRY_SKIP:
    645647                        case FAT_DENTRY_VALID:
     
    12191221                unsigned bnum;
    12201222                aoff64_t spos = pos;
    1221                 char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1];
     1223                char name[FAT_LFN_NAME_SIZE];
     1224                uint8_t lfn_utf16[FAT_LFN_MAX_COUNT * FAT_LFN_ENTRY_SIZE];
     1225                size_t lfn_offset;
     1226                size_t lfn_size;
     1227                bool long_entry = false;
     1228                int long_entry_count = 0;
    12221229                fat_dentry_t *d;
     1230                uint8_t checksum=0;
    12231231
    12241232                assert(nodep->type == FAT_DIRECTORY);
     
    12471255                                case FAT_DENTRY_SKIP:
    12481256                                case FAT_DENTRY_FREE:
     1257                                        long_entry_count = 0;
     1258                                        long_entry = false;
    12491259                                        continue;
    12501260                                case FAT_DENTRY_LAST:
     1261                                        long_entry_count = 0;
     1262                                        long_entry = false;
    12511263                                        rc = block_put(b);
    12521264                                        if (rc != EOK)
    12531265                                                goto err;
    12541266                                        goto miss;
     1267                                case FAT_DENTRY_LFN:
     1268                                        if (long_entry) {
     1269                                                /* We found long entry */
     1270                                                long_entry_count--;
     1271                                                if ((FAT_LFN_ORDER(d) == long_entry_count) &&
     1272                                                        (checksum == FAT_LFN_CHKSUM(d))) {
     1273                                                        /* Right order! */
     1274                                                        fat_lfn_copy_entry(d, lfn_utf16, &lfn_offset);
     1275                                                } else {
     1276                                                        /* Something wrong with order. Skip this long entries set */
     1277                                                        long_entry_count = 0;
     1278                                                        long_entry = false;
     1279                                                }
     1280                                        } else {
     1281                                                if (FAT_IS_LFN(d)) {
     1282                                                        /* We found Last long entry! */
     1283                                                        if (FAT_LFN_COUNT(d) <= FAT_LFN_MAX_COUNT) {
     1284                                                                long_entry = true;
     1285                                                                long_entry_count = FAT_LFN_COUNT(d);
     1286                                                                lfn_size = (FAT_LFN_ENTRY_SIZE *
     1287                                                                        (FAT_LFN_COUNT(d) - 1)) + fat_lfn_size(d);
     1288                                                                lfn_offset = lfn_size;
     1289                                                                fat_lfn_copy_entry(d, lfn_utf16, &lfn_offset);
     1290                                                                checksum = FAT_LFN_CHKSUM(d);
     1291                                                        }
     1292                                                }
     1293                                        }
     1294                                        break;
    12551295                                default:
    12561296                                case FAT_DENTRY_VALID:
    1257                                         fat_dentry_name_get(d, name);
     1297                                        if (long_entry &&
     1298                                                (checksum == fat_dentry_chksum(d->name))) {
     1299                                                rc = fat_lfn_convert_name(lfn_utf16, lfn_size, (uint8_t*)name, FAT_LFN_NAME_SIZE);
     1300                                                if (rc!=EOK)
     1301                                                        fat_dentry_name_get(d, name);
     1302                                        }
     1303                                        else
     1304                                                fat_dentry_name_get(d, name);
     1305
     1306                                        long_entry_count = 0;
     1307                                        long_entry = false;
    12581308                                        rc = block_put(b);
    12591309                                        if (rc != EOK)
Note: See TracChangeset for help on using the changeset viewer.