int art_stop(void) { //if (userCodes) // _free(userCodes); finalize_module(); exitThread = 1; while (exitThread) { sys_timer_usleep(1668); sys_ppu_thread_yield(); } _sys_ppu_thread_exit(0); return SYS_PRX_STOP_OK; }
/* * Function: art_thread() * File: main.c * Project: ArtemisPS3-PRX * Description: Artemis PRX Thread start * Interprets user input and calls art_process() * Arguments: * arg: * Return: void */ static void art_thread(uint64_t arg) { int GameProcessID = 0, lastGameProcessID = 0; printf("Artemis PS3 :::: Thread Started!\n"); sys_timer_sleep(10); sys_ppu_thread_yield(); CellPadData data; CellPadInfo2 info; int delay = 0, delay2 = 0, hasDisplayed = 0, fd = 0; while (1) { if (exitThread) { destroy_heap(); exitThread = 0; { sys_ppu_thread_exit(0); } { return; } } GameProcessID = GetGameProcessID(); if (GameProcessID != 0) { if (!check_turnoff()) //exit { printf("Artemis PS3 :::: Process Exited\n"); destroy_heap(); attachedPID = 0; } else { if (GameProcessID != lastGameProcessID) { for (int x = 0; x < (10 * 100); x++) //10 second delay { sys_timer_usleep(10000); sys_ppu_thread_yield(); } show_msg((char *)"Artemis PS3\nStart To Attach"); } cellPadGetInfo2(&info); if (info.port_status[0] && (cellPadGetData(0, &data) | 1) && data.len > 0) { uint32_t pad = data.button[2] | (data.button[3] << 8); if (attachedPID) // Run codes { art_process(0); } if (pad & PAD_START) { attachedPID = GameProcessID; if (attachedPID) { show_msg((char *)"Artemis PS3\nAttached and Wrote"); printf("Artemis PS3 :::: Attached to 0x%08X\n", attachedPID); if (get_heap() == 0) create_heap(1); check_syscall_api(); art_process(1); while ((cellPadGetData(0, &data) | 1) && data.len > 0) { if (!((data.button[2] | (data.button[3] << 8)) & PAD_START)) break; sys_timer_usleep(1000000); sys_ppu_thread_yield(); } } else { show_msg((char *)"Artemis PS3\nFailed to Attach"); } } else if (pad & PAD_SELECT && attachedPID) { show_msg((char *)"Artemis PS3\nDetached"); reset_heap(); attachedPID = 0; } } sys_timer_usleep(100 * 1000); //0.1 second delay } } else { if (attachedPID) // Disconnect { printf("Artemis PS3 :::: Process Exited\n"); destroy_heap(); attachedPID = 0; } else sys_timer_usleep(3 * 1000 * 1000); //3 second delay } lastGameProcessID = GameProcessID; sys_timer_usleep(1668); sys_ppu_thread_yield(); } destroy_heap(); sys_ppu_thread_exit(0); }
static void handleclient(u64 conn_s_p) { int conn_s = (int)conn_s_p; int list_s_data = -1; int conn_s_data = -1; char cwd[2048]; char login_user[32]; char login_pass[64]; char rename_from[2048]; u32 rest = 0; int authd = 0; char message[4096]; char buffer[2048]; sprintf(cwd, "/"); sprintf(message, "220-OpenPS3FTP by @jjolano\r\n"); Writeline(conn_s, message, strlen(message)); sprintf(message, "220 Version %s\r\n", VERSION); Writeline(conn_s, message, strlen(message)); while(program_running == 1) { sys_ppu_thread_yield(); if(Readline(conn_s, buffer, 2047) == 0 || strncmp(buffer, "QUIT", 4) == 0 || strncmp(buffer, "BYE", 3) == 0) { break; } buffer[strcspn(buffer, "\n")] = '\0'; buffer[strcspn(buffer, "\r")] = '\0'; if(strncmp(buffer, "USER", 4) == 0) { if(strlen(buffer) > 7) { strcpy(login_user, buffer+5); sprintf(message, "331 Username %s OK. Password required\r\n", login_user); Writeline(conn_s, message, strlen(message)); } else { sprintf(message, "430 No username specified\r\n"); Writeline(conn_s, message, strlen(message)); } } else if(strncmp(buffer, "PASS", 4) == 0) { if(strlen(buffer) > 7) { strcpy(login_pass, buffer+5); if(strcmp(LOGIN_USERNAME, login_user) == 0 && strcmp(LOGIN_PASSWORD, login_pass) == 0) { authd = 1; sprintf(message, "230 Successful authentication\r\n"); } else { sprintf(message, "430 Invalid username or password\r\n"); Writeline(conn_s, message, strlen(message)); } } else { sprintf(message, "430 Invalid username or password\r\n"); } Writeline(conn_s, message, strlen(message)); } else if(authd == 0) { sprintf(message, "530 Not logged in\r\n"); Writeline(conn_s, message, strlen(message)); } else if(strncmp(buffer, "FEAT", 4) == 0) { sprintf(message, "211-Extensions supported:\r\n"); Writeline(conn_s, message, strlen(message)); sprintf(message, " SIZE\r\n"); Writeline(conn_s, message, strlen(message)); sprintf(message, " PASV\r\n"); Writeline(conn_s, message, strlen(message)); sprintf(message, "211 End\r\n"); Writeline(conn_s, message, strlen(message)); } else if(strncmp(buffer, "TYPE", 4) == 0) { sprintf(message, "200 TYPE is now %s\r\n", buffer+5); Writeline(conn_s, message, strlen(message)); } else if(strncmp(buffer, "PORT", 4) == 0) { rest = 0; char connectinfo[24]; strcpy(connectinfo, buffer+5); char data[7][4]; int len = strlen(connectinfo); int i, x = 0, y = 0; for(i = 0;i < len;i++) { if(connectinfo[i] == ',') { data[x][y] = '\0'; x++; y = 0; } else { data[x][y] = connectinfo[i]; y++; } } char conn_ipaddr[16]; sprintf(conn_ipaddr, "%s.%s.%s.%s", data[0], data[1], data[2], data[3]); int p1 = atoi(data[4]); int p2 = atoi(data[5]); short int conn_port = (p1 * 256) + p2; netClose(conn_s_data); netClose(list_s_data); list_s_data = -1; conn_s_data = netSocket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(conn_port); inet_pton(AF_INET, conn_ipaddr, &servaddr.sin_addr); if(connect(conn_s_data, (struct sockaddr *)&servaddr, sizeof(servaddr)) == 0) { sprintf(message, "200 PORT command successful\r\n"); Writeline(conn_s, message, strlen(message)); continue; } sprintf(message, "425 Internal Error\r\n"); Writeline(conn_s, message, strlen(message)); } else if(strncmp(buffer, "PASV", 4) == 0) { rest = 0; netSocketInfo snf; int ret = netGetSockInfo(conn_s, &snf, 1); if(ret >= 0 && snf.local_adr.s_addr != 0) { netClose(conn_s_data); netClose(list_s_data); conn_s_data = -1; list_s_data = -1; // create the socket list_s_data = netSocket(AF_INET, SOCK_STREAM, 0); // calculate the passive mode port //srand((unsigned)time(NULL)); //srand((unsigned)time(NULL) + rand()); int rand1 = 4 + rand() % 255; int rand2 = rand() % 256; short int port = (rand1 * 256) + rand2; struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(port); // bind address to listener, listen, and accept netBind(list_s_data, (struct sockaddr *) &servaddr, sizeof(servaddr)); netListen(list_s_data, LISTENQ); sprintf(message, "227 Entering Passive Mode (%u,%u,%u,%u,%i,%i)\r\n", (snf.local_adr.s_addr & 0xFF000000) >> 24, (snf.local_adr.s_addr & 0xFF0000) >> 16, (snf.local_adr.s_addr & 0xFF00) >> 8, (snf.local_adr.s_addr & 0xFF), rand1, rand2); Writeline(conn_s, message, strlen(message)); if((conn_s_data = netAccept(list_s_data, NULL, NULL)) < 0) { printf("warning: failed to accept a connection\n"); netClose(conn_s_data); netClose(list_s_data); conn_s_data = -1; list_s_data = -1; } else { // PASV success continue; } } sprintf(message, "425 Internal Error\r\n"); Writeline(conn_s, message, strlen(message)); }