util: replace fseek/ftell/rewind with fstat
It's a more direct approach to get the file size. Change-Id: If49df26bf4996bd556c675f3a673d0003b4adf89 Signed-off-by: Patrick Georgi <patrick@georgi-clan.de> Reviewed-on: http://review.coreboot.org/6594 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
parent
77b182a31a
commit
32eeff4b6e
|
@ -11,6 +11,9 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
/* boot head definition from sun4i boot code */
|
/* boot head definition from sun4i boot code */
|
||||||
|
@ -108,12 +111,11 @@ static void fill_header(struct boot_file_head *hdr, size_t load_size)
|
||||||
|
|
||||||
static long int fsize(FILE *file)
|
static long int fsize(FILE *file)
|
||||||
{
|
{
|
||||||
long int size;
|
struct stat s;
|
||||||
|
int fd = fileno(file);
|
||||||
fseek(file, 0L, SEEK_END);
|
if (fd == -1) return -1;
|
||||||
size = ftell(file);
|
if (fstat(fd, &s) == -1) return -1;
|
||||||
fseek(file, 0L, SEEK_SET);
|
return s.st_size;
|
||||||
return size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
@ -145,6 +147,10 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
/* Get input file size */
|
/* Get input file size */
|
||||||
file_size = fsize(fd_in);
|
file_size = fsize(fd_in);
|
||||||
|
if (file_size == -1) {
|
||||||
|
fprintf(stderr, "can't determine file size\n");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
if ((file_data = malloc(file_size)) == NULL) {
|
if ((file_data = malloc(file_size)) == NULL) {
|
||||||
fprintf(stderr, "Cannot allocate memory\n");
|
fprintf(stderr, "Cannot allocate memory\n");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
|
@ -22,6 +22,9 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "cbfs.h"
|
#include "cbfs.h"
|
||||||
|
@ -40,6 +43,14 @@ int is_big_endian(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static off_t get_file_size(FILE *f)
|
||||||
|
{
|
||||||
|
struct stat s;
|
||||||
|
int fd = fileno(f);
|
||||||
|
if (fd == -1) return -1;
|
||||||
|
if (fstat(fd, &s) == -1) return -1;
|
||||||
|
return s.st_size;
|
||||||
|
}
|
||||||
/* Buffer and file I/O */
|
/* Buffer and file I/O */
|
||||||
|
|
||||||
int buffer_create(struct buffer *buffer, size_t size, const char *name) {
|
int buffer_create(struct buffer *buffer, size_t size, const char *name) {
|
||||||
|
@ -59,10 +70,13 @@ int buffer_from_file(struct buffer *buffer, const char *filename) {
|
||||||
perror(filename);
|
perror(filename);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fseek(fp, 0, SEEK_END);
|
buffer->size = get_file_size(fp);
|
||||||
buffer->size = ftell(fp);
|
if (buffer->size == -1) {
|
||||||
|
fprintf(stderr, "could not determine size of %s\n", filename);
|
||||||
|
fclose(fp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
buffer->name = strdup(filename);
|
buffer->name = strdup(filename);
|
||||||
rewind(fp);
|
|
||||||
buffer->data = (char *)malloc(buffer->size);
|
buffer->data = (char *)malloc(buffer->size);
|
||||||
assert(buffer->data);
|
assert(buffer->data);
|
||||||
if (fread(buffer->data, 1, buffer->size, fp) != buffer->size) {
|
if (fread(buffer->data, 1, buffer->size, fp) != buffer->size) {
|
||||||
|
|
|
@ -223,6 +223,14 @@ static int exists(const char *dirname, const char *filename)
|
||||||
return does_exist;
|
return does_exist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static off_t get_file_size(FILE *f)
|
||||||
|
{
|
||||||
|
struct stat s;
|
||||||
|
int fd = fileno(f);
|
||||||
|
if (fd == -1) return -1;
|
||||||
|
if (fstat(fd, &s) == -1) return -1;
|
||||||
|
return s.st_size;
|
||||||
|
}
|
||||||
|
|
||||||
static char *slurp_file(const char *dirname, const char *filename, off_t *r_size)
|
static char *slurp_file(const char *dirname, const char *filename, off_t *r_size)
|
||||||
{
|
{
|
||||||
|
@ -246,9 +254,10 @@ static char *slurp_file(const char *dirname, const char *filename, off_t *r_size
|
||||||
die("Cannot open '%s' : %s\n",
|
die("Cannot open '%s' : %s\n",
|
||||||
filename, strerror(errno));
|
filename, strerror(errno));
|
||||||
}
|
}
|
||||||
fseek(file, 0, SEEK_END);
|
size = get_file_size(file);
|
||||||
size = ftell(file);
|
if (size == -1) {
|
||||||
fseek(file, 0, SEEK_SET);
|
die("Could not fetch size of '%s': %s\n", filename, strerror(errno));
|
||||||
|
}
|
||||||
*r_size = size +1;
|
*r_size = size +1;
|
||||||
buf = xmalloc(size +2, filename);
|
buf = xmalloc(size +2, filename);
|
||||||
buf[size] = '\n'; /* Make certain the file is newline terminated */
|
buf[size] = '\n'; /* Make certain the file is newline terminated */
|
||||||
|
|
Loading…
Reference in New Issue