All of lore.kernel.org
 help / color / mirror / Atom feed
From: alison at peloton-tech.com <alison@peloton-tech.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 4/6] GPT: read partition table from device into a data structure
Date: Mon, 29 May 2017 09:49:31 -0700	[thread overview]
Message-ID: <1496076573-14495-5-git-send-email-alison@peloton-tech.com> (raw)
In-Reply-To: <1496076573-14495-1-git-send-email-alison@peloton-tech.com>

From: Alison Chaiken <alison@she-devel.com>

Make the partition table available for modification by reading it from
the user-specified device into a linked list.   Provide an accessor
function for command-line testing.

Signed-off-by: Alison Chaiken <alison@peloton-tech.com>
---
 cmd/gpt.c      | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/part.h |   8 +++++
 2 files changed, 120 insertions(+)

diff --git a/cmd/gpt.c b/cmd/gpt.c
index 3b7d929..c61d2b1 100644
--- a/cmd/gpt.c
+++ b/cmd/gpt.c
@@ -19,6 +19,9 @@
 #include <linux/ctype.h>
 #include <div64.h>
 #include <memalign.h>
+#include <linux/compat.h>
+
+static LIST_HEAD(disk_partitions);
 
 /**
  * extract_env(): Expand env name from string format '&{env_name}'
@@ -151,6 +154,111 @@ static bool found_key(const char *str, const char *key)
 	return result;
 }
 
+static void del_gpt_info(void)
+{
+	struct list_head *pos = &disk_partitions;
+	struct disk_part *curr;
+	while (!list_empty(pos)) {
+		curr = list_entry(pos->next, struct disk_part, list);
+		list_del(pos->next);
+		free(curr);
+	}
+}
+
+static struct disk_part *allocate_disk_part(disk_partition_t *info, int partnum)
+{
+	struct disk_part *newpart;
+	newpart = (struct disk_part *)malloc(sizeof(*newpart));
+	memset(newpart, '\0', sizeof(newpart));
+	if (!newpart)
+		return ERR_PTR(-ENOMEM);
+
+	newpart->gpt_part_info.start = info->start;
+	newpart->gpt_part_info.size = info->size;
+	newpart->gpt_part_info.blksz = info->blksz;
+	strncpy((char *)newpart->gpt_part_info.name, (const char *)info->name, PART_NAME_LEN);
+	memset(newpart->gpt_part_info.name + 31, '\0', 1);
+	strncpy((char *)newpart->gpt_part_info.type, (const char *)info->type, PART_TYPE_LEN);
+	memset(newpart->gpt_part_info.type + 31, '\0', 1);
+	newpart->gpt_part_info.bootable = info->bootable;
+#ifdef CONFIG_PARTITION_UUIDS
+	strncpy(newpart->gpt_part_info.uuid, (const char *)info->uuid,
+		UUID_STR_LEN);
+#endif
+	newpart->partnum = partnum;
+
+	return newpart;
+}
+
+static void print_gpt_info(void)
+{
+	struct list_head *pos;
+	struct disk_part *curr;
+
+	list_for_each(pos, &disk_partitions) {
+		curr = list_entry(pos, struct disk_part, list);
+		printf("Partition %d:\n", curr->partnum);
+		printf("1st block %x, size %x\n", (unsigned)curr->gpt_part_info.start,
+		       (unsigned)curr->gpt_part_info.size);
+		printf("Block size %lu, name %s\n", curr->gpt_part_info.blksz,
+		       curr->gpt_part_info.name);
+		printf("Type %s, bootable %d\n", curr->gpt_part_info.type,
+		       curr->gpt_part_info.bootable);
+#ifdef CONFIG_PARTITION_UUIDS
+		printf("UUID %s\n", curr->gpt_part_info.uuid);
+#endif
+		printf("\n");
+	}
+}
+
+/*
+ * read partition info into disk_partitions list where
+ * it can be printed or modified
+ */
+static int get_gpt_info(struct blk_desc *dev_desc)
+{
+	/* start partition numbering at 1, as u-boot does */
+	int valid_parts = 1, p, ret = 0;
+	disk_partition_t info;
+	struct disk_part *new_disk_part;
+
+	if (disk_partitions.next == NULL)
+		INIT_LIST_HEAD(&disk_partitions);
+
+	for (p = 1; p <= MAX_SEARCH_PARTITIONS; p++) {
+		ret = part_get_info(dev_desc, p, &info);
+		if (ret)
+			continue;
+
+		new_disk_part = allocate_disk_part(&info, valid_parts);
+		if (IS_ERR(new_disk_part) && (valid_parts >= 2))
+			return -1;
+
+		list_add_tail(&new_disk_part->list, &disk_partitions);
+		valid_parts++;
+	}
+	if (!valid_parts) {
+		printf("** No valid partitions found **\n");
+		del_gpt_info();
+		return -ENODEV;
+	}
+	return --valid_parts;
+}
+
+/* a wrapper to test get_gpt_info */
+static int do_get_gpt_info(struct blk_desc *dev_desc)
+{
+	int ret;
+
+	ret = get_gpt_info(dev_desc);
+	if (ret > 0) {
+		print_gpt_info();
+		del_gpt_info();
+	}
+	return ret;
+}
+
+
 /**
  * set_gpt_info(): Fill partition information from string
  *		function allocates memory, remember to free!
@@ -457,6 +565,8 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		if (argc == 5)
 		       strcpy(varname, argv[4]);
 		return do_disk_guid(blk_dev_desc, varname);
+	} else if (strcmp(argv[1], "read") == 0) {
+		return do_get_gpt_info(blk_dev_desc);
 	} else {
 		return CMD_RET_USAGE;
 	}
@@ -479,6 +589,8 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
 	" Example usage:\n"
 	" gpt write mmc 0 $partitions\n"
 	" gpt verify mmc 0 $partitions\n"
+	" read <interface> <dev>\n"
+	"    - read GPT into a data structure for manipulation\n"
 	" guid <interface> <dev>\n"
 	"    - print disk GUID\n"
 	" guid <interface> <dev> <varname>\n"
diff --git a/include/part.h b/include/part.h
index 16c4a46..7d7052a 100644
--- a/include/part.h
+++ b/include/part.h
@@ -10,6 +10,7 @@
 #include <blk.h>
 #include <ide.h>
 #include <uuid.h>
+#include <linux/list.h>
 
 struct block_drvr {
 	char *name;
@@ -49,6 +50,7 @@ struct block_drvr {
 
 #define PART_NAME_LEN 32
 #define PART_TYPE_LEN 32
+#define MAX_SEARCH_PARTITIONS 16
 
 typedef struct disk_partition {
 	lbaint_t	start;	/* # of first block in partition	*/
