Subversion Repositories NaviCtrl

Rev

Rev 427 | Rev 433 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 427 Rev 431
Line 1089... Line 1089...
1089
        u16     end_of_directory_not_reached = 0;
1089
        u16     end_of_directory_not_reached = 0;
1090
        u8              i = 0;
1090
        u8              i = 0;
1091
        u8      direntry_exist = 0;
1091
        u8      direntry_exist = 0;
1092
        DirEntry_t * dir;
1092
        DirEntry_t * dir;
Line 1093... Line 1093...
1093
 
1093
 
1094
        // if incomming pointers are useless return immediatly
1094
        // incomming pointers are useless?
Line 1095... Line 1095...
1095
        if((!Partition.IsValid) || (file == NULL) || (dirname == NULL)) return(direntry_exist);
1095
        if((!Partition.IsValid) || (file == NULL) || (dirname == NULL)) return(direntry_exist);
1096
 
-
 
-
 
1096
 
1097
        // dir entries can be searched only in filesclusters that have
1097
        // check sector range to be searched
1098
        // a corresponding dir entry with a dir-flag set in its attribute
1098
 
1099
        // or direct within the root directory area
-
 
1100
        file->FirstSectorOfFirstCluster = SECTOR_UNDEFINED;
-
 
1101
        // no current directory exist therefore assume searching in the root
1099
        // no search area defined?
1102
        if(file->DirectorySector == SECTOR_UNDEFINED)
-
 
1103
        {
1100
        if(file->FirstSectorOfFirstCluster == SECTOR_UNDEFINED)
1104
                max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;
1101
        {      
1105
                file->FirstSectorOfFirstCluster = Partition.FirstRootDirSector;
1102
                return(direntry_exist);
1106
        }
1103
        }
1107
        // within the root directory area we can read sectors sequentially until the end of this area
1104
        //is search area the root?
1108
        else if((Partition.FirstRootDirSector <= file->DirectorySector) && (file->DirectorySector < Partition.FirstDataSector))
1105
        else if(Partition.FirstRootDirSector == file->FirstSectorOfFirstCluster)
1109
        {
1106
        {
1110
                max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;
1107
                max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR; // limit to  size of root 
1111
                file->FirstSectorOfFirstCluster = Partition.FirstRootDirSector;
1108
                file->DirectorySector = SECTOR_UNDEFINED; // if we have to search within the root, there is no corresponding directory entry available
1112
        }
1109
        }
1113
        // within the data clusters we can read sectors sequentially only within the cluster
1110
        // is search area within the data cluster range?
1114
        else if((Partition.FirstDataSector <= file->DirectorySector) && (file->DirectorySector <= Partition.LastDataSector))
1111
        else if((Partition.FirstDataSector <= file->FirstSectorOfFirstCluster) && (file->FirstSectorOfFirstCluster <= Partition.LastDataSector))
