Changeset 95b730c2 in mainline for tools/mkfat.py


Ignore:
Timestamp:
2008-10-27T19:48:07Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
de4a1cf
Parents:
7a5cdded
Message:

finish mkfat.py
this drops build dependency on mtools

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tools/mkfat.py

    r7a5cdded r95b730c2  
    4949       
    5050        size = 0
    51         files = 0
     51        files = 2
    5252       
    5353        for name in os.listdir(root):
     
    6969        return len(os.listdir(root))
    7070
    71 def write_file(path, outf, cluster_size, data_start, fat):
     71def write_file(path, outf, cluster_size, data_start, fat, reserved_clusters):
    7272        "Store the contents of a file"
    7373       
    7474        size = os.path.getsize(path)
    7575        prev = -1
    76         first = -1
     76        first = 0
    7777       
    7878        inf = file(path, "r")
    7979        rd = 0;
    8080        while (rd < size):
    81                 data = inf.read(cluster_size);
    82                
    8381                empty_cluster = fat.index(0)
    84                
    8582                fat[empty_cluster] = 0xffff
     83               
    8684                if (prev != -1):
    8785                        fat[prev] = empty_cluster
     
    9189                prev = empty_cluster
    9290               
    93                 outf.seek(data_start + empty_cluster * cluster_size)
     91                data = inf.read(cluster_size);
     92                outf.seek(data_start + (empty_cluster - reserved_clusters) * cluster_size)
    9493                outf.write(data)
    9594                rd += len(data)
    9695        inf.close()
     96       
     97        return first, size
     98
     99def write_directory(directory, outf, cluster_size, data_start, fat, reserved_clusters, dirent_size, empty_cluster):
     100        "Store the contents of a directory"
     101       
     102        length = len(directory)
     103        size = length * dirent_size
     104        prev = -1
     105        first = 0
     106       
     107        i = 0
     108        rd = 0;
     109        while (rd < size):
     110                if (prev != -1):
     111                        empty_cluster = fat.index(0)
     112                        fat[empty_cluster] = 0xffff
     113                        fat[prev] = empty_cluster
     114                else:
     115                        first = empty_cluster
     116               
     117                prev = empty_cluster
     118               
     119                data = ''
     120                data_len = 0
     121                while ((i < length) and (data_len < cluster_size)):
     122                        if (i == 0):
     123                                directory[i].cluster = empty_cluster
     124                       
     125                        data += directory[i].pack()
     126                        data_len += dirent_size
     127                        i += 1
     128               
     129                outf.seek(data_start + (empty_cluster - reserved_clusters) * cluster_size)
     130                outf.write(data)
     131                rd += len(data)
    97132       
    98133        return first, size
     
    114149"""
    115150
     151DOT_DIR_ENTRY = """little:
     152        uint8_t signature          /* 0x2e signature */
     153        char name[7]               /* empty */
     154        char ext[3]                /* empty */
     155        uint8_t attr               /* file attributes */
     156        padding[1]                 /* reserved for NT */
     157        uint8_t ctime_fine         /* create time (fine resolution) */
     158        uint16_t ctime             /* create time */
     159        uint16_t cdate             /* create date */
     160        uint16_t adate             /* access date */
     161        padding[2]                 /* EA-index */
     162        uint16_t mtime             /* modification time */
     163        uint16_t mdate             /* modification date */
     164        uint16_t cluster           /* first cluster */
     165        uint32_t size              /* file size */
     166"""
     167
     168DOTDOT_DIR_ENTRY = """little:
     169        uint8_t signature[2]       /* 0x2e signature */
     170        char name[6]               /* empty */
     171        char ext[3]                /* empty */
     172        uint8_t attr               /* file attributes */
     173        padding[1]                 /* reserved for NT */
     174        uint8_t ctime_fine         /* create time (fine resolution) */
     175        uint16_t ctime             /* create time */
     176        uint16_t cdate             /* create date */
     177        uint16_t adate             /* access date */
     178        padding[2]                 /* EA-index */
     179        uint16_t mtime             /* modification time */
     180        uint16_t mdate             /* modification date */
     181        uint16_t cluster           /* first cluster */
     182        uint32_t size              /* file size */
     183"""
     184
    116185def mangle_fname(name):
    117186        # FIXME: filter illegal characters
    118         fname = (name.split('.')[0] + '          ').upper()[0:8]
    119         return fname
     187        parts = name.split('.')
     188       
     189        if (len(parts) > 0):
     190                fname = parts[0]
     191        else:
     192                fname = ''
     193               
     194        return (fname + '          ').upper()[0:8]
    120195
    121196def mangle_ext(name):
    122197        # FIXME: filter illegal characters
    123         ext = (name.split('.')[1] + '  ').upper()[0:3]
    124         return ext
     198        parts = name.split('.')
     199       
     200        if (len(parts) > 1):
     201                ext = parts[1]
     202        else:
     203                ext = ''
     204       
     205        return (ext + '   ').upper()[0:3]
    125206
    126207def create_dirent(name, directory, cluster, size):
     
    142223        dir_entry.mdate = 0 # FIXME
    143224        dir_entry.cluster = cluster
    144         dir_entry.size = size
     225       
     226        if (directory):
     227                dir_entry.size = 0
     228        else:
     229                dir_entry.size = size
    145230       
    146231        return dir_entry
    147232
    148 def recursion(head, root, outf, cluster_size, root_start, data_start, fat):
     233def create_dot_dirent(empty_cluster):
     234        dir_entry = xstruct.create(DOT_DIR_ENTRY)
     235       
     236        dir_entry.signature = 0x2e
     237        dir_entry.name = '       '
     238        dir_entry.ext = '   '
     239        dir_entry.attr = 0x10
     240       
     241        dir_entry.ctime_fine = 0 # FIXME
     242        dir_entry.ctime = 0 # FIXME
     243        dir_entry.cdate = 0 # FIXME
     244        dir_entry.adate = 0 # FIXME
     245        dir_entry.mtime = 0 # FIXME
     246        dir_entry.mdate = 0 # FIXME
     247        dir_entry.cluster = empty_cluster
     248        dir_entry.size = 0
     249       
     250        return dir_entry
     251
     252def create_dotdot_dirent(parent_cluster):
     253        dir_entry = xstruct.create(DOTDOT_DIR_ENTRY)
     254       
     255        dir_entry.signature = [0x2e, 0x2e]
     256        dir_entry.name = '      '
     257        dir_entry.ext = '   '
     258        dir_entry.attr = 0x10
     259       
     260        dir_entry.ctime_fine = 0 # FIXME
     261        dir_entry.ctime = 0 # FIXME
     262        dir_entry.cdate = 0 # FIXME
     263        dir_entry.adate = 0 # FIXME
     264        dir_entry.mtime = 0 # FIXME
     265        dir_entry.mdate = 0 # FIXME
     266        dir_entry.cluster = parent_cluster
     267        dir_entry.size = 0
     268       
     269        return dir_entry
     270
     271def recursion(head, root, outf, cluster_size, root_start, data_start, fat, reserved_clusters, dirent_size, parent_cluster):
    149272        "Recursive directory walk"
    150273       
    151274        directory = []
     275       
     276        if (not head):
     277                # Directory cluster preallocation
     278                empty_cluster = fat.index(0)
     279                fat[empty_cluster] = 0xffff
     280               
     281                directory.append(create_dot_dirent(empty_cluster))
     282                directory.append(create_dotdot_dirent(parent_cluster))
     283        else:
     284                empty_cluster = 0
     285       
    152286        for name in os.listdir(root):
    153287                canon = os.path.join(root, name)
    154288               
    155289                if (os.path.isfile(canon)):
    156                         rv = write_file(canon, outf, cluster_size, data_start, fat)
     290                        rv = write_file(canon, outf, cluster_size, data_start, fat, reserved_clusters)
    157291                        directory.append(create_dirent(name, False, rv[0], rv[1]))
     292               
     293                if (os.path.isdir(canon)):
     294                        rv = recursion(False, canon, outf, cluster_size, root_start, data_start, fat, reserved_clusters, dirent_size, empty_cluster)
     295                        directory.append(create_dirent(name, True, rv[0], rv[1]))
    158296       
    159297        if (head):
     
    161299                for dir_entry in directory:
    162300                        outf.write(dir_entry.pack())
     301        else:
     302                return write_directory(directory, outf, cluster_size, data_start, fat, reserved_clusters, dirent_size, empty_cluster)
    163303
    164304BOOT_SECTOR = """little:
     
    212352       
    213353        fat16_clusters = 4096
     354        min_cluster_size = 1024
    214355       
    215356        sector_size = 512
     
    223364        size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size
    224365        while (size / cluster_size < fat16_clusters):
    225                 if (cluster_size > sector_size):
     366                if (cluster_size > min_cluster_size):
    226367                        cluster_size /= 2
    227368                        size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size
     
    272413        # FAT tables
    273414        for i in range(0, fat_count):
    274                 for j in range(0, boot_sector.fat_sectors):
     415                for j in range(0, fat_size / sector_size):
    275416                        outf.write(empty_sector.pack())
    276417       
     
    287428        fat[1] = 0xffff
    288429       
    289         recursion(True, path, outf, cluster_size, root_start, data_start, fat)
     430        recursion(True, path, outf, cluster_size, root_start, data_start, fat, reserved_clusters, dirent_size, 0)
    290431       
    291432        # Store FAT
Note: See TracChangeset for help on using the changeset viewer.