// Pancake poll bouncer example

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/poll.h>

int
main(int argc, char *argv[])
{
 int remote_sock=socket(PF_INET,SOCK_STREAM,0);
 int listen_sock=socket(PF_INET,SOCK_STREAM,0);
 int client_sock=socket(PF_INET,SOCK_STREAM,0);
 char *buff;
 struct pollfd s[2];

 if (argc>3)
  {
   struct hostent *he;
   struct sockaddr_in sa;
   
   he=(struct hostent *)gethostbyname(argv[2]);
   if (he==(struct hostent *)0)
      {
       printf ("Host not found.\n");
       return 1;
      }

    // escoltem
       bzero(&sa,sizeof(sa));
       sa.sin_family=AF_INET;
       sa.sin_port=htons(atoi(argv[1]));
       sa.sin_addr.s_addr=htonl(INADDR_ANY);
       
       setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR,0,0); // 0==NULL
       
       if (0>bind(listen_sock, (struct sockaddr_in *)&sa, sizeof(sa)) )
          {
           printf("Cannot bind\n\n");
           close(listen_sock);
           return 1;
          }
       listen(listen_sock,5);
       client_sock=accept(listen_sock,NULL,NULL);
       
    // ens connectem
       memcpy(  (char *)&sa.sin_addr,
            he->h_addr, 
            he->h_length);
       sa.sin_family=AF_INET;
       sa.sin_port=htons(atoi(argv[3]));
       
       connect(remote_sock,&sa,sizeof(struct sockaddr_in));
    
     // rebotem.
      s[0].fd=remote_sock;          s[1].fd=client_sock;
      s[0].events=POLLIN;           s[1].events=POLLIN;
      s[0].revents=0;               s[1].revents=0;
      
      write(1,"ok",2);
      
      while(1)
      {
       if(poll(s,2,100))
        {
          if (s[0].revents) 
             {
              int len;
              len=read(s[0].fd,&buff,1024);
              if (!len) break;
              write(s[1].fd,&buff, len);
             }
          if (s[1].revents)
             {
              int len;
              len=read(s[1].fd,&buff,1024);
              if (!len) break;
              write(s[0].fd,&buff, len);
             }
        }
      }
      
     {
      int i;
      for(i=0;i<2;close(s[i++].fd));
      close(listen_sock);
     }
         
   return 0;
  }
  else
  {
   printf ("Usage ./a.out [port] [ip] [port]\n");
   return 1;
  }
   

}