1115
        {
1112
        {
1116
                max_dir_sector = Partition.SectorsPerCluster;                           // limit max sectors before next cluster
-
 
1117
        }
1113
                max_dir_sector = Partition.SectorsPerCluster;                           // limit max sectors before next cluster
1118
        else return (direntry_exist); // bad sector range for directory sector of the file
1114
                /*
1119
        // if search area is not defined yet, i.e. not in the root directory area
-
 
1120
        if(file->FirstSectorOfFirstCluster == SECTOR_UNDEFINED)
-
 
1121
        {
-
 
1122
                // check if the directory entry of current file is existent and has the dir-flag set
-
 
1123
                file->SectorInCache = file->DirectorySector;                            // update the sector number of file cache.
1115
                //there must be a corresponding directory entry
1124
                if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
1116
                if(file->DirectorySector == SECTOR_UNDEFINED)
1125
                {
-
 
1126
                        Fat16_Deinit();
1117
                {
1127
                        return(0);
1118
                        return (direntry_exist);       
1128
                }
-
 
1129
                dir = (DirEntry_t *)file->Cache;                                                        // set pointer to directory
1119
                }
-
 
1120
                else // check directory entry
-
 
1121
                {
-
 
1122
                        file->SectorInCache = file->DirectorySector;                            // update the sector number of file cache.
-
 
1123
                        if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
-
 
1124
                        {
-
 
1125
                                Fat16_Deinit();
-
 
1126
                                return (direntry_exist);
-
 
1127
                        }
-
 
1128
                        dir = (DirEntry_t *)file->Cache;                                                        // set pointer to directory
1130
                switch((u8)dir[file->DirectoryIndex].Name[0])                           // check if current directory exist
1129
                        switch((u8)dir[file->DirectoryIndex].Name[0])                           // check if current directory exist
1131
                {
1130
                        {
1132
                        case SLOT_EMPTY:
1131
                                case SLOT_EMPTY:
1133
                        case SLOT_DELETED:
1132
                                case SLOT_DELETED:
1134
                                // the directrory pointer of this file points to a deleted or not existen directory
1133
                                        // the directrory pointer of this file points to a deleted or not existen directory
1135
                                // therefore no file or subdirectory exist here
1134
                                        // therefore no file or subdirectory exist here
1136
                                return (direntry_exist);
1135
                                        return(direntry_exist);
1137
                                break;
1136
                                        break;
1138
                        default:        // and is a real directory
1137
                                default:        // and is a real directory
1139
                                if((dir[file->DirectoryIndex].Attribute & ATTR_SUBDIRECTORY) != ATTR_SUBDIRECTORY)
1138
                                        if((dir[file->DirectoryIndex].Attribute & ATTR_SUBDIRECTORY) != ATTR_SUBDIRECTORY)
1140
                                {       // current file is not a directory therefore no file or subdirectory can be created here
1139
                                        {       // current file is not a directory therefore no file or subdirectory can be searched here
1141
                                        return (direntry_exist);
1140
                                                return(direntry_exist);
1142
                                }
1141
                                        }
-
 
1142
                                        break;
1143
                                break;
1143
                        }
-
 
1144
                        // check that search area matches directory entry
-
 
1145
                        if(file->FirstSectorOfFirstCluster != Fat16ClusterToSector(dir[file->DirectoryIndex].StartCluster))
-
 
1146
                        {
-
 
1147
                                return (direntry_exist);        
-
 
1148
                        }
1144
                }
1149
                       
-
 
1150
                } */
-
 
1151
        }
1145
                file->FirstSectorOfFirstCluster = Fat16ClusterToSector(dir[file->DirectoryIndex].StartCluster);
1152
        else return (direntry_exist); // bad sector range for search area
1146
        }
1153
       
1147
        // update current file data area position to start of first cluster
1154
        // update current file data area position to start of first cluster
1148
        file->FirstSectorOfCurrCluster  = file->FirstSectorOfFirstCluster;
1155
        file->FirstSectorOfCurrCluster  = file->FirstSectorOfFirstCluster;
Line 1157... Line 1164...
1157
                        curr_sector = file->FirstSectorOfCurrCluster + dir_sector;      // calculate sector number
1164
                        curr_sector = file->FirstSectorOfCurrCluster + dir_sector;      // calculate sector number
1158
                        file->SectorInCache = curr_sector;                                                      // upate the sector number of file cache.
1165
                        file->SectorInCache = curr_sector;                                                      // upate the sector number of file cache.
1159
                        if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read the sector
1166
                        if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read the sector
1160
                        {
1167
                        {
1161
                                Fat16_Deinit();
1168
                                Fat16_Deinit();
1162
                                return(0);
1169
                                return(direntry_exist);
1163
                        }
1170
                        }
1164
                        dir = (DirEntry_t *)file->Cache;                                                        // set pointer to directory
1171
                        dir = (DirEntry_t *)file->Cache;                                                        // set pointer to directory
1165
                        // search all directory entries within that sector
1172
                        // search all directory entries within that sector
1166
                        for(dir_entry = 0; dir_entry < DIRENTRIES_PER_SECTOR; dir_entry++)
1173
                        for(dir_entry = 0; dir_entry < DIRENTRIES_PER_SECTOR; dir_entry++)
1167
                        {   // check for existing dir entry
1174
                        {   // check for existing dir entry
Line 1198... Line 1205...
1198
                // if we are seaching in the data area and the file not found in this cluster so take next cluster.
1205
                // if we are seaching in the data area and the file not found in this cluster so take next cluster.
1199
                if(!direntry_exist && ( Partition.FirstDataSector <= file->FirstSectorOfCurrCluster))
1206
                if(!direntry_exist && ( Partition.FirstDataSector <= file->FirstSectorOfCurrCluster))
1200
                {
1207
                {
1201
                        end_of_directory_not_reached = GetNextCluster(file);  // updates File->FirstSectorOfCurrCluster
1208
                        end_of_directory_not_reached = GetNextCluster(file);  // updates File->FirstSectorOfCurrCluster
1202
                }
1209
                }
1203
        }while((end_of_directory_not_reached) && (!direntry_exist)); // repeat until a next cluster exist an no
1210
        }while((end_of_directory_not_reached) && (!direntry_exist)); // repeat until a next cluster exist an no match has been found
