From 7be90a6c1fa4ddf25dc2f7e82d6a8b4339494492 Mon Sep 17 00:00:00 2001 From: cpasjuste Date: Fri, 16 Jun 2017 17:53:38 +0200 Subject: [PATCH] refactor start --- .gitignore | 2 +- common/cmd_common.c | 201 +++++++++++++++++++++++++++++++ common/cmd_common.h | 90 ++++++++++++++ common/include/psp2cmd.h | 64 ---------- common/source/psp2cmd.c | 77 ------------ psp2shell_cli/CMakeLists.txt | 4 +- psp2shell_cli/source/cmd.c | 52 ++------ psp2shell_cli/source/main.c | 44 +------ psp2shell_k/CMakeLists.txt | 1 - psp2shell_k/kutility.c | 21 ---- psp2shell_k/kutility.h | 17 --- psp2shell_k/main.c | 81 ++++++++----- psp2shell_k/psp2shell_k.h | 6 +- psp2shell_m/CMakeLists.txt | 7 +- psp2shell_m/include/psp2shell.h | 4 +- psp2shell_m/source/cmd.c | 202 +++++++++++++++----------------- psp2shell_m/source/cmd.h | 2 +- psp2shell_m/source/file.c | 2 +- psp2shell_m/source/main.c | 36 +++--- psp2shell_m/source/utility.c | 1 + 20 files changed, 484 insertions(+), 430 deletions(-) create mode 100644 common/cmd_common.c create mode 100644 common/cmd_common.h delete mode 100644 common/include/psp2cmd.h delete mode 100644 common/source/psp2cmd.c delete mode 100644 psp2shell_k/kutility.c delete mode 100644 psp2shell_k/kutility.h diff --git a/.gitignore b/.gitignore index b9f249f..e18871d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ CTestTestfile.cmake *.idea build psp2shell_cli/build -cmake-build-* +cmake-build* # psp2shell client *.o diff --git a/common/cmd_common.c b/common/cmd_common.c new file mode 100644 index 0000000..c45176e --- /dev/null +++ b/common/cmd_common.c @@ -0,0 +1,201 @@ +// +// Created by cpasjuste on 17/05/17. +// + +#ifdef PSP2 + +#include +#include +#include +#include +#include +#include + +#define send sceNetSend +#define recv sceNetRecv + +#else + +#include +#include +#include +#include +#include + +#endif + +#include "cmd_common.h" + +int p2s_cmd_receive(int sock, S_CMD *cmd) { + + char buffer[SIZE_CMD]; + memset(buffer, 0, SIZE_CMD); + + ssize_t read = recv(sock, buffer, SIZE_CMD, 0); + if (read < 2) { + return read <= 0 ? P2S_ERR_SOCKET : P2S_ERR_INVALID_CMD; + } + + bool is_cmd = p2s_string_to_cmd(cmd, buffer) == 0; + if (!is_cmd) { + return P2S_ERR_INVALID_CMD; + } + + return 0; +} + +int p2s_cmd_receive_resp(int sock) { + + char buffer[SIZE_CMD]; + memset(buffer, 0, SIZE_CMD); + + ssize_t read = recv(sock, buffer, SIZE_CMD, 0); + if (read < 2) { + return -1; + } + + S_CMD cmd; + if (p2s_string_to_cmd(&cmd, buffer) != 0) { + return -1; + } + + if (cmd.type != CMD_OK) { + return -1; + } + + return 0; +} + +size_t p2s_cmd_receive_buffer(int sock, void *buffer, size_t size) { + + ssize_t len; + size_t left = size; + + while (left) { + len = recv(sock, buffer, left, 0); + if (len == 0) { + size = 0; + break; + }; + if (len == -1) { + break; + } else { + left -= len; + buffer += len; + } + } + + return size; +} + +void p2s_cmd_send(int sock, int cmdType) { + + char buffer[4]; + memset(buffer, 0, 4); + snprintf(buffer, 4, "%i", cmdType); + send(sock, buffer, strlen(buffer), 0); +} + +void p2s_cmd_send_cmd(int sock, S_CMD *cmd) { + + char buffer[SIZE_CMD]; + memset(buffer, 0, SIZE_CMD); + + if (p2s_cmd_to_string(buffer, cmd) == 0) { + send(sock, buffer, strlen(buffer), 0); + } +} + +void p2s_cmd_send_fmt(int sock, const char *fmt, ...) { + + char buffer[SIZE_CMD]; + memset(buffer, 0, SIZE_CMD); + va_list args; + va_start(args, fmt); + vsnprintf(buffer, SIZE_CMD, fmt, args); + va_end(args); + + send(sock, buffer, strlen(buffer), 0); +} + +void p2s_cmd_send_string(int sock, int cmdType, const char *value) { + + char buffer[SIZE_PRINT + 6]; + memset(buffer, 0, SIZE_PRINT + 6); + snprintf(buffer, SIZE_PRINT + 6, "%i\"%s\"", cmdType, value); + send(sock, buffer, strlen(buffer), 0); +} + +void p2s_cmd_send_int(int sock, int cmdType, int value) { + + char buffer[16]; + memset(buffer, 0, 16); + snprintf(buffer, 16, "%i\"%i\"", cmdType, value); + send(sock, buffer, strlen(buffer), 0); +} + +void p2s_cmd_send_long(int sock, int cmdType, long value) { + + char buffer[32]; + memset(buffer, 0, 32); + snprintf(buffer, 32, "%i\"%ld\"", cmdType, value); + send(sock, buffer, strlen(buffer), 0); +} + +int p2s_cmd_to_string(char *buffer, S_CMD *cmd) { + + if (!buffer || !cmd) { + return -1; + } + + memset(buffer, 0, SIZE_CMD); + sprintf(buffer, "%i", cmd->type); + for (int i = 0; i < MAX_ARGS; i++) { + snprintf(buffer + strlen(buffer), SIZE_CMD, "\"%s", cmd->args[i]); + } + strncat(buffer, "\"", SIZE_CMD); + + return 0; +} + +int p2s_string_to_cmd(S_CMD *cmd, const char *buffer) { + + if (!cmd || !buffer) { + return -1; + } + + if (strlen(buffer) < 2) { + return -1; + } + + memset(cmd, 0, sizeof(S_CMD)); + + // type + char tmp[2]; + strncpy(tmp, buffer, 2); + cmd->type = atoi(tmp); + if (cmd->type < CMD_START) { + cmd->type = 0; + return -1; + } + + const char *start, *end = buffer; + + for (int i = 0; i < MAX_ARGS; i++) { + + start = strstr(end, "\""); + if (!start) { + break; + } + start += 1; + + end = strstr(start, "\""); + if (!end) { + break; + } + + strncpy(cmd->args[i], start, end - start); + } + + return 0; +} diff --git a/common/cmd_common.h b/common/cmd_common.h new file mode 100644 index 0000000..eb9b75d --- /dev/null +++ b/common/cmd_common.h @@ -0,0 +1,90 @@ +#ifndef CMD_COMMON_H +#define CMD_COMMON_H + +#define P2S_ERR_SOCKET 0x80000001 +#define P2S_ERR_INVALID_CMD 0x80000002 + +#define SIZE_CHAR (256) +#define SIZE_DATA (8 * 1024) +#define SIZE_PRINT (512) + +#define MAX_ARGS (8) + +typedef struct S_CMD { + int type; + char args[MAX_ARGS][SIZE_PRINT]; +} S_CMD; + +#define SIZE_CMD (sizeof(S_CMD) + 1024) + +enum cmd_t { + CMD_START = 10, + CMD_LS, + CMD_CD, + CMD_RM, + CMD_RMDIR, + CMD_MKDIR, + CMD_MV, + CMD_PWD, + CMD_GET, + CMD_PUT, + CMD_LAUNCH, + CMD_LOAD, + CMD_RELOAD, + CMD_TEST, + CMD_MOUNT, + CMD_UMOUNT, + CMD_TITLE, + CMD_OVADD, + CMD_OVDEL, + CMD_OVLS, + CMD_FIOSCP, + CMD_MODLS, + CMD_MODLS_PID, + CMD_MODINFO, + CMD_MODINFO_PID, + CMD_MODLOADSTART, + CMD_MODLOADSTART_PID, + CMD_MODSTOPUNLOAD, + CMD_MODSTOPUNLOAD_PID, + CMD_KMODLOADSTART, + CMD_KMODSTOPUNLOAD, + CMD_THLS, + CMD_THPAUSE, + CMD_THRESUME, + CMD_MEMR, + CMD_MEMW, + CMD_RESET, + CMD_REBOOT, + CMD_EXIT, + CMD_HELP, + + CMD_OK = 64, + CMD_NOK = 65 +}; + +int p2s_cmd_receive(int sock, S_CMD *cmd); + +size_t p2s_cmd_receive_buffer(int sock, void *buffer, size_t size); + +int p2s_cmd_receive_resp(int sock); + +void p2s_cmd_send(int sock, int cmdType); + +void p2s_cmd_send_cmd(int sock, S_CMD *cmd); + +void p2s_cmd_send_fmt(int sock, const char *fmt, ...); + +void p2s_cmd_send_string(int sock, int cmdType, const char *value); + +void p2s_cmd_send_strings(int sock, int cmdType, int argc, char *argv[]); + +void p2s_cmd_send_int(int sock, int cmdType, int value); + +void p2s_cmd_send_long(int sock, int cmdType, long value); + +int p2s_cmd_to_string(char *buffer, S_CMD *c); + +int p2s_string_to_cmd(S_CMD *c, const char *buffer); + +#endif \ No newline at end of file diff --git a/common/include/psp2cmd.h b/common/include/psp2cmd.h deleted file mode 100644 index 8f85d92..0000000 --- a/common/include/psp2cmd.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef CMD_H -#define CMD_H - -#define SIZE_CHAR (256) -#define SIZE_DATA (8 * 1024) -#define SIZE_PRINT (1024) - -typedef struct S_CMD { - int type; - char arg0[SIZE_PRINT]; - char arg1[SIZE_PRINT]; - long arg2; -} S_CMD; - -#define SIZE_CMD ((SIZE_PRINT * 2) + 64) - -enum cmd_t { - CMD_NONE = 0, - CMD_LS, - CMD_CD, - CMD_RM, - CMD_RMDIR, - CMD_MKDIR, - CMD_MV, - CMD_PWD, - CMD_GET, - CMD_PUT, - CMD_LAUNCH, - CMD_LOAD, - CMD_RELOAD, - CMD_TEST, - CMD_MOUNT, - CMD_UMOUNT, - CMD_TITLE, - CMD_OVADD, - CMD_OVDEL, - CMD_OVLS, - CMD_FIOSCP, - CMD_MODLS, - CMD_MODLS_PID, - CMD_MODINFO, - CMD_MODINFO_PID, - CMD_MODLOADSTART, - CMD_MODLOADSTART_PID, - CMD_MODSTOPUNLOAD, - CMD_MODSTOPUNLOAD_PID, - CMD_KMODLOADSTART, - CMD_KMODSTOPUNLOAD, - CMD_THLS, - CMD_THPAUSE, - CMD_THRESUME, - CMD_MEMR, - CMD_MEMW, - CMD_RESET, - CMD_REBOOT, - CMD_EXIT, - CMD_HELP -}; - -int s_cmd_to_string(char *buffer, S_CMD *c); - -int s_string_to_cmd(S_CMD *c, const char *buffer); - -#endif \ No newline at end of file diff --git a/common/source/psp2cmd.c b/common/source/psp2cmd.c deleted file mode 100644 index b36d7f3..0000000 --- a/common/source/psp2cmd.c +++ /dev/null @@ -1,77 +0,0 @@ -// -// Created by cpasjuste on 17/05/17. -// - -#include - -#ifdef PSP2 - -#include -#include -#include - -#else - -#include -#include -#include - -#endif - -int s_cmd_to_string(char *buffer, S_CMD *c) { - - if (!buffer || !c) { - return -1; - } - - memset(buffer, 0, SIZE_CMD); - snprintf(buffer, SIZE_CMD, - "%i \"%s\" \"%s\" %li", - c->type, c->arg0, c->arg1, c->arg2); - - return 0; -} - -int s_string_to_cmd(S_CMD *c, const char *buffer) { - - memset(c, 0, sizeof(S_CMD)); - - if (strlen(buffer) < 0) { - return -1; - } - - const char *start, *end; - - // type - char tmp[2]; - strncpy(tmp, buffer, 2); - c->type = atoi(tmp); - - // arg0 (string) - start = strstr(buffer, "\"") + 1; - if (!start) { - return -1; - } - end = strstr(start, "\""); - if (!end) { - return -1; - } - strncpy(c->arg0, start, end - start); - - // arg1 (string) - start = strstr(end, "\"") + 3; - if (!start) { - return -1; - } - end = strstr(start, "\""); - if (!end) { - return -1; - } - strncpy(c->arg1, start, end - start); - - // arg2 (long) - start = strstr(start, "\"") + 2; - c->arg2 = atol(start); - - return 0; -} diff --git a/psp2shell_cli/CMakeLists.txt b/psp2shell_cli/CMakeLists.txt index 122a4b9..4c021ce 100644 --- a/psp2shell_cli/CMakeLists.txt +++ b/psp2shell_cli/CMakeLists.txt @@ -8,11 +8,11 @@ add_executable(${PROJECT_NAME} source/main.c source/cmd.c source/utility.c - ../common/source/psp2cmd.c) + ../common/cmd_common.c) target_include_directories(${PROJECT_NAME} PRIVATE include - ../common/include + ../common ) target_link_libraries(${PROJECT_NAME} diff --git a/psp2shell_cli/source/cmd.c b/psp2shell_cli/source/cmd.c index aac3766..f9fecfd 100644 --- a/psp2shell_cli/source/cmd.c +++ b/psp2shell_cli/source/cmd.c @@ -10,19 +10,13 @@ #include "main.h" #include "utility.h" -#include "psp2cmd.h" +#include "cmd_common.h" #include "cmd.h" extern void close_terminal(); extern void close_socks(); -bool response_ok(int sock) { - char buf[2]; - recv(sock, buf, 2, 0); - return buf[0] == '1'; -} - ssize_t send_file(FILE *file, long size) { ssize_t len, progress = 0; @@ -43,24 +37,6 @@ ssize_t send_file(FILE *file, long size) { return progress; } -char CMD_MSG[SIZE_CMD]; - -char *build_msg(int type, char *arg0, - char *arg1, long arg2) { - - S_CMD cmd; - memset(&cmd, 0, sizeof(S_CMD)); - - cmd.type = type; - strncpy(cmd.arg0, arg0, SIZE_PRINT); - strncpy(cmd.arg1, arg1, SIZE_PRINT); - cmd.arg2 = arg2; - - s_cmd_to_string(CMD_MSG, &cmd); - - return CMD_MSG; -} - int cmd_cd(int argc, char **argv) { if (argc < 2) { @@ -68,24 +44,21 @@ int cmd_cd(int argc, char **argv) { return -1; } - char *cmd = build_msg(CMD_CD, argv[1], "0", 0); - send(data_sock, cmd, strlen(cmd), 0); + p2s_cmd_send_string(data_sock, CMD_CD, argv[1]); return 0; } int cmd_ls(int argc, char **argv) { - char *cmd = build_msg(CMD_LS, argc < 2 ? "root" : argv[1], "0", 0); - send(data_sock, cmd, strlen(cmd), 0); + p2s_cmd_send_string(data_sock, CMD_LS, argc < 2 ? "root" : argv[1]); return 0; } int cmd_pwd(int argc, char **argv) { - char *cmd = build_msg(CMD_PWD, "0", "0", 0); - send(data_sock, cmd, strlen(cmd), 0); + p2s_cmd_send(data_sock, CMD_PWD); return 0; } @@ -100,9 +73,9 @@ int cmd_rm(int argc, char **argv) { printf("remove `%s` ? (y/N)\n", argv[1]); char c; scanf("%c", &c); + if (c == 'y') { - char *cmd = build_msg(CMD_RM, argv[1], "0", 0); - send(data_sock, cmd, strlen(cmd), 0); + p2s_cmd_send_string(data_sock, CMD_RM, argv[1]); } return 0; } @@ -118,8 +91,7 @@ int cmd_rmdir(int argc, char **argv) { char c; scanf("%c", &c); if (c == 'y') { - char *cmd = build_msg(CMD_RMDIR, argv[1], "0", 0); - send(data_sock, cmd, strlen(cmd), 0); + p2s_cmd_send_string(data_sock, CMD_RMDIR, argv[1]); } return 0; @@ -132,8 +104,7 @@ int cmd_mv(int argc, char **argv) { return -1; } - char *cmd = build_msg(CMD_MV, argv[1], argv[2], 0); - send(data_sock, cmd, strlen(cmd), 0); + p2s_cmd_send_strings(data_sock, CMD_MV, 2, (char *[]) {argv[1], argv[2]}); return 0; } @@ -149,10 +120,11 @@ int cmd_put(int argc, char **argv) { long size = ftell(fp); fseek(fp, 0L, SEEK_SET); - char *cmd = build_msg(CMD_PUT, basename(argv[1]), argc < 3 ? "0" : argv[2], size); - send(data_sock, cmd, strlen(cmd), 0); - if (response_ok(data_sock)) { + p2s_cmd_send_fmt(data_sock, "%i\"%s\"\"%s\"\"%ld\"", + CMD_PUT, basename(argv[1]), argc < 3 ? "0" : argv[2], size); + + if (p2s_cmd_receive_resp(data_sock) == 0) { send_file(fp, size); } diff --git a/psp2shell_cli/source/main.c b/psp2shell_cli/source/main.c index 06dd607..b9dba96 100644 --- a/psp2shell_cli/source/main.c +++ b/psp2shell_cli/source/main.c @@ -12,7 +12,7 @@ #include #include -#include "psp2cmd.h" +#include "cmd_common.h" #include "cmd.h" #include "utility.h" #include "main.h" @@ -156,39 +156,6 @@ int connect_psp2(char *address, int port) { return 0; } -void set_timeout(int socket, int sec) { - struct timeval timeout; - timeout.tv_sec = sec; - timeout.tv_usec = 0; - setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); -} - -/* -// TODO: crappy way to check psp2 disconnection -bool psp2_alive() { - - bool alive = true; - - int sockfd = socket(AF_INET, SOCK_STREAM, 0); - set_timeout(sockfd, 1); - - struct sockaddr_in sin; - sin.sin_family = AF_INET; - sin.sin_port = htons(65432); - inet_pton(AF_INET, _argv[1], &sin.sin_addr); - if (connect(sockfd, (struct sockaddr *) &sin, sizeof(sin)) == -1) { - if (errno != 111) { // connection refused - printf("Error connecting to %s: %d (%s)\n", _argv[1], errno, strerror(errno)); - close(msg_sock); - alive = false; - } - } - close(sockfd); - - return alive; -} -*/ - void print_hex(char *line) { size_t num_tokens; @@ -236,8 +203,6 @@ void *msg_thread(void *unused) { char *msg = malloc(SIZE_PRINT); - //set_timeout(msg_sock, 1); - // receive message from psp2shell while (true) { @@ -246,13 +211,6 @@ void *msg_thread(void *unused) { ssize_t recv_size = recv(msg_sock, msg, SIZE_PRINT, 0); if (recv_size <= 0) { break; - /* - if (((errno != EAGAIN) && (errno != EWOULDBLOCK)) || !psp2_alive()) { - break; - } else { - continue; - } - */ } size_t len = strlen(msg); diff --git a/psp2shell_k/CMakeLists.txt b/psp2shell_k/CMakeLists.txt index 691416d..e52ae52 100644 --- a/psp2shell_k/CMakeLists.txt +++ b/psp2shell_k/CMakeLists.txt @@ -10,7 +10,6 @@ link_directories(${CMAKE_CURRENT_BINARY_DIR}) add_definitions(-DRELEASE) add_executable(${PROJECT_NAME} main.c - kutility.c ) target_link_libraries(${PROJECT_NAME} taihenForKernel_stub diff --git a/psp2shell_k/kutility.c b/psp2shell_k/kutility.c deleted file mode 100644 index f92a4c7..0000000 --- a/psp2shell_k/kutility.c +++ /dev/null @@ -1,21 +0,0 @@ -// -// Created by cpasjuste on 02/06/17. -// - -#include -#include -#include "kutility.h" - -char log_buf[K_BUF_SIZE]; - -void log_write(const char *msg) { - - //ksceIoMkdir("ux0:/tai/", 6); - SceUID fd = ksceIoOpen("ux0:/tai/psp2shell_k.log", - SCE_O_WRONLY | SCE_O_CREAT | SCE_O_APPEND, 6); - if (fd < 0) - return; - - ksceIoWrite(fd, msg, strlen(msg)); - ksceIoClose(fd); -} diff --git a/psp2shell_k/kutility.h b/psp2shell_k/kutility.h deleted file mode 100644 index 2d8ddec..0000000 --- a/psp2shell_k/kutility.h +++ /dev/null @@ -1,17 +0,0 @@ - -#ifndef KUTILITY_H -#define KUTILITY_H - -#include "psp2shell_k.h" - -extern char log_buf[K_BUF_SIZE]; - -void log_write(const char *msg); - -#define LOG(...) \ - do { \ - snprintf(log_buf, sizeof(log_buf), ##__VA_ARGS__); \ - log_write(log_buf); \ - } while (0) - -#endif // KUTILITY_H \ No newline at end of file diff --git a/psp2shell_k/main.c b/psp2shell_k/main.c index d6df247..73a9559 100644 --- a/psp2shell_k/main.c +++ b/psp2shell_k/main.c @@ -6,26 +6,29 @@ #include "psp2shell_k.h" -volatile static int lock = 0; -volatile static char kbuf[K_BUF_SIZE] = {0}; volatile static int at = 0; +volatile static int lock = 0; +volatile static char k_buf[P2S_KMSG_SIZE] = {0}; + +#define P2S_MSG_LEN 256 -#define KPRINT(fmt, args...) do { \ - int len; \ +#define p2s_print_len(len, fmt, args...) do { \ while (lock); \ lock = 1; \ - len = snprintf((char *)kbuf+at, K_BUF_SIZE-at, fmt, args); \ - if (at + len < K_BUF_SIZE) \ + snprintf((char *)k_buf+at, P2S_KMSG_SIZE-at, fmt, args); \ + if (at + len <= P2S_KMSG_SIZE) \ at += len; \ lock = 0; \ } while (0) -#define MAX_HOOKS 64 +#define p2s_print(fmt, args...) p2s_print_len(strlen(fmt), fmt, args) + +#define MAX_HOOKS 32 static SceUID g_hooks[MAX_HOOKS]; static tai_hook_ref_t ref_hooks[MAX_HOOKS]; static int __stdout_fd = 1073807367; -static int ready = 0; +static bool ready = false; void set_hooks(); @@ -33,16 +36,15 @@ void delete_hooks(); static int _kDebugPrintf(const char *fmt, ...) { - char temp_buf[512]; - memset(temp_buf, 0, 512); + char temp_buf[P2S_MSG_LEN]; + memset(temp_buf, 0, P2S_MSG_LEN); va_list args; va_start(args, fmt); - vsnprintf(temp_buf, 512, fmt, args); + vsnprintf(temp_buf, P2S_MSG_LEN, fmt, args); va_end(args); - //LOG("_printf: %s\n", temp_buf); if (ready) { - KPRINT("%s", temp_buf); + p2s_print("%s", temp_buf); } return TAI_CONTINUE(int, ref_hooks[2], fmt, args); @@ -50,38 +52,37 @@ static int _kDebugPrintf(const char *fmt, ...) { static int _kDebugPrintf2(int num0, int num1, const char *fmt, ...) { - char temp_buf[512]; - memset(temp_buf, 0, 512); + char temp_buf[P2S_MSG_LEN]; + memset(temp_buf, 0, P2S_MSG_LEN); va_list args; va_start(args, fmt); - vsnprintf(temp_buf, 512, fmt, args); + vsnprintf(temp_buf, P2S_MSG_LEN, fmt, args); va_end(args); - //LOG("_printf2: %s\n", temp_buf); if (ready) { - KPRINT("%s", temp_buf); + p2s_print("%s", temp_buf); } return TAI_CONTINUE(int, ref_hooks[3], num0, num1, fmt, args); } -int _sceIoWrite(SceUID fd, const void *data, SceSize size) { +static int _sceIoWrite(SceUID fd, const void *data, SceSize size) { if (ref_hooks[0] <= 0) { return 0; } - if (fd == __stdout_fd && ready && size < K_BUF_SIZE) { - char buf[size]; - memset(buf, 0, size); - ksceKernelStrncpyUserToKernel(buf, (uintptr_t) data, size); - KPRINT("%s", buf); + if (fd == __stdout_fd && ready && size < P2S_MSG_LEN) { + char temp_buf[size]; + memset(temp_buf, 0, size); + ksceKernelStrncpyUserToKernel(temp_buf, (uintptr_t) data, size); + p2s_print_len(size, "%s", temp_buf); } return TAI_CONTINUE(int, ref_hooks[0], fd, data, size); } -int _sceKernelGetStdout() { +static int _sceKernelGetStdout() { if (ref_hooks[1] <= 0) { return 0; @@ -89,28 +90,31 @@ int _sceKernelGetStdout() { int fd = TAI_CONTINUE(int, ref_hooks[1]); __stdout_fd = fd; - //LOG("hook: __stdout_fd: 0x%08X\n", __stdout_fd); return fd; } -int kpsp2shell_wait_buffer(char *buffer) { +SceSize kpsp2shell_wait_buffer(char *buffer) { int state = 0; int count = 0; ENTER_SYSCALL(state); + while (lock); lock = 1; + count = at; - ksceKernelStrncpyKernelToUser((uintptr_t) buffer, (char *) kbuf, at + 1); + ksceKernelStrncpyKernelToUser((uintptr_t) buffer, (char *) k_buf, at + 1); at = 0; lock = 0; + EXIT_SYSCALL(state); - return count; + + return (SceSize) count; } -void kpsp2shell_set_ready(int rdy) { +void kpsp2shell_set_ready(bool rdy) { ready = rdy; } @@ -162,6 +166,13 @@ int kpsp2shell_get_module_list(SceUID pid, int flags1, int flags2, SceUID *modid return res; } +/* +int unload_allowed_patched(void) { + TAI_CONTINUE(int, ref_hooks[4]); + return 1; // always allowed +} +*/ + void set_hooks() { uint32_t state; @@ -203,6 +214,16 @@ void set_hooks() { _kDebugPrintf2); //LOG("hook: _printf2: 0x%08X\n", g_hooks[3]); + /* + g_hooks[4] = taiHookFunctionImportForKernel( + KERNEL_PID, + &ref_hooks[4], // Output a reference + "SceKernelModulemgr", + 0x11F9B314, + 0xBBA13D9C, + unload_allowed_patched); + */ + EXIT_SYSCALL(state); } diff --git a/psp2shell_k/psp2shell_k.h b/psp2shell_k/psp2shell_k.h index 0c7e59b..efabc60 100644 --- a/psp2shell_k/psp2shell_k.h +++ b/psp2shell_k/psp2shell_k.h @@ -3,11 +3,11 @@ #include -#define K_BUF_SIZE 0x1000 +#define P2S_KMSG_SIZE 0x1000 -void kpsp2shell_set_ready(int rdy); +void kpsp2shell_set_ready(bool ready); -int kpsp2shell_wait_buffer(char *buffer); +SceSize kpsp2shell_wait_buffer(char *buffers); int kpsp2shell_get_module_info(SceUID pid, SceUID uid, SceKernelModuleInfo *info); diff --git a/psp2shell_m/CMakeLists.txt b/psp2shell_m/CMakeLists.txt index d958f35..239a68b 100644 --- a/psp2shell_m/CMakeLists.txt +++ b/psp2shell_m/CMakeLists.txt @@ -8,15 +8,16 @@ execute_process(COMMAND "date" "+%Y.%m.%d" OUTPUT_VARIABLE BUILD_DATE OUTPUT_STR set(SRC_FILES source/main.c + source/cmd.c source/utility.c source/file.c source/module.c source/thread.c source/taipool.c - ../common/source/psp2cmd.c - source/cmd.c source/cmd.h) + ../common/cmd_common.c + ) set(INC_FILES - ../common/include + ../common include ) diff --git a/psp2shell_m/include/psp2shell.h b/psp2shell_m/include/psp2shell.h index bc2e232..3256a19 100755 --- a/psp2shell_m/include/psp2shell.h +++ b/psp2shell_m/include/psp2shell.h @@ -1,12 +1,12 @@ #ifndef _psp2_shell_h_ #define _psp2_shell_h_ -#include "psp2cmd.h" - #ifdef __cplusplus extern "C" { #endif +#include "cmd_common.h" + #ifdef DEBUG int sceClibPrintf(const char *, ...); #define printf sceClibPrintf diff --git a/psp2shell_m/source/cmd.c b/psp2shell_m/source/cmd.c index c45ac7f..6f9bf41 100644 --- a/psp2shell_m/source/cmd.c +++ b/psp2shell_m/source/cmd.c @@ -17,14 +17,6 @@ static void cmd_reset(); -static void sendOK(int sock) { - sceNetSend(sock, "1\n", 2, 0); -} - -static void sendNOK(int sock) { - sceNetSend(sock, "0\n", 2, 0); -} - static void toAbsolutePath(s_FileList *fileList, char *path) { p2s_removeEndSlash(path); @@ -55,11 +47,12 @@ static ssize_t cmd_put(s_client *client, long size, char *name, char *dst) { SceUID fd = s_open(new_path, SCE_O_WRONLY | SCE_O_CREAT | SCE_O_TRUNC, 0777); if (fd < 0) { - sendNOK(client->cmd_sock); + p2s_cmd_send(client->cmd_sock, CMD_NOK); PRINT_ERR("could not open file for writing: %s\n", new_path); return -1; } - sendOK(client->cmd_sock); + + p2s_cmd_send(client->cmd_sock, CMD_OK); ssize_t received = p2s_recv_file(client->cmd_sock, fd, size); s_close(fd); @@ -127,12 +120,12 @@ static void cmd_load(int sock, long size, const char *tid) { SceUID fd = s_open(path, SCE_O_WRONLY | SCE_O_CREAT | SCE_O_TRUNC, 6); if (fd < 0) { - sendNOK(sock); + p2s_cmd_send(sock, CMD_NOK); PRINT_ERR("could not open file for writing: %s\n", path); return; } - sendOK(sock); + p2s_cmd_send(sock, CMD_OK); ssize_t received = p2s_recv_file(sock, fd, size); if (received > 0) { @@ -148,7 +141,7 @@ static void cmd_reload(int sock, long size) { char tid[16]; if (p2s_get_running_app_title_id(tid) != 0) { - sendNOK(sock); + p2s_cmd_send(sock, CMD_NOK); PRINT_ERR("can't reload SceShell...\n"); return; } @@ -391,129 +384,124 @@ static void cmd_reboot() { scePowerRequestColdReset(); } -void cmd_parse(s_client *client) { - - S_CMD cmd; - BOOL is_cmd = s_string_to_cmd(&cmd, client->cmd_buffer) == 0; +void cmd_parse(s_client *client, S_CMD *cmd) { - if (is_cmd) { + switch (cmd->type) { - switch (cmd.type) { + case CMD_CD: + cmd_cd(client, cmd->args[0]); + break; - case CMD_CD: - cmd_cd(client, cmd.arg0); - break; + case CMD_LS: + cmd_ls(client, cmd->args[0]); + break; - case CMD_LS: - cmd_ls(client, cmd.arg0); - break; + case CMD_PWD: + cmd_pwd(client); + break; - case CMD_PWD: - cmd_pwd(client); - break; + case CMD_RM: + cmd_rm(client, cmd->args[0]); + break; - case CMD_RM: - cmd_rm(client, cmd.arg0); - break; + case CMD_RMDIR: + cmd_rmdir(client, cmd->args[0]); + break; - case CMD_RMDIR: - cmd_rmdir(client, cmd.arg0); - break; + case CMD_MV: + cmd_mv(client, cmd->args[0], cmd->args[1]); + break; - case CMD_MV: - cmd_mv(client, cmd.arg0, cmd.arg1); - break; + case CMD_PUT: + cmd_put(client, strtoul(cmd->args[0], NULL, 0), cmd->args[1], cmd->args[2]); + break; - case CMD_PUT: - cmd_put(client, cmd.arg2, cmd.arg0, cmd.arg1); - break; + case CMD_LAUNCH: + p2s_launch_app_by_uri(cmd->args[0]); + break; - case CMD_LAUNCH: - p2s_launch_app_by_uri(cmd.arg0); - break; + case CMD_TITLE: + cmd_title(); - case CMD_TITLE: - cmd_title(); + case CMD_MOUNT: + cmd_mount(cmd->args[0]); + break; - case CMD_MOUNT: - cmd_mount(cmd.arg0); - break; + case CMD_UMOUNT: + cmd_umount(cmd->args[0]); + break; - case CMD_UMOUNT: - cmd_umount(cmd.arg0); - break; + case CMD_LOAD: + cmd_load(client->cmd_sock, strtoul(cmd->args[0], NULL, 0), cmd->args[1]); + break; - case CMD_LOAD: - cmd_load(client->cmd_sock, cmd.arg2, cmd.arg0); - break; + case CMD_RELOAD: + cmd_reload(client->cmd_sock, strtoul(cmd->args[0], NULL, 0)); + break; - case CMD_RELOAD: - cmd_reload(client->cmd_sock, cmd.arg2); - break; + case CMD_RESET: + cmd_reset(); + break; - case CMD_RESET: - cmd_reset(); - break; + case CMD_REBOOT: + cmd_reboot(); + break; - case CMD_REBOOT: - cmd_reboot(); - break; + case CMD_MEMR: + cmd_memr(cmd->args[0], cmd->args[1]); + break; - case CMD_MEMR: - cmd_memr(cmd.arg0, cmd.arg1); - break; + case CMD_MEMW: + cmd_memw(cmd->args[0], cmd->args[1]); + break; - case CMD_MEMW: - cmd_memw(cmd.arg0, cmd.arg1); - break; + case CMD_MODLS: + p2s_moduleList(); + break; - case CMD_MODLS: - p2s_moduleList(); - break; + case CMD_MODLS_PID: + p2s_moduleListForPid((SceUID) strtoul(cmd->args[0], NULL, 16)); + break; - case CMD_MODLS_PID: - p2s_moduleListForPid((SceUID) strtoul(cmd.arg0, NULL, 16)); - break; + case CMD_MODINFO: + p2s_moduleInfo((SceUID) strtoul(cmd->args[0], NULL, 16)); + break; - case CMD_MODINFO: - p2s_moduleInfo((SceUID) strtoul(cmd.arg0, NULL, 16)); - break; + case CMD_MODINFO_PID: + p2s_moduleInfoForPid((SceUID) strtoul(cmd->args[0], NULL, 16), (SceUID) strtoul(cmd->args[1], NULL, 16)); + break; - case CMD_MODINFO_PID: - p2s_moduleInfoForPid((SceUID) strtoul(cmd.arg0, NULL, 16), (SceUID) strtoul(cmd.arg1, NULL, 16)); - break; + case CMD_MODLOADSTART: + p2s_moduleLoadStart(cmd->args[0]); + break; - case CMD_MODLOADSTART: - p2s_moduleLoadStart(cmd.arg0); - break; + case CMD_MODLOADSTART_PID: + p2s_moduleLoadStartForPid((SceUID) strtoul(cmd->args[0], NULL, 16), cmd->args[1]); + break; - case CMD_MODLOADSTART_PID: - p2s_moduleLoadStartForPid((SceUID) strtoul(cmd.arg0, NULL, 16), cmd.arg1); - break; + case CMD_MODSTOPUNLOAD: + p2s_moduleStopUnload((SceUID) strtoul(cmd->args[0], NULL, 16)); + break; - case CMD_MODSTOPUNLOAD: - p2s_moduleStopUnload((SceUID) strtoul(cmd.arg0, NULL, 16)); - break; + case CMD_MODSTOPUNLOAD_PID: + p2s_moduleStopUnloadForPid((SceUID) strtoul(cmd->args[0], NULL, 16), + (SceUID) strtoul(cmd->args[1], NULL, 16)); + break; - case CMD_MODSTOPUNLOAD_PID: - p2s_moduleStopUnloadForPid((SceUID) strtoul(cmd.arg0, NULL, 16), (SceUID) strtoul(cmd.arg1, NULL, 16)); - break; + case CMD_KMODLOADSTART: + p2s_kmoduleLoadStart(cmd->args[0]); + break; - case CMD_KMODLOADSTART: - p2s_kmoduleLoadStart(cmd.arg0); - break; + case CMD_KMODSTOPUNLOAD: + p2s_kmoduleStopUnload((SceUID) strtoul(cmd->args[0], NULL, 16)); + break; - case CMD_KMODSTOPUNLOAD: - p2s_kmoduleStopUnload((SceUID) strtoul(cmd.arg0, NULL, 16)); - break; + case CMD_THLS: + ps_threadList(); + break; - case CMD_THLS: - ps_threadList(); - break; - - default: - PRINT_ERR("Unrecognized command\n"); - break; - } + default: + PRINT_ERR("Unrecognized command\n"); + break; } } diff --git a/psp2shell_m/source/cmd.h b/psp2shell_m/source/cmd.h index ba7da82..7b7b0f8 100644 --- a/psp2shell_m/source/cmd.h +++ b/psp2shell_m/source/cmd.h @@ -5,6 +5,6 @@ #ifndef PROJECT_CMD_H #define PROJECT_CMD_H -void cmd_parse(s_client *client); +void cmd_parse(s_client *client, S_CMD *cmd); #endif //PROJECT_CMD_H diff --git a/psp2shell_m/source/file.c b/psp2shell_m/source/file.c index 1dbbc71..0337026 100644 --- a/psp2shell_m/source/file.c +++ b/psp2shell_m/source/file.c @@ -35,10 +35,10 @@ #include "libmodule.h" #endif -#include "psp2cmd.h" #include "file.h" #include "utility.h" #include "taipool.h" +#include "cmd_common.h" #define SCE_ERROR_ERRNO_EEXIST 0x80010011 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) diff --git a/psp2shell_m/source/main.c b/psp2shell_m/source/main.c index 88a51f5..25dac33 100755 --- a/psp2shell_m/source/main.c +++ b/psp2shell_m/source/main.c @@ -20,7 +20,7 @@ #include #include -#include "psp2cmd.h" +#include "cmd_common.h" #include "main.h" #include "cmd.h" #include "utility.h" @@ -144,19 +144,20 @@ int cmd_thread(SceSize args, void *argp) { kpsp2shell_set_ready(1); #endif - while (!quit) { - - memset(client->cmd_buffer, 0, SIZE_CMD); + S_CMD cmd; - int read_size = sceNetRecv( - client->cmd_sock, - client->cmd_buffer, SIZE_CMD, 0); + while (!quit) { - if (read_size <= 0) { - printf("sceNetRecv failed: %i\n", read_size); - break; - } else if (read_size > 0 && !quit) { - cmd_parse(client); + int res = p2s_receive_cmd(sock, &cmd); + if (res != 0) { + if (res == P2S_ERR_SOCKET) { + PRINT_ERR("p2s_receive_cmd sock failed: 0x%08X\n", res); + break; + } else { + PRINT_ERR("p2s_receive_cmd failed: 0x%08X\n", res); + } + } else { + cmd_parse(client, &cmd); } } @@ -234,18 +235,19 @@ static int thread_wait(SceSize args, void *argp) { static int thread_kbuf(SceSize args, void *argp) { - char buffer[K_BUF_SIZE]; + char buffer[P2S_KMSG_SIZE]; while (!quit) { + if (client != NULL) { - int len = kpsp2shell_wait_buffer(buffer); + SceSize len = kpsp2shell_wait_buffer(buffer); if (client != NULL && client->msg_sock > 0 && len > 0) { - psp2shell_print_color_advanced(len, 0, buffer); + psp2shell_print_color_advanced(len, 0, "%s", buffer); } else { - sceKernelDelayThread(1000); + sceKernelDelayThread(100); } } else { - sceKernelDelayThread(1000); + sceKernelDelayThread(100); } } diff --git a/psp2shell_m/source/utility.c b/psp2shell_m/source/utility.c index e89b380..83a1dad 100644 --- a/psp2shell_m/source/utility.c +++ b/psp2shell_m/source/utility.c @@ -26,6 +26,7 @@ #include #include "psp2shell.h" +#include "cmd_common.h" #include "main.h" #include "libmodule.h" #include "taipool.h"