[General] Moving the FS-wrapper into an own lib, no more macro madness

The library now needs to be build with "make" and installed with "make install".
Make sure to include the -lwups into the plugin projecs.
If you call "WUPS_InitFS(args);" in the INITIALIZE method, the plugin has full SD/USB access.
This commit is contained in:
Maschell 2018-02-16 21:51:35 +01:00
parent 1cfa474ca9
commit 797e58f576
11 changed files with 230 additions and 99 deletions

1
.gitignore vendored
View File

@ -8,6 +8,7 @@ plugins/*/bin/*
plugins/*/build/*
loader/WiiUPluginLoader.cscope_file_list
loader/WiiUPluginLoader.layout
release/*
*.mod
*.cbp

View File

@ -52,7 +52,7 @@ install:
- (cd controller_patcher-master && make -j8 && make install)
script:
- make
- make && make install
- (cd loader && make)
- (cd plugins && make)

125
Makefile
View File

@ -1,15 +1,101 @@
#---------------------------------------------------------------------------------
# Clear the implicit built in rules
DO_LOGGING := 0
#---------------------------------------------------------------------------------
.SUFFIXES:
#---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITPPC)),)
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC")
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC)
endif
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPRO")
include $(DEVKITPPC)/wii_rules
#---------------------------------------------------------------------------------
# BUILD is the directory where object files & intermediate files will be placed
# SOURCES is a list of directories containing source code
# INCLUDES is a list of directories containing extra header files
# DATA is a list of directories containing binary files
# LIBDIR is where the built library will be placed
# all directories are relative to this makefile
#---------------------------------------------------------------------------------
BUILD ?= release
SOURCES := src
INCLUDES := src \
wups_include
DATA :=
LIB := lib
#---------------------------------------------------------------------------------
# options for code generation
#---------------------------------------------------------------------------------
CFLAGS = -g -Os -Wall -D__wiiu__ -D_GNU_SOURCE $(MACHDEP) $(INCLUDE)
CXXFLAGS = $(CFLAGS)
ifeq ($(DO_LOGGING), 1)
CFLAGS += -D__LOGGING__
CXXFLAGS += -D__LOGGING__
endif
ASFLAGS := -mregnames
export WIIUBIN := $(LIB)/libwups.a
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS :=
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------
LIBDIRS :=
#---------------------------------------------------------------------------------
# no real need to edit anything past this point unless you need to add additional
# rules for different file extensions
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------
export TOPDIR ?= $(CURDIR)/..
export DEPSDIR := $(CURDIR)/$(BUILD)
export INCLUDEDIR := $(PORTLIBS)/include/libgui
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S)))
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
export OFILES := $(addsuffix .o,$(BINFILES)) \
$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) $(sFILES:.s=.o)
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
$(foreach dir,$(LIBDIRS),-I$(dir)/include)
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
.PHONY: $(BUILD) clean
#---------------------------------------------------------------------------------
$(BUILD):
@[ -d $@ ] || mkdir -p $@
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
#---------------------------------------------------------------------------------
clean:
@echo clean ...
@rm -fr debug release $(LIB) include
all: $(WIIUBIN)
WUPSDIR := $(DEVKITPRO)/wups
# Rule to install wups.
@ -17,11 +103,32 @@ PHONY += install
install : wups.ld wups_elf.ld
$(addprefix $Qrm -rf ,$(wildcard $(WUPSDIR)))
$Qmkdir $(WUPSDIR)
$Qmkdir $(WUPSDIR)/lib/
$Qcp -r wups_include $(WUPSDIR)/include
$Qcp -r wups.ld $(WUPSDIR)
$Qcp -r wups_elf.ld $(WUPSDIR)
@cp $(BUILD)/lib/libwups.a $(WUPSDIR)/lib/
#---------------------------------------------------------------------------------
else
DEPENDS := $(OFILES:.o=.d)
#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------
$(WIIUBIN) : $(OFILES) $(LIB)
@rm -f "$(WIIUBIN)"
@$(AR) rcs "$(WIIUBIN)" $(OFILES)
@echo built ... $(notdir $@)
$(LIB):
mkdir $(LIB)
-include $(DEPENDS)
#---------------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------------
# Rule to install wups.
PHONY += uninstall
uninstall :
$(addprefix $Qrm -rf ,$(wildcard $(WUPSDIR)))

View File

@ -96,7 +96,7 @@ MAKEFLAGS += --no-print-directory
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS := -lutils -ldynamiclibs
LIBS := -lwups -lutils -ldynamiclibs
#
#---------------------------------------------------------------------------------
@ -153,7 +153,8 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
# build a list of library paths
#---------------------------------------------------------------------------------
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \
-L$(PORTLIBS)/lib
-L$(PORTLIBS)/lib \
-L$(WUPSDIR)/lib
export OUTPUT := $(CURDIR)/$(TARGET)
.PHONY: $(BUILD) clean install

View File

@ -99,7 +99,7 @@ MAKEFLAGS += --no-print-directory
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS := -lcontrollerpatcher -lutils -ldynamiclibs
LIBS := -lwups -lcontrollerpatcher -lutils -ldynamiclibs
#
#---------------------------------------------------------------------------------
@ -156,7 +156,8 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
# build a list of library paths
#---------------------------------------------------------------------------------
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \
-L$(PORTLIBS)/lib
-L$(PORTLIBS)/lib \
-L$(WUPSDIR)/lib
export OUTPUT := $(CURDIR)/$(TARGET)
.PHONY: $(BUILD) clean install

View File

@ -97,7 +97,7 @@ MAKEFLAGS += --no-print-directory
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS := -lutils -ldynamiclibs
LIBS := -lwups -lutils -ldynamiclibs
#
#---------------------------------------------------------------------------------
@ -154,7 +154,8 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
# build a list of library paths
#---------------------------------------------------------------------------------
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \
-L$(PORTLIBS)/lib
-L$(PORTLIBS)/lib \
-L$(WUPSDIR)/lib
export OUTPUT := $(CURDIR)/$(TARGET)
.PHONY: $(BUILD) clean install

View File

@ -100,7 +100,7 @@ MAKEFLAGS += --no-print-directory
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS := -liosuhax -lfswrapper -lutils -ldynamiclibs
LIBS := -lwups -liosuhax -lfswrapper -lutils -ldynamiclibs
#
#---------------------------------------------------------------------------------
@ -152,13 +152,14 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
-I$(CURDIR)/$(BUILD) -I$(PORTLIBS)/include \
-I$(PORTLIBS)/include/libutils -I$(PORTLIBS)/include/libfswrapper \
-I$(WUPSDIR)/include
-I$(WUPSDIR)/include
#---------------------------------------------------------------------------------
# build a list of library paths
#---------------------------------------------------------------------------------
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \
-L$(PORTLIBS)/lib
-L$(PORTLIBS)/lib \
-L$(WUPSDIR)/lib
export OUTPUT := $(CURDIR)/$(TARGET)
.PHONY: all $(BUILD) clean install

View File

@ -20,6 +20,7 @@ WUPS_MODULE_AUTHOR("Maschell");
WUPS_MODULE_LICENSE("GPL");
INITIALIZE(args){
WUPS_InitFS(args);
InitOSFunctionPointers();
InitSocketFunctionPointers(); //For logging
InitVPadFunctionPointers(); //For logging

View File

@ -99,7 +99,7 @@ MAKEFLAGS += --no-print-directory
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS := -lutils -ldynamiclibs
LIBS := -lwups -lutils -ldynamiclibs
#
#---------------------------------------------------------------------------------
@ -156,7 +156,8 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
# build a list of library paths
#---------------------------------------------------------------------------------
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \
-L$(PORTLIBS)/lib
-L$(PORTLIBS)/lib \
-L$(WUPSDIR)/lib
export OUTPUT := $(CURDIR)/$(TARGET)
.PHONY: $(BUILD) clean install

92
src/fs_function_wrapper.c Normal file
View File

@ -0,0 +1,92 @@
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <wups.h>
static void * new_open_ptr __attribute__((section(".data"))) = NULL;
static void * new_close_ptr __attribute__((section(".data"))) = NULL;
static void * new_write_ptr __attribute__((section(".data"))) = NULL;
static void * new_read_ptr __attribute__((section(".data"))) = NULL;
static void * new_lseek_ptr __attribute__((section(".data"))) = NULL;
static void * new_stat_ptr __attribute__((section(".data"))) = NULL;
static void * new_fstat_ptr __attribute__((section(".data"))) = NULL;
static void * new_opendir_ptr __attribute__((section(".data"))) = NULL;
static void * new_closedir_ptr __attribute__((section(".data"))) = NULL;
static void * new_readdir_ptr __attribute__((section(".data"))) = NULL;
#ifdef __cplusplus
extern "C" {
#endif
void WUPS_InitFS(wups_loader_init_args_t* args){
if(args != NULL){
new_open_ptr = (void*) args->fs_wrapper.open_repl;
new_close_ptr = (void*) args->fs_wrapper.close_repl;
new_write_ptr = (void*) args->fs_wrapper.write_repl;
new_read_ptr = (void*) args->fs_wrapper.read_repl;
new_lseek_ptr = (void*) args->fs_wrapper.lseek_repl;
new_stat_ptr = (void*) args->fs_wrapper.stat_repl;
new_fstat_ptr = (void*) args->fs_wrapper.fstat_repl;
new_opendir_ptr = (void*) args->fs_wrapper.opendir_repl;
new_closedir_ptr = (void*) args->fs_wrapper.closedir_repl;
new_readdir_ptr = (void*) args->fs_wrapper.readdir_repl;
}
}
int __real_open(const char *pathname, int flags);
int __wrap_open(const char *pathname, int flags){
if(new_open_ptr == NULL) return __real_open(pathname,flags);
return ( (int (*)(const char *,int))((unsigned int*)new_open_ptr) )(pathname,flags);
}
int __real_close(int fd);
int __wrap_close(int fd){
if(new_close_ptr == NULL) return __real_close(fd);
return ( (int (*)(int))((unsigned int*)new_close_ptr) )(fd);
}
ssize_t __real_write(int fd, const void *buf, size_t count);
ssize_t __wrap_write(int fd, const void *buf, size_t count){
if(new_write_ptr == NULL) return __real_write(fd,buf,count);
return ( (ssize_t (*)(int, const void *, size_t))((unsigned int*)new_write_ptr) )(fd,buf,count);
}
ssize_t __real_read(int fd, const void *buf, size_t count);
ssize_t __wrap_read(int fd, const void *buf, size_t count){
if(new_read_ptr == NULL) return __real_read(fd,buf,count);
return ( (ssize_t (*)(int, const void *, size_t))((unsigned int*)new_read_ptr) )(fd,buf,count);
}
off_t __real_lseek(int fd, off_t offset, int whence);
off_t __wrap_lseek(int fd, off_t offset, int whence){
if(new_lseek_ptr == NULL) return __real_lseek(fd, offset, whence);
return ( (off_t (*)(int, off_t, int))((unsigned int*)new_lseek_ptr) )(fd, offset, whence);
}
int __real_stat(const char *pathname, struct stat *statbuf);
int __wrap_stat(const char *pathname, struct stat *statbuf){
if(new_stat_ptr == NULL) return __real_stat(pathname,statbuf);
return ( (int (*)(const char *, struct stat *))((unsigned int*)new_stat_ptr) )(pathname,statbuf);
}
int __real_fstat(int fd, struct stat *statbuf);
int __wrap_fstat(int fd, struct stat *statbuf){
if(new_fstat_ptr == NULL) return __real_fstat(fd,statbuf);
return ( (int (*)(int, struct stat *))((unsigned int*)new_fstat_ptr) )(fd,statbuf);
}
DIR* __real_opendir(const char * arg);
DIR* __wrap_opendir(const char * arg){
if(new_opendir_ptr == NULL) return __real_opendir(arg);
return ( (DIR* (*)(const char *))((unsigned int*)new_opendir_ptr) )(arg);
}
int __real_closedir(DIR *dirp);
int __wrap_closedir(DIR *dirp){
if(new_closedir_ptr == NULL) return __real_closedir(dirp);
return ( (int (*)(DIR *))((unsigned int*)new_closedir_ptr) )(dirp);
}
struct dirent * __real_readdir(DIR *dirp);
struct dirent * __wrap_readdir(DIR *dirp){
if(new_readdir_ptr == NULL) return __real_readdir(dirp);
return ( (struct dirent * (*)(DIR *))((unsigned int*)new_readdir_ptr) )(dirp);
}
#ifdef __cplusplus
}
#endif

View File

@ -113,8 +113,6 @@ typedef enum wups_loader_library_type_t {
WUPS_LOADER_LIBRARY_ZLIB125,
} wups_loader_library_type_t;
typedef enum wups_loader_hook_type_t {
WUPS_LOADER_HOOK_INIT_FUNCTION
} wups_loader_hook_type_t;
@ -173,86 +171,11 @@ typedef struct wups_loader_init_args_t {
void init(wups_loader_init_args_t*);\
void myInit(wups_loader_init_args_t*);\
WUPS_HOOK_INIT(init); \
static void * new_open_ptr __attribute__((section(".data"))) = NULL; \
static void * new_close_ptr __attribute__((section(".data"))) = NULL; \
static void * new_write_ptr __attribute__((section(".data"))) = NULL; \
static void * new_read_ptr __attribute__((section(".data"))) = NULL; \
static void * new_lseek_ptr __attribute__((section(".data"))) = NULL; \
static void * new_stat_ptr __attribute__((section(".data"))) = NULL; \
static void * new_fstat_ptr __attribute__((section(".data"))) = NULL; \
static void * new_opendir_ptr __attribute__((section(".data"))) = NULL; \
static void * new_closedir_ptr __attribute__((section(".data"))) = NULL; \
static void * new_readdir_ptr __attribute__((section(".data"))) = NULL; \
void init(wups_loader_init_args_t* args){ \
if(args != NULL){\
new_open_ptr = (void*) args->fs_wrapper.open_repl; \
new_close_ptr = (void*) args->fs_wrapper.close_repl; \
new_write_ptr = (void*) args->fs_wrapper.write_repl; \
new_read_ptr = (void*) args->fs_wrapper.read_repl; \
new_lseek_ptr = (void*) args->fs_wrapper.lseek_repl; \
new_stat_ptr = (void*) args->fs_wrapper.stat_repl; \
new_fstat_ptr = (void*) args->fs_wrapper.fstat_repl; \
new_opendir_ptr = (void*) args->fs_wrapper.opendir_repl; \
new_closedir_ptr = (void*) args->fs_wrapper.closedir_repl; \
new_readdir_ptr = (void*) args->fs_wrapper.readdir_repl; \
}\
myInit(args);\
} \
\
EXTERN_C_START \
\
int __real_open(const char *pathname, int flags);\
int __wrap_open(const char *pathname, int flags){\
if(new_open_ptr == NULL) return __real_open(pathname,flags); \
return ( (int (*)(const char *,int))((unsigned int*)new_open_ptr) )(pathname,flags);\
}\
int __real_close(int fd);\
int __wrap_close(int fd){\
if(new_close_ptr == NULL) return __real_close(fd); \
return ( (int (*)(int))((unsigned int*)new_close_ptr) )(fd);\
}\
ssize_t __real_write(int fd, const void *buf, size_t count);\
ssize_t __wrap_write(int fd, const void *buf, size_t count){\
if(new_write_ptr == NULL) return __real_write(fd,buf,count); \
return ( (ssize_t (*)(int, const void *, size_t))((unsigned int*)new_write_ptr) )(fd,buf,count);\
}\
ssize_t __real_read(int fd, const void *buf, size_t count);\
ssize_t __wrap_read(int fd, const void *buf, size_t count){\
if(new_read_ptr == NULL) return __real_read(fd,buf,count); \
return ( (ssize_t (*)(int, const void *, size_t))((unsigned int*)new_read_ptr) )(fd,buf,count);\
}\
off_t __real_lseek(int fd, off_t offset, int whence);\
off_t __wrap_lseek(int fd, off_t offset, int whence){\
if(new_lseek_ptr == NULL) return __real_lseek(fd, offset, whence); \
return ( (off_t (*)(int, off_t, int))((unsigned int*)new_lseek_ptr) )(fd, offset, whence);\
}\
int __real_stat(const char *pathname, struct stat *statbuf);\
int __wrap_stat(const char *pathname, struct stat *statbuf){\
if(new_stat_ptr == NULL) return __real_stat(pathname,statbuf); \
return ( (int (*)(const char *, struct stat *))((unsigned int*)new_stat_ptr) )(pathname,statbuf);\
}\
int __real_fstat(int fd, struct stat *statbuf);\
int __wrap_fstat(int fd, struct stat *statbuf){\
if(new_fstat_ptr == NULL) return __real_fstat(fd,statbuf); \
return ( (int (*)(int, struct stat *))((unsigned int*)new_fstat_ptr) )(fd,statbuf);\
}\
DIR* __real_opendir(const char * arg);\
DIR* __wrap_opendir(const char * arg){\
if(new_opendir_ptr == NULL) return __real_opendir(arg); \
return ( (DIR* (*)(const char *))((unsigned int*)new_opendir_ptr) )(arg);\
}\
int __real_closedir(DIR *dirp);\
int __wrap_closedir(DIR *dirp){\
if(new_closedir_ptr == NULL) return __real_closedir(dirp); \
return ( (int (*)(DIR *))((unsigned int*)new_closedir_ptr) )(dirp);\
}\
struct dirent * __real_readdir(DIR *dirp);\
struct dirent * __wrap_readdir(DIR *dirp){\
if(new_readdir_ptr == NULL) return __real_readdir(dirp); \
return ( (struct dirent * (*)(DIR *))((unsigned int*)new_readdir_ptr) )(dirp);\
}\
\
EXTERN_C_END\
void myInit(wups_loader_init_args_t* my_args)
typedef enum wups_loader_entry_type_t {
@ -297,6 +220,8 @@ typedef struct wups_loader_entry_t {
#define WUPS_MODULE_VERSION(x) WUPS_META(version, x)
#define WUPS_MODULE_LICENSE(x) WUPS_META(license, x)
void WUPS_InitFS(wups_loader_init_args_t* args);
#ifdef __cplusplus
}
#endif