1204
        return(direntry_exist);
1211
        return(direntry_exist);
1205
}
1212
}
Line 1206... Line 1213...
1206
 
1213
 
Line 1221... Line 1228...
1221
        u16 end_of_directory_not_reached = 0;
1228
        u16 end_of_directory_not_reached = 0;
1222
        u8      i                       = 0;
1229
        u8      i                       = 0;
1223
        u8      retvalue        = 0;
1230
        u8      retvalue        = 0;
1224
        DirEntry_t *dir;
1231
        DirEntry_t *dir;
Line -... Line 1232...
-
 
1232
 
1225
 
1233
        // incomming pointers are useless?
1226
        if((!Partition.IsValid) || (file == NULL) || (dirname == NULL)) return (retvalue);
-
 
Line 1227... Line 1234...
1227
        // It is not checked here that the dir entry that should be created is already existent!
1234
        if((!Partition.IsValid) || (file == NULL) || (dirname == NULL)) return(retvalue);
1228
 
-
 
Line 1229... Line -...
1229
        // Dir entries can be created only in file-clusters that have
-
 
1230
        // the dir-flag set in its attribute or within the root directory
1235
 
1231
 
1236
        // check sector range to be searched
1232
        file->FirstSectorOfFirstCluster = SECTOR_UNDEFINED;
-
 
1233
        // no current directory exist therefore assume creating in the root
-
 
1234
        if(file->DirectorySector == SECTOR_UNDEFINED)
-
 
1235
        {
-
 
1236
                max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;
-
 
1237
                dircluster = 0;
-
 
1238
                file->FirstSectorOfFirstCluster = Partition.FirstRootDirSector;
-
 
1239
        }
1237
 
1240
        // within the root directory area we can read sectors sequentially until the end of this area
-
 
1241
        else if((Partition.FirstRootDirSector <= file->DirectorySector) && (file->DirectorySector < Partition.FirstDataSector))
1238
        // no creation area defined?
1242
        {
-
 
1243
                max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;
1239
        if(file->FirstSectorOfFirstCluster == SECTOR_UNDEFINED)
1244
                dircluster = 0;
1240
        {      
1245
                file->FirstSectorOfFirstCluster = Partition.FirstRootDirSector;
1241
                return(retvalue);
1246
        }
1242
        }
1247
        // within the data clusters we can read sectors sequentially only within the cluster
1243
        //is creation area the root?
1248
        else if((Partition.FirstDataSector <= file->DirectorySector) && (file->DirectorySector <= Partition.LastDataSector))
1244
        else if(Partition.FirstRootDirSector == file->FirstSectorOfFirstCluster)
1249
        {
1245
        {
1250
                max_dir_sector = Partition.SectorsPerCluster;
-
 
1251
                file->FirstSectorOfFirstCluster = Partition.CurrentWorkingDirectory;
1246
                max_dir_sector = (Partition.MaxRootEntries * DIRENTRY_SIZE)/BYTES_PER_SECTOR;  // limit to  size of root 
1252
        }
1247
                file->DirectorySector = SECTOR_UNDEFINED; // if we have to search within the root, there is no corresponding directory entry available
1253
        else return (retvalue); // bad sector range for directory sector of the file
1248
        }
1254
        // if search area is not defined yet
1249
        // is creation area within the data cluster range?
1255
        if(file->FirstSectorOfFirstCluster == SECTOR_UNDEFINED)
1250
        else if((Partition.FirstDataSector <= file->FirstSectorOfFirstCluster) && (file->FirstSectorOfFirstCluster <= Partition.LastDataSector))
