/* daytimetcpsrv.c - From Stevens, Network Programming Vol.1
                     with minor changes. 
		     Compile with
		        % gcc -o server daytimetcpsrv.c
                     Run with
		        % server [<Portid>]
                     and a daytime server will sit on port <Portid>
		     [port 5000 by default].
 */

#include <string.h>
#include <stdlib.h> 
#include <unistd.h>  
#include <stdio.h>
#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 */

int main(int argc, char **argv)
{
	int		        listenfd, /* The listening socket */
	                        connfd;   /* The connected socket */
	struct sockaddr_in	servaddr;
	char			buff[128+1];
	time_t			ticks;
	unsigned short          port;

	port = (argc > 1) ? atoi(argv[1]) : 5000;
	
	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	if (listenfd < 0) {
	  perror("listen");
	  exit(1);
	}
	
	bzero((char *)&servaddr, sizeof(servaddr));
	servaddr.sin_family      = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port        = htons(port);
	
	if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){
	  perror("bind");
	  exit(1);
	}
	
	if (listen(listenfd, 7) < 0) {
	  perror("listen");
	  exit(1);
	}
	
	for ( ; ; ) {
	  connfd = accept(listenfd, (struct sockaddr *) NULL, NULL);
	  /* We use a NULL sockaddr since we do not care who is the client */
	  if (connfd < 0) {
	    perror("connect");
	    exit(1);
	  }
	  
	  ticks = time(NULL);
	  sprintf(buff, "%.24s\r\n", ctime(&ticks));
	  write(connfd, buff, strlen(buff));
	  
	  close(connfd);
	}
}
