#include #include #include #include "sekrits.h" /// SEKRITS CODE struct sekrits_node { struct sekrits_node *next; char *name; char *value; }; struct sekrits { struct sekrits_node *root; }; int sekrits_create_from_filename(struct sekrits **ppsekrits, const char *filename) { FILE *stream = fopen(filename, "r"); if (stream == NULL) { perror("couldn't open file"); return SEKRITS_ERROR; } int result = sekrits_create_from_file(ppsekrits, stream); fclose(stream); return result; } /* used to define how long a sekrit line is allowed to be (this includes the * sekrit name and value) */ #define SEKRIT_MAX_LINE_LEN 8096 int sekrits_create_from_file(struct sekrits **ppsekrits, FILE *file) { struct sekrits *out = (struct sekrits *)malloc(sizeof(struct sekrits)); if (file == NULL) { return SEKRITS_ERROR; } char sekrit_buf[SEKRIT_MAX_LINE_LEN] = {0}; char *line_end; size_t line_num = 0; while ((line_end = fgets(sekrit_buf, SEKRIT_MAX_LINE_LEN, file)) != NULL) { ++line_num; ssize_t total_len = line_end - sekrit_buf; char *iter; for (iter = sekrit_buf; iter < line_end; ++iter) { if (*iter == '\\') { ++iter; continue; } else if (*iter == '=') { *iter = '\0'; ++iter; break; } } char *name = sekrit_buf; size_t name_len = iter - sekrit_buf; char *value = iter; size_t value_len = line_end - iter; // char name_buf[SEKRIT_MAX_LINE_LEN] = {0}; // char value_buf[SEKRIT_MAX_LINE_LEN] = {0}; // char terminator = 0; // int read_bytes = 0; // do { // int res = sscanf(file, "%[^\\=]%n%[\=]c%s", name_buf, &read_bytes, ); // } while (res != 2); }; *ppsekrits = out; return SEKRITS_OK; } int sekrits_destroy(struct sekrits *thing) { if (thing != NULL) { free(thing); } return SEKRITS_OK; } int sekrits_fetch(const struct sekrits *, const char *name, char *buf, size_t len); const char *sekrits_get(struct sekrits *secrets, const char *name) { if (secrets == NULL) { return NULL; } struct sekrits_node *curr = secrets->root; while (curr != NULL) { if (strcmp(curr->name, name)) { return curr->value; } curr = curr->next; }; return NULL; }