return alias->modname;
}
-static struct kmod_list *add_alias(struct kmod_ctx *ctx,
- struct kmod_list *aliases,
- const char *name, const char *modname)
+static int kmod_config_add_alias(struct kmod_config *config,
+ const char *name, const char *modname)
{
struct kmod_alias *alias;
+ struct kmod_list *list;
- DBG(ctx, "name=%s modname=%s\n", name, modname);
+ DBG(config->ctx, "name=%s modname=%s\n", name, modname);
alias = malloc(sizeof(*alias));
+ if (!alias)
+ goto oom_error_init;
alias->name = strdup(name);
alias->modname = strdup(modname);
+ if (!alias->name || !alias->modname)
+ goto oom_error;
- return kmod_list_append(aliases, alias);
+ list = kmod_list_append(config->aliases, alias);
+ if (!list)
+ goto oom_error;
+ config->aliases = list;
+ return 0;
+
+oom_error:
+ free(alias->name);
+ free(alias->modname);
+ free(alias);
+oom_error_init:
+ ERR(config->ctx, "out-of-memory name=%s modname=%s\n", name, modname);
+ return -ENOMEM;
}
-static struct kmod_list *free_alias(struct kmod_ctx *ctx, struct kmod_list *l)
+static void kmod_config_free_alias(struct kmod_config *config, struct kmod_list *l)
{
struct kmod_alias *alias = l->data;
free(alias->name);
free(alias);
- return kmod_list_remove(l);
+ config->aliases = kmod_list_remove(l);
}
-static struct kmod_list *add_blacklist(struct kmod_ctx *ctx,
- struct kmod_list *blacklist,
+static int kmod_config_add_blacklist(struct kmod_config *config,
const char *modname)
{
char *p;
+ struct kmod_list *list;
- DBG(ctx, "modname=%s\n", modname);
+ DBG(config->ctx, "modname=%s\n", modname);
p = strdup(modname);
+ if (!p)
+ goto oom_error_init;
+
+ list = kmod_list_append(config->blacklists, p);
+ if (!list)
+ goto oom_error;
+ config->blacklists = list;
+ return 0;
- return kmod_list_append(blacklist, p);
+oom_error:
+ free(p);
+oom_error_init:
+ ERR(config->ctx, "out-of-memory modname=%s\n", modname);
+ return -ENOMEM;
}
-static struct kmod_list *free_blacklist(struct kmod_ctx *ctx,
+static void kmod_config_free_blacklist(struct kmod_config *config,
struct kmod_list *l)
{
free(l->data);
- return kmod_list_remove(l);
+ config->blacklists = kmod_list_remove(l);
}
-
-int kmod_parse_config_file(struct kmod_ctx *ctx, const char *filename,
- struct kmod_config *config)
+static int kmod_config_parse(struct kmod_config *config, const char *filename)
{
+ struct kmod_ctx *ctx = config->ctx;
char *line;
FILE *fp;
unsigned int linenum;
if (alias == NULL || modname == NULL)
goto syntax_error;
- config->aliases = add_alias(ctx, config->aliases,
+ kmod_config_add_alias(config,
underscores(ctx, alias),
underscores(ctx, modname));
} else if (!strcmp(cmd, "blacklist")) {
if (modname == NULL)
goto syntax_error;
- config->blacklists = add_blacklist(ctx,
- config->blacklists,
- underscores(ctx, modname));
+ kmod_config_add_blacklist(config,
+ underscores(ctx, modname));
} else if (!strcmp(cmd, "include") || !strcmp(cmd, "options")
|| !strcmp(cmd, "install")
|| !strcmp(cmd, "remove")
return 0;
}
-void kmod_free_config(struct kmod_ctx *ctx, struct kmod_config *config)
+void kmod_config_free(struct kmod_config *config)
{
while (config->aliases)
- config->aliases = free_alias(ctx, config->aliases);
+ kmod_config_free_alias(config, config->aliases);
while (config->blacklists)
- config->blacklists = free_blacklist(ctx, config->blacklists);
+ kmod_config_free_blacklist(config, config->blacklists);
+
+ free(config);
}
static bool conf_files_filter(struct kmod_ctx *ctx, const char *path,
return strcmp(basename(s1), basename(s2));
}
-int kmod_parse_config(struct kmod_ctx *ctx, struct kmod_config *config)
+int kmod_config_new(struct kmod_ctx *ctx, struct kmod_config **p_config)
{
-
+ struct kmod_config *config;
size_t i, n = 0;
const char **files;
int err = 0;
struct kmod_list *list = NULL, *l;
+ *p_config = config = calloc(1, sizeof(struct kmod_config));
+ if (!config)
+ return -ENOMEM;
+ config->ctx = ctx;
+
for (i = 0; i < ARRAY_SIZE(config_files); i++)
conf_files_list(ctx, &list, config_files[i], &n);
qsort(files, n, sizeof(char *), base_cmp);
for (i = 0; i < n; i++)
- kmod_parse_config_file(ctx, files[i], config);
+ kmod_config_parse(config, files[i]);
finish:
free(files);
const char *fn, const char *format, va_list args);
const void *userdata;
char *dirname;
- struct kmod_config config;
+ struct kmod_config *config;
};
void kmod_log(struct kmod_ctx *ctx,
{
const char *env;
struct kmod_ctx *ctx;
+ int err;
ctx = calloc(1, sizeof(struct kmod_ctx));
if (!ctx)
if (env != NULL)
kmod_set_log_priority(ctx, log_priority(env));
- kmod_parse_config(ctx, &ctx->config);
+ err = kmod_config_new(ctx, &ctx->config);
+ if (err < 0) {
+ ERR(ctx, "could not create config");
+ free(ctx->dirname);
+ free(ctx);
+ return NULL;
+ }
INFO(ctx, "ctx %p created\n", ctx);
DBG(ctx, "log_priority=%d\n", ctx->log_priority);
return ctx;
INFO(ctx, "context %p released\n", ctx);
free(ctx->dirname);
- kmod_free_config(ctx, &ctx->config);
+ if (ctx->config)
+ kmod_config_free(ctx->config);
free(ctx);
return NULL;
}
int kmod_lookup_alias_from_config(struct kmod_ctx *ctx, const char *name,
struct kmod_list **list)
{
- struct kmod_config *config = &ctx->config;
+ struct kmod_config *config = ctx->config;
struct kmod_list *l;
int err, nmatch = 0;