#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <netdb.h>

void uzmislovo (int soq, char *slovo) {

	if (recv (soq, slovo, 1, 0)!=1) {
		perror("recv");
		exit(1);
	}

}

void pop_poruka (int soq, char *slovo) {

        do {
		uzmislovo (soq,slovo);
                putchar(*slovo);
        } while (!(*slovo=='\r'));

        uzmislovo (soq,slovo);

	if (!(*slovo=='\n')) {
		exit(1);
	}

	printf ("\n");
}


int check (int soq) {

	char *slovo = '\0';
	char buf[4];

	uzmislovo (soq, slovo);

	if (*slovo=='+') {
		if ((recv (soq, buf, 2, 0)==2) && (buf[0]=='O'&&buf[1]=='K')) {
 			printf("+OK");
                        /* stvar je ok - ispisujemo poruku i kraj f-je */
			pop_poruka (soq,slovo);
			return(0);
		}
		else {
                	/* nekaj ne stima. vjerojatno nije POP server */
			printf("POP3 server not responding.\n");
                	exit(1);
		}
	}

	else if (*slovo=='-') {
		if ((recv (soq, buf, 3, 0)==3) && ((buf[0]=='E') && (buf[1]=='R') && (buf[2]='R'))) {
			printf("+ERR");
			/* greska - ispisujemo poruku i kraj programa */
			pop_poruka (soq,slovo);
			exit(1);
		}
		else {
                	/* nekaj ne stima. vjerojatno nije POP server */
			printf("POP3 server not responding.\n");
                	exit(1);
		}
	}

	/* nekaj ne stima. vjerojatno nije POP server */
	printf("POP3 server not responding.\n");
	exit(1);
}

void main (int argc, char *argv[]) {

	int soq;
	int count;
	struct hostent *host;
	struct sockaddr_in sin = { 0 };
	FILE *fp;
	FILE *env;
	char buf[512];
	char hostname[512];
	char user_cmd[38] = "USER \0";
	char user[32];
	char pass_cmd[38] = "PASS \0";
	char pass[32];

	if (argc!=2) {
		printf ("Usage: weazel <message_file>\n");
		exit(1);
	}

	if (!(fp=fopen(argv[1],"rb"))) {
		printf ("Error opening file %s.\n",argv[1]);
		exit(1);
	}

	if (!(env=fopen("ENV:WEAZEL","rb"))) {
		printf ("Config file not found.\n");
		exit(1);
	}

	fgets(user,32,env);
	fgets(pass,32,env);
        fgets(hostname,512,env);

	/* sad maknemo CR i LF sa kraja houstnejma ako ih ima */

	if (hostname[strlen(hostname)-1]=='\r'||hostname[strlen(hostname)-1]=='\n') {
                hostname[strlen(hostname)-1]='\0';
	}

	if (hostname[strlen(hostname)-1]=='\r'||hostname[strlen(hostname)-1]=='\n') {
                hostname[strlen(hostname)-1]='\0';
	}

	fclose(env);

	soq = socket (AF_INET,SOCK_STREAM,0);

	if (soq < 0) {
		perror ("socket");
                exit (1);
	}

	if (!(host=gethostbyname(hostname))) {
		perror ("gethostbyname");
		exit (1);
	}

	memcpy (&sin.sin_addr, host->h_addr, sizeof(sin.sin_addr));
	sin.sin_family = host->h_addrtype;
	sin.sin_port = 110;			/* POP3 port */

	if(connect(soq, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) < 0)
	{
		perror("connect");
		exit(1);
	}

	printf("Connected to %s.\n",hostname);

	check(soq);

	strcat(user_cmd,user);

	send(soq,user_cmd,strlen(user_cmd),0);

	check(soq);

	strcat(pass_cmd,pass);

	send (soq,pass_cmd,strlen(pass_cmd),0);

        check(soq);

	send (soq,"XTND XMIT\r\n",11,0);

        check(soq);

	do {
	        count = fread(buf, 1, 512, fp);
		send (soq,buf,count,0);
	} while (!(feof(fp)));

	send (soq,"\r\n.\r\n",5,0);

	check(soq);

	send (soq,"QUIT\r\n",6,0);

	check(soq);

	CloseSocket(soq);

}