1256
        {
1251
        {
1257
            // check if the directory entry of current file is existent and has the dir-flag set
1252
                max_dir_sector = Partition.SectorsPerCluster;                                   // limit max sectors before next cluster
1258
                file->SectorInCache = file->DirectorySector;                            // update the sector number of file cache.
-
 
1259
                if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
1253
                // there must be a corresponding directory entry
1260
                {
1254
                if(file->DirectorySector == SECTOR_UNDEFINED)
1261
                        Fat16_Deinit();
1255
                {
1262
                        return(0);
-
 
1263
                }
1256
                        return (retvalue);     
-
 
1257
                }
-
 
1258
                else // check directory entry
-
 
1259
                {
-
 
1260
                        file->SectorInCache = file->DirectorySector;                            // update the sector number of file cache.
-
 
1261
                        if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache)) // read in the sector.
-
 
1262
                        {
-
 
1263
                                Fat16_Deinit();
-
 
1264
                                return (retvalue);
-
 
1265
                        }
1264
                dir = (DirEntry_t *)file->Cache;                                                        // set pointer to directory
1266
                        dir = (DirEntry_t *)file->Cache;                                                        // set pointer to directory
1265
                switch((u8)dir[file->DirectoryIndex].Name[0])                           // check if current directory exist
1267
                        switch((u8)dir[file->DirectoryIndex].Name[0])                           // check if current directory exist
-
 
1268
                        {
-
 
1269
                                case SLOT_EMPTY:
1266
                {
1270
                                case SLOT_DELETED:
1267
                        case SLOT_EMPTY:
1271
                                        // the directrory pointer of this file points to a deleted or not existen directory
1268
                        case SLOT_DELETED:
1272
                                        // therefore no file or subdirectory exist here
1269
                                return (retvalue);
1273
                                        return(retvalue);
1270
                                break;
1274
                                        break;
1271
                        default:        // and is a real directory
1275
                                default:        // and is a real directory
1272
                                if((dir[file->DirectoryIndex].Attribute & ATTR_SUBDIRECTORY) != ATTR_SUBDIRECTORY)
1276
                                        if((dir[file->DirectoryIndex].Attribute & ATTR_SUBDIRECTORY) != ATTR_SUBDIRECTORY)
1273
                                {       // current file is not a directory therefore no file or subdirectory can be created here
1277
                                        {       // current file is not a directory therefore no file or subdirectory can be created here
-
 
1278
                                                return(retvalue);
-
 
1279
                                        }
-
 
1280
                                        break;
-
 
1281
                        }
-
 
1282
                        // check that search area matches directory entry
-
 
1283
                        if(file->FirstSectorOfFirstCluster != Fat16ClusterToSector(dir[file->DirectoryIndex].StartCluster))
1274
                                        return (retvalue);
1284
                        {
1275
                                }
-
 
1276
                                break;
-
 
1277
                }
1285
                                return (retvalue);      
-
 
1286
                        }
Line 1278... Line 1287...
1278
                dircluster = dir[file->DirectoryIndex].StartCluster;
1287
                }
1279
                file->FirstSectorOfFirstCluster = Fat16ClusterToSector(dircluster);
1288
        }
1280
        }
1289
        else return(retvalue); // bad sector range for search area
1281
 
1290
 
1282
        // if the new direntry is a subdirectory
1291
        // if the new directory entry is a subdirectory
1283
        if((attrib & ATTR_SUBDIRECTORY) == ATTR_SUBDIRECTORY)
1292
        if((attrib & ATTR_SUBDIRECTORY) == ATTR_SUBDIRECTORY)
Line 1299... Line 1308...
1299
                        curr_sector = file->FirstSectorOfCurrCluster + dir_sector;      // calculate sector number
1308
                        curr_sector = file->FirstSectorOfCurrCluster + dir_sector;      // calculate sector number
1300
                        file->SectorInCache = curr_sector;                                                      // update the sector number of file cache.
1309
                        file->SectorInCache = curr_sector;                                                      // update the sector number of file cache.
1301
                        if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
1310
                        if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
1302
                        {
1311
                        {
1303
                                Fat16_Deinit();
1312
                                Fat16_Deinit();
1304
                                return(0);
1313
                                return(retvalue);
1305
                        }
1314
                        }
Line 1306... Line 1315...
1306
 
1315
 
1307
                        dir = (DirEntry_t *)file->Cache;                                                        // set pointer to directory
1316
                        dir = (DirEntry_t *)file->Cache;                                                        // set pointer to directory
1308
                        // search all directory entries of a sector
1317
                        // search all directory entries of a sector
Line 1325... Line 1334...
1325
                                        dir[dir_entry].StartCluster = subdircluster;                                            // copy the location of the first datacluster to the directoryentry.
1334
                                        dir[dir_entry].StartCluster = subdircluster;                                            // copy the location of the first datacluster to the directoryentry.
1326
                                        dir[dir_entry].Size             = 0;                                                                    // the new createted file has no content yet.
1335
                                        dir[dir_entry].Size             = 0;                                                                    // the new createted file has no content yet.
1327
                                        if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache))       // write back to card
1336
                                        if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache))       // write back to card
1328
                                        {
1337
                                        {
1329
                                                Fat16_Deinit();
1338
                                                Fat16_Deinit();
1330
                                                return(0);
1339
                                                return(retvalue);
1331
                                        }
1340
                                        }
1332
                                        file->FirstSectorOfFirstCluster = Fat16ClusterToSector(subdircluster);  // Calculate absolute sectorposition of first datacluster.
