Skip to content

Commit

Permalink
Automatically save a OTP/SEEPROM dump to the sd card
Browse files Browse the repository at this point in the history
  • Loading branch information
Maschell committed May 8, 2024
1 parent cc04c1a commit 2a995e2
Show file tree
Hide file tree
Showing 12 changed files with 543 additions and 44 deletions.
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ COPY --from=ghcr.io/wiiu-env/libnotifications:20240426 /artifacts $DEVKITPRO
COPY --from=ghcr.io/wiiu-env/librpxloader:20240425 /artifacts $DEVKITPRO
COPY --from=ghcr.io/wiiu-env/libcurlwrapper:20240505 /artifacts $DEVKITPRO
COPY --from=ghcr.io/wiiu-env/libsdutils:20230621 /artifacts $DEVKITPRO
COPY --from=ghcr.io/wiiu-env/libmocha:20231127 /artifacts $DEVKITPRO

WORKDIR project
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,13 @@ CXXFLAGS += -DDEBUG -DVERBOSE_DEBUG -g
CFLAGS += -DDEBUG -DVERBOSE_DEBUG -g
endif

LIBS := -lcurlwrapper -lnotifications -lrpxloader -lsdutils -lwups -lwut
LIBS := -lmocha -lcurlwrapper -lnotifications -lrpxloader -lsdutils -lwups -lwut

#-------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level
# containing include and lib
#-------------------------------------------------------------------------------
LIBDIRS := $(PORTLIBS) $(WUPS_ROOT) $(WUMS_ROOT) $(WUT_ROOT)
LIBDIRS := $(PORTLIBS) $(WUPS_ROOT) $(WUMS_ROOT) $(WUT_ROOT) $(WUT_ROOT)/usr

