#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>

#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <asm/errno.h>

#include "utils.h"

#define BUFSIZE 1024

int get_line_soc(int s,char *buffer,int length,int flags) {
	char c;
	int l = 0;
	int ret = 0;
	fprintf(stderr,"get_line_soc: start %x\n",flags);
	while(l < (length - 1) && c != '\n' && ret != -1) {
		ret = recv(s,&c,1,flags);
		if (ret == 1) {
			(*buffer) = c;
			++buffer;
			++l;
			putc(c,stdout);
			fflush(stdout);
		} else {
			*buffer = '\0';
			fprintf(stderr,"get_line_soc: EAGAIN\n");
			return EAGAIN;
		}
	}
	*buffer = '\n';
	++buffer;
	*buffer = '\0';
	fprintf(stderr,"get_line_soc: end\n");
	if (ret == -1) {
		return EOF;
	} else {
		return l + 2;
	}
}

void *rcon_command(int s, char *buffer, struct sockaddr *addr, 
		int addr_len, char *password, char *command) {
	char *temp = NULL;
	
	sprintf(buffer,"˙˙˙˙challenge rcon\n");
	sendto(s,buffer,(strlen(buffer) + 1),0,addr,addr_len);
	
	recv(s,buffer,BUFSIZE,0);
	chomp(buffer,strlen(buffer));
	temp = word(buffer,3);
	
	sprintf(buffer,"˙˙˙˙rcon %s \"%s\" %s",temp,password,command);
	sendto(s,buffer,(strlen(buffer) + 1),0,addr,addr_len);
	recv(s,buffer,BUFSIZE,0);
	
	free(temp);
}

int main(int argc, char *argv[]) {
	int main_soc;
	int result;
	int port = 33333;
	char *temp;
	char password[] = "mouse";
	char buffer_data1[BUFSIZE];
	char buffer_data2[BUFSIZE];
	char *buffer = buffer_data1;
	char *buffer2 = buffer_data2;
	struct sockaddr_in addr;
	struct sockaddr_in ret;
	struct hostent *host;
	struct hostent *hext;
	struct in_addr inaddr;
	host = gethostbyname("eden");
	main_soc = socket(PF_INET,SOCK_DGRAM,0);
		
	memcpy(&addr.sin_addr.s_addr,host->h_addr_list[0],host->h_length);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(27015);

	gethostname(buffer,BUFSIZE);
	//hext = gethostbyname(buffer);
	
	ret.sin_family = AF_INET;
	ret.sin_port = htons(port);
	inet_aton("0.0.0.0",&ret.sin_addr);

	//inaddr.s_addr = *hext->h_addr_list[0];
	//printf("%x,%d\n",*hext->h_addr_list[0],hext->h_length);
	bind(main_soc,(struct sockaddr *)&ret,sizeof(ret));
	sprintf(buffer2,"logaddress %s %d",
			buffer,port); 
	
	rcon_command(main_soc,buffer,
			(struct sockaddr *)&addr,sizeof(addr),password,"log on");
	rcon_command(main_soc,buffer,
			(struct sockaddr *)&addr,sizeof(addr),password,buffer2);

	while(recv(main_soc,buffer,BUFSIZE,0)) {
		printf("%s",buffer);
	}
	return 0;	
}
