#include "inet.h"


#define EPORT 3001
void main()
{

  int sockfd,newsockfd,childpid,clilen;
  struct sockaddr_in servaddr,cliaddr;


  
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
  
   perror("socket error");
  
  //bzero((char*)&servaddr,sizeof(servaddr));
  servaddr.sin_family=AF_INET;
  servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  servaddr.sin_port=htons(EPORT);


  
  if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
    perror("can't bind");
  


  listen(sockfd,5);
  
 

  const int MAXLEN = 2048;

  cout << "\nFile Server started...\n" << flush;

  //int count=0;
  //char addr[100][500];
  char file[100];

  file[0]=0;
  int fi=0;
  while(1)
    {
      
      clilen=sizeof(cliaddr);
      newsockfd=accept(sockfd,(struct sockaddr*)&cliaddr,&clilen);

     

    
      

      if(newsockfd<0)
	perror("accept error");


	
	  
      
      if((childpid=fork())<0)
	perror(" fork error");
      else if(childpid==0) //__ we are connected
	{
	  //__compute new filename

	  srandom(time(NULL));
	  char file[81];
	  for(int i=0;i<80;i++)
	    {
	      file[i]=65+random()%26;
	      
	    }
	  file[80]=0;
	  
	  cout << endl << "Connected to  : " << inet_ntoa(cliaddr.sin_addr) << endl << flush;
	  
	  char buf[2048];
	  char args[10][100];
	  close(sockfd);
	  int catmode=0;
	       fstream a;
	  
	  while(1)
	    {
	      int n=recv(newsockfd,buf,MAXLEN,0);
	
	      if(n==0)
		{
		  break;
		}
	      else if(n<0)
		{
		  perror("recv error");
		  break;
		}
	      buf[n]=0;
	      cout << "Received from  "<< inet_ntoa(cliaddr.sin_addr) << " : "  << buf << endl << flush;

	      if(strncmp(buf,"exit",4)==0)
		{
		  break;
		}
	      

	      //____break into words
	      int i,j=0,k=0;
	      j=k=0;
	      for(i=0;i<n;i++)
		{
		  if(buf[i]==' ')
		    {
		      args[j][k]=0;
		      j++;
		      i++;
		      k=0;
		    }
		  args[j][k++]=buf[i];
		}
	      args[j][k-1]=0;      

	      
	      if(strcmp(args[0],"ls")==0)
		{
		  char filename[80];
		  char command[400];
		  command[0]=0;

		  strcpy(filename,file);
		  for(i=0;i<=j;i++)
		    {
		      strcat(command,args[i]);
		      strcat(command," ");
		      
		    }
		  
		  strcat(command," > ");
		  strcat(command,file);
		  
		  system(command);

		  //___data is in filename
		  
		  fstream a;
		  
		  a.open(file,ios::in);
		  
		  while(a)
		    {
		      a.getline(buf,2048);
		      strcat(buf,"\n");
		      //cout << "sending  : " << buf << endl << flush;
		      if(send(newsockfd,buf,strlen(buf),0)==-1)
			{
			  perror("Send error");
			  break;
			}
		    }
		  
		  
		  buf[0]=26;
		  buf[1]=0;
		  
		  if(send(newsockfd,buf,strlen(buf),0)==-1)
		    {
		      perror("Send error");
		      break;
		    }

		  
		}
	     
		 

	      else if(strcmp(args[0],"cat")==0 || catmode)
		{
		  
		  char filename[80];
		  char command[400];
		  command[0]=0;
		  

		  if(catmode==0) //__ init file etc...
		    {

		      strcpy(filename,file);
		      for(i=0;i<=j;i++)
			{
			  strcat(command,args[i]);
			  strcat(command," ");
		      
			}
		  
		      strcat(command," > ");
		      strcat(command,file);
		  
		      system(command);
		  

		      //___data is in filename
		 
		      a.close();
		      a.open(file,ios::in);
		      catmode=1;
		    }
		  else
		    {
		      if(strncmp(args[0],"q",1)==0) // quit command
			catmode=0;
		    }

		 
		  int count=0;
		  while(a && catmode)
		    {
		      a.getline(buf,2048);
		      strcat(buf,"\n");
		      //cout << "sending  : " << buf << endl << flush;
		      if(send(newsockfd,buf,strlen(buf),0)==-1)
			{
			  perror("Send error");
			  break;
			}
		      count++;

		      if(count==24)
			{
			  break;
			}
		      
			  
		    }

		  if(!a)
		    {
		    catmode=0;
		     strcpy(buf,"File Transmission end.\n");
		      send(newsockfd,buf,strlen(buf),0);
		    }
		    
		   
		  else
		    {
		      strcpy(buf,"Press <Enter> for more or q to quit\n");
		      send(newsockfd,buf,strlen(buf),0);
		    }
		  
		      
		
		  buf[0]=26;
		  buf[1]=0;
		  if(send(newsockfd,buf,strlen(buf),0)==-1)
		    {
		      perror("Send error");
		      break;
		    }
		}
		  
		  
	   
	      
	      
	      else
		{
		  
		  strcpy(buf,"what was that !?\n");
		  
		  
		  if(send(newsockfd,buf,strlen(buf),0)==-1)
		    {
		      perror("Send error");
		      break;
		    }
		  
		
		  
		  buf[0]=26;
		  buf[1]=0;
		  if(send(newsockfd,buf,strlen(buf),0)==-1)
		    {
		      perror("Send error");
		      break;
		    }
		  
		  
		}
	
	      
		} // main while

	  
	  //__remove the temp file
	  strcpy(buf,"rm ");
	  strcat(buf,file);
	  system(buf);
	  cout << endl << "Connection closed to  : " << inet_ntoa(cliaddr.sin_addr) << endl << flush;
	  exit(0);
	
	  
	  
	} // new child
      
      close(newsockfd);
    
     
      
    }
  
  
}

     