#-------------------------------------------------------------------------------
# no real need to edit anything past this point unless you need to add additional
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ For building you need:
- [librpxloader](https://github.com/wiiu-env/librpxloader)
- [libcurlwrapper](https://github.com/wiiu-env/libcurlwrapper)
- [libsdutils](https://github.com/wiiu-env/libsdutils)
- [libmocha](https://github.com/wiiu-env/libmocha)

## Building using the Dockerfile

Expand Down
6 changes: 5 additions & 1 deletion src/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@
#define AROMA_UPDATER_OLD_PATH_FULL SD_CARD_PATH AROMA_UPDATER_OLD_PATH
#define AROMA_UPDATER_NEW_PATH_FULL SD_CARD_PATH AROMA_UPDATER_NEW_PATH
#define AROMA_UPDATER_NEW_DIRECTORY_FULL SD_CARD_PATH AROMA_UPDATER_NEW_DIRECTORY
#define AROMA_UPDATER_LAST_UPDATE_URL "https://aroma.foryour.cafe/api/latest_version"
#define AROMA_UPDATER_LAST_UPDATE_URL "https://aroma.foryour.cafe/api/latest_version"


#define BACKUPS_DIRECTORY "wiiu/backups"
#define BACKUPS_DIRECTORY_FULL SD_CARD_PATH BACKUPS_DIRECTORY
49 changes: 9 additions & 40 deletions src/main.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
#include "main.h"
#include "Hints.h"
#include "UpdaterCheck.h"
#include "common.h"
#include "utils/DownloadUtils.h"
#include "utils/LatestVersion.h"
#include "utils/config.h"
#include "utils/utils.h"
#include <coreinit/title.h>
#include <malloc.h>
#include <mocha/mocha.h>
#include <nn/spm.h>
#include <notifications/notifications.h>
#include <rpxloader/rpxloader.h>
Expand Down Expand Up @@ -72,44 +73,6 @@ bool InitConfigValuesFromStorage() {
return result;
}

/*
* Migrates wiiu/apps/AromaUpdater.wuhb to wiiu/apps/AromaUpdater/AromaUpdater.wuhb
*/
void MigrateAromaUpdater() {
struct stat st {};
bool oldExists = false;
bool newExists = false;
if (stat(AROMA_UPDATER_NEW_PATH_FULL, &st) >= 0 && S_ISREG(st.st_mode)) {
DEBUG_FUNCTION_LINE_VERBOSE("\"%s\" exists", AROMA_UPDATER_NEW_PATH_FULL);
newExists = true;
}
st = {};
if (stat(AROMA_UPDATER_OLD_PATH_FULL, &st) >= 0 && S_ISREG(st.st_mode)) {
DEBUG_FUNCTION_LINE_VERBOSE("\"%s\" exists", AROMA_UPDATER_OLD_PATH_FULL);
oldExists = true;
}
if (newExists) {
if (oldExists) {
if (remove(AROMA_UPDATER_OLD_PATH_FULL) < 0) {
DEBUG_FUNCTION_LINE_WARN("Failed to remove old Aroma Updater: %d", errno);
}
} else {
DEBUG_FUNCTION_LINE_VERBOSE("Only new AromaUpdater.wuhb exists");
}
return;
} else if (oldExists) {
if (stat(AROMA_UPDATER_NEW_DIRECTORY_FULL, &st) < 0 || !S_ISDIR(st.st_mode)) {
if (mkdir(AROMA_UPDATER_NEW_DIRECTORY_FULL, 0777) < 0) {
DEBUG_FUNCTION_LINE_WARN("Failed to create: \"%s\"", AROMA_UPDATER_NEW_DIRECTORY_FULL);
}
}
if (rename(AROMA_UPDATER_OLD_PATH_FULL, AROMA_UPDATER_NEW_PATH_FULL) < 0) {
DEBUG_FUNCTION_LINE_WARN("Failed to move Aroma Updater to new path");
}
} else {
DEBUG_FUNCTION_LINE_VERBOSE("No AromaUpdater.wuhb exists");
}
}

INITIALIZE_PLUGIN() {
initLogging();
Expand All @@ -123,11 +86,17 @@ INITIALIZE_PLUGIN() {
DEBUG_FUNCTION_LINE_ERR("SDUtils_InitLibrary failed");
}

if (Mocha_InitLibrary() != MOCHA_RESULT_SUCCESS) {
DEBUG_FUNCTION_LINE_ERR("Mocha_InitLibrary failed");
}

InitConfigValuesFromStorage();

InitConfigMenu();

MigrateAromaUpdater();
Utils::MigrateAromaUpdater();

Utils::DumpOTPAndSeeprom();
}

ON_APPLICATION_START() {
Expand Down
2 changes: 1 addition & 1 deletion src/main.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#pragma once
#include "version.h"

#define PLUGIN_VERSION "v0.1.4"
#define PLUGIN_VERSION "v0.1.5"
#define PLUGIN_VERSION_FULL PLUGIN_VERSION PLUGIN_VERSION_EXTRA
173 changes: 173 additions & 0 deletions src/utils/CFile.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@

#include "CFile.hpp"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

CFile::CFile() {
iFd = -1;
mem_file = nullptr;
filesize = 0;
pos = 0;
}

CFile::CFile(const std::string &filepath, eOpenTypes mode) {
iFd = -1;
this->open(filepath, mode);
}

CFile::CFile(const uint8_t *mem, int32_t size) {
iFd = -1;
this->open(mem, size);
}

CFile::~CFile() {
this->close();
}

int32_t CFile::open(const std::string &filepath, eOpenTypes mode) {
this->close();
int32_t openMode = 0;

// This depend on the devoptab implementation.
// see https://github.com/devkitPro/wut/blob/master/libraries/wutdevoptab/devoptab_fs_open.c#L21 fpr reference

switch (mode) {
default:
case ReadOnly: // file must exist
openMode = O_RDONLY;
break;
case WriteOnly: // file will be created / zerod
openMode = O_TRUNC | O_CREAT | O_WRONLY;
break;
case ReadWrite: // file must exist
openMode = O_RDWR;
break;
case Append: // append to file, file will be created if missing. write only
openMode = O_CREAT | O_APPEND | O_WRONLY;
break;
}

//! Using fopen works only on the first launch as expected
//! on the second launch it causes issues because we don't overwrite
//! the .data sections which is needed for a normal application to re-init
//! this will be added with launching as RPX
iFd = ::open(filepath.c_str(), openMode);
if (iFd < 0)
return iFd;


filesize = ::lseek(iFd, 0, SEEK_END);
::lseek(iFd, 0, SEEK_SET);

return 0;
}

int32_t CFile::open(const uint8_t *mem, int32_t size) {
this->close();

mem_file = mem;
filesize = size;

return 0;
}

void CFile::close() {
if (iFd >= 0)
::close(iFd);

iFd = -1;
mem_file = NULL;
filesize = 0;
pos = 0;
}

int32_t CFile::read(uint8_t *ptr, size_t size) {
if (iFd >= 0) {
int32_t ret = ::read(iFd, ptr, size);
if (ret > 0)
pos += ret;
return ret;
}

int32_t readsize = size;

if (readsize > (int64_t) (filesize - pos))
readsize = filesize - pos;

if (readsize <= 0)
return readsize;

if (mem_file != NULL) {
memcpy(ptr, mem_file + pos, readsize);
pos += readsize;
return readsize;
}

return -1;
}

int32_t CFile::write(const uint8_t *ptr, size_t size) {
if (iFd >= 0) {
size_t done = 0;
while (done < size) {
int32_t ret = ::write(iFd, ptr, size - done);
if (ret <= 0)
return ret;

ptr += ret;
done += ret;
pos += ret;
}
return done;
}

return -1;
}

int32_t CFile::seek(long int offset, int32_t origin) {
int32_t ret = 0;
int64_t newPos = pos;

if (origin == SEEK_SET) {
newPos = offset;
} else if (origin == SEEK_CUR) {
newPos += offset;
} else if (origin == SEEK_END) {
newPos = filesize + offset;
}

if (newPos < 0) {
pos = 0;
} else {
pos = newPos;
}

if (iFd >= 0)
ret = ::lseek(iFd, pos, SEEK_SET);

if (mem_file != NULL) {
if (pos > filesize) {
pos = filesize;
}
}

return ret;
}

int32_t CFile::fwrite(const char *format, ...) {
char tmp[512];
tmp[0] = 0;
int32_t result = -1;

va_list va;
va_start(va, format);
if ((vsprintf(tmp, format, va) >= 0)) {
result = this->write((uint8_t *) tmp, strlen(tmp));
}
va_end(va);


return result;
}
71 changes: 71 additions & 0 deletions src/utils/CFile.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#ifndef CFILE_HPP_
#define CFILE_HPP_

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <unistd.h>
#include <wut_types.h>

class CFile {
public:
enum eOpenTypes {
ReadOnly,
WriteOnly,
ReadWrite,
Append
};

CFile();

CFile(const std::string &filepath, eOpenTypes mode);

CFile(const uint8_t *memory, int32_t memsize);

virtual ~CFile();

int32_t open(const std::string &filepath, eOpenTypes mode);

int32_t open(const uint8_t *memory, int32_t memsize);

BOOL isOpen() const {
if (iFd >= 0)
return true;

if (mem_file)
return true;

return false;
}

void close();

int32_t read(uint8_t *ptr, size_t size);

int32_t write(const uint8_t *ptr, size_t size);

int32_t fwrite(const char *format, ...);

int32_t seek(long int offset, int32_t origin);

uint64_t tell() {
return pos;
};

uint64_t size() {
return filesize;
};

void rewind() {
this->seek(0, SEEK_SET);
};

protected:
int32_t iFd;
const uint8_t *mem_file{};
uint64_t filesize{};
uint64_t pos{};
};

#endif
Loading

0 comments on commit 2a995e2

Please sign in to comment.