diff options
| author | Leah Rowe <leah@libreboot.org> | 2026-03-15 20:20:19 +0000 |
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2026-03-15 20:20:19 +0000 |
| commit | 99b50d74c632f91de42d1fc775a8942cfa94331a (patch) | |
| tree | cd56d6769adf21b795b1d5e39c1cff6cd5df19a5 /util/nvmutil | |
| parent | eb139b32ef752058c28da60657e32ebc6ea963c1 (diff) | |
util/nvmutil: fix cat
i simplified it in the last commits, but i sttill
need this loop to properly handle parts
otherwise yeah, all it's doing is copying a file
verbatim. duh.
Signed-off-by: Leah Rowe <leah@libreboot.org>
Diffstat (limited to 'util/nvmutil')
| -rw-r--r-- | util/nvmutil/nvmutil.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c index aececdbb..eefd8cb8 100644 --- a/util/nvmutil/nvmutil.c +++ b/util/nvmutil/nvmutil.c @@ -408,6 +408,7 @@ static void cmd_helper_copy(void); * cat, cat16 and cat128 */ static void cmd_helper_cat(void); +static void cat_buf(u8 *b); /* * After command processing, write @@ -773,11 +774,6 @@ main(int argc, char *argv[]) memset(buf, 0, GBE_BUF_SIZE); memset(bufcmp, 0, GBE_BUF_SIZE); - /* - * Used by CMD_CAT, for padding - */ - memset(pad, 0xff, sizeof(pad)); - copy_gbe(); read_checksums(); @@ -1540,10 +1536,41 @@ cmd_helper_copy(void) static void cmd_helper_cat(void) { + size_t p = 0; + size_t ff = 0; + size_t nff = 0; + fflush(NULL); - if (rw_file_exact(STDOUT_FILENO, bufcmp, - gbe_file_size, 0, IO_WRITE, LOOP_EAGAIN, LOOP_EINTR, + memset(pad, 0xff, GBE_PART_SIZE); + + switch (cmd_index) { + case CMD_CAT: + nff = 0; + break; + case CMD_CAT16: + nff = 1; + break; + case CMD_CAT128: + nff = 15; + break; + default: + err(EINVAL, "erroneous call to cat"); + } + + for (p = 0; p < 2; p++) { + cat_buf(bufcmp + (size_t)(p * (gbe_file_size >> 1))); + + for (ff = 0; ff < nff; ff++) + cat_buf(pad); + } +} + +static void +cat_buf(u8 *b) +{ + if (rw_file_exact(STDOUT_FILENO, b, + GBE_PART_SIZE, 0, IO_WRITE, LOOP_EAGAIN, LOOP_EINTR, MAX_ZERO_RW_RETRY, OFF_ERR) < 0) err(errno, "stdout: cat"); } |
