#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <sys/timeb.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <errno.h>
#include <sys/stat.h>
#include <unistd.h>

#define BYTES_NR	1024
#define DEFAULTPORT 12345



char	buf[BYTES_NR];
char    line[BYTES_NR];




main(argc,argv)
     int argc;char *argv[];
{
  int	sock,length,  numerolinea, lunghezzalinea;
 struct 	sockaddr_in 	server,client;
 int	msgsock,rval,i;
 struct	hostent	*hp,*gethostbyname();
 int myport;
 FILE *fp;

if(argc !=1)
  {
    fprintf(stderr,"Usage: %s\n",argv[0]);
    exit(-1);
  }


 myport = DEFAULTPORT;
  


/* Crea la socket DGRAM */
sock=	socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
	{
	perror("open sulla socket dgram");
	exit(1);
	}

/* Name socket using wildcards */
server.sin_family = 	AF_INET;
server.sin_addr.s_addr= INADDR_ANY;
server.sin_port = htons(myport);

if (bind(sock,(struct sockaddr *)&server,sizeof server)<0)
	{
	perror("bind sulla socket dgram");
	exit(1);
	}

/* Find out assigned port and print out */
length= sizeof server;
if(getsockname(sock,(struct sockaddr *)&server,&length)<0)
	{
	perror("getsockname");
	exit(1);
	}

printf("Server running on port #%d\n",ntohs(server.sin_port));

  /* Pronto ad accettare connessioni */

  listen(sock,2);


 do{


 /* Attesa di una connessione */	 
   
   msgsock= accept(sock,(struct sockaddr *)&client,(int *)&length);

   
   if(msgsock ==-1)
     perror("accept");
      else
	{
	  if(fork()==0)
	    {
	      printf("Serving connection from %s, port %d\n",
		     inet_ntoa(client.sin_addr),
		     ntohs(client.sin_port));
	      
	      
	      
	      close(sock);

	      bzero(buf,sizeof buf); 
	      servizio(msgsock);
	      close(msgsock);
	      exit(0);
	    }
	  else
	    close(msgsock);
	}
   
 }
 while(1);
}


servizio(int sock)
{
  int fd,rval ;
  struct stat fbuf;  
  
  if((rval=read(sock,buf, sizeof buf))<0)
   {
     perror("reading filename");
     exit(-1);
   }

  printf("Opening file %s\n",buf);

  if((fd= open(buf,O_RDONLY))<0)
   {
     fprintf(stderr,"Cannot open file %s (%s)...\n",buf,strerror(errno));
     fbuf.st_size = -1 ;
   }
  else
    fstat(fd,&fbuf);

  if((rval = write(sock,&(fbuf.st_size),sizeof(int)))<0)
    perror("writing on stream socket");
  
  printf("Service  completed\n");
}


