From ec3f738fb6012d714c36a878c61d290775467283 Mon Sep 17 00:00:00 2001 From: "Joseph C. Lehner" Date: Thu, 10 Sep 2020 15:11:04 +0200 Subject: [PATCH] Add -S option --- main.c | 7 ++++++- nmrpd.h | 1 + tftp.c | 6 +++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index 90e2fda..039bee8 100644 --- a/main.c +++ b/main.c @@ -44,6 +44,7 @@ void usage(FILE *fp) #ifdef NMRPFLASH_SET_REGION " -R Set device region (NA, WW, GR, PR, RU, BZ, IN, KO, JP)\n" #endif + " -S Skip bytes of the firmware file\n" #ifdef NMRPFLASH_TFTP_TEST " -U Test TFTP upload\n" #endif @@ -145,6 +146,7 @@ int main(int argc, char **argv) .port = 69, .region = NULL, .blind = false, + .offset = 0, }; #ifdef NMRPFLASH_WINDOWS char *newpath = NULL; @@ -181,7 +183,7 @@ int main(int argc, char **argv) opterr = 0; - while ((c = getopt(argc, argv, "a:A:Bc:f:F:i:m:M:p:R:t:T:hLVvU")) != -1) { + while ((c = getopt(argc, argv, "a:A:Bc:f:F:i:m:M:p:R:S:t:T:hLVvU")) != -1) { max = 0x7fffffff; switch (c) { case 'a': @@ -218,6 +220,7 @@ int main(int argc, char **argv) break; #endif case 'p': + case 'S': case 'T': case 't': if (c == 'p') { @@ -236,6 +239,8 @@ int main(int argc, char **argv) args.rx_timeout = val; } else if (c == 'T') { args.ul_timeout = val * 1000; + } else if (c == 'S') { + args.offset = val; } break; diff --git a/nmrpd.h b/nmrpd.h index 7429d86..ad678e8 100644 --- a/nmrpd.h +++ b/nmrpd.h @@ -100,6 +100,7 @@ struct nmrpd_args { bool blind; uint16_t port; const char *region; + off_t offset; }; const char *leafname(const char *path); diff --git a/tftp.c b/tftp.c index 16fa591..bac02bc 100644 --- a/tftp.c +++ b/tftp.c @@ -349,11 +349,15 @@ int tftp_put(struct nmrpd_args *args) fd = open(args->file_local, O_RDONLY | O_BINARY); if (fd < 0) { xperror("open"); - ret = fd; goto cleanup; } else if (!file_remote) { file_remote = args->file_local; } + + if (lseek(fd, args->offset, SEEK_SET) == (off_t)-1) { + xperror("lseek"); + goto cleanup; + } } #ifndef NMRPFLASH_FUZZ_TFTP