/*	Project Group :	Muhammad Rashid Mahfooz, Salman Zubair, Syed Shahzad Ali
 *			CS742 COMPUTER COMMUNICATION NETWORKS
 *			Wichita State University
 *                      Wichita Kansas
 *
 *	Created:	September 18, 2001
 *
 *	Program: 	This is a client program which provides the user 
 *			a facility to get time from the server and display
 *			it as an out put
 *
 *	Modified:	September 19, 2001
 */

/* Included Header Files */
#include	<sys/types.h>	/* basic system data types */
#include	<sys/socket.h>	/* basic socket definitions */
#include	<sys/time.h>	/* timeval{} for select() */
#include	<time.h>	/* timespec{} for pselect() */
#include	<netinet/in.h>	/* sockaddr_in{} and other Internet defns */
#include	<arpa/inet.h>	/* inet(3) functions */
#include	<errno.h>
#include	<fcntl.h>	/* for nonblocking */
#include	<netdb.h>
#include	<signal.h>
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<sys/stat.h>	/* for S_xxx file mode constants */
#include	<sys/uio.h>	/* for iovec{} and readv/writev */
#include	<unistd.h>
#include	<sys/wait.h>
#include	<sys/un.h>	/* for Unix domain sockets */

/* Macros used by program */
#define MAXLINE	4096		/* max text line length */
#define SA	struct sockaddr
#define PORT_NO	5914		/* port number */

/* Mian Function */
int main(int argc, char **argv)
{
	int			sockfd, n;
	socklen_t		len;
	char			recvline[MAXLINE + 1];
	char			buff[MAXLINE];
	struct sockaddr_in	servaddr, cliaddr;

	if (argc != 2)
	{
		perror("usage: a.out <IPaddress>");
		exit(1);
	}

	if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		perror("socket error");
		exit(1);
	}

	memset(&servaddr,0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port   = htons(PORT_NO);	/* daytime server */
	
	if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
	{
		perror("inet_pton error for ");
		printf("%s", argv[1]);
		exit(1);
	}

	if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
	{
		perror("connect error");
		exit(1);
	}

	len = sizeof(cliaddr);
	getsockname(sockfd, (SA *) &cliaddr, &len);

	printf("local addr: %s\n",
			inet_ntop(AF_INET, &cliaddr.sin_addr, 
					buff, sizeof(buff)));

	while ( (n = read(sockfd, recvline, MAXLINE)) > 0) 
	{
		recvline[n] = 0;	/* null terminate */
		if (fputs(recvline, stdout) == EOF)
		{
			perror("fputs error");
			exit(1);
		}
	}
	
	if (n < 0)
	{
		perror("read error");
		exit(1);
	}

	exit(0);
}
/* end of main() */
