@ -71,7 +71,7 @@ struct fw_region {
/*
/*
* Globals
* Globals
*/
*/
static char * ofname ;
char * ofname ;
char * progname ;
char * progname ;
static char * vendor = " TP-LINK Technologies " ;
static char * vendor = " TP-LINK Technologies " ;
static char * version = " ver. 1.0 " ;
static char * version = " ver. 1.0 " ;
@ -79,7 +79,7 @@ static char *fw_ver = "0.0.0";
static uint32_t hdr_ver = HEADER_VERSION_V1 ;
static uint32_t hdr_ver = HEADER_VERSION_V1 ;
static char * layout_id ;
static char * layout_id ;
static st ruct flash_layout * layout ;
struct flash_layout * layout ;
static char * opt_hw_id ;
static char * opt_hw_id ;
static uint32_t hw_id ;
static uint32_t hw_id ;
static char * opt_hw_rev ;
static char * opt_hw_rev ;
@ -90,17 +90,17 @@ static const struct fw_region *region;
static int fw_ver_lo ;
static int fw_ver_lo ;
static int fw_ver_mid ;
static int fw_ver_mid ;
static int fw_ver_hi ;
static int fw_ver_hi ;
static st ruct file_info kernel_info ;
struct file_info kernel_info ;
static uint32_t kernel_la = 0 ;
static uint32_t kernel_la = 0 ;
static uint32_t kernel_ep = 0 ;
static uint32_t kernel_ep = 0 ;
static uint32_t kernel_len = 0 ;
uint32_t kernel_len = 0 ;
static st ruct file_info rootfs_info ;
struct file_info rootfs_info ;
static uint32_t rootfs_ofs = 0 ;
uint32_t rootfs_ofs = 0 ;
static uint32_t rootfs_align ;
uint32_t rootfs_align ;
static struct file_info boot_info ;
static struct file_info boot_info ;
static int combined ;
int combined ;
static int strip_padding ;
int strip_padding ;
static int add_jffs2_eof ;
int add_jffs2_eof ;
static uint32_t fw_max_len ;
static uint32_t fw_max_len ;
static uint32_t reserved_space ;
static uint32_t reserved_space ;
@ -355,7 +355,7 @@ static int check_options(void)
return 0 ;
return 0 ;
}
}
static void fill_header ( char * buf , int len )
void fill_header ( char * buf , int len )
{
{
struct fw_header * hdr = ( struct fw_header * ) buf ;
struct fw_header * hdr = ( struct fw_header * ) buf ;
@ -408,69 +408,6 @@ static void fill_header(char *buf, int len)
get_md5 ( buf , len , hdr - > md5sum1 ) ;
get_md5 ( buf , len , hdr - > md5sum1 ) ;
}
}
static int build_fw ( void )
{
int buflen ;
char * buf ;
char * p ;
int ret = EXIT_FAILURE ;
int writelen = 0 ;
writelen = sizeof ( struct fw_header ) + kernel_len ;
if ( combined )
buflen = writelen ;
else
buflen = layout - > fw_max_len ;
buf = malloc ( buflen ) ;
if ( ! buf ) {
ERR ( " no memory for buffer \n " ) ;
goto out ;
}
memset ( buf , 0xff , buflen ) ;
p = buf + sizeof ( struct fw_header ) ;
ret = read_to_buf ( & kernel_info , p ) ;
if ( ret )
goto out_free_buf ;
if ( ! combined ) {
if ( rootfs_align )
p = buf + writelen ;
else
p = buf + rootfs_ofs ;
ret = read_to_buf ( & rootfs_info , p ) ;
if ( ret )
goto out_free_buf ;
if ( rootfs_align )
writelen + = rootfs_info . file_size ;
else
writelen = rootfs_ofs + rootfs_info . file_size ;
if ( add_jffs2_eof )
writelen = pad_jffs2 ( buf , writelen , layout - > fw_max_len ) ;
}
if ( ! strip_padding )
writelen = buflen ;
fill_header ( buf , writelen ) ;
ret = write_fw ( ofname , buf , writelen ) ;
if ( ret )
goto out_free_buf ;
ret = EXIT_SUCCESS ;
out_free_buf :
free ( buf ) ;
out :
return ret ;
}
static int inspect_fw ( void )
static int inspect_fw ( void )
{
{
char * buf ;
char * buf ;
@ -686,7 +623,7 @@ int main(int argc, char *argv[])
goto out ;
goto out ;
if ( ! inspect_info . file_name )
if ( ! inspect_info . file_name )
ret = build_fw ( ) ;
ret = build_fw ( sizeof ( struct fw_header ) ) ;
else
else
ret = inspect_fw ( ) ;
ret = inspect_fw ( ) ;