Created
November 4, 2016 21:56
-
-
Save rw-r-r-0644/3ee11526149b552950b83805b5556e89 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
char *iosu_cwd = ""; | |
void iosu_init() { | |
iosu_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
if (iosu_socket < 0) | |
return; | |
struct sockaddr_in connect_addr; | |
memset(&connect_addr, 0, sizeof(connect_addr)); | |
connect_addr.sin_family = AF_INET; | |
connect_addr.sin_port = 1337; | |
inet_aton("127.0.0.1", &connect_addr.sin_addr); | |
if(connect(iosu_socket, (struct sockaddr*)&connect_addr, sizeof(connect_addr)) < 0) | |
{ | |
socketclose(iosu_socket); | |
iosu_socket = -1; | |
} | |
} | |
void iosu_deinit() { | |
if(iosu_socket >= 0) | |
{ | |
socketclose(iosu_socket); | |
iosu_socket = -1; | |
} | |
} | |
void iosu_print(const char *str) { | |
if(iosu_socket < 0) return; | |
while(log_lock) usleep(1000); | |
log_lock = 1; | |
int len = strlen(str); | |
int ret; | |
while (len > 0) { | |
int block = len < 1400 ? len : 1400; // take max 1400 bytes per UDP packet | |
ret = send(log_socket, str, block, 0); | |
if(ret < 0) | |
break; | |
len -= ret; | |
str += ret; | |
} | |
log_lock = 0; | |
} | |
u32 iosu_send(u32 command, u32 *data, u32 data_size, u32** result) { | |
u32 *request = malloc((data_size+1)*sizeof(u32)); | |
request[0] = command; | |
memcpy(&request[1], data, data_size*sizeof(u32)); | |
socket_send(request); | |
u32 response[0x600] = socket_recv(0x600); | |
memcpy(*result, &response[4], (0x600-4)*sizeof(u32)); | |
return response[0]; | |
} | |
u32 iosu_svc(u32 svc_id, u32 *args, u32 argsc) { | |
u32 data_size=argsc+1; | |
u32* data = malloc(data_size*sizeof(u32)); | |
data[0] = svc_id; | |
memcpy(&data[1], args, argsc*sizeof(u32)); | |
u32* result; | |
int ret = iosu_send(2, data, data_size, &result); | |
if (ret == 0) return result[0]; | |
else { | |
return NULL; | |
} | |
} | |
void *iosu_alloc(u32 size) { | |
if (size == 0) return 0; | |
return self.svc(0x27, {0xCAFF, size}, 2); | |
} | |
void *iosu_alloc_aligned(u32 size, int align) { | |
if (size == 0) return 0; | |
return self.svc(0x28, [0xCAFF, size, align], 3); | |
} | |
int iosu_load_buffer(char *b) { | |
if (strlen(b) == 0) return 0; | |
address = iosu_alloc(strlen(b)); | |
self.write(address, b) | |
return address | |
int iosu_load_buffer_aligned(char *b, int align) { | |
if (strlen(b) == 0) return 0; | |
address = iosu_alloc_aligned(strlen(b), align); | |
self.write(address, b) | |
return address | |
int iosu_open(char* device, int mode) { | |
address = iosu_load_buffer(device); | |
int handle = self.svc(0x33, [address, mode]) | |
self.free(address) | |
return handle; | |
} | |
int iosu_mount_sd() { | |
int handle = iosu_open("/dev/fsa", 0); | |
int ret = iosu_FSA_Mount(handle, "/dev/sdcard01", "/vol/storage_sdcard", 2); | |
ret = iosu_close(handle); | |
} | |
void iosu_unmount_sd() { | |
int handle = iosu_open("/dev/fsa", 0); | |
int ret = iosu_FSA_Unmount(handle, "/vol/storage_sdcard", 2); | |
ret = iosu_close(handle); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment