firmware-utils: allow passing a specific MBR signature to ptgen
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@42934 3c298f89-4303-0410-b956-a3cf2f4a3e73master
parent
41f4265101
commit
872c274a3a
|
@ -28,6 +28,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#if __BYTE_ORDER == __BIG_ENDIAN
|
#if __BYTE_ORDER == __BIG_ENDIAN
|
||||||
#define cpu_to_le16(x) bswap_16(x)
|
#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 */
|
/* 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];
|
struct pte pte[4];
|
||||||
unsigned long sect = 0;
|
unsigned long sect = 0;
|
||||||
|
@ -159,6 +160,12 @@ static int gen_ptable(int nr)
|
||||||
return -1;
|
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);
|
lseek(fd, 446, SEEK_SET);
|
||||||
if (write(fd, pte, sizeof(struct pte) * 4) != sizeof(struct pte) * 4) {
|
if (write(fd, pte, sizeof(struct pte) * 4) != sizeof(struct pte) * 4) {
|
||||||
fprintf(stderr, "write failed.\n");
|
fprintf(stderr, "write failed.\n");
|
||||||
|
@ -187,8 +194,9 @@ int main (int argc, char **argv)
|
||||||
char type = 0x83;
|
char type = 0x83;
|
||||||
int ch;
|
int ch;
|
||||||
int part = 0;
|
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) {
|
switch (ch) {
|
||||||
case 'o':
|
case 'o':
|
||||||
filename = optarg;
|
filename = optarg;
|
||||||
|
@ -221,6 +229,9 @@ int main (int argc, char **argv)
|
||||||
case 'l':
|
case 'l':
|
||||||
kb_align = (int) strtoul(optarg, NULL, 0) * 2;
|
kb_align = (int) strtoul(optarg, NULL, 0) * 2;
|
||||||
break;
|
break;
|
||||||
|
case 'S':
|
||||||
|
signature = strtoul(optarg, NULL, 0);
|
||||||
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
default:
|
default:
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
@ -230,5 +241,5 @@ int main (int argc, char **argv)
|
||||||
if (argc || (heads <= 0) || (sectors <= 0) || !filename)
|
if (argc || (heads <= 0) || (sectors <= 0) || !filename)
|
||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
|
|
||||||
return gen_ptable(part);
|
return gen_ptable(signature, part);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue