aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware-utils/src/ptgen.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2014-10-16 16:16:47 +0000
committerJo-Philipp Wich <jow@openwrt.org>2014-10-16 16:16:47 +0000
commit6358368500e45848b4d86e42d0555ccdba4355e3 (patch)
tree3cb9d48d01cb42f250e342d30c9242d7e3247d28 /tools/firmware-utils/src/ptgen.c
parent4f73613c2698346102741b27a8524076eb66c20c (diff)
downloadupstream-6358368500e45848b4d86e42d0555ccdba4355e3.tar.gz
upstream-6358368500e45848b4d86e42d0555ccdba4355e3.tar.bz2
upstream-6358368500e45848b4d86e42d0555ccdba4355e3.zip
firmware-utils: allow passing a specific MBR signature to ptgen
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org> SVN-Revision: 42934
Diffstat (limited to 'tools/firmware-utils/src/ptgen.c')
-rw-r--r--tools/firmware-utils/src/ptgen.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/tools/firmware-utils/src/ptgen.c b/tools/firmware-utils/src/ptgen.c
index 0247fd0131..6379ed7a59 100644
--- a/tools/firmware-utils/src/ptgen.c
+++ b/tools/firmware-utils/src/ptgen.c
@@ -28,6 +28,7 @@
#include <stdio.h>
#include <ctype.h>
#include <fcntl.h>
+#include <stdint.h>
#if __BYTE_ORDER == __BIG_ENDIAN
#define cpu_to_le16(x) bswap_16(x)
@@ -124,7 +125,7 @@ static inline unsigned long round_to_kb(long sect) {
}
/* check the partition sizes and write the partition table */
-static int gen_ptable(int nr)
+static int gen_ptable(uint32_t signature, int nr)
{
struct pte pte[4];
unsigned long sect = 0;
@@ -159,6 +160,12 @@ static int gen_ptable(int nr)
return -1;
}
+ lseek(fd, 440, SEEK_SET);
+ if (write(fd, &signature, sizeof(signature)) != sizeof(signature)) {
+ fprintf(stderr, "write failed.\n");
+ goto fail;
+ }
+
lseek(fd, 446, SEEK_SET);
if (write(fd, pte, sizeof(struct pte) * 4) != sizeof(struct pte) * 4) {
fprintf(stderr, "write failed.\n");
@@ -187,8 +194,9 @@ int main (int argc, char **argv)
char type = 0x83;
int ch;
int part = 0;
+ uint32_t signature = 0x5452574F; /* 'OWRT' */
- while ((ch = getopt(argc, argv, "h:s:p:a:t:o:vl:")) != -1) {
+ while ((ch = getopt(argc, argv, "h:s:p:a:t:o:vl:S:")) != -1) {
switch (ch) {
case 'o':
filename = optarg;
@@ -221,6 +229,9 @@ int main (int argc, char **argv)
case 'l':
kb_align = (int) strtoul(optarg, NULL, 0) * 2;
break;
+ case 'S':
+ signature = strtoul(optarg, NULL, 0);
+ break;
case '?':
default:
usage(argv[0]);
@@ -229,6 +240,6 @@ int main (int argc, char **argv)
argc -= optind;
if (argc || (heads <= 0) || (sectors <= 0) || !filename)
usage(argv[0]);
-
- return gen_ptable(part);
+
+ return gen_ptable(signature, part);
}