#include "socktools.h"

int PORT   = 31414, NMAX=10;
char *SERV;
unsigned int TAILLE = 16;

void erreur( char* msg)
{
  perror( msg );
  exit(1);
}
struct sockaddr_in sockaddrinbyname(char *nom, int port)
{ struct sockaddr_in res;
  struct hostent* infos;
  infos = gethostbyname( nom );
  memset( &res, 0 , sizeof( res ) );
  res.sin_family = AF_INET;       
  res.sin_port = htons( port );
  memcpy(&res.sin_addr, infos -> h_addr_list[0], 4); 
  return res;
}

struct sockaddr_in sockaddrinlocal( int port)
{ struct sockaddr_in res;
  memset( &res, 0 , sizeof( res ) );
  res.sin_family = AF_INET;       
  res.sin_port = htons( port );
  res.sin_addr.s_addr  = htonl(INADDR_ANY);
  return res;
}

char * sockaddrhostname( struct sockaddr  *aux)
{ char *ptr;
  struct sockaddr_in *client;
  client = (struct sockaddr_in *) aux;
  ptr = inet_ntoa( client->sin_addr );
  return ptr;
} 

void printfrom(struct sockaddr  *aux)
{  char *ptr;
  ptr = sockaddrhostname ( aux );
  fprintf(stdout, " ( %s )", ptr);
}

void sendpaquetto( int sd,  struct sockaddr *client, int n)
{ int val = n;
  int nb;
  nb = sendto( sd, &val, 4 , 0, client, TAILLE);
  if ( nb < 0 ) erreur("sendto");
}
int recvpaquetfrom( int sd,  struct sockaddr *client )
{ int val, nb;
  nb = recvfrom( sd, &val, 4 , 0 , client , &TAILLE);
  if ( nb < 0 ) erreur("recvfrom");
  return val;
}
int nobloqpaquetfrom( int sd,  struct sockaddr *client )
{ int  val, nb;
  nb = recvfrom( sd,&val,4,MSG_DONTWAIT,client,&TAILLE);
  if ( nb < 0 ) { val = - 1;
    if ( errno != EAGAIN ) erreur("nb recvfrom");
  }
  return val;
}


int argok( int argc, char* argv[])
{ int opt;
  char * optliste = "p:n:s:h";
  while (( opt = getopt( argc, argv, optliste )) >= 0 ) {
      switch ( opt ) { 
      case 'p' : PORT = atoi(optarg);   break; 
      case 's' : SERV = optarg;         break;   
      case 'n' : NMAX = atoi(optarg);   break;   
      case 'h' : printf("\nusage %s: -p port -n max", argv[0]);
	         printf("\nusage %s: -s serveur\n", argv[0]);
      default  : return 0; 
      }
  };
  return 1;
}
