int config_file_read(struct dm_config_tree *cft) { const char *filename = NULL; struct config_file *cf = dm_config_get_custom(cft); struct stat info; int r; if (!config_file_check(cft, &filename, &info)) return_0; /* Nothing to do. E.g. empty file. */ if (!filename) return 1; if (!cf->dev) { if (!(cf->dev = dev_create_file(filename, NULL, NULL, 1))) return_0; if (!dev_open_readonly_buffered(cf->dev)) return_0; } r = config_file_read_fd(cft, cf->dev, 0, (size_t) info.st_size, 0, 0, (checksum_fn_t) NULL, 0); if (!cf->keep_open) { if (!dev_close(cf->dev)) stack; cf->dev = NULL; } return r; }
int read_config_file(struct config_tree *cft) { struct cs *c = (struct cs *) cft; struct stat info; int r = 1; if (stat(c->filename, &info)) { log_sys_error("stat", c->filename); c->exists = 0; return 0; } if (!S_ISREG(info.st_mode)) { log_error("%s is not a regular file", c->filename); c->exists = 0; return 0; } c->exists = 1; if (info.st_size == 0) { log_verbose("%s is empty", c->filename); return 1; } if (!c->dev) { if (!(c->dev = dev_create_file(c->filename, NULL, NULL, 1))) return_0; if (!dev_open_readonly_buffered(c->dev)) { c->dev = 0; return_0; } } r = read_config_fd(cft, c->dev, 0, (size_t) info.st_size, 0, 0, (checksum_fn_t) NULL, 0); if (!c->keep_open) { dev_close(c->dev); c->dev = 0; } c->timestamp = info.st_ctime; c->st_size = info.st_size; return r; }