mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-26 17:19:22 +00:00
net/http: Allow use of non-standard TCP/IP ports
Allow the use of HTTP servers listening on ports other 80. This is done with an extension to the http notation: (http[,server[,port]]) - or - (http[,server[:port]]) Signed-off-by: Stephen Balousek <sbalousek@wickedloop.com> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
1 parent
a0548c140c
commit
ac8a37dda0
2 files changed
+71
-2
No files matched your search
@@ -3011,6 +3011,39 @@ environment variable @samp{net_default_server} is used.
|
|||||||
Before using the network drive, you must initialize the network.
|
Before using the network drive, you must initialize the network.
|
||||||
@xref{Network}, for more information.
|
@xref{Network}, for more information.
|
||||||
|
|
||||||
|
For the @samp{http} network protocol, @code{@var{server}} may specify a
|
||||||
|
port number other than the default value of @samp{80}. The server name
|
||||||
|
and port number are separated by either @samp{,} or @samp{:}.
|
||||||
|
For IPv6 addresses, the server name and port number may only be separated
|
||||||
|
by @samp{,}.
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item
|
||||||
|
@code{(http,@var{server},@var{port})}
|
||||||
|
|
||||||
|
@item
|
||||||
|
@code{(http,@var{server}:@var{port})}
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
These examples all reference an @samp{http} server at address
|
||||||
|
@samp{192.0.2.1} listening on the non-standard port of @samp{3000}.
|
||||||
|
In these examples, the DNS name @samp{grub.example.com} is resolved
|
||||||
|
to @samp{192.0.2.1}.
|
||||||
|
|
||||||
|
@example
|
||||||
|
(http,grub.example.com,3000)
|
||||||
|
(http,grub.example.com:3000)
|
||||||
|
(http,192.0.2.1,3000)
|
||||||
|
(http,192.0.2.1:3000)
|
||||||
|
@end example
|
||||||
|
|
||||||
|
Referencing an @samp{http} server over IPv6 on the non-standard
|
||||||
|
port of @samp{3000} would look like this:
|
||||||
|
|
||||||
|
@example
|
||||||
|
(http,2001:db8::1,3000)
|
||||||
|
@end example
|
||||||
|
|
||||||
If you boot GRUB from a CD-ROM, @samp{(cd)} is available. @xref{Making
|
If you boot GRUB from a CD-ROM, @samp{(cd)} is available. @xref{Making
|
||||||
a GRUB bootable CD-ROM}, for details.
|
a GRUB bootable CD-ROM}, for details.
|
||||||
|
|
||||||
|
|||||||
+38
-2
@@ -312,6 +312,10 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
|
|||||||
int i;
|
int i;
|
||||||
struct grub_net_buff *nb;
|
struct grub_net_buff *nb;
|
||||||
grub_err_t err;
|
grub_err_t err;
|
||||||
|
char *server_name;
|
||||||
|
char *port_string;
|
||||||
|
const char *port_string_end;
|
||||||
|
unsigned long port_number;
|
||||||
|
|
||||||
nb = grub_netbuff_alloc (GRUB_NET_TCP_RESERVE_SIZE
|
nb = grub_netbuff_alloc (GRUB_NET_TCP_RESERVE_SIZE
|
||||||
+ sizeof ("GET ") - 1
|
+ sizeof ("GET ") - 1
|
||||||
@@ -390,10 +394,42 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
|
|||||||
grub_netbuff_put (nb, 2);
|
grub_netbuff_put (nb, 2);
|
||||||
grub_memcpy (ptr, "\r\n", 2);
|
grub_memcpy (ptr, "\r\n", 2);
|
||||||
|
|
||||||
data->sock = grub_net_tcp_open (file->device->net->server,
|
port_string = grub_strrchr (file->device->net->server, ',');
|
||||||
HTTP_PORT, http_receive,
|
if (port_string == NULL)
|
||||||
|
{
|
||||||
|
/* If ",port" is not found in the http server string, look for ":port". */
|
||||||
|
port_string = grub_strrchr (file->device->net->server, ':');
|
||||||
|
/* For IPv6 addresses, the ":port" syntax is not supported and ",port" must be used. */
|
||||||
|
if (port_string != NULL && grub_strchr (file->device->net->server, ':') != port_string)
|
||||||
|
port_string = NULL;
|
||||||
|
}
|
||||||
|
if (port_string != NULL)
|
||||||
|
{
|
||||||
|
port_number = grub_strtoul (port_string + 1, &port_string_end, 10);
|
||||||
|
if (*(port_string + 1) == '\0' || *port_string_end != '\0')
|
||||||
|
return grub_error (GRUB_ERR_BAD_NUMBER, N_("non-numeric or invalid port number `%s'"), port_string + 1);
|
||||||
|
if (port_number == 0 || port_number > 65535)
|
||||||
|
return grub_error (GRUB_ERR_OUT_OF_RANGE, N_("port number `%s' not in the range of 1 to 65535"), port_string + 1);
|
||||||
|
|
||||||
|
server_name = grub_strdup (file->device->net->server);
|
||||||
|
if (server_name == NULL)
|
||||||
|
return grub_errno;
|
||||||
|
server_name[port_string - file->device->net->server] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
port_number = HTTP_PORT;
|
||||||
|
server_name = file->device->net->server;
|
||||||
|
}
|
||||||
|
|
||||||
|
data->sock = grub_net_tcp_open (server_name,
|
||||||
|
port_number, http_receive,
|
||||||
http_err, NULL,
|
http_err, NULL,
|
||||||
file);
|
file);
|
||||||
|
|
||||||
|
if (server_name != file->device->net->server)
|
||||||
|
grub_free (server_name);
|
||||||
|
|
||||||
if (!data->sock)
|
if (!data->sock)
|
||||||
{
|
{
|
||||||
grub_netbuff_free (nb);
|
grub_netbuff_free (nb);
|
||||||
|
|||||||
Reference in new issue
Block a user