-
Notifications
You must be signed in to change notification settings - Fork 137
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #707 from david-cermak/bugfix/sckutls_gethostname
[sock-utils]: Add support for gethostname()
- Loading branch information
Showing
5 changed files
with
124 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
/* | ||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
#pragma once | ||
|
||
#include <unistd.h> | ||
#include "sdkconfig.h" | ||
|
||
#ifdef CONFIG_IDF_TARGET_LINUX | ||
// namespace with esp_ on linux to avoid conflict of symbols | ||
#define gethostname esp_gethostname | ||
#endif | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** | ||
* @brief Retrieves the hostname of the device. | ||
* | ||
* This function provides the hostname associated with the network interface. | ||
* Unlike the standard behavior where the hostname represents a system-wide name, | ||
* this implementation returns lwip netif hostname (used as a hostname in DHCP packets) | ||
* | ||
* @param[out] name A pointer to a buffer where the hostname will be stored. | ||
* The buffer must be allocated by the caller. | ||
* @param[in] len The size of the buffer pointed to by @p name. The hostname, | ||
* including the null-terminator, must fit within this size. | ||
* | ||
* @return | ||
* - 0 on success | ||
* - -1 on error, with `errno` set to indicate the error: | ||
* - `EINVAL`: Invalid argument, name is NULL, or hostname is too long | ||
* | ||
* @note This implementation retrieves the hostname associated with the network | ||
* interface using the `esp_netif_get_hostname()` function, which in turn | ||
* returns lwip netif hostname used in DHCP packets if LWIP_NETIF_HOSTNAME=1 (hardcoded) | ||
* in ESP-IDF lwip port. | ||
* As there could be multiple network interfaces in the system, the logic tries | ||
* to find the default (active) netif first, then it looks for any (inactive) netif | ||
* with highest route priority. If none of the above found or esp_netif_get_hostname() fails | ||
* for the selected interface, this API returns the default value of `CONFIG_LWIP_LOCAL_HOSTNAME`, | ||
* the local hostname from lwip component configuration menu. | ||
*/ | ||
int gethostname(char *name, size_t len); | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/* | ||
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
#include <string.h> | ||
#include "gethostname.h" | ||
#include "esp_netif.h" | ||
#include "errno.h" | ||
#include "esp_log.h" | ||
|
||
|
||
static bool highest_prio_netif(esp_netif_t *netif, void *ctx) | ||
{ | ||
esp_netif_t **highest_so_far = ctx; | ||
if (esp_netif_get_route_prio(netif) > esp_netif_get_route_prio(*highest_so_far)) { | ||
*highest_so_far = netif; | ||
} | ||
return false; // go over the entire list to find the netif with the highest route-prio | ||
} | ||
|
||
int gethostname(char *name, size_t len) | ||
{ | ||
if (name == NULL) { | ||
errno = EINVAL; | ||
return -1; | ||
} | ||
const char *netif_hostname = CONFIG_LWIP_LOCAL_HOSTNAME; // default value from Kconfig | ||
|
||
// Find the default netif | ||
esp_netif_t *default_netif = esp_netif_get_default_netif(); | ||
if (default_netif == NULL) { // if no netif is active/up -> find the highest prio netif | ||
esp_netif_find_if(highest_prio_netif, &default_netif); | ||
} | ||
// now the `default_netif` could be NULL and/or the esp_netif_get_hostname() could fail | ||
// but we ignore the return code, as if it fails, the `netif_hostname` still holds the default value | ||
esp_netif_get_hostname(default_netif, &netif_hostname); | ||
|
||
size_t hostname_len; | ||
if (netif_hostname == NULL || len < (hostname_len = strlen(netif_hostname) + 1)) { // including the NULL terminator | ||
errno = EINVAL; | ||
return -1; | ||
} | ||
memcpy(name, netif_hostname, hostname_len); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters