[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] net: Don't use nested functions to allow building with clang
From: |
Daniel Axtens |
Subject: |
Re: [PATCH] net: Don't use nested functions to allow building with clang |
Date: |
Wed, 20 May 2020 00:35:00 +1000 |
Hi Javier,
Thanks!
> Nested functions are supported as an extension in GNU C, but are not in
> the clang compiler. Commit cb2f15c5448 ("normal/main: Search for specific
> config files for netboot") added a nested function which caused the build
> to break when compiling with clang.
>
> Reported-by: Daniel Axtens <address@hidden>
> Signed-off-by: Javier Martinez Canillas <address@hidden>
With this patch, clang-9 builds and runs mainline grub-emu.
Tested-by: Daniel Axtens <address@hidden> # emu platform only
clang still doesn't like 'make check', but that looks like a different
issue around relocations. clang isn't a huge priority for me, so it
might take a while. But this patch is good to go in regardless.
Thanks again,
Daniel
> ---
>
> grub-core/net/net.c | 65 +++++++++++++++++++++++----------------------
> 1 file changed, 33 insertions(+), 32 deletions(-)
>
> diff --git a/grub-core/net/net.c b/grub-core/net/net.c
> index c42f0f4f71d..ec7e2899ed5 100644
> --- a/grub-core/net/net.c
> +++ b/grub-core/net/net.c
> @@ -1735,42 +1735,43 @@ grub_net_restore_hw (void)
> return GRUB_ERR_NONE;
> }
>
> -grub_err_t
> -grub_net_search_config_file (char *config)
> +static int grub_config_search_through (char *config, char *suffix,
> + grub_size_t num_tries,
> + grub_size_t slice_size)
> {
> - grub_size_t config_len;
> - char *suffix;
> + while (num_tries-- > 0)
> + {
> + grub_file_t file;
>
> - auto int search_through (grub_size_t num_tries, grub_size_t slice_size);
> - int search_through (grub_size_t num_tries, grub_size_t slice_size)
> - {
> - while (num_tries-- > 0)
> - {
> - grub_file_t file;
> + grub_dprintf ("net", "attempt to fetch config %s\n", config);
>
> - grub_dprintf ("net", "attempt to fetch config %s\n", config);
> + file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG);
>
> - file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG);
> + if (file)
> + {
> + grub_file_close (file);
> + return 0;
> + }
> + else
> + {
> + if (grub_errno == GRUB_ERR_IO)
> + grub_errno = GRUB_ERR_NONE;
> + }
>
> - if (file)
> - {
> - grub_file_close (file);
> - return 0;
> - }
> - else
> - {
> - if (grub_errno == GRUB_ERR_IO)
> - grub_errno = GRUB_ERR_NONE;
> - }
> + if (grub_strlen (suffix) < slice_size)
> + break;
>
> - if (grub_strlen (suffix) < slice_size)
> - break;
> + config[grub_strlen (config) - slice_size] = '\0';
> + }
>
> - config[grub_strlen (config) - slice_size] = '\0';
> - }
> + return 1;
> +}
>
> - return 1;
> - }
> +grub_err_t
> +grub_net_search_config_file (char *config)
> +{
> + grub_size_t config_len;
> + char *suffix;
>
> config_len = grub_strlen (config);
> config[config_len] = '-';
> @@ -1801,7 +1802,7 @@ grub_net_search_config_file (char *config)
> if (client_uuid)
> {
> grub_strcpy (suffix, client_uuid);
> - if (search_through (1, 0) == 0)
> + if (grub_config_search_through (config, suffix, 1, 0) == 0)
> return GRUB_ERR_NONE;
> }
>
> @@ -1816,7 +1817,7 @@ grub_net_search_config_file (char *config)
> if (*ptr == ':')
> *ptr = '-';
>
> - if (search_through (1, 0) == 0)
> + if (grub_config_search_through (config, suffix, 1, 0) == 0)
> return GRUB_ERR_NONE;
>
> /* By IP address */
> @@ -1831,7 +1832,7 @@ grub_net_search_config_file (char *config)
> ((n >> 24) & 0xff), ((n >> 16) & 0xff), \
> ((n >> 8) & 0xff), ((n >> 0) & 0xff));
>
> - if (search_through (8, 1) == 0)
> + if (grub_config_search_through (config, suffix, 8, 1) == 0)
> return GRUB_ERR_NONE;
> break;
> }
> @@ -1848,7 +1849,7 @@ grub_net_search_config_file (char *config)
> *ptr = '-';
>
> grub_snprintf (suffix, GRUB_NET_MAX_STR_ADDR_LEN, "%s", buf);
> - if (search_through (1, 0) == 0)
> + if (grub_config_search_through (config, suffix, 1, 0) == 0)
> return GRUB_ERR_NONE;
> break;
> }
> --
> 2.26.2