iniparser_freedict(*ini);
}
-enum ini_fields {
- INI_FIELD_TITLE = 0,
- INI_FIELD_PATH,
- INI_FIELD_ARGS,
- INI_FIELD_ENV,
- INI_FIELD_FLAG,
- COUNT_INI_FIELDS,
-};
-
static const char *const INI_KEYS[COUNT_INI_FIELDS] = {
[INI_FIELD_TITLE] = "title",
[INI_FIELD_PATH] = "path",
};
static const size_t MAX_INI_KEY_LEN = 7;
-struct extra_dump_item {
- // not separate named fields, for convenient iteration
- char *fields[COUNT_INI_FIELDS];
- int order;
-};
-
void cleanup_extra_dump_item(struct extra_dump_item *edi)
{
for (size_t i = 0; i < ARRAY_SIZE(edi->fields); ++i)
free(edi->fields[i]);
}
-struct extra_items_vector {
- size_t size;
- struct extra_dump_item *data;
-};
-
bool check_cmdflag(const char *const flag, int argc, char **argv)
{
if (!flag)
int handle_items_vector(struct extra_items_vector *eiv, int out_fd, handle_ini_section_t handle_ini_section, int argc, char **argv)
{
- inline int cmp(const void *a, const void *b) {
- return ((struct extra_dump_item *)a)->order - ((struct extra_dump_item *)b)->order;
- }
- qsort(eiv->data, eiv->size, sizeof *eiv->data, cmp);
-
int ret = 0;
for (size_t i = 0; i < eiv->size; ++i)
ret |= handle_ini_section(out_fd, eiv->data + i, argc, argv);
free(eiv->data);
}
-int handle_extra_dir(int out_fd, char *dir_path, handle_ini_section_t handle_ini_section, int argc, char **argv)
+int read_ini_files(int out_fd, char *dir_path, struct extra_items_vector *eiv)
{
assert(out_fd >= 0);
assert(dir_path);
- assert(handle_ini_section);
+ assert(eiv);
const int dir_fd = open(dir_path, O_DIRECTORY | O_RDONLY);
if (dir_fd < 0) {
return EXIT_ERR;
}
- __attribute__((cleanup(free_items_vector))) struct extra_items_vector eiv = {
- .size = 0,
- .data = NULL,
- };
-
int ret = 0;
for (int i = 0; i < entry_count; ++i) {
struct dirent *const de = entries[i];
snprintf(ini_path, sizeof ini_path, "%s/%s", dir_path, de->d_name);
free(de);
- ret |= handle_extra_ini(out_fd, &eiv, ini_path);
+ ret |= handle_extra_ini(out_fd, eiv, ini_path);
+ }
+
+ if (ret) {
+ inline int cmp(const void *a, const void *b) {
+ return ((struct extra_dump_item *)a)->order - ((struct extra_dump_item *)b)->order;
+ }
+ qsort(eiv->data, eiv->size, sizeof *eiv->data, cmp);
}
- ret |= handle_items_vector(&eiv, out_fd, handle_ini_section, argc, argv);
free(entries);
close(dir_fd);
+
+ return ret;
+}
+
+int handle_extra_dir(int out_fd, char *dir_path, handle_ini_section_t handle_ini_section, int argc, char **argv)
+{
+ assert(out_fd >= 0);
+ assert(dir_path);
+ assert(handle_ini_section);
+
+ __attribute__((cleanup(free_items_vector))) struct extra_items_vector eiv = {
+ .size = 0,
+ .data = NULL,
+ };
+
+ int ret = 0;
+ ret |= read_ini_files(out_fd, dir_path, &eiv);
+ ret |= handle_items_vector(&eiv, out_fd, handle_ini_section, argc, argv);
+
return ret;
}
#pragma once
+#include <sys/types.h>
#include "defs.h"
#define DUMP_SYSTEMSTATE_CONFIG_DIR_PROGRAMS_PATH \
#define DUMP_SYSTEMSTATE_CONFIG_DIR_FILES_PATH \
DUMP_SYSTEMSTATE_CONFIG_DIR_PATH "/files"
-struct extra_dump_item;
+enum ini_fields {
+ INI_FIELD_TITLE = 0,
+ INI_FIELD_PATH,
+ INI_FIELD_ARGS,
+ INI_FIELD_ENV,
+ INI_FIELD_FLAG,
+ COUNT_INI_FIELDS,
+};
+
+struct extra_items_vector {
+ size_t size;
+ struct extra_dump_item *data;
+};
+
+struct extra_dump_item {
+ // not separate named fields, for convenient iteration
+ char *fields[COUNT_INI_FIELDS];
+ int order;
+};
+
typedef int (*handle_ini_section_t)(int out_fd, struct extra_dump_item *, int argc, char **argv);
int handle_extra_dir(int out_fd, char *dir_path, handle_ini_section_t handle_ini_section, int argc, char **argv);
int handle_extra_file(int out_fd, struct extra_dump_item *item, int argc, char **argv);
int handle_extra_program(int out_fd, struct extra_dump_item *item, int argc, char **argv);
+int read_ini_files(int out_fd, char *dir_path, struct extra_items_vector *eiv);