owlps/librtaputil/librtaputil.c

215 lines
5.3 KiB
C
Raw Normal View History

/*
* This file is part of the rtap localisation project.
*/
#include "rtaputil.h"
BOOL run = TRUE ;
/* Convertit une adresse MAC en octets en une chaîne de caractères.
* ¡ Il est nécessaire de libérer manuellement le retour de cette fonction !
*/
char* mac_bytes_to_string(unsigned char *mac_binary)
{
char *ret = malloc(sizeof(char) * 18) ;
sprintf(ret, "%02x:%02x:%02x:%02x:%02x:%02x", mac_binary[0], mac_binary[1], mac_binary[2], mac_binary[3], mac_binary[4], mac_binary[5]) ;
ret[17] = '\0' ;
return ret ;
}
/* Convertit un identifiant de canal en son numéro (0 si la fréquence est erronée) */
char frequency_to_channel(unsigned short channel)
{
char c = 0 ; // Résultat
switch (channel)
{
case 2412 :
c = 1 ;
break ;
case 2417 :
c = 2 ;
break ;
case 2422 :
c = 3 ;
break ;
case 2427 :
c = 4 ;
break ;
case 2432 :
c = 5 ;
break ;
case 2437 :
c = 6 ;
break ;
case 2442 :
c = 7 ;
break ;
case 2447 :
c = 8 ;
break ;
case 2452 :
c = 9 ;
break ;
case 2457 :
c = 10 ;
break ;
case 2462 :
c = 11 ;
break ;
case 2467 :
c = 12 ;
break ;
case 2472 :
c = 13 ;
break ;
case 2477 :
c = 14 ;
break ;
}
return c ;
}
/* Retourne une date au format struct timeval en mili-secondes */
unsigned long timeval_to_ms(struct timeval d)
{
return d.tv_sec * 1000 + d.tv_usec / 1000 ;
}
/* Retourne le temps (en millisecondes) écoulé entre deux dates */
unsigned long sub_date(struct timeval sup, struct timeval inf)
{
unsigned long sup_ms = sup.tv_sec * 1000 + sup.tv_usec / 1000 ;
unsigned long inf_ms = inf.tv_sec * 1000 + inf.tv_usec / 1000 ;
return abs(sup_ms - inf_ms) ;
}
/* Compare deux adresses MAC : retourne TRUE si elles sont égales, FALSE sinon */
BOOL mac_cmp(unsigned char *mac1, unsigned char *mac2)
{
int i ;
for(i=0 ; i < 6 ; i++)
if(mac1[i] != mac2[i])
return FALSE ;
return TRUE ;
}
/* Crée une socket d'envoi UDP et retourne son descripteur.
* Paramètres :
* - server_address : l'adresse IP du serveur.
* - server_port : le port d'écoute du serveur.
* - server_description (paramètre résultat) : la structure dans laquelle sera enregistrée la description du serveur.
* - client_description (paramètre résultat) : la structure dans laquelle sera enregistrée la description du client.
*/
int create_udp_sending_socket(char *server_address, int server_port, struct sockaddr_in *server_description, struct sockaddr_in * client_description)
{
int sockfd ; // Descripteur de la socket
/* Ceation de la socket UDP */
sockfd = socket(AF_INET, SOCK_DGRAM, 0) ;
if (sockfd < 0)
{
perror("Échec de la création de la socket ") ;
return(sockfd) ;
}
/* Remise à zéro et initialisation de la structure du client */
bzero((char *) client_description, sizeof(*client_description)) ;
client_description->sin_family = AF_INET ; // Socket INET
client_description->sin_addr.s_addr = htonl(INADDR_ANY) ; // Toutes les connexions
// client_description->sin_port = htons(0) ; // N'importe quel port (ne sert à rien a priori)
/* Remise à zéro et initialisation de la structure du serveur */
bzero((char *) server_description, sizeof(*server_description)) ; // RÀZ
server_description->sin_family = AF_INET ; // Socket INET
server_description->sin_addr.s_addr = inet_addr(server_address) ; // Adresse du serveur
server_description->sin_port = htons(server_port) ; // Port d'écoute du serveur
return (sockfd) ; // On retourne le descripteur de la socket créée
}
/* Crée une socket d'écoute UDP et retourne son descripteur.
* Paramètres :
* - port est le port sur lequel écouter.
*/
int create_udp_listening_socket(int port)
{
int sockfd ; // Descripteur de la socket
struct sockaddr_in server_description ; // Structure du serveur
int ret = 0 ; // Valeur de retour
/* Création d'une socket UDP */
sockfd = socket(AF_INET, SOCK_DGRAM, 0) ;
if (sockfd < 0)
{
perror("Échec de la création de la socket ") ;
return(sockfd) ;
}
/* Remise à zéro et initialisation de la structure du serveur */
bzero((char *) &server_description, sizeof(server_description)) ; // RÀZ
server_description.sin_family = AF_INET ; // Socket INET
server_description.sin_addr.s_addr = htonl(INADDR_ANY) ; // Toutes les connexions sont acceptées
server_description.sin_port = htons(port) ; // Port d'écoute
/* Réservation du port */
ret = bind(sockfd, (struct sockaddr*) &server_description, sizeof(server_description)) ;
if (ret < 0)
{
perror("Impossible de créer la socket (bind) ") ;
(void) close(sockfd) ;
return ret ;
}
return sockfd ; // On retourne le descripteur de la socket créée
}
void sigint_handler(int num)
{
if (num != SIGINT)
{
fprintf(stderr, "Erreur ! Gestionnaire de SIGINT appelé mais le signal n'est pas SIGINT.\n") ;
exit(1) ;
}
run = FALSE ;
printf("\nSignal reçu : fin du programme.\n");
fflush(NULL) ;
}
void sigterm_handler(int num)
{
if (num != SIGTERM)
{
fprintf(stderr, "Erreur ! Gestionnaire de SIGTERM appelé mais le signal n'est pas SIGINT.\n") ;
exit(1) ;
}
sigint_handler(SIGINT) ;
}