Skip to content

Commit

Permalink
Merge pull request Rohde-Schwarz#22 from mjg59/netboot
Browse files Browse the repository at this point in the history
Add various small patches to improve netboot support
  • Loading branch information
mjg59 committed Jan 8, 2016
2 parents b29d1d3 + 4d5d7be commit 4ccc609
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 21 deletions.
2 changes: 1 addition & 1 deletion grub-core/commands/efi/getenv.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ grub_cmd_getenv (grub_extcmd_context_t ctxt, int argc, char **args)
{
bindata = grub_zalloc(datasize * 2 + 1);
for (i=0; i<datasize; i++)
grub_snprintf(bindata + i*2, 3, "%02x", data[i]);
grub_snprintf(bindata + i*2, 3, "%02x", data[i] & 0xff);

if (grub_env_set (args[0], bindata))
goto done;
Expand Down
94 changes: 77 additions & 17 deletions grub-core/commands/verify.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,20 @@ static const struct grub_arg_option options[] =
{0, 0, 0, 0, 0, 0}
};

static grub_ssize_t
pseudo_read (struct grub_file *file, char *buf, grub_size_t len)
{
grub_memcpy (buf, (grub_uint8_t *) file->data + file->offset, len);
return len;
}

/* Filesystem descriptor. */
struct grub_fs pseudo_fs =
{
.name = "pseudo",
.read = pseudo_read
};

static grub_err_t
read_packet_header (grub_file_t sig, grub_uint8_t *out_type, grub_size_t *len)
{
Expand Down Expand Up @@ -694,6 +708,64 @@ grub_cmd_trust (grub_extcmd_context_t ctxt,
return GRUB_ERR_NONE;
}

static grub_err_t
grub_cmd_trust_var (grub_command_t cmd __attribute__ ((unused)),
int argc, char **args)
{
struct grub_file pseudo_file;
const char *var;
char *data;
struct grub_public_key *pk = NULL;
unsigned int i, idx0, idx1;

if (argc < 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));

var = grub_env_get (args[0]);
if (!var)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("unknown variable"));

data = grub_zalloc (grub_strlen (var) / 2);
if (!data)
return grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("can't allocate memory for key"));

/* For the want of sscanf() */
for (i = 0; i < grub_strlen (var); i += 2)
{
if (var[i] < 0x40)
idx0 = var[i] - 0x30;
else
idx0 = var[i] - 0x57;

if (var[i+1] < 0x40)
idx1 = var[i+1] - 0x30;
else
idx1 = var[i+1] - 0x57;

data[i/2] = ((idx0 << 4) & 0xf0) | (idx1 & 0x0f);
}

grub_memset (&pseudo_file, 0, sizeof (pseudo_file));

pseudo_file.fs = &pseudo_fs;
pseudo_file.size = grub_strlen (var) / 2;
pseudo_file.data = data;

pk = grub_load_public_key (&pseudo_file);
if (!pk)
{
grub_free(data);
return grub_errno;
}

pk->next = grub_pk_trusted;
grub_pk_trusted = pk;

grub_free(data);
return GRUB_ERR_NONE;

}

static grub_err_t
grub_cmd_list (grub_command_t cmd __attribute__ ((unused)),
int argc __attribute__ ((unused)),
Expand Down Expand Up @@ -948,24 +1020,8 @@ grub_env_write_sec (struct grub_env_var *var __attribute__ ((unused)),
return grub_strdup (sec ? "enforce" : "no");
}

static grub_ssize_t
pseudo_read (struct grub_file *file, char *buf, grub_size_t len)
{
grub_memcpy (buf, (grub_uint8_t *) file->data + file->offset, len);
return len;
}


/* Filesystem descriptor. */
struct grub_fs pseudo_fs =
{
.name = "pseudo",
.read = pseudo_read
};


static grub_extcmd_t cmd, cmd_trust;
static grub_command_t cmd_distrust, cmd_list;
static grub_command_t cmd_trust_var, cmd_distrust, cmd_list;

GRUB_MOD_INIT(verify)
{
Expand Down Expand Up @@ -1018,6 +1074,9 @@ GRUB_MOD_INIT(verify)
N_("[-s|--skip-sig] PUBKEY_FILE"),
N_("Add PUBKEY_FILE to trusted keys."),
options);
cmd_trust_var = grub_register_command ("trust_var", grub_cmd_trust_var,
N_("PUBKEY_VAR"),
N_("Add the contents of PUBKEY_VAR to trusted keys."));
cmd_list = grub_register_command ("list_trusted", grub_cmd_list,
0,
N_("Show the list of trusted keys."));
Expand All @@ -1031,6 +1090,7 @@ GRUB_MOD_FINI(verify)
grub_file_filter_unregister (GRUB_FILE_FILTER_PUBKEY);
grub_unregister_extcmd (cmd);
grub_unregister_extcmd (cmd_trust);
grub_unregister_command (cmd_trust_var);
grub_unregister_command (cmd_list);
grub_unregister_command (cmd_distrust);
}
6 changes: 6 additions & 0 deletions grub-core/net/bootp.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
#include <grub/net/udp.h>
#include <grub/datetime.h>

