Branch data Line data Source code
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 : : #include "spdk/string.h" 8 : : 9 : : void * 10 : 1170 : spdk_posix_file_load(FILE *file, size_t *size) 11 : : { 12 : 1170 : uint8_t *newbuf, *buf = NULL; 13 : 1170 : size_t rc, buf_size, cur_size = 0; 14 : : 15 : 1170 : *size = 0; 16 : 1170 : buf_size = 128 * 1024; 17 : : 18 [ + - ]: 1170 : while (buf_size <= 1024 * 1024 * 1024) { 19 : 1170 : newbuf = realloc(buf, buf_size); 20 [ - + ]: 1170 : if (newbuf == NULL) { 21 : 0 : free(buf); 22 : 0 : return NULL; 23 : : } 24 : 1170 : buf = newbuf; 25 : : 26 : 1170 : rc = fread(buf + cur_size, 1, buf_size - cur_size, file); 27 : 1170 : cur_size += rc; 28 : : 29 [ + - ]: 1170 : if (feof(file)) { 30 : 1170 : *size = cur_size; 31 : 1170 : return buf; 32 : : } 33 : : 34 [ # # ]: 0 : if (ferror(file)) { 35 : 0 : free(buf); 36 : 0 : return NULL; 37 : : } 38 : : 39 : 0 : buf_size *= 2; 40 : : } 41 : : 42 : 0 : free(buf); 43 : 0 : return NULL; 44 : : } 45 : : 46 : : void * 47 : 1171 : spdk_posix_file_load_from_name(const char *file_name, size_t *size) 48 : : { 49 : 1171 : FILE *file = fopen(file_name, "r"); 50 : : void *data; 51 : : 52 [ + + ]: 1171 : if (file == NULL) { 53 : 1 : return NULL; 54 : : } 55 : : 56 : 1170 : data = spdk_posix_file_load(file, size); 57 : 1170 : fclose(file); 58 : : 59 : 1170 : return data; 60 : : } 61 : : 62 : : static int 63 : 0 : read_sysfs_attribute(char **attribute_p, const char *format, va_list args) 64 : : { 65 : : char *attribute; 66 : : FILE *file; 67 : : char *path; 68 : 0 : size_t len = 0; 69 : : ssize_t read; 70 : : 71 : 0 : path = spdk_vsprintf_alloc(format, args); 72 [ # # ]: 0 : if (path == NULL) { 73 : 0 : return -ENOMEM; 74 : : } 75 : : 76 : 0 : file = fopen(path, "r"); 77 : 0 : free(path); 78 [ # # ]: 0 : if (file == NULL) { 79 : 0 : return -errno; 80 : : } 81 : : 82 : 0 : *attribute_p = NULL; 83 : 0 : read = getline(attribute_p, &len, file); 84 : 0 : fclose(file); 85 : 0 : attribute = *attribute_p; 86 [ # # ]: 0 : if (read == -1) { 87 : : /* getline man page says line should be freed even on failure. */ 88 : 0 : free(attribute); 89 : 0 : return -errno; 90 : : } 91 : : 92 : : /* len is the length of the allocated buffer, which may be more than 93 : : * the string's length. Reuse len to hold the actual strlen. 94 : : */ 95 [ # # ]: 0 : len = strlen(attribute); 96 [ # # ]: 0 : if (attribute[len - 1] == '\n') { 97 : 0 : attribute[len - 1] = '\0'; 98 : : } 99 : : 100 : 0 : return 0; 101 : : } 102 : : 103 : : int 104 : 0 : spdk_read_sysfs_attribute(char **attribute_p, const char *path_format, ...) 105 : : { 106 : 0 : va_list args; 107 : : int rc; 108 : : 109 : 0 : va_start(args, path_format); 110 : 0 : rc = read_sysfs_attribute(attribute_p, path_format, args); 111 : 0 : va_end(args); 112 : : 113 : 0 : return rc; 114 : : }