X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fhelper%2Ffileio.c;h=2664bfa1160dd5be688384f382537a07af35f0b9;hb=0dcfa4d26a365279edc51bdda4c8c99d077f6c02;hp=c6f45e6ba78bb23d8dec0bcdb00abe2b5ee4ed15;hpb=517ba0690dcc9e859a05df2113ce32401a5ab254;p=openocd.git diff --git a/src/helper/fileio.c b/src/helper/fileio.c index c6f45e6ba7..2664bfa116 100644 --- a/src/helper/fileio.c +++ b/src/helper/fileio.c @@ -34,7 +34,7 @@ struct fileio_internal { char *url; - ssize_t size; + size_t size; enum fileio_type type; enum fileio_access access; FILE *file; @@ -44,6 +44,7 @@ static inline int fileio_close_local(struct fileio_internal *fileio); static inline int fileio_open_local(struct fileio_internal *fileio) { char file_access[4]; + ssize_t file_size; switch (fileio->access) { case FILEIO_READ: @@ -78,6 +79,8 @@ static inline int fileio_open_local(struct fileio_internal *fileio) return ERROR_FILEIO_OPERATION_FAILED; } + file_size = 0; + if ((fileio->access != FILEIO_WRITE) || (fileio->access == FILEIO_READWRITE)) { /* NB! Here we use fseek() instead of stat(), since stat is a * more advanced operation that might not apply to e.g. a disk path @@ -86,16 +89,17 @@ static inline int fileio_open_local(struct fileio_internal *fileio) result = fseek(fileio->file, 0, SEEK_END); - fileio->size = ftell(fileio->file); + file_size = ftell(fileio->file); result2 = fseek(fileio->file, 0, SEEK_SET); - if ((fileio->size < 0) || (result < 0) || (result2 < 0)) { + if ((file_size < 0) || (result < 0) || (result2 < 0)) { fileio_close_local(fileio); return ERROR_FILEIO_OPERATION_FAILED; } - } else - fileio->size = 0x0; + } + + fileio->size = file_size; return ERROR_OK; } @@ -105,10 +109,10 @@ int fileio_open(struct fileio *fileio_p, enum fileio_access access_type, enum fileio_type type) { - int retval = ERROR_OK; + int retval; + struct fileio_internal *fileio; - struct fileio_internal *fileio = malloc(sizeof(struct fileio_internal)); - fileio_p->fp = fileio; + fileio = malloc(sizeof(struct fileio_internal)); fileio->type = type; fileio->access = access_type; @@ -116,7 +120,15 @@ int fileio_open(struct fileio *fileio_p, retval = fileio_open_local(fileio); - return retval; + if (retval != ERROR_OK) { + free(fileio->url); + free(fileio); + return retval; + } + + fileio_p->fp = fileio; + + return ERROR_OK; } static inline int fileio_close_local(struct fileio_internal *fileio) @@ -245,9 +257,10 @@ int fileio_write_u32(struct fileio *fileio_p, uint32_t data) * Avoiding the seek on startup opens up for using streams. * */ -int fileio_size(struct fileio *fileio_p, int *size) +int fileio_size(struct fileio *fileio_p, size_t *size) { struct fileio_internal *fileio = fileio_p->fp; *size = fileio->size; + return ERROR_OK; }