|
@@ -193,11 +193,14 @@ static void kvp_update_mem_state(int pool)
|
|
|
for (;;) {
|
|
|
readp = &record[records_read];
|
|
|
records_read += fread(readp, sizeof(struct kvp_record),
|
|
|
- ENTRIES_PER_BLOCK * num_blocks,
|
|
|
- filep);
|
|
|
+ ENTRIES_PER_BLOCK * num_blocks - records_read,
|
|
|
+ filep);
|
|
|
|
|
|
if (ferror(filep)) {
|
|
|
- syslog(LOG_ERR, "Failed to read file, pool: %d", pool);
|
|
|
+ syslog(LOG_ERR,
|
|
|
+ "Failed to read file, pool: %d; error: %d %s",
|
|
|
+ pool, errno, strerror(errno));
|
|
|
+ kvp_release_lock(pool);
|
|
|
exit(EXIT_FAILURE);
|
|
|
}
|
|
|
|
|
@@ -210,6 +213,7 @@ static void kvp_update_mem_state(int pool)
|
|
|
|
|
|
if (record == NULL) {
|
|
|
syslog(LOG_ERR, "malloc failed");
|
|
|
+ kvp_release_lock(pool);
|
|
|
exit(EXIT_FAILURE);
|
|
|
}
|
|
|
continue;
|
|
@@ -224,15 +228,11 @@ static void kvp_update_mem_state(int pool)
|
|
|
fclose(filep);
|
|
|
kvp_release_lock(pool);
|
|
|
}
|
|
|
+
|
|
|
static int kvp_file_init(void)
|
|
|
{
|
|
|
int fd;
|
|
|
- FILE *filep;
|
|
|
- size_t records_read;
|
|
|
char *fname;
|
|
|
- struct kvp_record *record;
|
|
|
- struct kvp_record *readp;
|
|
|
- int num_blocks;
|
|
|
int i;
|
|
|
int alloc_unit = sizeof(struct kvp_record) * ENTRIES_PER_BLOCK;
|
|
|
|
|
@@ -246,61 +246,19 @@ static int kvp_file_init(void)
|
|
|
|
|
|
for (i = 0; i < KVP_POOL_COUNT; i++) {
|
|
|
fname = kvp_file_info[i].fname;
|
|
|
- records_read = 0;
|
|
|
- num_blocks = 1;
|
|
|
sprintf(fname, "%s/.kvp_pool_%d", KVP_CONFIG_LOC, i);
|
|
|
fd = open(fname, O_RDWR | O_CREAT | O_CLOEXEC, 0644 /* rw-r--r-- */);
|
|
|
|
|
|
if (fd == -1)
|
|
|
return 1;
|
|
|
|
|
|
-
|
|
|
- filep = fopen(fname, "re");
|
|
|
- if (!filep) {
|
|
|
- close(fd);
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- record = malloc(alloc_unit * num_blocks);
|
|
|
- if (record == NULL) {
|
|
|
- fclose(filep);
|
|
|
- close(fd);
|
|
|
- return 1;
|
|
|
- }
|
|
|
- for (;;) {
|
|
|
- readp = &record[records_read];
|
|
|
- records_read += fread(readp, sizeof(struct kvp_record),
|
|
|
- ENTRIES_PER_BLOCK,
|
|
|
- filep);
|
|
|
-
|
|
|
- if (ferror(filep)) {
|
|
|
- syslog(LOG_ERR, "Failed to read file, pool: %d",
|
|
|
- i);
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
-
|
|
|
- if (!feof(filep)) {
|
|
|
- /*
|
|
|
- * We have more data to read.
|
|
|
- */
|
|
|
- num_blocks++;
|
|
|
- record = realloc(record, alloc_unit *
|
|
|
- num_blocks);
|
|
|
- if (record == NULL) {
|
|
|
- fclose(filep);
|
|
|
- close(fd);
|
|
|
- return 1;
|
|
|
- }
|
|
|
- continue;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
kvp_file_info[i].fd = fd;
|
|
|
- kvp_file_info[i].num_blocks = num_blocks;
|
|
|
- kvp_file_info[i].records = record;
|
|
|
- kvp_file_info[i].num_records = records_read;
|
|
|
- fclose(filep);
|
|
|
-
|
|
|
+ kvp_file_info[i].num_blocks = 1;
|
|
|
+ kvp_file_info[i].records = malloc(alloc_unit);
|
|
|
+ if (kvp_file_info[i].records == NULL)
|
|
|
+ return 1;
|
|
|
+ kvp_file_info[i].num_records = 0;
|
|
|
+ kvp_update_mem_state(i);
|
|
|
}
|
|
|
|
|
|
return 0;
|