mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-15 16:05:10 +01:00
*Reverted giantpunes work on forwarder source and added mine (worked parallel didnt know he was doing it) | added mine because its bit more clean and got a check if the CFG file doesnt exist
This commit is contained in:
parent
b4ba424be0
commit
11e17e07ab
75
source/cfg.c
Normal file
75
source/cfg.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <ogcsys.h>
|
||||||
|
|
||||||
|
#include "cfg.h"
|
||||||
|
|
||||||
|
static char *cfg_name, *cfg_val;
|
||||||
|
|
||||||
|
char* strcopy(char *dest, char *src, int size)
|
||||||
|
{
|
||||||
|
strncpy(dest,src,size);
|
||||||
|
dest[size-1] = 0;
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* trimcopy(char *dest, char *src, int size)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
while (*src == ' ') src++;
|
||||||
|
len = strlen(src);
|
||||||
|
// trim trailing " \r\n"
|
||||||
|
while (len > 0 && strchr(" \r\n", src[len-1])) len--;
|
||||||
|
if (len >= size) len = size-1;
|
||||||
|
strncpy(dest, src, len);
|
||||||
|
dest[len] = 0;
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cfg_parseline(char *line, void (*set_func)(char*, char*))
|
||||||
|
{
|
||||||
|
// split name = value
|
||||||
|
char tmp[200], name[100], val[100];
|
||||||
|
strcopy(tmp, line, sizeof(tmp));
|
||||||
|
char *eq = strchr(tmp, '=');
|
||||||
|
if (!eq) return;
|
||||||
|
*eq = 0;
|
||||||
|
trimcopy(name, tmp, sizeof(name));
|
||||||
|
trimcopy(val, eq+1, sizeof(val));
|
||||||
|
//printf("CFG: %s = %s\n", name, val);
|
||||||
|
set_func(name, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool cfg_parsefile(char *fname, void (*set_func)(char*, char*))
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
char line[200];
|
||||||
|
|
||||||
|
//printf("opening(%s)\n", fname);
|
||||||
|
f = fopen(fname, "r");
|
||||||
|
if (!f) {
|
||||||
|
//printf("error opening(%s)\n", fname);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
while (fgets(line, sizeof(line), f)) {
|
||||||
|
// lines starting with # are comments
|
||||||
|
if (line[0] == '#') continue;
|
||||||
|
cfg_parseline(line, set_func);
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cfg_set(char *name, char *val)
|
||||||
|
{
|
||||||
|
cfg_name = name;
|
||||||
|
cfg_val = val;
|
||||||
|
if (strcmp(name, "update_path") == 0) {
|
||||||
|
strcopy(update_path, val, sizeof(update_path));
|
||||||
|
}
|
||||||
|
}
|
18
source/cfg.h
Normal file
18
source/cfg.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef _CFG_H_
|
||||||
|
#define _CFG_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char update_path[150];
|
||||||
|
|
||||||
|
void cfg_set(char *name, char *val);
|
||||||
|
bool cfg_parsefile(char * fname, void (*set_func)(char*, char*));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
299
source/main.cpp
299
source/main.cpp
@ -1,53 +1,52 @@
|
|||||||
/*
|
/*
|
||||||
* loadMii loader v0.3
|
* loadMii loader v0.3
|
||||||
* main.c
|
* main.c
|
||||||
* http://code.google.com/p/loadmii
|
* http://code.google.com/p/loadmii
|
||||||
*
|
*
|
||||||
* Copyright 2009 The Lemon Man
|
* Copyright 2009 The Lemon Man
|
||||||
* Thanks to luccax, Wiipower, Aurelio and crediar
|
* Thanks to luccax, Wiipower, Aurelio and crediar
|
||||||
* usbGecko powered by Nuke
|
* GX added by dimok (thanks to Tantric)
|
||||||
*
|
* usbGecko powered by Nuke
|
||||||
* This program is free software; you can redistribute it and/or modify
|
*
|
||||||
* it under the terms of the GNU General Public License as published by
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
* it under the terms of the GNU General Public License as published by
|
||||||
* (at your option) any later version.
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
*
|
* (at your option) any later version.
|
||||||
* This program is distributed in the hope that it will be useful,
|
*
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* This program is distributed in the hope that it will be useful,
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* GNU General Public License for more details.
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
*
|
* GNU General Public License for more details.
|
||||||
* You should have received a copy of the GNU General Public License
|
*
|
||||||
* along with this program; if not, write to the Free Software
|
* You should have received a copy of the GNU General Public License
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
* along with this program; if not, write to the Free Software
|
||||||
* MA 02110-1301, USA.
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
*/
|
* MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
#include <gccore.h>
|
|
||||||
#include <wiiuse/wpad.h>
|
#include <gccore.h>
|
||||||
|
#include <wiiuse/wpad.h>
|
||||||
#include <fat.h>
|
#include <fat.h>
|
||||||
#include <sdcard/wiisd_io.h>
|
#include <sdcard/wiisd_io.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <ogc/machine/processor.h>
|
#include <ogc/machine/processor.h>
|
||||||
//shit i added
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
|
#include "pngu/pngu.h"
|
||||||
#include "pngu/pngu.h"
|
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
#include "filelist.h"
|
#include "filelist.h"
|
||||||
#include "dolloader.h"
|
#include "dolloader.h"
|
||||||
#include "elfloader.h"
|
#include "elfloader.h"
|
||||||
|
#include "cfg.h"
|
||||||
|
|
||||||
PNGUPROP imgProp;
|
|
||||||
IMGCTX ctx;
|
PNGUPROP imgProp;
|
||||||
|
IMGCTX ctx;
|
||||||
|
|
||||||
|
|
||||||
u8 * GetImageData(void) {
|
u8 * GetImageData(void) {
|
||||||
|
|
||||||
u8 * data = NULL;
|
u8 * data = NULL;
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
@ -71,99 +70,25 @@ u8 * GetImageData(void) {
|
|||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Background_Show(int x, int y, int z, u8 * data, int angle, int scaleX, int scaleY, int alpha)
|
void Background_Show(int x, int y, int z, u8 * data, int angle, int scaleX, int scaleY, int alpha)
|
||||||
{
|
{
|
||||||
/* Draw image */
|
/* Draw image */
|
||||||
Menu_DrawImg(x, y, z, imgProp.imgWidth, imgProp.imgHeight, data, angle, scaleX, scaleY, alpha);
|
Menu_DrawImg(x, y, z, imgProp.imgWidth, imgProp.imgHeight, data, angle, scaleX, scaleY, alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
char thePath[100];
|
|
||||||
static char *cfg_name, *cfg_val;
|
|
||||||
|
|
||||||
|
|
||||||
char* strcopy(char *dest, char *src, int size)
|
|
||||||
{
|
|
||||||
strncpy(dest,src,size);
|
|
||||||
dest[size-1] = 0;
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* trimcopy(char *dest, char *src, int size)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
while (*src == ' ') src++;
|
|
||||||
len = strlen(src);
|
|
||||||
// trim trailing " \r\n"
|
|
||||||
while (len > 0 && strchr(" \r\n", src[len-1])) len--;
|
|
||||||
if (len >= size) len = size-1;
|
|
||||||
strncpy(dest, src, len);
|
|
||||||
dest[len] = 0;
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cfg_parseline(char *line, void (*set_func)(char*, char*))
|
|
||||||
{
|
|
||||||
// split name = value
|
|
||||||
char tmp[200], name[100], val[100];
|
|
||||||
strcopy(tmp, line, sizeof(tmp));
|
|
||||||
char *eq = strchr(tmp, '=');
|
|
||||||
if (!eq) return;
|
|
||||||
*eq = 0;
|
|
||||||
trimcopy(name, tmp, sizeof(name));
|
|
||||||
trimcopy(val, eq+1, sizeof(val));
|
|
||||||
set_func(name, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cfg_parsefile(char *fname, void (*set_func)(char*, char*))
|
|
||||||
{
|
|
||||||
FILE *f;
|
|
||||||
char line[200];
|
|
||||||
|
|
||||||
f = fopen(fname, "r");
|
|
||||||
if (!f) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
while (fgets(line, sizeof(line), f)) {
|
|
||||||
// lines starting with # are comments
|
|
||||||
if (line[0] == '#') continue;
|
|
||||||
cfg_parseline(line, set_func);
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char pathname[200];
|
|
||||||
void cfg_set(char *name, char *val)
|
|
||||||
{
|
|
||||||
cfg_name = name;
|
|
||||||
cfg_val = val;
|
|
||||||
|
|
||||||
if (strcmp(name, "update_path") == 0) {
|
|
||||||
strcopy(thePath, val, sizeof(thePath));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
u32 cookie;
|
u32 cookie;
|
||||||
FILE *exeFile;
|
FILE *exeFile = NULL;
|
||||||
void *exeBuffer = (void *)EXECUTABLE_MEM_ADDR;
|
void *exeBuffer = (void *)EXECUTABLE_MEM_ADDR;
|
||||||
int exeSize = 0;
|
int exeSize = 0;
|
||||||
u32 exeEntryPointAddress = 0;
|
u32 exeEntryPointAddress = 0;
|
||||||
entrypoint exeEntryPoint;
|
entrypoint exeEntryPoint;
|
||||||
|
|
||||||
|
|
||||||
|
/* int videomod */
|
||||||
/* int videomod */
|
|
||||||
InitVideo();
|
InitVideo();
|
||||||
|
|
||||||
/* get imagedata */
|
/* get imagedata */
|
||||||
@ -174,51 +99,57 @@ int main(int argc, char **argv) {
|
|||||||
if(i>255) i = 255;
|
if(i>255) i = 255;
|
||||||
Background_Show(0, 0, 0, imgdata, 0, 1, 1, i);
|
Background_Show(0, 0, 0, imgdata, 0, 1, 1, i);
|
||||||
Menu_Render();
|
Menu_Render();
|
||||||
}
|
}
|
||||||
/* check devices */
|
/* check devices */
|
||||||
__io_wiisd.startup();
|
__io_wiisd.startup();
|
||||||
fatMount("SD", &__io_wiisd, 0, 32, 128);
|
fatMount("SD", &__io_wiisd, 0, 32, 128);
|
||||||
|
|
||||||
/* write default path*/
|
char cfgpath[40];
|
||||||
snprintf(thePath, sizeof(thePath), "SD:/apps/usbloader_gx/");
|
sprintf(cfgpath, "SD:/config/GXGlobal.cfg");
|
||||||
|
|
||||||
// check to see if there is a path in the GXglobal file
|
if(!cfg_parsefile(cfgpath, &cfg_set)) {
|
||||||
snprintf(pathname, sizeof(pathname), "SD:/config/GXGlobal.cfg");
|
/* Open dol File and check exist */
|
||||||
cfg_parsefile(pathname, &cfg_set);
|
exeFile = fopen ("SD:/apps/usbloader_gx/boot.dol" ,"rb");
|
||||||
|
if (exeFile==NULL) {
|
||||||
//add boot.dol to our path
|
fclose(exeFile);
|
||||||
snprintf(pathname, sizeof(pathname), "%sboot.dol", thePath);
|
exeFile = fopen ("SD:/apps/usbloader_gx/boot.elf" ,"rb");
|
||||||
|
if (exeFile==NULL) {
|
||||||
/* Open dol File and check exist */
|
fclose(exeFile);
|
||||||
exeFile = fopen (pathname ,"rb");
|
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
||||||
|
}
|
||||||
//boot.dol wasn't found. Try for the elf.
|
}
|
||||||
if (exeFile==NULL) {
|
} else {
|
||||||
fclose(exeFile);
|
sprintf(cfgpath, "%sboot.dol", update_path);
|
||||||
snprintf(pathname, sizeof(pathname), "%sboot.elf", thePath);
|
/* Open dol File and check exist */
|
||||||
exeFile = fopen (pathname ,"rb");
|
exeFile = fopen (cfgpath, "rb");
|
||||||
if (exeFile==NULL) {
|
if (exeFile==NULL) {
|
||||||
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
fclose(exeFile);
|
||||||
}
|
sprintf(cfgpath, "%sboot.elf", update_path);
|
||||||
}
|
exeFile = fopen (cfgpath,"rb");
|
||||||
|
if (exeFile==NULL) {
|
||||||
fseek (exeFile, 0, SEEK_END);
|
fclose(exeFile);
|
||||||
exeSize = ftell(exeFile);
|
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
|
||||||
fseek (exeFile, 0, SEEK_SET);
|
}
|
||||||
if(fread (exeBuffer, 1, exeSize, exeFile) != (unsigned int) exeSize) {
|
}
|
||||||
printf("Can't open DOL File...\n");
|
}
|
||||||
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);;
|
|
||||||
}
|
fseek (exeFile, 0, SEEK_END);
|
||||||
|
exeSize = ftell(exeFile);
|
||||||
fclose (exeFile);
|
fseek (exeFile, 0, SEEK_SET);
|
||||||
|
if(fread (exeBuffer, 1, exeSize, exeFile) != (unsigned int) exeSize) {
|
||||||
/* load entry point */
|
printf("Can't open DOL File...\n");
|
||||||
|
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose (exeFile);
|
||||||
|
|
||||||
|
/* load entry point */
|
||||||
struct __argv args[10];
|
struct __argv args[10];
|
||||||
|
|
||||||
int ret = valid_elf_image(exeBuffer);
|
int ret = valid_elf_image(exeBuffer);
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
exeEntryPointAddress = load_elf_image(exeBuffer);
|
exeEntryPointAddress = load_elf_image(exeBuffer);
|
||||||
} else {
|
} else {
|
||||||
exeEntryPointAddress = load_dol_image(exeBuffer, args);
|
exeEntryPointAddress = load_dol_image(exeBuffer, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,24 +159,24 @@ int main(int argc, char **argv) {
|
|||||||
Background_Show(0, 0, 0, imgdata, 0, 1, 1, i);
|
Background_Show(0, 0, 0, imgdata, 0, 1, 1, i);
|
||||||
Menu_Render();
|
Menu_Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
fatUnmount("SD");
|
fatUnmount("SD");
|
||||||
__io_wiisd.shutdown();
|
__io_wiisd.shutdown();
|
||||||
StopGX();
|
StopGX();
|
||||||
|
|
||||||
if (exeEntryPointAddress == 0) {
|
if (exeEntryPointAddress == 0) {
|
||||||
printf("EntryPointAddress failed...\n");
|
printf("EntryPointAddress failed...\n");
|
||||||
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);;
|
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);;
|
||||||
}
|
}
|
||||||
|
|
||||||
exeEntryPoint = (entrypoint) exeEntryPointAddress;
|
exeEntryPoint = (entrypoint) exeEntryPointAddress;
|
||||||
|
|
||||||
/* cleaning up and load dol */
|
/* cleaning up and load dol */
|
||||||
SYS_ResetSystem(SYS_SHUTDOWN, 0, 0);
|
SYS_ResetSystem(SYS_SHUTDOWN, 0, 0);
|
||||||
_CPU_ISR_Disable (cookie);
|
_CPU_ISR_Disable (cookie);
|
||||||
__exception_closeall ();
|
__exception_closeall ();
|
||||||
exeEntryPoint ();
|
exeEntryPoint ();
|
||||||
_CPU_ISR_Restore (cookie);
|
_CPU_ISR_Restore (cookie);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user