mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 23:56:57 +02:00
MINOR: cfgparse: load_cfg_in_mem: take in account file size
Let's take in account the given file size, when its reported via stat. It's very convenient for large configuration files, as this allows to perform only the one memory allocation call for precisely needeed file size. This also allows to perform only the one call to fread(). We need to provide to fread() file_stat.st_size + 1 to be able to grab EOF. Like this it sets feof(f)=1 flag and this allows to exit from the loop immediately, just after fread call. If /dev/stdin or /dev/null is provided as a file, we continue to read the configuration chunk by chunk, stat doesn't report the size.
This commit is contained in:
parent
5b9ed6e4be
commit
03e63b98ca
@ -1759,10 +1759,23 @@ ssize_t load_cfg_in_mem(char *filename, char **cfg_content)
|
||||
size_t bytes_to_read = LINESIZE;
|
||||
size_t chunk_size = 0;
|
||||
size_t read_bytes = 0;
|
||||
struct stat file_stat;
|
||||
char *new_area;
|
||||
size_t ret = 0;
|
||||
FILE *f;
|
||||
|
||||
/* let's try to obtain the size, if regular file */
|
||||
if (stat(filename, &file_stat) != 0) {
|
||||
ha_alert("stat() failed for configuration file %s : %s\n",
|
||||
filename, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (file_stat.st_size) {
|
||||
/* as we need to read EOF to have feof(f)=1 */
|
||||
bytes_to_read = file_stat.st_size + 1;
|
||||
}
|
||||
|
||||
if ((f = fopen(filename,"r")) == NULL) {
|
||||
ha_alert("Could not open configuration file %s : %s\n",
|
||||
filename, strerror(errno));
|
||||
|
Loading…
Reference in New Issue
Block a user