]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
improve kmod_config api.
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Fri, 2 Dec 2011 23:40:22 +0000 (21:40 -0200)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Sat, 3 Dec 2011 05:56:57 +0000 (03:56 -0200)
make the function names reflect the structure they are operating on.

the structure is now allocated and remembers the context it was
created, then no need to give the context in every function call.

libkmod/libkmod-config.c
libkmod/libkmod-private.h
libkmod/libkmod.c

index 656db77c30b742d68609e4ff530a32f3c57d0375..05fcbd40e33702f768f13c5dc8640a0844b3f4f6 100644 (file)
@@ -53,22 +53,38 @@ const char *kmod_alias_get_modname(const struct kmod_list *l) {
        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;
 
@@ -76,33 +92,44 @@ static struct kmod_list *free_alias(struct kmod_ctx *ctx, struct kmod_list *l)
        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;
@@ -130,7 +157,7 @@ int kmod_parse_config_file(struct kmod_ctx *ctx, const char *filename,
                        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")) {
@@ -139,9 +166,8 @@ int kmod_parse_config_file(struct kmod_ctx *ctx, const char *filename,
                        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")
@@ -164,13 +190,15 @@ done_next:
        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,
@@ -257,14 +285,19 @@ static int base_cmp(const void *a, const void *b)
        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);
 
@@ -283,7 +316,7 @@ int kmod_parse_config(struct kmod_ctx *ctx, struct kmod_config *config)
        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);
index 838a19fad008c0ba9a9ecd91a42d70c589df0dbd..c589a22ddd671b115b32519c0b7a493efaecc1c9 100644 (file)
@@ -63,12 +63,12 @@ int kmod_lookup_alias_from_moddep_file(struct kmod_ctx *ctx, const char *name, s
 
 /* libkmod-config.c */
 struct kmod_config {
+       struct kmod_ctx *ctx;
        struct kmod_list *aliases;
        struct kmod_list *blacklists;
 };
-int kmod_parse_config_file(struct kmod_ctx *ctx, const char *filename, struct kmod_config *config) __attribute__((nonnull(1, 2, 3)));
-int kmod_parse_config(struct kmod_ctx *ctx, struct kmod_config *config) __attribute__((nonnull(1, 2)));
-void kmod_free_config(struct kmod_ctx *ctx, struct kmod_config *config) __attribute__((nonnull(1, 2)));
+int kmod_config_new(struct kmod_ctx *ctx, struct kmod_config **config) __attribute__((nonnull(1)));
+void kmod_config_free(struct kmod_config *config) __attribute__((nonnull(1)));
 const char *kmod_alias_get_name(const struct kmod_list *l) __attribute__((nonnull(1)));
 const char *kmod_alias_get_modname(const struct kmod_list *l) __attribute__((nonnull(1)));
 
index af784ea80537b6f34d032321a9c680a2698cde84..1ad4e2742ccb18eeedbb44b951cb57901d44b665 100644 (file)
@@ -53,7 +53,7 @@ struct kmod_ctx {
                        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,
@@ -161,6 +161,7 @@ KMOD_EXPORT struct kmod_ctx *kmod_new(const char *dirname)
 {
        const char *env;
        struct kmod_ctx *ctx;
+       int err;
 
        ctx = calloc(1, sizeof(struct kmod_ctx));
        if (!ctx)
@@ -177,7 +178,13 @@ KMOD_EXPORT struct kmod_ctx *kmod_new(const char *dirname)
        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);
@@ -218,7 +225,8 @@ KMOD_EXPORT struct kmod_ctx *kmod_unref(struct kmod_ctx *ctx)
                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;
 }
@@ -387,7 +395,7 @@ finish:
 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;