otrx: avoid unneeded fseek() when calculating CRC32
[project/firmware-utils.git] / src / mkmylofw.c
index 3ad743420f831abf770cb9f0f0c1ef9fc5c9aee1..fd79f1ca83d3a87157fe313750e25847134c3c0d 100644 (file)
@@ -1,21 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  *  Copyright (C) 2006-2008 Gabor Juhos <juhosg@openwrt.org>
- *
- *  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 the Free Software Foundation; either version 2
- *  of the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the
- *  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- *  Boston, MA  02110-1301, USA.
- *
  */
 
 #include <stdio.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <endian.h>     /* for __BYTE_ORDER */
-
-#if defined(__CYGWIN__)
-#  include <byteswap.h>
-#endif
+#include <byteswap.h>
 
 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
 #  define HOST_TO_LE16(x)      (x)
@@ -98,7 +80,7 @@ struct cpx_board {
 #define CPX_BOARD_AR23XX(_did, _flash, _mod, _name, _desc) \
        CPX_BOARD(_did, _flash, _mod, _name, _desc, 0x10000, 0x10000)
 
-#define ALIGN(x,y)     ((x)+((y)-1)) & ~((y)-1)
+#define ALIGN(x,y)     (((x)+((y)-1)) & ~((y)-1))
 
 char   *progname;
 char   *ofname = NULL;
@@ -478,18 +460,20 @@ process_partitions(void)
  * routines to write data to the output file
  */
 int
-write_out_data(FILE *outfile, uint8_t *data, size_t len, uint32_t *crc)
+write_out_data(FILE *outfile, void *data, size_t len, uint32_t *crc)
 {
+       uint8_t *ptr = data;
+
        errno = 0;
 
-       fwrite(data, len, 1, outfile);
+       fwrite(ptr, len, 1, outfile);
        if (errno) {
                errmsg(1,"unable to write output file");
                return -1;
        }
 
        if (crc) {
-               update_crc(data, len, crc);
+               update_crc(ptr, len, crc);
        }
 
        return 0;
@@ -581,7 +565,7 @@ write_out_file(FILE *outfile, struct fw_block *block, uint32_t *crc)
        fclose(f);
 
        /* align next block on a 4 byte boundary */
-       len = ALIGN(len,4) - block->size;
+       len = block->size % 4;
        if (write_out_padding(outfile, len, 0xFF, crc))
                return -1;