1341
                                        file->FirstSectorOfFirstCluster = Fat16ClusterToSector(subdircluster);  // Calculate absolute sectorposition of first datacluster.
1333
                                        file->FirstSectorOfCurrCluster  = file->FirstSectorOfFirstCluster;      // Start reading the file with the first sector of the first datacluster.
1342
                                        file->FirstSectorOfCurrCluster  = file->FirstSectorOfFirstCluster;      // Start reading the file with the first sector of the first datacluster.
1334
                                        file->SectorOfCurrCluster               = 0;                                                            // reset sector of cureen cluster
1343
                                        file->SectorOfCurrCluster               = 0;                                                            // reset sector of cureen cluster
1335
                                        file->ByteOfCurrSector                  = 0;                                                            // reset the byte location within the current sector
1344
                                        file->ByteOfCurrSector                  = 0;                                                            // reset the byte location within the current sector
Line 1343... Line 1352...
1343
                                                ClearCurrCluster(file); // fill cluster with zeros
1352
                                                ClearCurrCluster(file); // fill cluster with zeros
1344
                                                file->SectorInCache = file->FirstSectorOfFirstCluster;
1353
                                                file->SectorInCache = file->FirstSectorOfFirstCluster;
1345
                                                if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
1354
                                                if(SD_SUCCESS != SDC_GetSector(file->SectorInCache, file->Cache))// read in the sector.
1346
                                                {
1355
                                                {
1347
                                                        Fat16_Deinit();
1356
                                                        Fat16_Deinit();
1348
                                                        return(0);
1357
                                                        return(retvalue);
1349
                                                }
1358
                                                }
1350
                                                dir = (DirEntry_t *)file->Cache;
1359
                                                dir = (DirEntry_t *)file->Cache;
1351
                                                // create direntry "." to current dir
1360
                                                // create direntry "." to current dir
1352
                                                dir[0].Name[0] = 0x2E;
1361
                                                dir[0].Name[0] = 0x2E;
1353
                                                for(i = 1; i < 11; i++) dir[0].Name[i] = ' ';
1362
                                                for(i = 1; i < 11; i++) dir[0].Name[i] = ' ';
Line 1362... Line 1371...
1362
                                                dir[1].StartCluster = dircluster;
1371
                                                dir[1].StartCluster = dircluster;
1363
                                                dir[1].Size = 0;
1372
                                                dir[1].Size = 0;
1364
                                                if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache))// read in the sector.
1373
                                                if(SD_SUCCESS != SDC_PutSector(file->SectorInCache, file->Cache))// read in the sector.
1365
                                                {
1374
                                                {
1366
                                                        Fat16_Deinit();
1375
                                                        Fat16_Deinit();
1367
                                                        return(0);
1376
                                                        return(retvalue);
1368
                                                }
1377
                                                }
1369
                                        }
1378
                                        }
1370
                                        retvalue = 1;
1379
                                        retvalue = 1;
1371
                                        dir_entry = DIRENTRIES_PER_SECTOR;      // stop for-loop
1380
                                        dir_entry = DIRENTRIES_PER_SECTOR;      // stop for-loop
1372
                                }
1381
                                }
Line 1400... Line 1409...
1400
{
1409
{
1401
        DirEntry_t *DirectoryEntry = NULL;
1410
        DirEntry_t *DirectoryEntry = NULL;
1402
        u8 retval = 0;
1411
        u8 retval = 0;
Line 1403... Line 1412...
1403
 
1412
 
-
 
1413
        if((!Partition.IsValid) || (file == NULL)) return (retval);
-
 
1414
        // valid directory sector?
1404
        if((!Partition.IsValid) || (file == NULL)) return (retval);
1415
        if((Partition.FirstRootDirSector <= file->DirectorySector) && (file->DirectorySector < Partition.LastDataSector))
1405
 
1416
        {
1406
        // try to  read the sector containing the directoryentry of the file to be deleted 
1417
                // try to  read the sector containing the directory entry of the file to be deleted 
1407
        if(SD_SUCCESS != SDC_GetSector((u32) file->DirectorySector,file->Cache)) return(retval);
1418
                if(SD_SUCCESS != SDC_GetSector((u32) file->DirectorySector,file->Cache)) return(retval);
1408
        // get access to the elements of the directoryentry
1419
                // get access to the elements of the directoryentry
1409
        DirectoryEntry = (DirEntry_t *)file->Cache;
1420
                DirectoryEntry = (DirEntry_t *)file->Cache;
1410
        // delete the directoryentry
1421
                // delete the directoryentry
1411
        DirectoryEntry[file->DirectoryIndex].Name[0] = SLOT_DELETED;
1422
                DirectoryEntry[file->DirectoryIndex].Name[0] = SLOT_DELETED;
1412
        DirectoryEntry[file->DirectoryIndex].Attribute = 0;
1423
                DirectoryEntry[file->DirectoryIndex].Attribute = 0;
1413
        DirectoryEntry[file->DirectoryIndex].Size = 0;
1424
                DirectoryEntry[file->DirectoryIndex].Size = 0;
1414
        // the file has been deleted from the directory, save the modified sector back to the filesystem 
1425
                // the file has been deleted from the directory, save the modified sector back to the filesystem 
-
 
1426
                if(SD_SUCCESS == SDC_PutSector((u32) file->DirectorySector,file->Cache)) retval = 1;
1415
        if(SD_SUCCESS == SDC_PutSector((u32) file->DirectorySector,file->Cache)) retval = 1;
1427
        }
1416
        return(retval);
1428
        return(retval);
Line 1417... Line 1429...
1417
}
1429
}
1418
 
