int vbucket_config_parse(VBUCKET_CONFIG_HANDLE handle, vbucket_source_t data_source, const char *data) { if (data_source == LIBVBUCKET_SOURCE_FILE) { return parse_from_file(handle, data); } else { return parse_from_memory(handle, data); } }
int vbucket_config_parse2(VBUCKET_CONFIG_HANDLE handle, vbucket_source_t data_source, const char *data, const char *peername) { handle->localhost = peername; handle->nlocalhost = peername ? strlen(peername) : 0; if (data_source == LIBVBUCKET_SOURCE_FILE) { return parse_from_file(handle, data); } else { return parse_from_memory(handle, data); } }
static int parse_from_file(VBUCKET_CONFIG_HANDLE handle, const char *filename) { long size; char *data; int ret; FILE *f = fopen(filename, "rb"); if (f == NULL) { char msg[1024]; snprintf(msg, sizeof(msg), "Unable to open file \"%s\": %s", filename, strerror(errno)); handle->errmsg = strdup(msg); return -1; } fseek(f, 0, SEEK_END); size = ftell(f); fseek(f, 0, SEEK_SET); if (size > MAX_CONFIG_SIZE) { char msg[1024]; snprintf(msg, sizeof(msg), "File too large: \"%s\"", filename); handle->errmsg = strdup(msg); fclose(f); return -1; } data = calloc(size+1, sizeof(char)); if (data == NULL) { char msg[1024]; snprintf(msg, sizeof(msg), "Failed to allocate buffer to read: \"%s\"", filename); handle->errmsg = strdup(msg); fclose(f); return -1; } if (do_read_file(f, data, size) == -1) { char msg[1024]; snprintf(msg, sizeof(msg), "Failed to read entire file: \"%s\": %s", filename, strerror(errno)); handle->errmsg = strdup(msg); fclose(f); free(data); return -1; } fclose(f); ret = parse_from_memory(handle, data); free(data); return ret; }