From 3931b99d142d337ea6558fd09aad2e0812c04507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Wed, 29 Sep 2010 09:11:01 +0200 Subject: fileio: fileio_size() can now fail MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part of making the fileio API more robust. Signed-off-by: Øyvind Harboe --- src/flash/mflash.c | 14 ++++++++++---- src/flash/nand/fileio.c | 8 +++++++- src/flash/nand/tcl.c | 9 +++++++-- src/flash/nor/tcl.c | 22 ++++++++++++++++++---- src/helper/fileio.c | 14 ++++++++++++-- src/helper/fileio.h | 2 +- src/target/etm.c | 10 +++++++++- src/target/image.c | 25 ++++++++++++++++++++++--- src/target/target.c | 8 ++++++-- 9 files changed, 92 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/flash/mflash.c b/src/flash/mflash.c index 272127b..ba34422 100644 --- a/src/flash/mflash.c +++ b/src/flash/mflash.c @@ -720,14 +720,20 @@ COMMAND_HANDLER(mg_write_cmd) if (ret != ERROR_OK) return ret; + int filesize; buffer = malloc(MG_FILEIO_CHUNK); if (!buffer) { fileio_close(&fileio); return ERROR_FAIL; } + int retval = fileio_size(&fileio, &filesize); + if (retval != ERROR_OK) { + fileio_close(&fileio); + return retval; + } - cnt = fileio_size(&fileio) / MG_FILEIO_CHUNK; - res = fileio_size(&fileio) % MG_FILEIO_CHUNK; + cnt = filesize / MG_FILEIO_CHUNK; + res = filesize % MG_FILEIO_CHUNK; struct duration bench; duration_start(&bench); @@ -752,8 +758,8 @@ COMMAND_HANDLER(mg_write_cmd) if (duration_measure(&bench) == ERROR_OK) { command_print(CMD_CTX, "wrote %ld bytes from file %s " - "in %fs (%0.3f kB/s)", (long)fileio_size(&fileio), CMD_ARGV[1], - duration_elapsed(&bench), duration_kbps(&bench, fileio_size(&fileio))); + "in %fs (%0.3f kB/s)", (long)filesize, CMD_ARGV[1], + duration_elapsed(&bench), duration_kbps(&bench, filesize)); } free(buffer); diff --git a/src/flash/nand/fileio.c b/src/flash/nand/fileio.c index 0a006fc..c7515e2 100644 --- a/src/flash/nand/fileio.c +++ b/src/flash/nand/fileio.c @@ -180,7 +180,13 @@ COMMAND_HELPER(nand_fileio_parse_args, struct nand_fileio_state *state, return retval; if (!need_size) - state->size = fileio_size(&state->fileio); + { + int filesize; + retval = fileio_size(&state->fileio, &filesize); + if (retval != ERROR_OK) + return retval; + state->size = filesize; + } *dev = nand; diff --git a/src/flash/nand/tcl.c b/src/flash/nand/tcl.c index a54f8ea..15cf179 100644 --- a/src/flash/nand/tcl.c +++ b/src/flash/nand/tcl.c @@ -388,9 +388,14 @@ COMMAND_HANDLER(handle_nand_dump_command) if (nand_fileio_finish(&s) == ERROR_OK) { + int filesize; + retval = fileio_size(&s.fileio, &filesize); + if (retval != ERROR_OK) + return retval; + command_print(CMD_CTX, "dumped %ld bytes in %fs (%0.3f KiB/s)", - (long)fileio_size(&s.fileio), duration_elapsed(&s.bench), - duration_kbps(&s.bench, fileio_size(&s.fileio))); + (long)filesize, duration_elapsed(&s.bench), + duration_kbps(&s.bench, filesize)); } return ERROR_OK; } diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c index f36ab7d..142f31f 100644 --- a/src/flash/nor/tcl.c +++ b/src/flash/nor/tcl.c @@ -604,9 +604,23 @@ COMMAND_HANDLER(handle_flash_write_bank_command) return ERROR_OK; } - buffer = malloc(fileio_size(&fileio)); + int filesize; + retval = fileio_size(&fileio, &filesize); + if (retval != ERROR_OK) + { + fileio_close(&fileio); + return retval; + } + + buffer = malloc(filesize); + if (buffer == NULL) + { + fileio_close(&fileio); + LOG_ERROR("Out of memory"); + return ERROR_FAIL; + } size_t buf_cnt; - if (fileio_read(&fileio, fileio_size(&fileio), buffer, &buf_cnt) != ERROR_OK) + if (fileio_read(&fileio, filesize, buffer, &buf_cnt) != ERROR_OK) { free(buffer); fileio_close(&fileio); @@ -622,8 +636,8 @@ COMMAND_HANDLER(handle_flash_write_bank_command) { command_print(CMD_CTX, "wrote %ld bytes from file %s to flash bank %u" " at offset 0x%8.8" PRIx32 " in %fs (%0.3f KiB/s)", - (long)fileio_size(&fileio), CMD_ARGV[1], p->bank_number, offset, - duration_elapsed(&bench), duration_kbps(&bench, fileio_size(&fileio))); + (long)filesize, CMD_ARGV[1], p->bank_number, offset, + duration_elapsed(&bench), duration_kbps(&bench, filesize)); } fileio_close(&fileio); diff --git a/src/helper/fileio.c b/src/helper/fileio.c index 7c862e4..9ae0134 100644 --- a/src/helper/fileio.c +++ b/src/helper/fileio.c @@ -245,8 +245,18 @@ int fileio_write_u32(struct fileio *fileio_p, uint32_t data) return retval; } -int fileio_size(struct fileio *fileio_p) +/** + * FIX!!!! + * + * For now this can not fail, but that's because a seek was executed + * on startup. + * + * Avoiding the seek on startup opens up for using streams. + * + */ +int fileio_size(struct fileio *fileio_p, int *size) { struct fileio_internal *fileio = fileio_p->fp; - return fileio->size; + *size = fileio->size; + return ERROR_OK; } diff --git a/src/helper/fileio.h b/src/helper/fileio.h index 40c4ef0..fa499ab 100644 --- a/src/helper/fileio.h +++ b/src/helper/fileio.h @@ -66,7 +66,7 @@ int fileio_write(struct fileio *fileio, int fileio_read_u32(struct fileio *fileio, uint32_t *data); int fileio_write_u32(struct fileio *fileio, uint32_t data); -int fileio_size(struct fileio *fileio); +int fileio_size(struct fileio *fileio, int *size); #define ERROR_FILEIO_LOCATION_UNKNOWN (-1200) #define ERROR_FILEIO_NOT_FOUND (-1201) diff --git a/src/target/etm.c b/src/target/etm.c index c71c5d1..9f7bc83 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -1897,7 +1897,15 @@ COMMAND_HANDLER(handle_etm_load_command) return ERROR_FAIL; } - if (fileio_size(&file) % 4) + int filesize; + int retval = fileio_size(&file, &filesize); + if (retval != ERROR_OK) + { + fileio_close(&file); + return retval; + } + + if (filesize % 4) { command_print(CMD_CTX, "size isn't a multiple of 4, no valid trace data"); fileio_close(&file); diff --git a/src/target/image.c b/src/target/image.c index e77e190..b0d957f 100644 --- a/src/target/image.c +++ b/src/target/image.c @@ -158,7 +158,13 @@ static int image_ihex_buffer_complete_inner(struct image *image, char *lpszLine, /* we can't determine the number of sections that we'll have to create ahead of time, * so we locally hold them until parsing is finished */ - ihex->buffer = malloc(fileio_size(fileio) >> 1); + int filesize; + int retval; + retval = fileio_size(fileio, &filesize); + if (retval != ERROR_OK) + return retval; + + ihex->buffer = malloc(filesize >> 1); cooked_bytes = 0x0; image->num_sections = 0; section[image->num_sections].private = &ihex->buffer[cooked_bytes]; @@ -537,7 +543,13 @@ static int image_mot_buffer_complete_inner(struct image *image, char *lpszLine, /* we can't determine the number of sections that we'll have to create ahead of time, * so we locally hold them until parsing is finished */ - mot->buffer = malloc(fileio_size(fileio) >> 1); + int retval; + int filesize; + retval = fileio_size(fileio, &filesize); + if (retval != ERROR_OK) + return retval; + + mot->buffer = malloc(filesize >> 1); cooked_bytes = 0x0; image->num_sections = 0; section[image->num_sections].private = &mot->buffer[cooked_bytes]; @@ -743,11 +755,18 @@ int image_open(struct image *image, const char *url, const char *type_string) { return retval; } + int filesize; + retval = fileio_size(&image_binary->fileio, &filesize); + if (retval != ERROR_OK) + { + fileio_close(&image_binary->fileio); + return retval; + } image->num_sections = 1; image->sections = malloc(sizeof(struct imagesection)); image->sections[0].base_address = 0x0; - image->sections[0].size = fileio_size(&image_binary->fileio); + image->sections[0].size = filesize; image->sections[0].flags = 0; } else if (image->type == IMAGE_IHEX) diff --git a/src/target/target.c b/src/target/target.c index fcdcc36..82cbbff 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -2648,9 +2648,13 @@ COMMAND_HANDLER(handle_dump_image_command) if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { + int filesize; + retval = fileio_size(&fileio, &filesize); + if (retval != ERROR_OK) + return retval; command_print(CMD_CTX, - "dumped %ld bytes in %fs (%0.3f KiB/s)", (long)fileio_size(&fileio), - duration_elapsed(&bench), duration_kbps(&bench, fileio_size(&fileio))); + "dumped %ld bytes in %fs (%0.3f KiB/s)", (long)filesize, + duration_elapsed(&bench), duration_kbps(&bench, filesize)); } return retval; -- cgit v1.1