diff options
author | Peter H. Froehlich <peter.hans.froehlich@gmail.com> | 2021-04-25 18:15:18 +0200 |
---|---|---|
committer | Peter H. Froehlich <peter.hans.froehlich@gmail.com> | 2021-04-25 18:15:18 +0200 |
commit | 8f272adf9273b2379d4647254d1e7b191ff704ca (patch) | |
tree | 3a5f1a2414c5b2b95f3288514db84d21592587d5 | |
parent | 360f850c46d9301a7e1177afe9b337fadb7a516a (diff) | |
download | mkgpt-8f272adf9273b2379d4647254d1e7b191ff704ca.tar.gz |
Rework partition struct and partition name.
-rw-r--r-- | mkgpt.c | 50 | ||||
-rw-r--r-- | part.h | 20 | ||||
-rwxr-xr-x | test-mkgpt.sh | 9 |
3 files changed, 51 insertions, 28 deletions
diff --git a/mkgpt.c b/mkgpt.c index 0c95953..70f267b 100644 --- a/mkgpt.c +++ b/mkgpt.c @@ -26,6 +26,7 @@ #include "part.h" #include "part_ids.h" +#include <assert.h> #include <errno.h> #include <limits.h> #include <stddef.h> @@ -33,6 +34,8 @@ #include <stdlib.h> #include <string.h> +#define MAX_PART_NAME (36) + static void dump_help(char *fname); static int @@ -42,11 +45,17 @@ parse_opts(int argc, char **argv); static void write_output(); +static inline int +min(const int a, const int b) +{ + return a < b ? a : b; +} + static size_t sect_size = 512; static long image_sects = 0; static long min_image_sects = 2048; -static PART *first_part = NULL; -static PART *last_part = NULL; +static struct partition *first_part = NULL; +static struct partition *last_part = NULL; static FILE *output = NULL; static GUID disk_guid; static int part_count; @@ -88,7 +97,7 @@ parse_opts(int argc, char **argv) { int i = 1; int cur_part_id = 0; - PART *cur_part = NULL; + struct partition *cur_part = NULL; /* First, parse global options */ while (i < argc) { @@ -206,6 +215,8 @@ parse_opts(int argc, char **argv) } cur_part_id++; cur_part->id = cur_part_id; + snprintf(cur_part->name, sizeof(cur_part->name), + "part%i", cur_part_id); /* Get the filename of the partition image */ i++; @@ -242,7 +253,19 @@ parse_opts(int argc, char **argv) return -1; } - cur_part->name = argv[i]; + /* + * TODO we would really need to check the number of + * UTF-8 characters and not the number of bytes here... + */ + if (strlen(argv[i]) > MAX_PART_NAME) { + fprintf(stderr, + "partition name too long (max %i)\n", + MAX_PART_NAME); + return -1; + } + static_assert(sizeof(cur_part->name) >= MAX_PART_NAME, + "more space for name in struct partition"); + strcpy(cur_part->name, argv[i]); i++; } else if (!strcmp(argv[i], "--type") || @@ -334,7 +357,7 @@ check_parts() /* Iterate through the partitions, checking validity */ int cur_part_id = 0; int cur_sect; - PART *cur_part; + struct partition *cur_part; int header_length; int needed_file_length; @@ -390,11 +413,6 @@ check_parts() return -1; } - if (cur_part->name == NULL) { - cur_part->name = malloc(128); - sprintf(cur_part->name, "part%i", cur_part_id); - } - fseek(cur_part->src, 0, SEEK_END); cur_part_file_len = ftell(cur_part->src); fseek(cur_part->src, 0, SEEK_SET); @@ -443,7 +461,7 @@ write_output() { int i; uint8_t *mbr, *gpt, *gpt2, *parts, *image_buf; - PART *cur_part; + struct partition *cur_part; /* Write MBR */ mbr = calloc(1, sect_size); @@ -519,11 +537,15 @@ write_output() *(uint64_t *)&parts[i * 128 + 48] = cur_part->attrs; /* Attributes */ - for (char_id = 0; - char_id < (int)strlen(cur_part->name) && char_id < 35; - char_id++) + /* + * TODO settle missing UTF-16LE conversion issue somehow, + * possibly by simply limiting the tool to ASCII here? + */ + int len = min(strlen(cur_part->name), MAX_PART_NAME); + for (char_id = 0; char_id < len; char_id++) { *(uint16_t *)&parts[i * 128 + 56 + char_id * 2] = (uint16_t)cur_part->name[char_id]; + } i++; cur_part = cur_part->next; diff --git a/part.h b/part.h index 7890ca8..a04ef02 100644 --- a/part.h +++ b/part.h @@ -26,22 +26,22 @@ #ifndef PART_H #define PART_H -#include <stdio.h> -#include <stdint.h> #include "guid.h" -typedef struct _part { +#include <stdint.h> +#include <stdio.h> + +struct partition { GUID type; GUID uuid; - int id; uint64_t attrs; - int sect_start; - int sect_length; long src_length; - char *name; FILE *src; - - struct _part *next; /* TODO why build a list? */ -} PART; + struct partition *next; /* TODO why build a list? */ + int id; + int sect_start; + int sect_length; + char name[52]; +}; #endif diff --git a/test-mkgpt.sh b/test-mkgpt.sh index 6d291aa..7c3c54d 100755 --- a/test-mkgpt.sh +++ b/test-mkgpt.sh @@ -16,12 +16,13 @@ done # TODO something goes wrong with --sector-size 1024 or 4096 ./mkgpt -o ${tmpdir}/bla.img -s 131072 \ - --part ${tmpdir}/a.img --type system \ - --part ${tmpdir}/b.img --type fat32 \ - --part ${tmpdir}/c.img --type linux \ - --part ${tmpdir}/d.img --type 0x82 \ + --part ${tmpdir}/a.img --type system --name part_system_a \ + --part ${tmpdir}/b.img --type fat32 --name part_fat32_b \ + --part ${tmpdir}/c.img --type linux --name X \ + --part ${tmpdir}/d.img --type 0x82 --name 123456789012345678901234567890123456 \ --part ${tmpdir}/e.img --type 21686148-6449-6E6F-744E-656564454649 fdisk -l ${tmpdir}/bla.img +#xxd ${tmpdir}/bla.img | less rm -rfv ${tmpdir} |