#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define NBUF 1000
#define NTITLE 1024
#define NHOSTNAME 128

int main() {

	char *s,*t;
	FILE *f,*fs;
	char *logfile = "log.c.txt";
	char *expr_st = "<title>";
	char *expr_en = "</title>";
	char last_title[NTITLE] = "";
	char title[NTITLE] = "";
	char buf[NBUF];
	char *recipients[] = { "dew@rabbit.com","tarzan@rabbit.com" };
	
	struct hostent *he;
	u_short port=80;
	char hostname[NHOSTNAME];
	int sd,found=0,host,dest=0,nbuf;
	struct sockaddr_in addr;
	char *path = "/";
	
	strcpy(hostname,"fruit.alsacreations.fr");
	he=gethostbyname(hostname);
	if(he==0) {
		herror("gethostbyname");
		exit(1);
	}
	
	memcpy(&addr.sin_addr.s_addr,he->h_addr,he->h_length);
	addr.sin_family=AF_INET;
	addr.sin_port=htons(port);
	memset(&(addr.sin_zero),'\0',8);
	
	sd=socket(AF_INET,SOCK_STREAM,0); 
	if(sd<0) {
		perror("socket");
		exit(1);
	}
	
	if(connect(sd,(struct sockaddr *)&addr,sizeof(struct sockaddr))<0) {
		perror("connect");
		exit(1);
	}
	
	sprintf(buf,"GET %s HTTP/1.1\r\nHost: %s\r\n\r\n",path,hostname);
	write(sd,buf,strlen(buf));
	
	fs = fdopen(sd,"r");
	while(fgets(buf,NBUF,fs) && found==0) {
		if((s=strstr(buf,expr_st))!=NULL) {
			s+=strlen(expr_st);
			t=strstr(s,expr_en);
			s[t-s]=0;
			strcpy(title,s);
			found=1;
		}
	}
	close(sd);
	fclose(fs);
	
	f = fopen(logfile,"r");
	if(f) {
		fgets(last_title,1024,f);
		fclose(f);
		found = strlen(last_title)-1;
		while(last_title[found] == '\n' || last_title[found] == '\r') last_title[found--]=0;
		printf("Last title : %s\n",last_title);
	}
	
	printf("Title : %s\n",title);
	
	if(strcmp(title,last_title)!=0) {

		printf("Difference !\n");
		
		strcpy(hostname,"localhost");
		port=25;
		he=gethostbyname(hostname);
		if(he==0) {
			herror("gethostbyname");
			exit(1);
		}
		
		memcpy(&host,he->h_addr,sizeof(host));
		addr.sin_family=AF_INET;
		addr.sin_port=htons(port);
		addr.sin_addr.s_addr=host;
		
		sd=socket(AF_INET,SOCK_STREAM,0); 
		if(sd<0) {
			perror("socket");
			exit(1);
		}
		
		if(connect(sd,(struct sockaddr *)&addr,sizeof(addr))<0) {
			perror("connect");
			exit(1);
		}
		
		nbuf=read(sd,buf,NBUF);
		
		sprintf(buf,"HELO papaye\r\n");
		write(sd,buf,strlen(buf));
		nbuf=read(sd,buf,NBUF);
		if(strncmp(buf,"250",3)!=0) {
			perror("Err SMTP HELO");
			exit(1);
		}
		
		for(dest=0;dest<2;dest++) {

			printf("Mail to %s\n",recipients[dest]);
			
			memset(buf,0,NBUF);
			sprintf(buf,"MAIL FROM:<dumbo@jumbo.com>\r\n");
			write(sd,buf,strlen(buf));
			
			memset(buf,0,NBUF);
			sprintf(buf,"RCPT TO:<%s>\r\n",recipients[dest]);
			write(sd,buf,strlen(buf));
			
			memset(buf,0,NBUF);
			sprintf(buf,"DATA\r\nSubject: [Turborabbit] New title !\r\n(Script C) New title !\n%s\r\n",title);
			write(sd,buf,strlen(buf));
			
			memset(buf,0,NBUF);
			sprintf(buf,"\r\n.\r\n");
			write(sd,buf,strlen(buf));
		
		}
		
		sprintf(buf,"QUIT\r\n");
		write(sd,buf,strlen(buf));
		
		close(sd);

		f = fopen(logfile,"w");
		if(f) {
			fputs(title,f);
			fclose(f);
		} else {
			fprintf(stderr,"Cannot write to file");
		}

	}

}

