xref: /spdk/lib/util/file.c (revision 8130039ee5287100d9eb93eb886967645da3d545)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2015 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk/file.h"
7 
8 void *
9 spdk_posix_file_load(FILE *file, size_t *size)
10 {
11 	uint8_t *newbuf, *buf = NULL;
12 	size_t rc, buf_size, cur_size = 0;
13 
14 	*size = 0;
15 	buf_size = 128 * 1024;
16 
17 	while (buf_size <= 1024 * 1024 * 1024) {
18 		newbuf = realloc(buf, buf_size);
19 		if (newbuf == NULL) {
20 			free(buf);
21 			return NULL;
22 		}
23 		buf = newbuf;
24 
25 		rc = fread(buf + cur_size, 1, buf_size - cur_size, file);
26 		cur_size += rc;
27 
28 		if (feof(file)) {
29 			*size = cur_size;
30 			return buf;
31 		}
32 
33 		if (ferror(file)) {
34 			free(buf);
35 			return NULL;
36 		}
37 
38 		buf_size *= 2;
39 	}
40 
41 	free(buf);
42 	return NULL;
43 }
44 
45 void *
46 spdk_posix_file_load_from_name(const char *file_name, size_t *size)
47 {
48 	FILE *file = fopen(file_name, "r");
49 	void *data;
50 
51 	if (file == NULL) {
52 		return NULL;
53 	}
54 
55 	data = spdk_posix_file_load(file, size);
56 	fclose(file);
57 
58 	return data;
59 }
60