mirror of
https://github.com/Ylianst/MeshAgent
synced 2025-12-20 18:23:21 +00:00
Updated error handling for info_GetLocalInterfaces on linux
This commit is contained in:
@@ -379,52 +379,86 @@ int info_GetLocalInterfaces(char* data, int maxdata)
|
|||||||
if (memcmp(ifr->ifr_name, "lo", 3) == 0) continue; // Loopback
|
if (memcmp(ifr->ifr_name, "lo", 3) == 0) continue; // Loopback
|
||||||
|
|
||||||
if (adapterCount > 0) { ptr += sprintf_s(data + ptr, maxdata - ptr, ","); }
|
if (adapterCount > 0) { ptr += sprintf_s(data + ptr, maxdata - ptr, ","); }
|
||||||
ptr += sprintf_s(data + ptr, maxdata - ptr, "{");
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, "{")) < 0) { break; }
|
||||||
|
|
||||||
// Get the name of the interface
|
// Get the name of the interface
|
||||||
ptr += sprintf_s(data + ptr, maxdata - ptr, "\"name\":\"%s\"", ifr->ifr_name);
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, "\"name\":\"%s\"", ifr->ifr_name)) < 0) { break; }
|
||||||
|
|
||||||
// Get the FQDN (DNS Suffix)
|
// Get the FQDN (DNS Suffix)
|
||||||
j = info_GetDefaultFqdn(ifr->ifr_name, &gateway);
|
j = info_GetDefaultFqdn(ifr->ifr_name, &gateway);
|
||||||
if (j > 0) { ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"dnssuffix\":\"%s\"", gateway); }
|
if (j > 0)
|
||||||
|
{
|
||||||
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"dnssuffix\":\"%s\"", gateway)) < 0)
|
||||||
|
{
|
||||||
|
free(gateway);
|
||||||
|
gateway = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (gateway != NULL) { free(gateway); gateway = NULL; }
|
if (gateway != NULL) { free(gateway); gateway = NULL; }
|
||||||
|
|
||||||
// Get the Default Gateway IP address
|
// Get the Default Gateway IP address
|
||||||
j = info_GetDefaultGateway(ifr->ifr_name, &gateway);
|
j = info_GetDefaultGateway(ifr->ifr_name, &gateway);
|
||||||
if (j == 4) { ILibInet_ntop(AF_INET, gateway, temp, 1024); ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"v4gateway\":\"%s\"", temp); }
|
if (j == 4)
|
||||||
|
{
|
||||||
|
ILibInet_ntop(AF_INET, gateway, temp, 1024);
|
||||||
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"v4gateway\":\"%s\"", temp)) < 0)
|
||||||
|
{
|
||||||
|
if (gateway != NULL) { free(gateway); gateway = NULL; }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (gateway != NULL) { free(gateway); gateway = NULL; }
|
if (gateway != NULL) { free(gateway); gateway = NULL; }
|
||||||
|
|
||||||
// Get the Default Gateway MAC address
|
// Get the Default Gateway MAC address
|
||||||
j = info_GetHwAddress(temp, strlen(temp), &gateway);
|
j = info_GetHwAddress(temp, strlen(temp), &gateway);
|
||||||
if (j == 6) { ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"gatewaymac\":\"%02x%02x%02x%02x%02x%02x\"", (unsigned char)gateway[0], (unsigned char)gateway[1], (unsigned char)gateway[2], (unsigned char)gateway[3], (unsigned char)gateway[4], (unsigned char)gateway[5]); }
|
if (j == 6)
|
||||||
|
{
|
||||||
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"gatewaymac\":\"%02x%02x%02x%02x%02x%02x\"", (unsigned char)gateway[0], (unsigned char)gateway[1], (unsigned char)gateway[2], (unsigned char)gateway[3], (unsigned char)gateway[4], (unsigned char)gateway[5])) < 0)
|
||||||
|
{
|
||||||
|
if (gateway != NULL) free(gateway);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (gateway != NULL) free(gateway);
|
if (gateway != NULL) free(gateway);
|
||||||
|
|
||||||
// Attempt to figure out the interface type
|
// Attempt to figure out the interface type
|
||||||
j = 0;
|
j = 0;
|
||||||
if (strlen(ifr->ifr_name) > 3 && memcmp(ifr->ifr_name, "eth", 3) == 0) { j = 6; }
|
if (strlen(ifr->ifr_name) > 3 && memcmp(ifr->ifr_name, "eth", 3) == 0) { j = 6; }
|
||||||
//if (strlen(ifr->ifr_name) > 2 && memcmp(ifr->ifr_name, "wl", 2) == 0) { j = 6; } // TODO: Wireless
|
//if (strlen(ifr->ifr_name) > 2 && memcmp(ifr->ifr_name, "wl", 2) == 0) { j = 6; } // TODO: Wireless
|
||||||
if (j > 0) { ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"type\":\"%d\"", j); }
|
if (j > 0)
|
||||||
|
{
|
||||||
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"type\":\"%d\"", j)) < 0) { break; }
|
||||||
|
}
|
||||||
|
|
||||||
// Get the hardware MAC address
|
// Get the hardware MAC address
|
||||||
if (ioctl(sockfd, SIOCGIFHWADDR, ifr) == 0) {
|
if (ioctl(sockfd, SIOCGIFHWADDR, ifr) == 0)
|
||||||
if (ifr->ifr_hwaddr.sa_family == 1) {
|
{
|
||||||
ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"mac\":\"%02x%02x%02x%02x%02x%02x\"", (unsigned char)ifr->ifr_hwaddr.sa_data[0], (unsigned char)ifr->ifr_hwaddr.sa_data[1], (unsigned char)ifr->ifr_hwaddr.sa_data[2], (unsigned char)ifr->ifr_hwaddr.sa_data[3], (unsigned char)ifr->ifr_hwaddr.sa_data[4], (unsigned char)ifr->ifr_hwaddr.sa_data[5]);
|
if (ifr->ifr_hwaddr.sa_family == 1)
|
||||||
|
{
|
||||||
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"mac\":\"%02x%02x%02x%02x%02x%02x\"", (unsigned char)ifr->ifr_hwaddr.sa_data[0], (unsigned char)ifr->ifr_hwaddr.sa_data[1], (unsigned char)ifr->ifr_hwaddr.sa_data[2], (unsigned char)ifr->ifr_hwaddr.sa_data[3], (unsigned char)ifr->ifr_hwaddr.sa_data[4], (unsigned char)ifr->ifr_hwaddr.sa_data[5])) < 0) { break; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the IP address
|
// Get the IP address
|
||||||
if (ioctl(sockfd, SIOCGIFADDR, ifr) == 0) { ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"v4addr\":\"%s\"", inet_ntoa(((struct sockaddr_in*)(&(ifr->ifr_addr)))->sin_addr)); }
|
if (ioctl(sockfd, SIOCGIFADDR, ifr) == 0)
|
||||||
|
{
|
||||||
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"v4addr\":\"%s\"", inet_ntoa(((struct sockaddr_in*)(&(ifr->ifr_addr)))->sin_addr))) < 0) { break; }
|
||||||
|
}
|
||||||
|
|
||||||
// Get the subnet mask
|
// Get the subnet mask
|
||||||
if (ioctl(sockfd, SIOCGIFNETMASK, ifr) == 0) { ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"v4mask\":\"%s\"", inet_ntoa(((struct sockaddr_in*)(&(ifr->ifr_addr)))->sin_addr)); }
|
if (ioctl(sockfd, SIOCGIFNETMASK, ifr) == 0)
|
||||||
|
{
|
||||||
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, ",\"v4mask\":\"%s\"", inet_ntoa(((struct sockaddr_in*)(&(ifr->ifr_addr)))->sin_addr))) < 0) { break; }
|
||||||
|
}
|
||||||
|
|
||||||
ptr += sprintf_s(data + ptr, maxdata - ptr, "}");
|
if ((ptr += sprintf_s(data + ptr, maxdata - ptr, "}")) < 0) { break; }
|
||||||
adapterCount++;
|
adapterCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(ifc.ifc_req);
|
free(ifc.ifc_req);
|
||||||
close(sockfd);
|
close(sockfd);
|
||||||
return ptr;
|
return(ptr < 0 ? 0 : ptr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user