#include "fileio.h"
struct fileio_internal {
- const char *url;
- ssize_t size;
+ char *url;
+ size_t size;
enum fileio_type type;
enum fileio_access access;
FILE *file;
static inline int fileio_open_local(struct fileio_internal *fileio)
{
char file_access[4];
+ ssize_t file_size;
switch (fileio->access) {
case FILEIO_READ:
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
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;
}
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;
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)
retval = fileio_close_local(fileio);
- free((void *)fileio->url);
+ free(fileio->url);
fileio->url = NULL;
free(fileio);
* 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;
}