--- /dev/null
+/*
+ * Copyright (C) 2013 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ */
+
+#include <tap/tap.h>
+#include <common/config/session-config.h>
+#include <common/utils.h>
+#include <string.h>
+#include <lttng/constant.h>
+
+struct state {
+ int section_1;
+ int section_2;
+ int section_3;
+ int section_global;
+ int text_entry;
+ int int_entry;
+};
+
+int lttng_opt_quiet = 1;
+int lttng_opt_verbose = 0;
+int lttng_opt_mi;
+
+static int entry_handler(const struct config_entry *entry, struct state *state)
+{
+ int ret = 0;
+
+ if (!entry || !state) {
+ ret = -1;
+ goto end;
+ }
+
+ if (!strcmp(entry->section, "section1")) {
+ state->section_1 = 1;
+ if (!strcmp(entry->name, "section1_entry") &&
+ !strcmp(entry->value, "42")) {
+ state->int_entry = 1;
+ }
+ }
+
+ if (!strcmp(entry->section, "section2")) {
+ state->section_2 = 1;
+ }
+
+ if (!strcmp(entry->section, "section 3")) {
+ state->section_3 = 1;
+ if (!strcmp(entry->name, "name with a space") &&
+ !strcmp(entry->value, "another value")) {
+ state->text_entry = 1;
+ }
+ }
+
+ if (!strcmp(entry->section, "")) {
+ state->section_global = 1;
+ }
+end:
+ return ret;
+}
+
+int main(int argc, char **argv)
+{
+ char *path = NULL;
+ int ret;
+ struct state state = {};
+
+ if (argc < 2) {
+ diag("Usage: path_to_sample_INI_file");
+ goto end;
+ }
+
+ if (strlen(argv[1]) >= LTTNG_PATH_MAX) {
+ diag("The provided path exceeds the maximal permitted length of %i bytes",
+ LTTNG_PATH_MAX);
+ goto end;
+ }
+ path = utils_expand_path(argv[1]);
+ if (!path) {
+ fail("Failed to resolve sample INI file path");
+ }
+
+ plan_no_plan();
+ ret = config_get_section_entries(path, NULL,
+ (config_entry_handler_cb)entry_handler, &state);
+ ok(ret == 0, "Successfully opened a config file, registered to all sections");
+ ok(state.section_1 && state.section_2 && state.section_3 &&
+ state.section_global, "Processed entries from each sections");
+ ok(state.text_entry, "Text value parsed correctly");
+
+ memset(&state, 0, sizeof(struct state));
+ ret = config_get_section_entries(path, "section1",
+ (config_entry_handler_cb)entry_handler, &state);
+ ok(ret == 0, "Successfully opened a config file, registered to one section");
+ ok(state.section_1 && !state.section_2 && !state.section_3 &&
+ !state.section_global, "Processed an entry from section1 only");
+ ok(state.int_entry, "Int value parsed correctly");
+
+ memset(&state, 0, sizeof(struct state));
+ ret = config_get_section_entries(path, "",
+ (config_entry_handler_cb)entry_handler, &state);
+ ok(ret == 0, "Successfully opened a config file, registered to the global section");
+ ok(!state.section_1 && !state.section_2 && !state.section_3 &&
+ state.section_global, "Processed an entry from the global section only");
+end:
+ free(path);
+ return exit_status();
+}