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: 19596
This commit is contained in:
Travis Kemen 2010-02-12 01:40:57 +00:00
parent 9e5844fda2
commit cb9c37af38
3 changed files with 130 additions and 104 deletions

View file

@ -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

View file

@ -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))

View file

@ -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) {
exitcode = 1; printf("Image file not stated\n");
} else {
base_filename = basename(out_filename);
if (base_filename == NULL) {
printf("Output file is a directory\n");
exitcode = 1; exitcode = 1;
} else { } else {
base_filename = strdup(base_filename); base_filename = basename(img_filename);
zip_filename = strrchr(base_filename, '.'); if (!base_filename) {
if (zip_filename != NULL) { printf("Image file is a directory\n");
zip_filename[0] = 0; exitcode = 1;
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]);
lprintf(DEBUG, "Parameter file: %s\n", par_filename); if (par_filename) {
lprintf(DEBUG, "Output file: %s\n", out_filename); lprintf(DEBUG, "Parameter file: %s\n", par_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");
exitcode = errno; if (!f_img) {
printf("Output file %s: %s\n", out_filename, strerror(exitcode)); exitcode = errno;
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;