int cafiine_fstat(int sock, int *result, int fd, void *ptr) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); int ret; char buffer[1 + 4]; buffer[0] = BYTE_STATFILE; *(int *)(buffer + 1) = fd; ret = sendwait(sock, buffer, 1 + 4); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); CHECK_ERROR(ret == BYTE_NORMAL); ret = recvwait(sock, result, 4); CHECK_ERROR(ret < 0); int sz; ret = recvwait(sock, &sz, 4); CHECK_ERROR(ret < 0); if (ptr) { ret = recvwait(sock, ptr, sz); CHECK_ERROR(ret < 0); } bss.lock = 0; return 0; error: bss.lock = 0; return -1; }
int cafiine_fgetpos(int sock, int *result, int fd, int *pos) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); int ret; char buffer[1 + 4]; buffer[0] = BYTE_GETPOS; *(int *)(buffer + 1) = fd; ret = sendwait(sock, buffer, 1 + 4); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); CHECK_ERROR(ret == BYTE_NORMAL); ret = recvwait(sock, result, 4); CHECK_ERROR(ret < 0); ret = recvwait(sock, pos, 4); CHECK_ERROR(ret < 0); bss.lock = 0; return 0; error: bss.lock = 0; return -1; }
int cafiine_fread(int sock, int *result, void *ptr, int size, int count, int fd) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); int ret; char buffer[1 + 12]; buffer[0] = BYTE_READ; *(int *)(buffer + 1) = size; *(int *)(buffer + 5) = count; *(int *)(buffer + 9) = fd; ret = sendwait(sock, buffer, 1 + 12); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); CHECK_ERROR(ret == BYTE_NORMAL); ret = recvwait(sock, result, 4); CHECK_ERROR(ret < 0); int sz; ret = recvwait(sock, &sz, 4); CHECK_ERROR(ret < 0); ret = recvwait(sock, ptr, sz); CHECK_ERROR(ret < 0); ret = sendbyte(sock, BYTE_OK); CHECK_ERROR(ret < 0); bss.lock = 0; return 0; error: bss.lock = 0; return -1; }
static int cafiine_handshake(int sock) { int ret; unsigned char buffer[16]; memcpy(buffer, &title_id, 16); ret = sendwait(sock, buffer, sizeof(buffer)); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); return ret; error: return ret; }
int cafiine_fopen(int sock, int *result, const char *path, const char *mode, int *handle) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); int ret; int len_path = 0; while (path[len_path++]); int len_mode = 0; while (mode[len_mode++]); { char buffer[1 + 8 + len_path + len_mode]; buffer[0] = BYTE_OPEN; *(int *)(buffer + 1) = len_path; *(int *)(buffer + 5) = len_mode; for (ret = 0; ret < len_path; ret++) buffer[9 + ret] = path[ret]; for (ret = 0; ret < len_mode; ret++) buffer[9 + len_path + ret] = mode[ret]; ret = sendwait(sock, buffer, 1 + 8 + len_path + len_mode); } CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); CHECK_ERROR(ret == BYTE_NORMAL); ret = recvwait(sock, result, 4); CHECK_ERROR(ret < 0); ret = recvwait(sock, handle, 4); CHECK_ERROR(ret < 0); bss.lock = 0; return 0; error: bss.lock = 0; return -1; }
int fs_connect(int *psock) { extern unsigned int server_ip; struct sockaddr_in addr; int sock, ret; // No ip means that we don't have any server running, so no logs if (server_ip == 0) { *psock = -1; return 0; } socket_lib_init(); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); CHECK_ERROR(sock == -1); addr.sin_family = AF_INET; addr.sin_port = 7332; addr.sin_addr.s_addr = server_ip; ret = connect(sock, (void *)&addr, sizeof(addr)); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); *psock = sock; return 0; error: if (sock != -1) socketclose(sock); *psock = -1; return -1; }