Esempio n. 1
0
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;
}
Esempio n. 2
0
/*
 * 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);

}
Esempio n. 3
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));
		}