7e98da058f
This change reorganizes and cleanups our patches to reduce the patch number from 314 patches to 187. That's achieved by dropping patches that are later reverted and squashing fixes for earlier patches that introduced features. There are no code changes and the diff with upstream is the same before and after the cleanup. Having fewer patches makes easier to manage the patchset and also will ease to rebase them on top of the latest grub-2.04 release. Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
151 lines
4.7 KiB
Diff
151 lines
4.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Stephen Benjamin <stephen@redhat.com>
|
|
Date: Thu, 16 Aug 2018 16:58:51 -0400
|
|
Subject: [PATCH] Prepend prefix when HTTP path is relative
|
|
|
|
This sets a couple of variables. With the url http://www.example.com/foo/bar :
|
|
http_path: /foo/bar
|
|
http_url: http://www.example.com/foo/bar
|
|
|
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
|
---
|
|
grub-core/kern/main.c | 10 +++++-
|
|
grub-core/net/efi/http.c | 82 ++++++++++++++++++++++++++++++++++++------------
|
|
2 files changed, 71 insertions(+), 21 deletions(-)
|
|
|
|
diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c
|
|
index da47b18b50e..dcf48726d54 100644
|
|
--- a/grub-core/kern/main.c
|
|
+++ b/grub-core/kern/main.c
|
|
@@ -130,11 +130,19 @@ grub_set_prefix_and_root (void)
|
|
if (fwdevice && fwpath)
|
|
{
|
|
char *fw_path;
|
|
+ char separator[3] = ")";
|
|
|
|
- fw_path = grub_xasprintf ("(%s)/%s", fwdevice, fwpath);
|
|
+ grub_dprintf ("fw_path", "\n");
|
|
+ grub_dprintf ("fw_path", "fwdevice:\"%s\" fwpath:\"%s\"\n", fwdevice, fwpath);
|
|
+
|
|
+ if (!grub_strncmp(fwdevice, "http", 4) && fwpath[0] != '/')
|
|
+ grub_strcpy(separator, ")/");
|
|
+
|
|
+ fw_path = grub_xasprintf ("(%s%s%s", fwdevice, separator, fwpath);
|
|
if (fw_path)
|
|
{
|
|
grub_env_set ("fw_path", fw_path);
|
|
+ grub_dprintf ("fw_path", "fw_path:\"%s\"\n", fw_path);
|
|
grub_free (fw_path);
|
|
}
|
|
}
|
|
diff --git a/grub-core/net/efi/http.c b/grub-core/net/efi/http.c
|
|
index 243acbaa35b..de351b2cd03 100644
|
|
--- a/grub-core/net/efi/http.c
|
|
+++ b/grub-core/net/efi/http.c
|
|
@@ -9,10 +9,52 @@
|
|
static void
|
|
http_configure (struct grub_efi_net_device *dev, int prefer_ip6)
|
|
{
|
|
+ grub_efi_ipv6_address_t address;
|
|
grub_efi_http_config_data_t http_config;
|
|
grub_efi_httpv4_access_point_t httpv4_node;
|
|
grub_efi_httpv6_access_point_t httpv6_node;
|
|
grub_efi_status_t status;
|
|
+ int https;
|
|
+ char *http_url;
|
|
+ const char *rest, *http_server, *http_path = NULL;
|
|
+
|
|
+ http_server = grub_env_get ("root");
|
|
+ https = (grub_strncmp (http_server, "https", 5) == 0) ? 1 : 0;
|
|
+
|
|
+ /* extract http server + port */
|
|
+ if (http_server)
|
|
+ {
|
|
+ http_server = grub_strchr (http_server, ',');
|
|
+ if (http_server)
|
|
+ http_server++;
|
|
+ }
|
|
+
|
|
+ /* fw_path is like (http,192.168.1.1:8000)/httpboot, extract path part */
|
|
+ http_path = grub_env_get ("fw_path");
|
|
+ if (http_path)
|
|
+ {
|
|
+ http_path = grub_strchr (http_path, ')');
|
|
+ if (http_path)
|
|
+ {
|
|
+ http_path++;
|
|
+ grub_env_unset ("http_path");
|
|
+ grub_env_set ("http_path", http_path);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (http_server && http_path)
|
|
+ {
|
|
+ if (grub_efi_string_to_ip6_address (http_server, &address, &rest) && *rest == 0)
|
|
+ http_url = grub_xasprintf ("%s://[%s]%s", https ? "https" : "http", http_server, http_path);
|
|
+ else
|
|
+ http_url = grub_xasprintf ("%s://%s%s", https ? "https" : "http", http_server, http_path);
|
|
+ if (http_url)
|
|
+ {
|
|
+ grub_env_unset ("http_url");
|
|
+ grub_env_set ("http_url", http_url);
|
|
+ grub_free (http_url);
|
|
+ }
|
|
+ }
|
|
|
|
grub_efi_http_t *http = dev->http;
|
|
|
|
@@ -352,32 +394,32 @@ grub_efihttp_open (struct grub_efi_net_device *dev,
|
|
grub_err_t err;
|
|
grub_off_t size;
|
|
char *buf;
|
|
- char *root_url;
|
|
- grub_efi_ipv6_address_t address;
|
|
- const char *rest;
|
|
+ char *file_name = NULL;
|
|
+ const char *http_path;
|
|
|
|
- if (grub_efi_string_to_ip6_address (file->device->net->server, &address, &rest) && *rest == 0)
|
|
- root_url = grub_xasprintf ("%s://[%s]", type ? "https" : "http", file->device->net->server);
|
|
- else
|
|
- root_url = grub_xasprintf ("%s://%s", type ? "https" : "http", file->device->net->server);
|
|
- if (root_url)
|
|
- {
|
|
- grub_env_unset ("root_url");
|
|
- grub_env_set ("root_url", root_url);
|
|
- grub_free (root_url);
|
|
- }
|
|
- else
|
|
- {
|
|
+ /* If path is relative, prepend http_path */
|
|
+ http_path = grub_env_get ("http_path");
|
|
+ if (http_path && file->device->net->name[0] != '/') {
|
|
+ file_name = grub_xasprintf ("%s/%s", http_path, file->device->net->name);
|
|
+ if (!file_name)
|
|
return grub_errno;
|
|
- }
|
|
+ }
|
|
|
|
- err = efihttp_request (dev->http, file->device->net->server, file->device->net->name, type, 1, 0);
|
|
+ err = efihttp_request (dev->http, file->device->net->server,
|
|
+ file_name ? file_name : file->device->net->name, type, 1, 0);
|
|
if (err != GRUB_ERR_NONE)
|
|
- return err;
|
|
+ {
|
|
+ grub_free (file_name);
|
|
+ return err;
|
|
+ }
|
|
|
|
- err = efihttp_request (dev->http, file->device->net->server, file->device->net->name, type, 0, &size);
|
|
+ err = efihttp_request (dev->http, file->device->net->server,
|
|
+ file_name ? file_name : file->device->net->name, type, 0, &size);
|
|
+ grub_free (file_name);
|
|
if (err != GRUB_ERR_NONE)
|
|
- return err;
|
|
+ {
|
|
+ return err;
|
|
+ }
|
|
|
|
buf = grub_malloc (size);
|
|
efihttp_read (dev, buf, size);
|