From ef38a9a2606d0bec07bc8b36b38cab46fa165e79 Mon Sep 17 00:00:00 2001 From: Baptiste Wicht Date: Tue, 24 Dec 2013 14:00:00 +0100 Subject: [PATCH] Search for an empty entry in the cluster --- kernel/src/console.cpp | 2 +- kernel/src/fat32.cpp | 44 +++++++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/kernel/src/console.cpp b/kernel/src/console.cpp index bd731c07..56f8915a 100644 --- a/kernel/src/console.cpp +++ b/kernel/src/console.cpp @@ -223,7 +223,7 @@ void k_printf(const char* fmt, ...){ auto prev = current_column; - //Decimal + //Unsigned Decimal if(ch == 'd'){ auto arg = va_arg(va, uint64_t); diff --git a/kernel/src/fat32.cpp b/kernel/src/fat32.cpp index 9e11bc72..fa982042 100644 --- a/kernel/src/fat32.cpp +++ b/kernel/src/fat32.cpp @@ -277,22 +277,6 @@ std::pair find_cluster_number(fat32::dd disk, const std::vector< return std::make_pair(false, 0); } -std::pair> find_directory_cluster(fat32::dd disk, const std::vector& path){ - auto cluster_number = find_cluster_number(disk, path); - - if(cluster_number.first){ - std::unique_heap_array cluster(16 * fat_bs->sectors_per_cluster); - - if(read_sectors(disk, cluster_lba(cluster_number.second), fat_bs->sectors_per_cluster, cluster.get())){ - return std::make_pair(true, std::move(cluster)); - } else { - return std::make_pair(false, std::unique_heap_array()); - } - } - - return std::make_pair(false, std::unique_heap_array()); -} - std::vector files(fat32::dd disk, const std::vector& path){ auto cluster_number_search = find_cluster_number(disk, path); if(!cluster_number_search.first){ @@ -462,5 +446,33 @@ bool fat32::mkdir(dd disk, const disks::partition_descriptor& partition, const s return false; } + auto cluster_number = find_cluster_number(disk, path); + if(!cluster_number.first){ + return false; + } + + std::unique_heap_array directory_cluster(16 * fat_bs->sectors_per_cluster); + + if(read_sectors(disk, cluster_lba(cluster_number.second), fat_bs->sectors_per_cluster, directory_cluster.get())){ + auto end = -1; + auto free = -1; + for(size_t i = 0; i < directory_cluster.size(); ++i){ + auto& entry = directory_cluster[i]; + + if(end_of_directory(entry)){ + end = i; + continue; + } + + if(!entry_used(entry)){ + free = i; + break; + } + } + + k_printf("end=%d\n", end); + k_printf("free=%d\n", free); + } + return false; }