diff options
Diffstat (limited to 'src/config.c')
-rw-r--r-- | src/config.c | 73 |
1 files changed, 47 insertions, 26 deletions
diff --git a/src/config.c b/src/config.c index 292e22d..e8a0443 100644 --- a/src/config.c +++ b/src/config.c @@ -9,13 +9,34 @@ struct compile_cmd_t ***ccmds; size_t ccmds_size = 0; -int parse_config(const char *fpath, const struct stat *sb, - int typeflag, struct FTW *ftwbuf) +struct compile_cmd_t *compile_cmd_init() +{ + struct compile_cmd_t *self = malloc (sizeof (struct compile_cmd_t)); + self->cmd = NULL; + self->args = strdup (""); + self->fileext = NULL; + return self; +} + +void +compile_cmd_free (struct compile_cmd_t *self) +{ + if (self->cmd) free (self->cmd); + if (self->args) free (self->args); + if (self->fileext) free (self->fileext); + free (self); +} + +int +parse_config(const char *fpath, const struct stat *sb, + int typeflag, struct FTW *ftwbuf) { if (!S_ISREG (sb->st_mode)) return 0; + if (sb->st_size < 12) // config file that doesnt even include "compiler=xx" can be ignored + return 0; - struct compile_cmd_t *ccmd = malloc (sizeof (struct compile_cmd_t)); + struct compile_cmd_t *ccmd = compile_cmd_init(); struct compile_cmd_t **ccmds_tmp = realloc (*ccmds, sizeof (ccmds)+sizeof (struct compile_cmd_t)); if (ccmds_tmp) *ccmds = ccmds_tmp; @@ -23,13 +44,12 @@ int parse_config(const char *fpath, const struct stat *sb, FILE *cfg = fopen (fpath, "r"); int CMD_SET = 1; - int ARGS_SET = 2; - int FILEEXT_SET = 4; + int FILEEXT_SET = 2; int filled = 0; - while (filled != (CMD_SET|ARGS_SET|FILEEXT_SET)) { + while (filled != (CMD_SET|FILEEXT_SET)) { char *line = strdup (""); - int tmp_char; + int tmp_char = '\0'; while ((tmp_char = fgetc (cfg))) { char *line_tmp = realloc (line, strlen (line) + 8); if (line_tmp) line = line_tmp; @@ -39,29 +59,33 @@ int parse_config(const char *fpath, const struct stat *sb, } char *seperator_fnd = strstr (line, "="); if (!seperator_fnd) - puts ("invalid config line"); + fprintf (stderr, "warn: invalid configuration: %s\n", fpath); else { char *value = strdup (seperator_fnd+1); int identifier_len = strlen (line) - strlen (value) - 1; char *identifier = malloc (identifier_len + 1); strncpy(identifier, line, identifier_len); identifier[identifier_len] = '\0'; - if (strcmp (identifier, "compiler") == 0 && !(filled & CMD_SET)) { - ccmd->cmd = trim (strdup (value), NULL, NULL); + ccmd->cmd = trim (value, NULL, NULL); filled = filled | CMD_SET; } - else if (strcmp (identifier, "args") == 0 && !(filled & ARGS_SET)) { - ccmd->args = trim (strdup (value), NULL, NULL); - filled = filled | ARGS_SET; + else if (strcmp (identifier, "args") == 0) { + free (ccmd->args); + ccmd->args = trim (value, NULL, NULL); } else if (strcmp (identifier, "fileext") == 0 && !(filled & FILEEXT_SET)) { - ccmd->fileext = trim (strdup (value), NULL, NULL); + ccmd->fileext = trim (value, NULL, NULL); filled = filled | FILEEXT_SET; } else { - printf ("warn: invalid configuration: %s\n", fpath); - exit (1); + fprintf (stderr, "warn: invalid configuration: %s\n", fpath); + free (identifier); + free (value); + free (line); + fclose (cfg); + free (ccmd); + return 1; } free (identifier); @@ -80,20 +104,17 @@ size_t get_commands(struct compile_cmd_t ***ccmds_glob) { *ccmds = malloc (sizeof (struct compile_cmd_t)); char *home = getenv ("HOME"); if (!home) { - puts ("warn: HOME not found. Unable to read home configuration files."); + fprintf (stderr, "warn: HOME not found. Unable to read home configuration files.\n"); } - char **paths = malloc (sizeof (char*)*4); - paths[0] = strdup ("/etc/runc.d"); - paths[1] = strdup ("/usr/share/runc"); + char *paths[2] = {"/etc/runc.d", NULL}; if (home) { - paths[2] = malloc (strlen (home)+strlen ("/.local/share/runc")+1); - sprintf (paths[2], "%s/.local/share/runc", home); + paths[1] = malloc (strlen (home)+strlen ("/.config/runc")+1); + sprintf (paths[1], "%s/.config/runc", home); } - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 2; i++) { if (!paths[i]) break; - int err = nftw (paths[i], parse_config, 10, FTW_DEPTH|FTW_MOUNT|FTW_PHYS); - free (paths[i]); + nftw (paths[i], parse_config, 10, FTW_DEPTH|FTW_MOUNT|FTW_PHYS); + if (i==1) free (paths[i]); } - free (paths); return ccmds_size; } |