@@ -68,6 +70,12 @@ typedef struct disk_partition {
 #endif
 } disk_partition_t;
 
+struct disk_part {
+	int partnum;
+	disk_partition_t gpt_part_info;
+	struct list_head list;
+};
+
 /* Misc _get_dev functions */
 #ifdef CONFIG_PARTITIONS
 /**
-- 
2.1.4

  parent reply	other threads:[~2017-05-29 16:49 UTC|newest]

Thread overview: 116+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-21  2:27 [U-Boot] [PATCH 0/3] add support for GPT partition name manipulation alison at peloton-tech.com
2017-05-21  2:27 ` [U-Boot] [PATCH 1/3] GPT: add accessor function for disk GUID alison at peloton-tech.com
2017-05-26 12:38   ` Tom Rini
2017-05-21  2:27 ` [U-Boot] [PATCH 2/3] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-05-26 12:39   ` Tom Rini
2017-05-21  2:27 ` [U-Boot] [PATCH 3/3] rename GPT partitions to detect boot failure alison at peloton-tech.com
2017-05-26 12:39   ` Tom Rini
2017-05-29  9:25   ` Lothar Waßmann
2017-05-26 12:38 ` [U-Boot] [PATCH 0/3] add support for GPT partition name manipulation Tom Rini
2017-05-29 16:49   ` [U-Boot] [PATCH v2 0/6] " alison at peloton-tech.com
2017-05-29 16:49     ` [U-Boot] [PATCH v2 1/6] EFI: replace number with UUID_STR_LEN macro alison at peloton-tech.com
2017-05-31  2:07       ` Tom Rini
2017-05-31  7:37       ` Lukasz Majewski
2017-05-29 16:49     ` [U-Boot] [PATCH v2 2/6] disk_partition: introduce macros for description string lengths alison at peloton-tech.com
2017-05-31  7:37       ` Lukasz Majewski
2017-05-31 13:50       ` Tom Rini
2017-05-29 16:49     ` [U-Boot] [PATCH v2 3/6] GPT: add accessor function for disk GUID alison at peloton-tech.com
2017-05-30  6:46       ` Lothar Waßmann
2017-06-03  2:22         ` [U-Boot] [PATCH v3 0/5] add support for GPT partition name manipulation alison at peloton-tech.com
2017-06-03  2:22           ` [U-Boot] [PATCH v3 1/5] GPT: add accessor function for disk GUID alison at peloton-tech.com
2017-06-06  8:20             ` Lothar Waßmann
2017-06-10  5:27               ` [U-Boot] [PATCH v5 1/3] " alison at peloton-tech.com
2017-06-11 13:38                 ` Tom Rini
2017-06-03  2:22           ` [U-Boot] [PATCH v3 2/5] partitions: increase MAX_SEARCH_PARTITIONS and move to part.h alison at peloton-tech.com
2017-06-03 11:52             ` Lukasz Majewski
2017-06-03  2:22           ` [U-Boot] [PATCH v3 3/5] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-06-06  8:28             ` Lothar Waßmann
2017-06-10  5:30               ` [U-Boot] [PATCH v5 2/3] " alison at peloton-tech.com
2017-06-11 13:38                 ` Tom Rini
2017-06-06 10:43             ` [U-Boot] [PATCH v3 3/5] " Lothar Waßmann
2017-06-03  2:22           ` [U-Boot] [PATCH v3 4/5] rename GPT partitions to detect boot failure alison at peloton-tech.com
2017-06-06  8:20             ` Lothar Waßmann
2017-06-10  5:35               ` [U-Boot] [PATCH v5 3/3] " alison at peloton-tech.com
2017-06-10  6:51                 ` Wolfgang Denk
2017-06-10 23:27                   ` Alison Chaiken
2017-06-10 23:33                   ` [U-Boot] [PATCH v6 3/3] GPT: provide commands to selectively rename partitions alison at peloton-tech.com
2017-06-11 13:38                     ` Tom Rini
2017-06-11 16:03                       ` [U-Boot] [PATCH v7] " alison at peloton-tech.com
2017-06-12  7:45                     ` [U-Boot] [PATCH v6 3/3] " Wolfgang Denk
2017-06-12 14:24                       ` Alison Chaiken
2017-06-12 14:56                         ` Tom Rini
2017-06-18 11:08                           ` Wolfgang Denk
2017-06-25 23:43                             ` [U-Boot] [PATCH v7 0/9] add support for GPT partition name manipulation alison at peloton-tech.com
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 1/9] EFI: replace number with UUID_STR_LEN macro alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 2/9] disk_partition: introduce macros for description string lengths alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 3/9] GPT: fix error in partitions string doc alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 4/9] sandbox: README: fix partition command invocation alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 5/9] cmd gpt: test in sandbox alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot,v7,5/9] " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 6/9] partitions: increase MAX_SEARCH_PARTITIONS and move to part.h alison at peloton-tech.com
2017-08-07 13:54                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 7/9] GPT: add accessor function for disk GUID alison at peloton-tech.com
2017-08-07 13:55                                 ` [U-Boot] [U-Boot, v7, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 8/9] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-06-26  7:34                                 ` Lothar Waßmann
2017-07-01 22:42                                   ` [U-Boot] [PATCH v8 8/10] " alison at peloton-tech.com
2017-07-03  6:52                                     ` Lothar Waßmann
2017-07-04 18:18                                       ` [U-Boot] [PATCH v8 08/10] " alison at peloton-tech.com
2017-08-07 13:55                                         ` [U-Boot] [U-Boot, v8, " Tom Rini
2017-06-25 23:43                               ` [U-Boot] [PATCH v7 9/9] GPT: provide commands to selectively rename partitions alison at peloton-tech.com
2017-06-26  1:52                                 ` Bin Meng
2017-06-26  2:11                                   ` alison at peloton-tech.com
2017-06-26  7:55                                 ` Lothar Waßmann
2017-07-01 22:44                                   ` [U-Boot] [PATCH 09/10] " alison at peloton-tech.com
2017-06-18 11:03                         ` [U-Boot] [PATCH v6 3/3] " Wolfgang Denk
2017-06-25 21:54                           ` Alison Chaiken
2017-06-26 22:47                             ` Tom Rini
2017-06-27  7:05                             ` Lothar Waßmann
2017-06-27  9:12                               ` Lothar Waßmann
2017-07-01 22:44                                 ` [U-Boot] [PATCH 10/10] gpt: harden set_gpt_info() against non NULL-terminated strings alison at peloton-tech.com
2017-07-03  6:37                                   ` Lothar Waßmann
2017-07-04 18:19                                     ` [U-Boot] [PATCH v2 " alison at peloton-tech.com
2017-08-07 13:55                                       ` [U-Boot] [U-Boot, v2, " Tom Rini
2017-07-01 22:36                               ` [U-Boot] [PATCH v6 3/3] GPT: provide commands to selectively rename partitions Alison Chaiken
2017-07-03  6:40                                 ` Lothar Waßmann
2017-07-04 18:19                                   ` [U-Boot] [PATCH v8 09/10] " alison at peloton-tech.com
2017-08-07 13:55                                     ` [U-Boot] [U-Boot, v8, " Tom Rini
2017-06-03  2:22           ` [U-Boot] [PATCH v3 5/5] GPT: fix error in partitions string doc alison at peloton-tech.com
2017-06-03 11:48           ` [U-Boot] [PATCH v3 0/5] add support for GPT partition name manipulation Lukasz Majewski
2017-05-31  7:44       ` [U-Boot] [PATCH v2 3/6] GPT: add accessor function for disk GUID Lukasz Majewski
2017-05-31  8:47         ` Lothar Waßmann
2017-05-29 16:49     ` alison at peloton-tech.com [this message]
2017-05-30  7:37       ` [U-Boot] [PATCH v2 4/6] GPT: read partition table from device into a data structure Lothar Waßmann
2017-06-01  6:34         ` Chaiken, Alison
2017-06-01  9:48           ` Lothar Waßmann
2017-05-31  7:48       ` Lukasz Majewski
2017-05-31  8:48         ` Lothar Waßmann
2017-05-31 11:11           ` Lukasz Majewski
2017-05-31 13:42             ` Lothar Waßmann
2017-05-31 14:07         ` Lukasz Majewski
2017-05-29 16:49     ` [U-Boot] [PATCH v2 5/6] rename GPT partitions to detect boot failure alison at peloton-tech.com
2017-05-30  7:38       ` Lothar Waßmann
2017-05-31  8:12       ` Lukasz Majewski
2017-06-01  7:04         ` Chaiken, Alison
2017-06-01  8:21           ` Lukasz Majewski
2017-06-01 15:06             ` Chaiken, Alison
2017-06-01 18:20               ` Lukasz Majewski
2017-06-04 22:11         ` [U-Boot] [PATCH v4 0/5] add support for GPT partition name manipulation alison at peloton-tech.com
2017-06-04 22:11           ` [U-Boot] [PATCH v4 1/5] GPT: read partition table from device into a data structure alison at peloton-tech.com
2017-06-04 22:11           ` [U-Boot] [PATCH v4 2/5] rename GPT partitions to detect boot failure alison at peloton-tech.com
2017-06-04 22:11           ` [U-Boot] [PATCH v4 3/5] GPT: fix error in partitions string doc alison at peloton-tech.com
2017-06-04 22:11           ` [U-Boot] [PATCH 4/5] sandbox: README: fix partition command invocation alison at peloton-tech.com
2017-06-09 12:28             ` Simon Glass
2017-06-15 19:21               ` sjg at google.com
2017-06-04 22:11           ` [U-Boot] [PATCH 5/5] cmd gpt: test in sandbox alison at peloton-tech.com
2017-06-15 19:21             ` sjg at google.com
2017-08-27 23:02         ` [U-Boot] [PATCH v2 5/6] rename GPT partitions to detect boot failure Chaiken, Alison
2017-08-28  7:54           ` Łukasz Majewski
2017-08-28 11:16             ` Tom Rini
2017-05-29 16:49     ` [U-Boot] [PATCH v2 6/6] GPT: fix error in partitions string doc alison at peloton-tech.com
2017-05-31  8:14       ` Lukasz Majewski
2017-05-31 11:21         ` Lukasz Majewski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1496076573-14495-5-git-send-email-alison@peloton-tech.com \
    --to=alison@peloton-tech.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.