Unification des sources CM4/CM5 : makefiles scindés (common/cm4/cm5/cm5.debug), #ifdef CIBLE_CM5 pour GPIO, correctifs get_ip_address()/signal handler/backtrace, portabilité 32/64 bits

This commit is contained in:
2026-09-23 14:51:33 +02:00
parent 8fe204361b
commit fdf08bf1d7
23 changed files with 373 additions and 154 deletions
+43 -57
View File
@@ -981,10 +981,44 @@ sudo iwlist wlan0 scan | grep -i 'Address:\|Channel:\|ESSID:\|Quality='
//==================================================================================================================================================================
// Fonction : Recherche une interface réseau donnée par son nom dans la liste chaînée retournée par 'getifaddrs()', et récupère son adresse IPV4 si elle est
// active (bit IFF_RUNNING positionné). Le test du bit 'IFF_RUNNING' est nécessaire car le port peut être UP (visible via IFF_UP, équivalent de
// 'ifconfig') mais ne pas être physiquement connecté.
// Reçoit : La liste des interfaces (issue de 'getifaddrs()'), le nom de l'interface recherchée (ex : "eth0") et le pointeur destination pour l'adresse IP
// Renvoit : Rien. La destination n'est modifiée que si l'interface est trouvée, active, et possède une adresse IPV4.
//==================================================================================================================================================================
static void extraire_ip_interface(struct ifaddrs *addresses, const char *nom_interface, char *destination)
{
struct ifaddrs *address;
char chaine_ip[TAILLE_ADRESSE_IP];
const uint32_t family_size = sizeof(struct sockaddr_in);
for (address = addresses; address != NULL; address = address->ifa_next)
{
if (address->ifa_addr == NULL) continue; // Protection : certaines interfaces (virtuelles, tunnels...) n'ont pas d'adresse assignée
if (address->ifa_addr->sa_family != AF_INET) continue; // On ne traite que les IPV4 pour le moment...
if (strcmp(address->ifa_name, nom_interface) != 0) continue; // Ce n'est pas l'interface recherchée
if ((address->ifa_flags & IFF_RUNNING) == 0) continue; // Interface non physiquement connectée
getnameinfo(address->ifa_addr, family_size, chaine_ip, TAILLE_ADRESSE_IP_V4, 0, 0, NI_NUMERICHOST);
strcpy(destination, chaine_ip);
#ifdef __DEBUG_RESEAUX
{
char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
sprintf(tmp, "Adresse IP sur l'interface '%s' = %s [IFF_RUNNING=Oui]", nom_interface, destination);
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_PAR_DEFAUT);
}
#endif
return; // Trouvée : inutile de continuer à parcourir la liste pour cette interface
}
}
//==================================================================================================================================================================
// Fonction : Récupère l'adresse IP en cours
// Cette fonction a été trouvée ici : https://subscription.packtpub.com/book/cloud-and-networking/9781789349863/1/ch01lvl1sec22/listing-network-adapters-from-c
// dans la partie Unix.
// dans la partie Unix, puis factorisée via 'extraire_ip_interface()' pour éviter la répétition du parcours de liste pour chaque interface.
// Par défaut, elle retourne quelque chose comme :
// lo IPv4 127.0.0.1
// eth0 IPv4 192.168.1.31
@@ -1004,11 +1038,8 @@ sudo iwlist wlan0 scan | grep -i 'Address:\|Channel:\|ESSID:\|Quality='
//==================================================================================================================================================================
int8_t get_ip_address(void)
{
struct ifaddrs *addresses;
struct ifaddrs *address;
char chaine_ip[TAILLE_ADRESSE_IP];
const uint32_t family_size = sizeof(struct sockaddr_in);
char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
struct ifaddrs *addresses;
char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
// Recherche de la liste de toutes les interfaces disponibles :
if (getifaddrs(&addresses) == -1)
@@ -1023,58 +1054,13 @@ int8_t get_ip_address(void)
strcpy(reseaux.wifi.sta.adresse_ip, ADRESSE_IP_INCONNUE);
strcpy(reseaux.wifi.ap.adresse_ip, ADRESSE_IP_INCONNUE);
// Boucle sur toutes les interfaces reçues :
address = addresses;
while(address)
{
int family = address->ifa_addr->sa_family;
// if (family == AF_INET || family == AF_INET6) // AF_INET correspond à IPV4 et AF_INET6 correspond à IPV6
if (family == AF_INET) // On ne traite que les IPV4 pour le moment...
{
getnameinfo(address->ifa_addr, family_size, chaine_ip, TAILLE_ADRESSE_IP_V4, 0, 0, NI_NUMERICHOST); // Permet de récupérer la
if (strstr(address->ifa_name, "eth0") != NULL)
{
if ((address->ifa_flags & IFF_RUNNING) != 0) strcpy(reseaux.ethernet.adresse_ip, chaine_ip); // Le test du bit 'IFF_RUNNING' est nécessaire car le port peut être UP (visible via IFF_UP équivalent de 'ifconfig') mais ne pas être physiquement connecté...
#ifdef __DEBUG_RESEAUX
sprintf(tmp, "Adresse IP sur le réseau Ethernet du bord = %s [IFF_RUNNING=%s]", reseaux.ethernet.adresse_ip, ((address->ifa_flags & IFF_RUNNING) == 0 ? "Non" : "Oui") );
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_PAR_DEFAUT);
#endif
}
else if (strstr(address->ifa_name, "wlan0") != NULL)
{
if ((address->ifa_flags & IFF_RUNNING) != 0) strcpy(reseaux.wifi.sta.adresse_ip, chaine_ip); // Le test du bit 'IFF_RUNNING' est nécessaire car le port peut être UP (visible via IFF_UP équivalent de 'ifconfig') mais ne pas être physiquement connecté...
#ifdef __DEBUG_RESEAUX
sprintf(tmp, "Adresse IP sur le réseau Wifi du bord (connecté en mode STA) = %s [IFF_RUNNING=%s]", reseaux.wifi.sta.adresse_ip, ((address->ifa_flags & IFF_RUNNING) == 0 ? "Non" : "Oui") );
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_PAR_DEFAUT);
#endif
}
else if (strstr(address->ifa_name, "uap0") != NULL)
{
if ((address->ifa_flags & IFF_RUNNING) != 0) strcpy(reseaux.wifi.ap.adresse_ip, chaine_ip); // Le test du bit 'IFF_RUNNING' est nécessaire car le port peut être UP (visible via IFF_UP équivalent de 'ifconfig') mais ne pas être physiquement connecté...
#ifdef __DEBUG_RESEAUX
sprintf(tmp, "Adresse IP de ShipBase sur le réseau Wifi ShipHeart (mode AP) = %s [IFF_RUNNING=%s]", reseaux.wifi.ap.adresse_ip, ((address->ifa_flags & IFF_RUNNING) == 0 ? "Non" : "Oui") );
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_PAR_DEFAUT);
#endif
}
/*
printf("%s\t", address->ifa_name);
printf("%s\t", family == AF_INET ? "IPv4" : "IPv6");
getnameinfo(address->ifa_addr, family_size, chaine_ip, TAILLE_ADRESSE_IP_V4, 0, 0, NI_NUMERICHOST);
printf("\t%s\n", chaine_ip);*/
}
address = address->ifa_next;
}
// Recherche de l'adresse IP de chacune des 3 interfaces suivies :
extraire_ip_interface(addresses, "eth0", reseaux.ethernet.adresse_ip);
extraire_ip_interface(addresses, "wlan0", reseaux.wifi.sta.adresse_ip);
extraire_ip_interface(addresses, "uap0", reseaux.wifi.ap.adresse_ip);
freeifaddrs(addresses);
return 0;
}
}