Changeset 8f77f8f in rtems


Ignore:
Timestamp:
Mar 30, 2010, 11:16:29 AM (10 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, master
Children:
3f1dd94
Parents:
4a23fa97
Message:

2010-03-30 Chris Johns <chrisj@…>

  • libfs/src/dosfs/msdos_misc.c: Fix PR1491.
Location:
cpukit
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpukit/ChangeLog

    r4a23fa97 r8f77f8f  
     12010-03-30      Chris Johns <chrisj@rtems.org>
     2
     3        * libfs/src/dosfs/msdos_misc.c: Fix PR1491.
     4       
    152010-03-28      Joel Sherrill <joel.sherrill@oarcorp.com>
    26
  • cpukit/libfs/src/dosfs/msdos_misc.c

    r4a23fa97 r8f77f8f  
    2323#include <unistd.h>
    2424#include <string.h>
     25#ifdef HAVE_STRINGS_H
     26#include <strings.h>
     27#endif
    2528#include <assert.h>
    2629#include <rtems/libio_.h>
     
    108111 *
    109112 */
     113#define MSDOS_NAME_TYPE_PRINT 0
    110114static msdos_name_type_t
    111115msdos_name_type(const char *name, int name_len)
     
    121125        msdos_name_type_t type = msdos_is_valid_name_char(*name);
    122126
     127#if MSDOS_NAME_TYPE_PRINT
     128        printf ("MSDOS_NAME_TYPE: c:%02x type:%d\n", *name, type);
     129#endif
     130       
    123131        if ((type == MSDOS_NAME_INVALID) || (type == MSDOS_NAME_LONG))
    124132            return type;
     
    127135        {
    128136            if (is_dot || ((count - dot_at) > 3))
     137            {
     138#if MSDOS_NAME_TYPE_PRINT
     139                printf ("MSDOS_NAME_TYPE: LONG[1]: is_dot:%d, at:%d cnt\n",
     140                        is_dot, dot_at, count);
     141#endif
    129142                return MSDOS_NAME_LONG;
     143            }
    130144        }
    131145        else
    132146        {
    133147            if (count == 8 && !is_dot)
     148            {
     149#if MSDOS_NAME_TYPE_PRINT
     150                printf ("MSDOS_NAME_TYPE: LONG[2]: is_dot:%d, at:%d cnt\n",
     151                        is_dot, dot_at, count);
     152#endif
    134153                return MSDOS_NAME_LONG;
     154            }
    135155        }
    136156
     
    147167
    148168    if (lowercase && uppercase)
     169    {
     170#if MSDOS_NAME_TYPE_PRINT
     171        printf ("MSDOS_NAME_TYPE: LONG[3]\n");
     172#endif
    149173        return MSDOS_NAME_LONG;
    150 
     174    }
     175   
     176#if MSDOS_NAME_TYPE_PRINT
     177    printf ("MSDOS_NAME_TYPE: SHORT[1]\n");
     178#endif
    151179    return MSDOS_NAME_SHORT;
    152180}
     
    162190 *
    163191 */
     192#define MSDOS_L2S_PRINT 0
    164193msdos_name_type_t
    165194msdos_long_to_short(const char *lfn, int lfn_len, char* sfn, int sfn_len)
     
    179208    {
    180209        sfn[0] = '.';
     210#if MSDOS_L2S_PRINT
     211        printf ("MSDOS_L2S: SHORT[1]: lfn:'%s' SFN:'%s'\n", lfn, sfn);
     212#endif
    181213        return MSDOS_NAME_SHORT;
    182214    }
     
    185217    {
    186218        sfn[0] = sfn[1] = '.';
     219#if MSDOS_L2S_PRINT
     220        printf ("MSDOS_L2S: SHORT[2]: lfn:'%s' SFN:'%s'\n", lfn, sfn);
     221#endif
    187222        return MSDOS_NAME_SHORT;
    188223    }
     
    196231
    197232    if (i == lfn_len)
     233    {
     234#if MSDOS_L2S_PRINT
     235        printf ("MSDOS_L2S: INVALID[1]: lfn:'%s' SFN:'%s'\n", lfn, sfn);
     236#endif
    198237        return MSDOS_NAME_INVALID;
     238    }
    199239
    200240    /*
     
    205245
    206246    if (type == MSDOS_NAME_INVALID)
     247    {
     248#if MSDOS_L2S_PRINT
     249        printf ("MSDOS_L2S: INVALID[2]: lfn:'%s' SFN:'%s'\n", lfn, sfn);
     250#endif
    207251        return MSDOS_NAME_INVALID;
     252    }
    208253
    209254    msdos_filename_unix2dos (lfn, lfn_len, sfn);
    210255
     256#if MSDOS_L2S_PRINT
     257    printf ("MSDOS_L2S: TYPE:%d lfn:'%s' SFN:'%s'\n", type, lfn, sfn);
     258#endif
    211259    return type;
    212260}
     
    9901038    bool             lfn_matched = false;
    9911039    uint8_t          lfn_checksum = 0;
    992     int              lfn_entries = 0;
     1040    int              lfn_entries;
    9931041    int              lfn_entry = 0;
    9941042    uint32_t         empty_space_offset = 0;
     
    10061054
    10071055    /*
    1008      * If the file name is long how many short directory
    1009      * entries are needed ?
    1010      */
    1011     if (name_type == MSDOS_NAME_LONG)
    1012         lfn_entries = ((name_len - 1) + MSDOS_LFN_LEN_PER_ENTRY) / MSDOS_LFN_LEN_PER_ENTRY;
     1056     * Set the number of short entries needed to store the LFN. If the name
     1057     * is short still check for possible long entries with the short name.
     1058     *
     1059     * In PR1491 we need to have a LFN for a short file name entry. To
     1060     * test this make this test always fail, ie add "0 &&".
     1061     */
     1062    if (create_node && (name_type == MSDOS_NAME_SHORT))
     1063      lfn_entries = 0;
     1064    else
     1065      lfn_entries =
     1066        ((name_len - 1) + MSDOS_LFN_LEN_PER_ENTRY) / MSDOS_LFN_LEN_PER_ENTRY;
    10131067
    10141068    if (FAT_FD_OF_ROOT_DIR(fat_fd) &&
     
    10211075
    10221076#if MSDOS_FIND_PRINT
    1023     printf ("MSFS:[1] cn:%i ebp:%li bts2rd:%li lfne:%d nl:%i n:%s\n",
    1024             create_node, entries_per_block, bts2rd, lfn_entries, name_len, name);
     1077    printf ("MSFS:[1] nt:%d, cn:%i ebp:%li bts2rd:%li lfne:%d nl:%i n:%s\n",
     1078            name_type, create_node, entries_per_block, bts2rd,
     1079            lfn_entries, name_len, name);
    10251080#endif
    10261081    /*
     
    11471202#if MSDOS_FIND_PRINT
    11481203                    printf ("MSFS:[4.2] lfn:%c entry:%i checksum:%i\n",
    1149                             lfn_start.cln == FAT_FILE_SHORT_NAME ? 't' : 'f',
     1204                            lfn_start.cln == FAT_FILE_SHORT_NAME ? 'f' : 't',
    11501205                            *MSDOS_DIR_ENTRY_TYPE(entry) & MSDOS_LAST_LONG_ENTRY_MASK,
    11511206                            *MSDOS_DIR_LFN_CHECKSUM(entry));
     
    12641319                else
    12651320                {
     1321#if MSDOS_FIND_PRINT
     1322                    printf ("MSFS:[9.1] SFN entry, lfn_matched:%i\n", lfn_matched);
     1323#endif
    12661324                    /*
    12671325                     * SFN entry found.
     
    12831341                        if (lfn_entry || (lfn_checksum != cs))
    12841342                            lfn_matched = false;
     1343#if MSDOS_FIND_PRINT
     1344                        printf ("MSFS:[9.2] checksum, lfn_matched:%i, lfn_entry:%i, lfn_checksum:%02x/%02x\n",
     1345                                lfn_matched, lfn_entry, lfn_checksum, cs);
     1346#endif
    12851347                    }
    12861348
     
    12991361                                 MSDOS_SHORT_NAME_LEN) == 0)))
    13001362                    {
     1363#if MSDOS_FIND_PRINT
     1364                        printf ("MSFS:[9.3] SNF found\n");
     1365#endif
    13011366                        /*
    13021367                         * We get the entry we looked for - fill the position
     
    13601425    if (name_type == MSDOS_NAME_LONG)
    13611426    {
     1427        int      slot = (((empty_space_offset * bts2rd) + empty_space_entry) /
     1428                         MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE) + lfn_entries + 1;
     1429        msdos_short_name_hex(MSDOS_DIR_NAME(name_dir_entry), slot);
     1430    }
     1431
     1432    if (lfn_entries)
     1433    {
    13621434        uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(name_dir_entry);
    13631435        int      i;
    1364         int      slot = (((empty_space_offset * bts2rd) + empty_space_entry) /
    1365                          MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE) + lfn_entries + 1;
    1366 
    1367         msdos_short_name_hex(MSDOS_DIR_NAME(name_dir_entry), slot);
    1368 
    13691436        for (i = 0; i < 11; i++, p++)
    13701437            lfn_checksum =
Note: See TracChangeset for help on using the changeset viewer.