1430
 
Line 1434... Line 1446...
1434
        // if incomming pointers are useless return immediatly
1446
        // if incomming pointers are useless return immediatly
1435
        if ((filename == NULL) || (file == NULL) || (!Partition.IsValid)) return 0;
1447
        if ((filename == NULL) || (file == NULL) || (!Partition.IsValid)) return 0;
Line 1436... Line 1448...
1436
 
1448
 
1437
        // trace along the filepath
1449
        // trace along the filepath
1438
        path = (s8*)filename;                                                           // start at the beginning of the filename string
1450
        path = (s8*)filename;                                                           // start at the beginning of the filename string
1439
        file->DirectoryIndex = 0;
1451
        file->DirectoryIndex = 0;                                                       // start search at first dir entry of cluster
1440
        if(path[0] == '/') // if a path begins  with a '/' the search starts at RootDirectory with file search
1452
        if(path[0] == '/') // if a path begins  with a '/' the search starts at RootDirectory with file search
1441
        {
1453
        {
1442
                file->DirectorySector = Partition.FirstRootDirSector;   // start at RootDirectory with file search      
1454
                file->FirstSectorOfFirstCluster = Partition.FirstRootDirSector;         // start at RootDirectory with file search      
1443
        }
1455
        }
1444
        else // if a path begins not with a '/' the search starts relative to the CWD
1456
        else // if a path begins not with a '/' the search starts relative to the CWD
1445
        {
1457
        {
1446
                file->DirectorySector = Partition.CurrentWorkingDirectory;
1458
                file->FirstSectorOfFirstCluster = Partition.CurrentWorkingDirectory;
1447
        }
1459
        }
1448
        // as long as the file was not found and the remaining path is not empty
1460
        // as long as the file was not found and the remaining path is not empty
1449
        while((*path != 0) && !file_exist)
1461
        while((*path != 0) && !file_exist)
1450
        {       // separate dirname and subpath from filepath string
1462
        {       // separate dirname and subpath from filepath string
Line 1461... Line 1473...
1461
                                af = ATTR_SUBDIRECTORY;
1473
                                af = ATTR_SUBDIRECTORY;
1462
                                am = ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL;
1474
                                am = ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL;
1463
                        }
1475
                        }
1464
                        if(!DirectoryEntryExist(dirname, af, am, file))
1476
                        if(!DirectoryEntryExist(dirname, af, am, file))
1465
                        {
1477
                        {
1466
                                return (file_exist); // subdirectory does not exist
1478
                                return(file_exist); // subdirectory does not exist
1467
                        }
1479
                        }
1468
                        else
1480
                        else
1469
                        {
1481
                        {
1470
                                if (*subpath == 0)
1482
                                if (*subpath == 0)
1471
                                {
1483
                                {
Line 1473... Line 1485...
1473
                                }
1485
                                }
1474
                        }
1486
                        }
1475
                }
1487
                }
1476
                else // error seperating the subpath
1488
                else // error seperating the subpath
1477
                {
1489
                {
1478
                        return file_exist; // bad subdir format
1490
                        return(file_exist); // bad subdir format
1479
                }
1491
                }
1480
                path = subpath;
1492
                path = subpath;
1481
                subpath = 0;
1493
                subpath = 0;
1482
        }
1494
        }
1483
        return (file_exist);
1495
        return(file_exist);
1484
}
1496
}
Line 1485... Line 1497...
1485
 
1497
 
1486
 
