Changeset 3efe749 in rtems


Ignore:
Timestamp:
Mar 14, 2017, 8:36:07 AM (3 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
master
Children:
1a9483e2
Parents:
063eb574
git-author:
Sebastian Huber <sebastian.huber@…> (03/14/17 08:36:07)
git-committer:
Sebastian Huber <sebastian.huber@…> (03/16/17 14:33:57)
Message:

dosfs: Add and use msdos_lfn_checksum()

Update #2929.

Location:
cpukit/libfs/src/dosfs
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libfs/src/dosfs/msdos.h

    r063eb574 r3efe749  
    483483int msdos_sync(rtems_libio_t *iop);
    484484
     485uint8_t msdos_lfn_checksum(const void *entry);
     486
    485487#ifdef __cplusplus
    486488}
  • cpukit/libfs/src/dosfs/msdos_dir.c

    r063eb574 r3efe749  
    282282                if (lfn_start != FAT_FILE_SHORT_NAME)
    283283                {
    284                     uint8_t  cs = 0;
    285                     uint8_t* p = (uint8_t*) entry;
    286                     int      i;
    287 
    288                     for (i = 0; i < 11; i++, p++)
    289                         cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
    290 
    291                     if (lfn_entries || (lfn_checksum != cs))
     284                    if (lfn_entries ||
     285                        lfn_checksum != msdos_lfn_checksum(entry))
    292286                        lfn_start = FAT_FILE_SHORT_NAME;
    293287
  • cpukit/libfs/src/dosfs/msdos_misc.c

    r063eb574 r3efe749  
    5555const char *const MSDOS_DOT_NAME    = ".          ";
    5656const char *const MSDOS_DOTDOT_NAME = "..         ";
     57
     58uint8_t
     59msdos_lfn_checksum(const void *entry)
     60{
     61    const uint8_t *name;
     62    uint8_t        cs;
     63    int            i;
     64
     65    name = (const uint8_t *) MSDOS_DIR_NAME(entry);
     66    cs = 0;
     67
     68    for (i = 0; i < MSDOS_SHORT_NAME_LEN; ++i) {
     69        cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + name[i];
     70    }
     71
     72    return cs;
     73}
    5774
    5875/* msdos_is_valid_name_char --
     
    15361553                    if (entry_matched)
    15371554                    {
    1538                         uint8_t  cs = 0;
    1539                         uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(entry);
    1540                         int      i;
    1541 
    1542                         for (i = 0; i < MSDOS_SHORT_NAME_LEN; i++, p++)
    1543                             cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
    1544 
    1545                         if (lfn_entry || (lfn_checksum != cs))
     1555                        if (lfn_entry ||
     1556                            lfn_checksum != msdos_lfn_checksum(entry))
    15461557                            entry_matched = false;
    15471558                        else if (filename_size_remaining == 0) {
     
    15621573#if MSDOS_FIND_PRINT
    15631574                        printf ("MSFS:[9.2] checksum, entry_matched:%i, lfn_entry:%i, lfn_checksum:%02x/%02x\n",
    1564                                 entry_matched, lfn_entry, lfn_checksum, cs);
     1575                                entry_matched, lfn_entry, lfn_checksum, msdos_lfn_checksum(entry));
    15651576#endif
    15661577                    } else {
     
    16711682    if (fat_entries)
    16721683    {
    1673         uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(name_dir_entry);
    1674         int      i;
    1675         for (i = 0; i < 11; i++, p++)
    1676             lfn_checksum =
    1677                 ((lfn_checksum & 1) ? 0x80 : 0) + (lfn_checksum >> 1) + *p;
     1684        lfn_checksum = msdos_lfn_checksum(name_dir_entry);
    16781685    }
    16791686
Note: See TracChangeset for help on using the changeset viewer.