Compare commits

..

4 Commits

Author SHA1 Message Date
106bb02fbf Fix -Wstringop-truncation issues 2021-04-05 13:22:56 -04:00
b585305009 Add AsyncIONX.cpp 2020-10-21 00:45:02 -04:00
6f5cb6f972 GCC nonstring fixes 2020-10-21 00:44:45 -04:00
4ee594d0fd Link rt for AIO on Linux 2020-10-07 20:11:05 -04:00
7 changed files with 80 additions and 7 deletions

View File

@@ -49,10 +49,17 @@ if(WIN32)
include/kabufuda/winsupport.hpp
lib/kabufuda/AsyncIOWin32.cpp
)
elseif(NX)
target_sources(kabufuda PRIVATE
lib/kabufuda/AsyncIONX.cpp
)
else()
target_sources(kabufuda PRIVATE
lib/kabufuda/AsyncIOPosix.cpp
)
if(NOT APPLE)
target_link_libraries(kabufuda PUBLIC rt)
endif()
endif()
target_include_directories(kabufuda PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>)

View File

@@ -1,8 +1,13 @@
#pragma once
#ifndef _WIN32
#ifdef __SWITCH__
#include <sys/types.h>
using SizeReturn = ssize_t;
#else
#include <aio.h>
using SizeReturn = ssize_t;
#endif
#else
#include <windows.h>
using SizeReturn = DWORD;
@@ -16,7 +21,9 @@ using SizeReturn = DWORD;
namespace kabufuda {
class AsyncIO {
#ifndef _WIN32
#ifdef __SWITCH__
FILE* m_fd;
#elif !defined(_WIN32)
int m_fd = -1;
std::vector<std::pair<struct aiocb, SizeReturn>> m_queue;
#else
@@ -34,13 +41,19 @@ public:
AsyncIO& operator=(AsyncIO&& other);
AsyncIO(const AsyncIO* other) = delete;
AsyncIO& operator=(const AsyncIO& other) = delete;
void resizeQueue(size_t queueSz) { m_queue.resize(queueSz); }
void resizeQueue(size_t queueSz) {
#ifndef __SWITCH__
m_queue.resize(queueSz);
#endif
}
bool asyncRead(size_t qIdx, void* buf, size_t length, off_t offset);
bool asyncWrite(size_t qIdx, const void* buf, size_t length, off_t offset);
ECardResult pollStatus(size_t qIdx, SizeReturn* szRet = nullptr) const;
ECardResult pollStatus() const;
void waitForCompletion() const;
#ifndef _WIN32
#ifdef __SWITCH__
explicit operator bool() const { return m_fd != nullptr; }
#elif !defined(_WIN32)
explicit operator bool() const { return m_fd != -1; }
#else
explicit operator bool() const { return m_fh != INVALID_HANDLE_VALUE; }

View File

@@ -18,6 +18,9 @@ class File {
std::array<uint8_t, 2> m_maker;
uint8_t m_reserved;
uint8_t m_bannerFlags;
#if __GNUC__ && !__clang__
__attribute__((nonstring))
#endif
char m_filename[0x20];
uint32_t m_modifiedTime;
uint32_t m_iconAddress;

View File

@@ -0,0 +1,48 @@
#include "kabufuda/AsyncIO.hpp"
#include <cstdio>
#include <cstring>
namespace kabufuda {
AsyncIO::AsyncIO(SystemStringView filename, bool truncate) { m_fd = fopen(filename.data(), truncate ? "rw" : "ra"); }
AsyncIO::~AsyncIO() {
if (*this) {
fclose(m_fd);
}
}
AsyncIO::AsyncIO(AsyncIO&& other) {
m_fd = other.m_fd;
other.m_fd = nullptr;
m_maxBlock = other.m_maxBlock;
}
AsyncIO& AsyncIO::operator=(AsyncIO&& other) {
if (*this) {
fclose(m_fd);
}
m_fd = other.m_fd;
other.m_fd = nullptr;
m_maxBlock = other.m_maxBlock;
return *this;
}
void AsyncIO::_waitForOperation(size_t qIdx) const {}
bool AsyncIO::asyncRead(size_t qIdx, void* buf, size_t length, off_t offset) {
return fread(buf, length, offset, m_fd);
}
bool AsyncIO::asyncWrite(size_t qIdx, const void* buf, size_t length, off_t offset) {
return fwrite(buf, length, offset, m_fd);
}
ECardResult AsyncIO::pollStatus(size_t qIdx, SizeReturn* szRet) const { return ECardResult::READY; }
ECardResult AsyncIO::pollStatus() const { return ECardResult::READY; }
void AsyncIO::waitForCompletion() const {}
} // namespace kabufuda

View File

@@ -329,10 +329,12 @@ ECardResult Card::renameFile(const char* oldName, const char* newName) {
if (File* replF = dir.getFile(m_game, m_maker, newName)) {
BlockAllocationTable bat = m_bats[m_currentBat];
_deleteFile(*replF, bat);
std::strncpy(f->m_filename, newName, 32);
std::memset(f->m_filename, 0, std::size(f->m_filename));
std::strncpy(f->m_filename, newName, std::size(m_filename) - 1);
_updateDirAndBat(dir, bat);
} else {
std::strncpy(f->m_filename, newName, 32);
std::memset(f->m_filename, 0, std::size(f->m_filename));
std::strncpy(f->m_filename, newName, std::size(m_filename) - 1);
_updateDirAndBat(dir, m_bats[m_currentBat]);
}
return ECardResult::READY;

View File

@@ -107,7 +107,7 @@ File* Directory::getFile(const char* game, const char* maker, const char* filena
return false;
}
return std::strcmp(file.m_filename, filename) == 0;
return std::strncmp(file.m_filename, filename, 32) == 0;
});
if (iter == data.m_files.cend()) {

View File

@@ -13,7 +13,7 @@ File::File(const RawData& rawData) : raw{rawData} {}
File::File(const char* filename) {
raw.fill(0);
std::memset(m_filename, 0, std::size(m_filename));
std::strncpy(m_filename, filename, std::size(m_filename));
std::strncpy(m_filename, filename, std::size(m_filename) - 1);
}
void File::swapEndian() {
m_modifiedTime = SBig(m_modifiedTime);