mirror of https://github.com/hak5/openwrt.git
Update to v2.1 Stays closer to the stock firmware by using wrt350n.bin for the created image. Adds the possibility to create the image in two separate steps (-b / -z). Makefiles now support the possibility to include a u-boot image for a 100%-stock-like image.
Signed off by: Matthias Buecher <mail@maddes.net> SVN-Revision: 19596lede-17.01
parent
9e5844fda2
commit
cb9c37af38
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (C) 2008-2009 OpenWrt.org
|
# Copyright (C) 2008-2010 OpenWrt.org
|
||||||
#
|
#
|
||||||
# This is free software, licensed under the GNU General Public License v2.
|
# This is free software, licensed under the GNU General Public License v2.
|
||||||
# See /LICENSE for more information.
|
# See /LICENSE for more information.
|
||||||
|
@ -61,14 +61,18 @@ define Image/Build/Linksys
|
||||||
# create parameter file
|
# create parameter file
|
||||||
echo ":kernel $5 ${BIN_DIR}/openwrt-$2-uImage" >"${TMP_DIR}/$2_webupgrade/$2.par"
|
echo ":kernel $5 ${BIN_DIR}/openwrt-$2-uImage" >"${TMP_DIR}/$2_webupgrade/$2.par"
|
||||||
echo ":rootfs 0 ${KDIR}/root.$1" >>"${TMP_DIR}/$2_webupgrade/$2.par"
|
echo ":rootfs 0 ${KDIR}/root.$1" >>"${TMP_DIR}/$2_webupgrade/$2.par"
|
||||||
# create webupgrade image
|
[ ! -f "$(STAGING_DIR_HOST)/share/wrt350nv2-builder/u-boot.bin" ] || ( \
|
||||||
|
echo ":u-boot 0 $(STAGING_DIR_HOST)/share/wrt350nv2-builder/u-boot.bin" >>"${TMP_DIR}/$2_webupgrade/$2.par"; )
|
||||||
|
# create bin file for recovery and webupgrade image
|
||||||
( cd "${TMP_DIR}/$2_webupgrade"; \
|
( cd "${TMP_DIR}/$2_webupgrade"; \
|
||||||
"${STAGING_DIR_HOST}/bin/$2-builder" \
|
"${STAGING_DIR_HOST}/bin/$2-builder" \
|
||||||
-v "${TMP_DIR}/$2_webupgrade/$2.par" \
|
-v -b "${TMP_DIR}/$2_webupgrade/$2.par"; \
|
||||||
"${BIN_DIR}/openwrt-$2-$1-webupgrade.img"; \
|
|
||||||
)
|
)
|
||||||
# copy bin file as recovery image
|
# copy bin file as recovery image
|
||||||
$(CP) "${TMP_DIR}/$2_webupgrade/openwrt-$2-$1-webupgrade.bin" "$(BIN_DIR)/openwrt-$2-$1-recovery.bin"
|
$(CP) "${TMP_DIR}/$2_webupgrade/wrt350n.bin" "$(BIN_DIR)/openwrt-$2-$1-recovery.bin"
|
||||||
|
# create webupgrade image for stock firmware update mechanism
|
||||||
|
zip "${TMP_DIR}/$2_webupgrade/wrt350n.zip" "${TMP_DIR}/$2_webupgrade/wrt350n.bin"
|
||||||
|
"${STAGING_DIR_HOST}/bin/$2-builder" -v -z "${TMP_DIR}/$2_webupgrade/wrt350n.zip" "${BIN_DIR}/openwrt-$2-$1-webupgrade.img"
|
||||||
rm -rf "${TMP_DIR}/$2_webupgrade"
|
rm -rf "${TMP_DIR}/$2_webupgrade"
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
@ -85,8 +89,10 @@ endef
|
||||||
define Image/Build
|
define Image/Build
|
||||||
$(call Image/Build/$(1),$(1))
|
$(call Image/Build/$(1),$(1))
|
||||||
$(call Image/Build/Netgear,$(1),wnr854t,NG_WNR854T,$(1))
|
$(call Image/Build/Netgear,$(1),wnr854t,NG_WNR854T,$(1))
|
||||||
$(call Image/Build/Linksys,$(1),wrt350nv2,WNR350Nv2,$(1),1048576) # 5th parameter is kernel mtd size 0x00100000 = 1048576 / 0x001A0000 = 1703936
|
|
||||||
$(call Image/Build/Freecom,$(1),dt2,DT,$(1))
|
$(call Image/Build/Freecom,$(1),dt2,DT,$(1))
|
||||||
|
# Leave WRT350Nv2 at last position due to webimage dependency for zip
|
||||||
|
# 5th parameter is kernel mtd size, e.g. 0x00100000 = 1048576 or 0x001A0000 = 1703936
|
||||||
|
$(call Image/Build/Linksys,$(1),wrt350nv2,WNR350Nv2,$(1),1048576)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Image/Build/squashfs
|
define Image/Build/squashfs
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (C) 2006-2009 OpenWrt.org
|
# Copyright (C) 2006-2010 OpenWrt.org
|
||||||
#
|
#
|
||||||
# This is free software, licensed under the GNU General Public License v2.
|
# This is free software, licensed under the GNU General Public License v2.
|
||||||
# See /LICENSE for more information.
|
# See /LICENSE for more information.
|
||||||
|
@ -8,7 +8,7 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=wrt350nv2-builder
|
PKG_NAME:=wrt350nv2-builder
|
||||||
PKG_VERSION:=2.0
|
PKG_VERSION:=2.1
|
||||||
|
|
||||||
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/${PKG_NAME}-$(PKG_VERSION)
|
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/${PKG_NAME}-$(PKG_VERSION)
|
||||||
|
|
||||||
|
@ -24,10 +24,16 @@ endef
|
||||||
define Host/Install
|
define Host/Install
|
||||||
$(INSTALL_DIR) $(STAGING_DIR_HOST)/bin
|
$(INSTALL_DIR) $(STAGING_DIR_HOST)/bin
|
||||||
$(INSTALL_BIN) $(HOST_BUILD_DIR)/wrt350nv2-builder $(STAGING_DIR_HOST)/bin/
|
$(INSTALL_BIN) $(HOST_BUILD_DIR)/wrt350nv2-builder $(STAGING_DIR_HOST)/bin/
|
||||||
|
# optionally the builder can add a u-boot binary to create a complete webupgrade image, but this is not mandatory
|
||||||
|
# u-boot images from stock firmware are available at ftp://ftp.maddes.net/openwrt/kamikaze/orion/stock/binaries/
|
||||||
|
[ ! -f "files/u-boot.bin" ] || ( \
|
||||||
|
$(INSTALL_DIR) $(STAGING_DIR_HOST)/share/wrt350nv2-builder; \
|
||||||
|
$(CP) files/u-boot.bin $(STAGING_DIR_HOST)/share/wrt350nv2-builder/; )
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define Host/Clean
|
define Host/Clean
|
||||||
rm -f $(STAGING_DIR_HOST)/bin/wrt350nv2-builder
|
rm -f $(STAGING_DIR_HOST)/bin/wrt350nv2-builder
|
||||||
|
rm -f $(STAGING_DIR_HOST)/share/wrt350nv2-builder
|
||||||
endef
|
endef
|
||||||
|
|
||||||
$(eval $(call HostBuild))
|
$(eval $(call HostBuild))
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/*
|
/*
|
||||||
|
|
||||||
WRT350Nv2-Builder 2.0 (previously called buildimg)
|
WRT350Nv2-Builder 2.1 (previously called buildimg)
|
||||||
Copyright (C) 2008-2009 Dirk Teurlings <info@upexia.nl>
|
Copyright (C) 2008-2009 Dirk Teurlings <info@upexia.nl>
|
||||||
Copyright (C) 2009 Matthias Buecher (http://www.maddes.net/)
|
Copyright (C) 2009-2010 Matthias Buecher (http://www.maddes.net/)
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -36,18 +36,19 @@
|
||||||
1 wrt350nv2.par parameter file describing the image layout
|
1 wrt350nv2.par parameter file describing the image layout
|
||||||
2 wrt350nv2.img output file for linksys style image
|
2 wrt350nv2.img output file for linksys style image
|
||||||
|
|
||||||
An u-boot image inside the bin file is not necessary.
|
A u-boot image inside the bin file is not necessary.
|
||||||
The version is not important.
|
The version is not important.
|
||||||
The name of the bin file is not important.
|
The name of the bin file is not important, but still "wrt350n.bin" is used to
|
||||||
|
keep as close as possible to the stock firmware.
|
||||||
|
|
||||||
Linksys assumes that no mtd will be used to its maximum, so the last 16 bytes
|
Linksys assumes that no mtd will be used to its maximum, so the last 16 bytes
|
||||||
of the mtd are abused to define the length of the next mtd content (4 bytes for
|
of the mtd are abused to define the length of the next mtd content (4 bytes for
|
||||||
size + 12 pad bytes).
|
size + 12 pad bytes).
|
||||||
|
|
||||||
At the end of "rootfs" additional 16 bytes are abused for some data and an
|
At the end of "rootfs" additional 16 bytes are abused for some data and a
|
||||||
highly important eRcOmM identifier, so the last 32 bytes of "rootfs" are abused.
|
highly important eRcOmM identifier, so the last 32 bytes of "rootfs" are abused.
|
||||||
|
|
||||||
At the end of "u-boot" 128 bytes are abused for some data, a checksum and an
|
At the end of "u-boot" 128 bytes are abused for some data, a checksum and a
|
||||||
highly important sErCoMm identifier.
|
highly important sErCoMm identifier.
|
||||||
|
|
||||||
|
|
||||||
|
@ -82,7 +83,7 @@
|
||||||
|
|
||||||
|
|
||||||
// version info
|
// version info
|
||||||
#define VERSION "2.0"
|
#define VERSION "2.1"
|
||||||
char program_info[] = "WRT350Nv2-Builder v%s by Dirk Teurlings <info@upexia.nl> and Matthias Buecher (http://www.maddes.net/)\n";
|
char program_info[] = "WRT350Nv2-Builder v%s by Dirk Teurlings <info@upexia.nl> and Matthias Buecher (http://www.maddes.net/)\n";
|
||||||
|
|
||||||
// verbosity
|
// verbosity
|
||||||
|
@ -105,7 +106,8 @@ mtd_info mtd_rootfs = { "rootfs", 0, 0, NULL, 0L, { 0, 0 } };
|
||||||
mtd_info mtd_uboot = { "u-boot", 0, 0, NULL, 0L, { 0, 0 } };
|
mtd_info mtd_uboot = { "u-boot", 0, 0, NULL, 0L, { 0, 0 } };
|
||||||
|
|
||||||
#define ROOTFS_END_OFFSET 0x00760000
|
#define ROOTFS_END_OFFSET 0x00760000
|
||||||
#define ROOTFS_MIN_OFFSET 0x00700000 // should be filled up to here, to make sure that the zip file is big enough to pass the size check of the stock firmware
|
#define ROOTFS_MIN_OFFSET 0x00640000 // should be filled up to here, to make sure that the zip file is big enough to pass the size check of the stock firmware
|
||||||
|
// 2.0.17: filled up to 0x00640000, 2.0.19: filled up to 0x0670000
|
||||||
|
|
||||||
// rootfs statics via: hexdump -v -e '1/1 "0x%02X, "' -s 0x0075FFE0 -n 16 "wrt350n.bin" ; echo -en "\n"
|
// rootfs statics via: hexdump -v -e '1/1 "0x%02X, "' -s 0x0075FFE0 -n 16 "wrt350n.bin" ; echo -en "\n"
|
||||||
unsigned char product_id[] = { 0x00, 0x03 }; // seems to be a fixed value
|
unsigned char product_id[] = { 0x00, 0x03 }; // seems to be a fixed value
|
||||||
|
@ -203,17 +205,17 @@ int parse_par_file(FILE *f_par) {
|
||||||
// read next line into memory
|
// read next line into memory
|
||||||
do {
|
do {
|
||||||
// allocate memory for input line
|
// allocate memory for input line
|
||||||
if (buffer == NULL) {
|
if (!buffer) {
|
||||||
buffer = malloc(buffer_size);
|
buffer = malloc(buffer_size);
|
||||||
}
|
}
|
||||||
if (buffer == NULL) {
|
if (!buffer) {
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
printf("parse_par_file: can not allocate %i bytes\n", (int) buffer_size);
|
printf("parse_par_file: can not allocate %i bytes\n", (int) buffer_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
line = fgets(buffer, buffer_size, f_par);
|
line = fgets(buffer, buffer_size, f_par);
|
||||||
if (line == NULL) {
|
if (!line) {
|
||||||
exitcode = ferror(f_par);
|
exitcode = ferror(f_par);
|
||||||
if (exitcode) {
|
if (exitcode) {
|
||||||
printf("parse_par_file: %s\n", strerror(exitcode));
|
printf("parse_par_file: %s\n", strerror(exitcode));
|
||||||
|
@ -243,7 +245,7 @@ int parse_par_file(FILE *f_par) {
|
||||||
buffer_size *= 2;
|
buffer_size *= 2;
|
||||||
lprintf(DEBUG_LVL2, " extending buffer to %i bytes\n", buffer_size);
|
lprintf(DEBUG_LVL2, " extending buffer to %i bytes\n", buffer_size);
|
||||||
} while (1);
|
} while (1);
|
||||||
if (line == NULL || exitcode) {
|
if ((!line) || (exitcode)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,17 +264,17 @@ int parse_par_file(FILE *f_par) {
|
||||||
printf("line %i does not meet defined format (:<mtdname> <mtdsize> <file>)\n", lineno);
|
printf("line %i does not meet defined format (:<mtdname> <mtdsize> <file>)\n", lineno);
|
||||||
} else {
|
} else {
|
||||||
// populate mtd_info if supported mtd names
|
// populate mtd_info if supported mtd names
|
||||||
if (strcmp(string1, mtd_kernel.name) == 0) {
|
if (!strcmp(string1, mtd_kernel.name)) {
|
||||||
mtd = &mtd_kernel;
|
mtd = &mtd_kernel;
|
||||||
} else if (strcmp(string1, mtd_rootfs.name) == 0) {
|
} else if (!strcmp(string1, mtd_rootfs.name)) {
|
||||||
mtd = &mtd_rootfs;
|
mtd = &mtd_rootfs;
|
||||||
} else if (strcmp(string1, mtd_uboot.name) == 0) {
|
} else if (!strcmp(string1, mtd_uboot.name)) {
|
||||||
mtd = &mtd_uboot;
|
mtd = &mtd_uboot;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mtd == NULL) {
|
if (!mtd) {
|
||||||
printf("unknown mtd %s in line %i\n", string1, lineno);
|
printf("unknown mtd %s in line %i\n", string1, lineno);
|
||||||
} else if (mtd->filename != NULL) {
|
} else if (mtd->filename) {
|
||||||
f_exitcode = 1;
|
f_exitcode = 1;
|
||||||
printf("mtd %s in line %i multiple definitions\n", string1, lineno);
|
printf("mtd %s in line %i multiple definitions\n", string1, lineno);
|
||||||
} else {
|
} else {
|
||||||
|
@ -281,7 +283,7 @@ int parse_par_file(FILE *f_par) {
|
||||||
|
|
||||||
// Get file size
|
// Get file size
|
||||||
f_in = fopen(mtd->filename, "rb");
|
f_in = fopen(mtd->filename, "rb");
|
||||||
if (f_in == NULL) {
|
if (!f_in) {
|
||||||
f_exitcode = errno;
|
f_exitcode = errno;
|
||||||
printf("input file %s: %s\n", mtd->filename, strerror(f_exitcode));
|
printf("input file %s: %s\n", mtd->filename, strerror(f_exitcode));
|
||||||
} else {
|
} else {
|
||||||
|
@ -320,7 +322,7 @@ int parse_par_file(FILE *f_par) {
|
||||||
if (count != 2) {
|
if (count != 2) {
|
||||||
printf("line %i does not meet defined format (:<variable name> <integer>\n", lineno);
|
printf("line %i does not meet defined format (:<variable name> <integer>\n", lineno);
|
||||||
} else {
|
} else {
|
||||||
if (strcmp(string1, "version") == 0) {
|
if (!strcmp(string1, "version")) {
|
||||||
// changing version
|
// changing version
|
||||||
fw_version[0] = 0x000000FF & ( value >> 8 );
|
fw_version[0] = 0x000000FF & ( value >> 8 );
|
||||||
fw_version[1] = 0x000000FF & value;
|
fw_version[1] = 0x000000FF & value;
|
||||||
|
@ -337,9 +339,8 @@ int parse_par_file(FILE *f_par) {
|
||||||
printf("line %i does not meet defined format (:<mtdname> <mtdsize> <file>)\n", lineno);
|
printf("line %i does not meet defined format (:<mtdname> <mtdsize> <file>)\n", lineno);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
if (strcmp(string1, "something") == 0) {
|
if (!strcmp(string1, "something")) {
|
||||||
something = string2;
|
something = strdup(string2);
|
||||||
string2 = NULL; // do not free
|
|
||||||
} else {
|
} else {
|
||||||
*/
|
*/
|
||||||
printf("unknown string variable %s in line %i\n", string1, lineno);
|
printf("unknown string variable %s in line %i\n", string1, lineno);
|
||||||
|
@ -382,7 +383,7 @@ int create_bin_file(char *bin_filename) {
|
||||||
|
|
||||||
// allocate memory for bin file
|
// allocate memory for bin file
|
||||||
buffer = malloc(KERNEL_CODE_OFFSET + FLASH_SIZE);
|
buffer = malloc(KERNEL_CODE_OFFSET + FLASH_SIZE);
|
||||||
if (buffer == NULL) {
|
if (!buffer) {
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
printf("create_bin_file: can not allocate %i bytes\n", FLASH_SIZE);
|
printf("create_bin_file: can not allocate %i bytes\n", FLASH_SIZE);
|
||||||
} else {
|
} else {
|
||||||
|
@ -415,10 +416,10 @@ int create_bin_file(char *bin_filename) {
|
||||||
printf("create_bin_file: unknown mtd %i\n", i);
|
printf("create_bin_file: unknown mtd %i\n", i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (mtd == NULL) {
|
if (!mtd) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (mtd->filename == NULL) {
|
if (!mtd->filename) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -434,7 +435,7 @@ int create_bin_file(char *bin_filename) {
|
||||||
|
|
||||||
// adding file content
|
// adding file content
|
||||||
f_in = fopen(mtd->filename, "rb");
|
f_in = fopen(mtd->filename, "rb");
|
||||||
if (f_in == NULL) {
|
if (!f_in) {
|
||||||
exitcode = errno;
|
exitcode = errno;
|
||||||
printf("input file %s: %s\n", mtd->filename, strerror(exitcode));
|
printf("input file %s: %s\n", mtd->filename, strerror(exitcode));
|
||||||
} else {
|
} else {
|
||||||
|
@ -461,7 +462,7 @@ int create_bin_file(char *bin_filename) {
|
||||||
lprintf(DEBUG, " padding offset 0x%08X length 0x%08X\n", addsize, padsize);
|
lprintf(DEBUG, " padding offset 0x%08X length 0x%08X\n", addsize, padsize);
|
||||||
|
|
||||||
f_in = fopen(rand_filename, "rb");
|
f_in = fopen(rand_filename, "rb");
|
||||||
if (f_in == NULL) {
|
if (!f_in) {
|
||||||
exitcode = errno;
|
exitcode = errno;
|
||||||
printf("input file %s: %s\n", rand_filename, strerror(exitcode));
|
printf("input file %s: %s\n", rand_filename, strerror(exitcode));
|
||||||
} else {
|
} else {
|
||||||
|
@ -514,7 +515,7 @@ int create_bin_file(char *bin_filename) {
|
||||||
if (!exitcode) {
|
if (!exitcode) {
|
||||||
lprintf(DEBUG, "writing file %s\n", bin_filename);
|
lprintf(DEBUG, "writing file %s\n", bin_filename);
|
||||||
f_out = fopen(bin_filename, "wb");
|
f_out = fopen(bin_filename, "wb");
|
||||||
if (f_out == NULL) {
|
if (!f_out) {
|
||||||
exitcode = errno;
|
exitcode = errno;
|
||||||
printf("output file %s: %s\n", bin_filename, strerror(exitcode));
|
printf("output file %s: %s\n", bin_filename, strerror(exitcode));
|
||||||
} else {
|
} else {
|
||||||
|
@ -547,18 +548,18 @@ int create_zip_file(char *zip_filename, char *bin_filename) {
|
||||||
buffer = NULL;
|
buffer = NULL;
|
||||||
do {
|
do {
|
||||||
// allocate memory for command line
|
// allocate memory for command line
|
||||||
if (buffer == NULL) {
|
if (!buffer) {
|
||||||
buffer = malloc(buffer_size);
|
buffer = malloc(buffer_size);
|
||||||
}
|
}
|
||||||
if (buffer == NULL) {
|
if (!buffer) {
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
printf("create_zip_file: can not allocate %i bytes\n", (int) buffer_size);
|
printf("create_zip_file: can not allocate %i bytes\n", (int) buffer_size);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if buffer was not completely filled, then line fit in completely
|
// if buffer was not completely filled, then line fit in completely
|
||||||
count = snprintf(buffer, buffer_size, "zip %s %s", zip_filename, bin_filename);
|
count = snprintf(buffer, buffer_size, "zip \"%s\" \"%s\"", zip_filename, bin_filename);
|
||||||
if (count > -1 && count < buffer_size) {
|
if ((count > -1) && (count < buffer_size)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -577,7 +578,7 @@ int create_zip_file(char *zip_filename, char *bin_filename) {
|
||||||
// zipping binfile
|
// zipping binfile
|
||||||
lprintf(DEBUG, "%s\n", buffer);
|
lprintf(DEBUG, "%s\n", buffer);
|
||||||
count = system(buffer);
|
count = system(buffer);
|
||||||
if (count < 0 || WEXITSTATUS(count)) {
|
if ((count < 0) || (WEXITSTATUS(count))) {
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
printf("create_zip_file: can not execute %s bytes\n", buffer);
|
printf("create_zip_file: can not execute %s bytes\n", buffer);
|
||||||
}
|
}
|
||||||
|
@ -624,7 +625,7 @@ int create_img_file(FILE *f_out, char *out_filename, char *zip_filename) {
|
||||||
if (!exitcode) {
|
if (!exitcode) {
|
||||||
lprintf(DEBUG_LVL2, " adding zip file\n");
|
lprintf(DEBUG_LVL2, " adding zip file\n");
|
||||||
f_in = fopen(zip_filename, "rb");
|
f_in = fopen(zip_filename, "rb");
|
||||||
if (f_in == NULL) {
|
if (!f_in) {
|
||||||
exitcode = errno;
|
exitcode = errno;
|
||||||
printf("input file %s: %s\n", zip_filename, strerror(exitcode));
|
printf("input file %s: %s\n", zip_filename, strerror(exitcode));
|
||||||
} else {
|
} else {
|
||||||
|
@ -696,16 +697,17 @@ int main(int argc, char *argv[]) {
|
||||||
int exitcode = 0;
|
int exitcode = 0;
|
||||||
|
|
||||||
int help;
|
int help;
|
||||||
|
int onlybin;
|
||||||
int havezip;
|
int havezip;
|
||||||
char option;
|
char option;
|
||||||
char *par_filename = NULL;
|
char *par_filename = NULL;
|
||||||
char *out_filename = NULL;
|
char *img_filename = NULL;
|
||||||
char *base_filename = NULL;
|
char *base_filename = NULL;
|
||||||
char *bin_filename = NULL;
|
char *bin_filename = NULL;
|
||||||
char *zip_filename = NULL;
|
char *zip_filename = NULL;
|
||||||
|
|
||||||
FILE *f_par;
|
FILE *f_par = NULL;
|
||||||
FILE *f_out;
|
FILE *f_img = NULL;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
mtd_info *mtd;
|
mtd_info *mtd;
|
||||||
|
@ -722,19 +724,23 @@ int main(int argc, char *argv[]) {
|
||||||
// command line processing
|
// command line processing
|
||||||
// options
|
// options
|
||||||
help = 0;
|
help = 0;
|
||||||
|
onlybin = 0;
|
||||||
havezip = 0;
|
havezip = 0;
|
||||||
while ((option = getopt(argc, argv, ":hzf:v")) != -1) {
|
while ((option = getopt(argc, argv, ":hbzf:v")) != -1) {
|
||||||
switch(option) {
|
switch(option) {
|
||||||
case 'h':
|
case 'h':
|
||||||
help = 1;
|
help = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'b':
|
||||||
|
onlybin = 1;
|
||||||
|
break;
|
||||||
case 'z':
|
case 'z':
|
||||||
havezip = 1;
|
havezip = 1;
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
sizecheck = sscanf(optarg, "%i", &i);
|
sizecheck = sscanf(optarg, "%i", &i);
|
||||||
if (sizecheck != 1) {
|
if (sizecheck != 1) {
|
||||||
printf("firmware version of -f option not a valid integer\n");
|
printf("Firmware version of -f option not a valid integer\n");
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
} else {
|
} else {
|
||||||
fw_version[0] = 0x000000FF & ( i >> 8 );
|
fw_version[0] = 0x000000FF & ( i >> 8 );
|
||||||
|
@ -757,7 +763,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
// files
|
// files
|
||||||
for ( ; optind < argc; optind++) {
|
for ( ; optind < argc; optind++) {
|
||||||
if (par_filename == NULL) {
|
if (!par_filename) {
|
||||||
par_filename = argv[optind];
|
par_filename = argv[optind];
|
||||||
|
|
||||||
if (access(par_filename, R_OK)) {
|
if (access(par_filename, R_OK)) {
|
||||||
|
@ -772,12 +778,12 @@ int main(int argc, char *argv[]) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out_filename == NULL) {
|
if ((!onlybin) && (!img_filename)) {
|
||||||
out_filename = argv[optind];
|
img_filename = argv[optind];
|
||||||
|
|
||||||
if (!access(out_filename, F_OK)) { // if file already exists then check write access
|
if (!access(img_filename, F_OK)) { // if file already exists then check write access
|
||||||
if (access(out_filename, W_OK)) {
|
if (access(img_filename, W_OK)) {
|
||||||
printf("No write access to output file %s\n", out_filename);
|
printf("No write access to image file %s\n", img_filename);
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -791,7 +797,7 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// file name checks
|
// file name checks
|
||||||
if (par_filename == NULL) {
|
if (!par_filename) {
|
||||||
if (havezip) {
|
if (havezip) {
|
||||||
printf("Zip file not stated\n");
|
printf("Zip file not stated\n");
|
||||||
} else {
|
} else {
|
||||||
|
@ -800,7 +806,7 @@ int main(int argc, char *argv[]) {
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
} else {
|
} else {
|
||||||
base_filename = basename(par_filename);
|
base_filename = basename(par_filename);
|
||||||
if (base_filename == NULL) {
|
if (!base_filename) {
|
||||||
if (havezip) {
|
if (havezip) {
|
||||||
printf("Zip file is a directory\n");
|
printf("Zip file is a directory\n");
|
||||||
} else {
|
} else {
|
||||||
|
@ -810,33 +816,35 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (out_filename == NULL) {
|
if (!onlybin) {
|
||||||
printf("Output file not stated\n");
|
if (!img_filename) {
|
||||||
|
printf("Image file not stated\n");
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
} else {
|
} else {
|
||||||
base_filename = basename(out_filename);
|
base_filename = basename(img_filename);
|
||||||
if (base_filename == NULL) {
|
if (!base_filename) {
|
||||||
printf("Output file is a directory\n");
|
printf("Image file is a directory\n");
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
} else {
|
|
||||||
base_filename = strdup(base_filename);
|
|
||||||
zip_filename = strrchr(base_filename, '.');
|
|
||||||
if (zip_filename != NULL) {
|
|
||||||
zip_filename[0] = 0;
|
|
||||||
zip_filename = NULL; // clean up
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// react on parameter problems or help request, and exit
|
// check for mutually exclusive options
|
||||||
if ((exitcode != 0) || help) {
|
if ((onlybin) && (havezip)) {
|
||||||
|
printf("Option -b and -z are mutually exclusive\n");
|
||||||
|
exitcode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// react on option problems or help request, then exit
|
||||||
|
if ((exitcode) || (help)) {
|
||||||
if (help) {
|
if (help) {
|
||||||
printf("This program creates Linksys style images for the WRT350Nv2 router.\n");
|
printf("This program creates Linksys style images for the WRT350Nv2 router.\n");
|
||||||
}
|
}
|
||||||
printf(" Usage:\n\
|
printf(" Usage:\n\
|
||||||
%s [-h] [-z] [-f <version>] [-v] <parameter or zip file> <output file>\n\n\
|
%s [-h] [-b] [-z] [-f <version>] [-v] <parameter or zip file> [<image file>]\n\n\
|
||||||
Options:\n\
|
Options:\n\
|
||||||
-h - Show this help\n\
|
-h - Show this help\n\
|
||||||
|
-b - Create only bin file, no img or zip file is created\n\
|
||||||
-z - Have zip file, the img file will be directly created from it\n\
|
-z - Have zip file, the img file will be directly created from it\n\
|
||||||
-f <version> - Wanted firmware version to use with -z\n\
|
-f <version> - Wanted firmware version to use with -z\n\
|
||||||
Default firmware version is 0x2019 = 2.00.19.\n\
|
Default firmware version is 0x2019 = 2.00.19.\n\
|
||||||
|
@ -853,29 +861,37 @@ int main(int argc, char *argv[]) {
|
||||||
par_filename = NULL;
|
par_filename = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
lprintf(DEBUG_LVL2, " verbosity: %i\n", verbosity);
|
lprintf(DEBUG_LVL2, " Verbosity: %i\n", verbosity);
|
||||||
lprintf(DEBUG_LVL2, " program: %s\n", argv[0]);
|
lprintf(DEBUG_LVL2, " Program: %s\n", argv[0]);
|
||||||
|
|
||||||
|
if (par_filename) {
|
||||||
lprintf(DEBUG, "Parameter file: %s\n", par_filename);
|
lprintf(DEBUG, "Parameter file: %s\n", par_filename);
|
||||||
lprintf(DEBUG, "Output file: %s\n", out_filename);
|
}
|
||||||
lprintf(DEBUG_LVL2, " basename: %s (%i)\n", base_filename, strlen(base_filename));
|
if (zip_filename) {
|
||||||
|
lprintf(DEBUG, "Zip file: %s\n", zip_filename);
|
||||||
|
}
|
||||||
|
if (img_filename) {
|
||||||
|
lprintf(DEBUG, "Image file: %s\n", img_filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// open files from command line
|
// open files from command line
|
||||||
// parameter file
|
// parameter/zip file
|
||||||
if (par_filename != NULL) {
|
if (par_filename) {
|
||||||
f_par = fopen(par_filename, "r");
|
f_par = fopen(par_filename, "rt");
|
||||||
if (f_par == NULL) {
|
if (!f_par) {
|
||||||
exitcode = errno;
|
exitcode = errno;
|
||||||
printf("input file %s: %s\n", par_filename, strerror(exitcode));
|
printf("Input file %s: %s\n", par_filename, strerror(exitcode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// output file
|
// image file
|
||||||
f_out = fopen(out_filename, "w");
|
if (img_filename) {
|
||||||
if (f_out == NULL) {
|
f_img = fopen(img_filename, "wb");
|
||||||
|
if (!f_img) {
|
||||||
exitcode = errno;
|
exitcode = errno;
|
||||||
printf("Output file %s: %s\n", out_filename, strerror(exitcode));
|
printf("Output file %s: %s\n", img_filename, strerror(exitcode));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exitcode) {
|
if (exitcode) {
|
||||||
|
@ -884,20 +900,20 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
|
||||||
// parameter file processing
|
// parameter file processing
|
||||||
if (!exitcode && par_filename != NULL) {
|
if ((!exitcode) && (f_par)) {
|
||||||
lprintf(DEBUG, "parsing parameter file...\n");
|
lprintf(DEBUG, "parsing parameter file...\n");
|
||||||
|
|
||||||
exitcode = parse_par_file(f_par);
|
exitcode = parse_par_file(f_par);
|
||||||
|
|
||||||
lprintf(DEBUG, "...done parsing file\n");
|
lprintf(DEBUG, "...done parsing file\n");
|
||||||
}
|
}
|
||||||
if (par_filename != NULL) {
|
if (f_par) {
|
||||||
fclose(f_par);
|
fclose(f_par);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// check all input data
|
// check all input data
|
||||||
if (!exitcode && par_filename != NULL) {
|
if ((!exitcode) && (par_filename)) {
|
||||||
lprintf(DEBUG, "checking mtd data...\n");
|
lprintf(DEBUG, "checking mtd data...\n");
|
||||||
|
|
||||||
for (i = 1; i <= 3; i++) {
|
for (i = 1; i <= 3; i++) {
|
||||||
|
@ -936,20 +952,20 @@ int main(int argc, char *argv[]) {
|
||||||
printf("unknown mtd check %i\n", i);
|
printf("unknown mtd check %i\n", i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (mtd == NULL) {
|
if (!mtd) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
lprintf(DEBUG_LVL2, " checking mtd %s\n", mtd->name);
|
lprintf(DEBUG_LVL2, " checking mtd %s\n", mtd->name);
|
||||||
|
|
||||||
// general checks
|
// general checks
|
||||||
if (mandatory && mtd->filename == NULL) {
|
if ((mandatory) && (!mtd->filename)) {
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
printf("mtd %s not specified correctly or at all in parameter file\n", mtd->name);
|
printf("mtd %s not specified correctly or at all in parameter file\n", mtd->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// end checks if no file data present
|
// end checks if no file data present
|
||||||
if (mtd->filename == NULL) {
|
if (!mtd->filename) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -960,7 +976,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
// general magic number check
|
// general magic number check
|
||||||
if (magic[0]) {
|
if (magic[0]) {
|
||||||
if (mtd->magic[0] != magic[0] || mtd->magic[1] != magic[1]) {
|
if ((mtd->magic[0] != magic[0]) || (mtd->magic[1] != magic[1])) {
|
||||||
exitcode = 1;
|
exitcode = 1;
|
||||||
printf("mtd %s input file %s has wrong magic number (0x%02X%02X)\n", mtd->name, mtd->filename, mtd->magic[0], mtd->magic[1]);
|
printf("mtd %s input file %s has wrong magic number (0x%02X%02X)\n", mtd->name, mtd->filename, mtd->magic[0], mtd->magic[1]);
|
||||||
}
|
}
|
||||||
|
@ -992,10 +1008,8 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
|
||||||
// bin creation in memory
|
// bin creation in memory
|
||||||
if (!exitcode && par_filename != NULL) {
|
if ((!exitcode) && (par_filename)) {
|
||||||
// create bin name from basename
|
bin_filename = "wrt350n.bin";
|
||||||
bin_filename = malloc(strlen(base_filename)+10);
|
|
||||||
sprintf(bin_filename, "%s.bin", base_filename);
|
|
||||||
|
|
||||||
lprintf(DEBUG, "creating bin file %s...\n", bin_filename);
|
lprintf(DEBUG, "creating bin file %s...\n", bin_filename);
|
||||||
|
|
||||||
|
@ -1004,12 +1018,9 @@ int main(int argc, char *argv[]) {
|
||||||
lprintf(DEBUG, "...done creating bin file\n");
|
lprintf(DEBUG, "...done creating bin file\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// zip file creation
|
// zip file creation
|
||||||
if (!exitcode && zip_filename == NULL) {
|
if ((!exitcode) && (!onlybin) && (!zip_filename)) {
|
||||||
// create zip name from basename
|
zip_filename = "wrt350n.zip";
|
||||||
zip_filename = malloc(strlen(base_filename)+10);
|
|
||||||
sprintf(zip_filename, "%s.zip", base_filename);
|
|
||||||
|
|
||||||
lprintf(DEBUG, "creating zip file %s...\n", zip_filename);
|
lprintf(DEBUG, "creating zip file %s...\n", zip_filename);
|
||||||
|
|
||||||
|
@ -1020,15 +1031,18 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
|
||||||
// img file creation
|
// img file creation
|
||||||
if (!exitcode) {
|
if ((!exitcode) && (f_img)) {
|
||||||
lprintf(DEBUG, "creating img file...\n");
|
lprintf(DEBUG, "creating img file...\n");
|
||||||
|
|
||||||
exitcode = create_img_file(f_out, out_filename, zip_filename);
|
exitcode = create_img_file(f_img, img_filename, zip_filename);
|
||||||
|
|
||||||
lprintf(DEBUG, "...done creating img file\n");
|
lprintf(DEBUG, "...done creating img file\n");
|
||||||
}
|
}
|
||||||
fclose(f_out);
|
|
||||||
|
|
||||||
|
// clean up
|
||||||
|
if (f_img) {
|
||||||
|
fclose(f_img);
|
||||||
|
}
|
||||||
|
|
||||||
// end program
|
// end program
|
||||||
return exitcode;
|
return exitcode;
|
||||||
|
|
Loading…
Reference in New Issue