1498
 
Line 1497... Line 1509...
1497
{
1509
{
1498
        s8 *path = 0;
1510
        s8 *path = 0;
1499
        s8 *subpath = 0;
1511
        s8 *subpath = 0;
1500
        u8 af, am, file_created = 0;
1512
        u8 af, am, file_created = 0;
1501
        s8 dirname[12];
1513
        s8 dirname[12];
-
 
1514
        s8 txt[60];
-
 
1515
        u8 i=0;
Line 1502... Line 1516...
1502
 
1516
 
1503
        // if incomming pointers are useless return immediatly
1517
        // if incomming pointers are useless return immediatly
Line 1504... Line 1518...
1504
        if ((filename == NULL) || (file == NULL) || (!Partition.IsValid)) return(0);
1518
        if ((filename == NULL) || (file == NULL) || (!Partition.IsValid)) return(0);
1505
 
1519
 
Line 1506... Line 1520...
1506
        // trace along the filepath
1520
        // trace along the filepath
1507
        path = (s8*)filename;
1521
        path = (s8*)filename;
1508
 
1522
 
1509
        if(path[0] == '/') // if a path begins  with a '/' the search starts at RootDirectory with file search
1523
        if(path[0] == '/') // if a path begins  with a '/' the search starts at RootDirectory with file search
1510
        {
1524
        {
1511
                file->DirectorySector = Partition.FirstRootDirSector;   // start at RootDirectory with file search      
1525
                file->FirstSectorOfFirstCluster = Partition.FirstRootDirSector;         // start at RootDirectory with file search      
1512
        }
1526
        }
1513
        else // if a path begins not with a '/' the search starts relative to the CWD
1527
        else // if a path begins not with a '/' the search starts relative to the CWD
1514
        {
1528
        {
Line 1515... Line 1529...
1515
                file->DirectorySector = Partition.CurrentWorkingDirectory;
1529
                file->FirstSectorOfFirstCluster = Partition.CurrentWorkingDirectory;
1516
        }
1530
        }
Line 1539... Line 1553...
1539
                                {       // could not be created
1553
                                {       // could not be created
1540
                                        return(file_created);
1554
                                        return(file_created);
1541
                                }
1555
                                }
1542
                                else if(*subpath == 0) file_created = 1; // last element of path chain was created
1556
                                else if(*subpath == 0) file_created = 1; // last element of path chain was created
1543
                        }
1557
                        }
-
 
1558
                        sprintf(txt+i, "s:%06d",file->FirstSectorOfFirstCluster);
-
 
1559
                        i+=8;
1544
                }
1560
                }
1545
                else // error seperating the subpath
1561
                else // error seperating the subpath
1546
                {
1562
                {
1547
                        return file_created; // bad subdir format
1563
                        return(file_created); // bad subdir format
1548
                }
1564
                }
1549
                path = subpath;
1565
                path = subpath;
1550
                subpath = NULL;
1566
                subpath = NULL;
1551
        }
1567
        }
-
 
1568
        Debug(txt);
1552
        return (file_created);
1569
        return(file_created);
1553
}
1570
}
Line 1554... Line 1571...
1554
 
1571
 
1555
 
1572
 
Line 2161... Line 2178...
2161
        File_t file;
2178
        File_t file;
Line 2162... Line 2179...
2162
 
2179
 
2163
        if(filepath == NULL) return(0);
2180
        if(filepath == NULL) return(0);
2164
        // correct filepath formatting
2181
        // correct filepath formatting
-
 
2182
        Slashing_Path(filepath);
-
 
2183
        file.FirstSectorOfFirstCluster = SECTOR_UNDEFINED;              // First sector of the first cluster of the file.
-
 
2184
        file.FirstSectorOfCurrCluster = SECTOR_UNDEFINED;               // First sector of the cluster which is edited at the moment.
-
 
2185
        file.FirstSectorOfLastCluster = SECTOR_UNDEFINED;               // First sector of the last cluster of the file
-
 
2186
        file.SectorOfCurrCluster = SECTOR_UNDEFINED;                    // The sector within the current cluster.
-
 
2187
        file.ByteOfCurrSector = 0;                                                              // The byte location within the current sector.
-
 
2188
        file.Mode = 0;                                                                                  // Mode of fileoperation (read,write)
-
 
2189
        file.Size = 0;                                                                                  // The size of the opend file in bytes.
-
 
2190
        file.Position = 0;                                                                              // Pointer to a character within the file 0 < fileposition < filesize
-
 
2191
        file.DirectorySector = SECTOR_UNDEFINED;                                // the sectorposition where the directoryentry has been made.
