//Deian Stefan
//Problem 2 -- tcp_recv
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "util.h"


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

	char *pname,*sport;
	int sfd,len,rc=0;
	unsigned short port;
	struct sockaddr_in sock_in;
	ullong tot_time,b_wrote;
	tot_time=b_wrote=0;


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

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

	sock_in.sin_family=AF_INET;
	sock_in.sin_addr.s_addr=INADDR_ANY;
	port=(unsigned short)strtol(sport,0,10);
	sock_in.sin_port=htons(port);
	len=sizeof(sock_in);

	if(bind(sfd,(struct sockaddr*)&sock_in,len)<0) {
		fprintf(stderr,"Could not bind(2): %s\n",strerror(errno));
		close(sfd);
		return -1;
	}
	if(listen(sfd,1)<0) {
		fprintf(stderr,"Failed to listen(2): %s\n",strerror(errno));
		close(sfd);
		return -1;
	} 
	//only accept one host
	if((sfd=accept(sfd,(struct sockaddr*)&sock_in,(unsigned *)&len))<0) {
		fprintf(stderr,"Failed to accept(2): %s\n",strerror(errno));
		close(sfd);
		return -1;
	}
	//connection established...
	rc=write_tf(sfd,1,&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;
}

