#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>


struct thread_parm
{
    char * ptr;
    char *t;
    int newsockfd;

};

void * thread_sock(void * parameters)
{
    struct thread_parm * p = (struct thread_parm *) parameters;
    int n;
    n=0;
	n = readline(p->newsockfd,p->ptr,512);
	printf("%s\n",p->ptr);
    write(p->newsockfd,p->t,n);
	close(p->newsockfd);


}

int readline(int fd,char *ptr, int maxlen);
int main()
{
      char ptr[512];
      char *t;
      char cpid[25]; //child process number char[]
      char c;
      int pid;

      int sockfd, newsockfd, clilen, childpid, rc, n,i;

      pthread_t thread_id;

      struct thread_parm thread_args;


      struct sockaddr_in cli_addr, serv_addr;
      t=ptr;
      n=0;
      if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)
           perror("socket error");

      bzero((char *) &serv_addr, sizeof(serv_addr));

      serv_addr.sin_family      = AF_INET;
      serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
      serv_addr.sin_port        = htons(5000);

      if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))<0)
           perror("bind error");
      
	  
      listen(sockfd, 5);

      for(;;){
        clilen = sizeof(cli_addr);
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
		
	  
	  if(newsockfd<0)
	    perror("accept error");


		thread_args.ptr = ptr;
		thread_args.t = t;
		thread_args.newsockfd = newsockfd;
		pthread_create(&thread_id, NULL, &thread_sock, &thread_args);
		

      }
      return 0;
}

int readline(int fd,char *ptr, int maxlen){

	int i;
	int rc;
	char c;
	for(i=1;i<maxlen;i++){
		if((rc=read(fd, &c, 1))==1) {
		    *ptr++ = c;
		    if(c=='\n') break;
		}else if (rc==0) {
	            if(i==1) return 0;
		    else break;
		}else return -1;
	}
	*ptr = 0;
	return i;

};