#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <stdlib.h>        /* for getenv */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>    /* Internet domain header */
#include "wrapsock.h"
#include "io.h"

#define SERVER_PORT  30000

int main()
{ 
    int soc, ns, k;
    int on = 1, status;
    char buf[256];
    struct sockaddr_in peer;
    struct sockaddr_in self; 
    int peer_len = sizeof(peer);
    char *host;
    fd_set rset;
    int nready;
	int x;

    self.sin_family = AF_INET;
    self.sin_port = htons(SERVER_PORT);  
    self.sin_addr.s_addr = INADDR_ANY;
    bzero(&(self.sin_zero), 8);

    peer.sin_family = AF_INET;
    /* set up listening socket soc */
    soc = socket(AF_INET, SOCK_STREAM, 0);
    if (soc < 0) {  
	perror("server:socket"); 
	exit(1);
    }

    status = setsockopt(soc, SOL_SOCKET, SO_REUSEADDR,
        (const char *) &on, sizeof(on));
    if(status == -1) {
	perror("setsockopt -- REUSEADDR");
    }
    if (bind(soc, (struct sockaddr *)&self, sizeof(self)) == -1) {  
	 perror("server:bind"); close(soc);
	 exit(1); 
    }
    listen(soc, 1);                              
    /* accept connection request */
    ns = accept(soc, (struct sockaddr *)&peer, &peer_len);          
    if (ns < 0) {  
	perror("server:accept"); 
	close(soc);
	exit(1);
    }

    strncpy(buf, "default", sizeof(buf));
    /* data transfer on connected socket ns */
    while(1) {
	struct timeval tv; 
	tv.tv_sec = 0; 
	tv.tv_usec = 0;

	FD_ZERO(&rset);
	FD_SET(ns, &rset);
	if((nready = Select(ns+1, &rset, NULL,  NULL, &tv)) == 1) {
	    if(FD_ISSET(ns, &rset)) {
		if((k = Readline(ns, buf, sizeof(buf))) == 1) {
		    break;
		}
		printf("read %d bytes\n", k);
	    } else {
		printf("ERROR: wrong fd is set\n");
	    }
	}
	host = getenv("HOST");
	printf("SERVER ON %s RECEIVED: %s\n", host, buf);
	x = Writen(ns, buf, k);
	printf("wrote %d bytes\n", x);
	sleep(3);
    }
    close(ns);   
    close(soc);
    return(0);
}