static grub_uint8_t grub_userclass[] = {GRUB_NET_BOOTP_RFC1048_MAGIC_0,
GRUB_NET_BOOTP_RFC1048_MAGIC_1,
GRUB_NET_BOOTP_RFC1048_MAGIC_2,
GRUB_NET_BOOTP_RFC1048_MAGIC_3,
0x4D, 0x05, 'G', 'R', 'U', 'B', '2'};
static void
parse_dhcp_vendor (const char *name, const void *vend, int limit, int *mask)
{
Expand Down Expand Up @@ -525,6 +530,7 @@ grub_cmd_bootp (struct grub_command *cmd __attribute__ ((unused)),
pack->seconds = grub_cpu_to_be16 (t);

grub_memcpy (&pack->mac_addr, &ifaces[j].hwaddress.mac, 6);
grub_memcpy (&pack->vendor, grub_userclass, sizeof(grub_userclass));

grub_netbuff_push (nb, sizeof (*udph));

Expand Down
8 changes: 6 additions & 2 deletions grub-core/net/http.c
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
{
http_data_t data = file->data;
grub_uint8_t *ptr;
int i;
int i, port;
struct grub_net_buff *nb;
grub_err_t err;

Expand Down Expand Up @@ -391,8 +391,12 @@ http_establish (struct grub_file *file, grub_off_t offset, int initial)
grub_netbuff_put (nb, 2);
grub_memcpy (ptr, "\r\n", 2);

if (file->device->net->port)
port = file->device->net->port;
else
port = HTTP_PORT;
data->sock = grub_net_tcp_open (file->device->net->server,
HTTP_PORT, http_receive,
port, http_receive,
http_err, http_err,
file);
if (!data->sock)
Expand Down
10 changes: 9 additions & 1 deletion grub-core/net/net.c
Original file line number Diff line number Diff line change
Expand Up @@ -1273,7 +1273,7 @@ grub_net_open_real (const char *name)
grub_net_app_level_t proto;
const char *protname, *server;
grub_size_t protnamelen;
int try;
int try, port = 0;

if (grub_strncmp (name, "pxe:", sizeof ("pxe:") - 1) == 0)
{
Expand All @@ -1290,7 +1290,14 @@ grub_net_open_real (const char *name)
else
{
const char *comma;
char *colon;
comma = grub_strchr (name, ',');
colon = grub_strchr (name, ':');
if (colon)
{
port = (int) grub_strtol(colon+1, NULL, 10);
*colon = '\0';
}
if (comma)
{
protnamelen = comma - name;
Expand Down Expand Up @@ -1325,6 +1332,7 @@ grub_net_open_real (const char *name)
if (server)
{
ret->server = grub_strdup (server);
ret->port = port;
if (!ret->server)
{
grub_free (ret);
Expand Down
1 change: 1 addition & 0 deletions include/grub/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ typedef struct grub_net
grub_fs_t fs;
int eof;
int stall;
int port;
} *grub_net_t;

extern grub_net_t (*EXPORT_VAR (grub_net_open)) (const char *name);
Expand Down

0 comments on commit 4ccc609

Please sign in to comment.