-
 
2192
        file.DirectoryIndex = 0;                                                                // The index to the directoryentry within the specified sector.
-
 
2193
        file.Attribute = 0;                                                                             // The attribute of the file opened.
-
 
2194
        file.SectorInCache = SECTOR_UNDEFINED;                                  // The last sector read, which is still in the sector cache.
-
 
2195
        file.State = FSTATE_USED;                                                               // mark it as used
2165
        Slashing_Path(filepath);
2196
       
2166
        // if file is existent
2197
        // if file is existent
2167
        if(FileExist(filepath, ATTR_NONE, ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL, &file))
2198
        if(FileExist(filepath, ATTR_NONE, ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL, &file))
2168
        {
2199
        {
2169
                // and is not marked as readonly?
2200
                // and is not marked as readonly?
Line 2683... Line 2714...
2683
                {
2714
                {
2684
                        retvalue = 0;
2715
                        retvalue = 0;
2685
                        // we have modified the result of the findfirst_ operation therefore we have to redo findfirst_ to get detailed infos about the directory entry to be deleted
2716
                        // we have modified the result of the findfirst_ operation therefore we have to redo findfirst_ to get detailed infos about the directory entry to be deleted
2686
                        if(findfirst_(dn, 0xff, &fe))
2717
                        if(findfirst_(dn, 0xff, &fe))
2687
                        {
2718
                        {
-
 
2719
                                Debug("found");
2688
                                // try to clear the allocated clusters within the fat
2720
                                // try to clear the allocated clusters within the fat
2689
                                if(DeleteClusterChain(fe.fp.FirstSectorOfFirstCluster))
2721
                                if(DeleteClusterChain(fe.fp.FirstSectorOfFirstCluster))
2690
                                {
2722
                                {
2691
                                        // delete the directoryentry within the specified directory
2723
                                        // delete the directoryentry within the specified directory
2692
                                        if(DeleteDirectoryEntry(&(fe.fp))) retvalue = 1;
2724
                                        if(DeleteDirectoryEntry(&(fe.fp))) retvalue = 1;
Line 2717... Line 2749...
2717
        File_t file;
2749
        File_t file;
Line 2718... Line 2750...
2718
 
2750
 
2719
        if(dirpath == NULL) return(0);
2751
        if(dirpath == NULL) return(0);
2720
        // correct filepath formatting
2752
        // correct filepath formatting
-
 
2753
        Slashing_Path(dirpath);
-
 
2754
        file.FirstSectorOfFirstCluster = SECTOR_UNDEFINED;              // First sector of the first cluster of the file.
-
 
2755
        file.FirstSectorOfCurrCluster = SECTOR_UNDEFINED;               // First sector of the cluster which is edited at the moment.
-
 
2756
        file.FirstSectorOfLastCluster = SECTOR_UNDEFINED;               // First sector of the last cluster of the file
-
 
2757
        file.SectorOfCurrCluster = SECTOR_UNDEFINED;                    // The sector within the current cluster.
-
 
2758
        file.ByteOfCurrSector = 0;                                                              // The byte location within the current sector.
-
 
2759
        file.Mode = 0;                                                                                  // Mode of fileoperation (read,write)
-
 
2760
        file.Size = 0;                                                                                  // The size of the opend file in bytes.
-
 
2761
        file.Position = 0;                                                                              // Pointer to a character within the file 0 < fileposition < filesize
-
 
2762
        file.DirectorySector = SECTOR_UNDEFINED;                                // the sectorposition where the directoryentry has been made.
-
 
2763
        file.DirectoryIndex = 0;                                                                // The index to the directoryentry within the specified sector.
-
 
2764
        file.Attribute = 0;                                                                             // The attribute of the file opened.
-
 
2765
        file.SectorInCache = SECTOR_UNDEFINED;                                  // The last sector read, which is still in the sector cache.
2721
        Slashing_Path(dirpath);
2766
        file.State = FSTATE_USED;                                                               // mark it as used
2722
        // if directory is not existent
2767
        // if directory is not existent
2723
        if(!FileExist(dirpath, ATTR_SUBDIRECTORY, ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL, &file))
2768
        if(!FileExist(dirpath, ATTR_SUBDIRECTORY, ATTR_SUBDIRECTORY|ATTR_VOLUMELABEL, &file))
2724
        {
2769
        {
2725
                retvalue = FileCreate(dirpath, ATTR_SUBDIRECTORY, &file);
2770
                retvalue = FileCreate(dirpath, ATTR_SUBDIRECTORY, &file);