error_t FAT::int_ls(uint32_t sector, dirvector& ents) const { bool done = false; do { // read sector sync buffer_t data = device.read_sync(sector); if (UNLIKELY(!data)) return { error_t::E_IO, "Unable to read directory" }; // parse directory into @ents done = int_dirent(sector, data->data(), ents); // go to next sector until done sector++; } while (!done); return no_error; }
void FAT::int_ls( uint32_t sector, dirvec_t dirents, on_internal_ls_func callback) { // list contents of meme sector by sector typedef std::function<void(uint32_t)> next_func_t; auto next = std::make_shared<next_func_t> (); *next = [this, sector, callback, dirents, next] (uint32_t sector) { debug("int_ls: sec=%u\n", sector); device.read(sector, [this, sector, callback, dirents, next] (buffer_t data) { if (!data) { // could not read sector callback(true, dirents); return; } // parse entries in sector bool done = int_dirent(sector, data.get(), dirents); if (done) { // execute callback callback(no_error, dirents); } else { // go to next sector (*next)(sector+1); } }); // read root dir }; // start reading sectors asynchronously (*next)(sector); }
void FAT::int_ls( uint32_t sector, Dirvec_ptr dirents, on_internal_ls_func callback) const { // list contents of meme sector by sector typedef delegate<void(uint32_t)> next_func_t; auto next = std::make_shared<next_func_t> (); auto weak_next = std::weak_ptr<next_func_t>(next); *next = next_func_t::make_packed( [this, callback, dirents, weak_next] (uint32_t sector) { FS_PRINT("int_ls: sec=%u\n", sector); auto next = weak_next.lock(); device.read( sector, hw::Block_device::on_read_func::make_packed( [this, sector, callback, dirents, next] (buffer_t data) { if (data == nullptr) { // could not read sector callback({ error_t::E_IO, "Unable to read directory" }, dirents); return; } // parse entries in sector bool done = int_dirent(sector, data->data(), *dirents); if (done) // execute callback callback(no_error, dirents); else // go to next sector (*next)(sector+1); }) ); // read root dir }); // start reading sectors asynchronously (*next)(sector); }