//Deian Stefan
//Problem 1 -- tcp_send
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <setjmp.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "util.h"

jmp_buf int_jump;

void int_handler(int sig) {
	        longjmp(int_jump,1);
}

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

	char *pname, *hname, *sport;
	int sfd,rc=0;
	unsigned short port;
	struct sockaddr_in sock_out;
	ullong tot_time,b_wrote;
	struct sigaction sig;
	tot_time=b_wrote=0;

	sig.sa_handler=int_handler;
	sigaction(SIGPIPE,&sig,NULL);

	pname=*argv++;
	if(argc<3||argc>3) {
		fprintf(stderr, "Usage: %s hostname port.\n",pname);
		return -1;
	}
	hname=*argv++;     
     	sport=*argv++;

	if((sfd=socket(AF_INET,SOCK_STREAM,0))<0) {
		fprintf(stderr,"Could not create socket: %s\n",
				strerror(errno));
		return -1;
	}

	sock_out.sin_family=AF_INET;
	if(get_addr(hname,&sock_out)) {
		close(sfd);
		return -1;
	}
	port=(unsigned short)strtol(sport,0,10);
	sock_out.sin_port=htons(port);

	if(connect(sfd,(struct sockaddr *)&sock_out,sizeof(sock_out))<0) {
		fprintf(stderr,"Could not connect to host %s:%u: %s\n",
		hname,port,strerror(errno));
		close(sfd);
		return -1;
	}

	if(setjmp(int_jump)) {
		fprintf(stderr,"Connection interrupted.\n");
		close(sfd); //unreliable stats
		return rc;
	}
	rc=write_tf(0,sfd,&b_wrote,&tot_time);
	close(sfd);
	if(!rc) {
		print_stat(b_wrote,tot_time);
	} else if(rc==1){
		//gettime(2) failed
		fprintf(stderr,"Wrote %llu B.\n",b_wrote);
	}

	return rc;
}

