~registry/kmod/master

« back to all changes in this revision

Viewing changes to libkmod/libkmod-config.c

  • Committer: Lucas De Marchi
  • Date: 2011-12-12 12:30:01 UTC
  • mfrom: (161.1.30)
  • Revision ID: git-v1:2fee2f13ce5f6b17dd672389de422217c56105e2
Merge branch 'use-mmap'

Conflicts:
        libkmod/libkmod.c

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
#include "libkmod.h"
33
33
#include "libkmod-private.h"
34
34
 
35
 
static const char *config_files[] = {
36
 
        "/run/modprobe.d",
37
 
        "/etc/modprobe.d",
38
 
        "/lib/modprobe.d",
39
 
};
40
 
 
41
35
struct kmod_alias {
42
36
        char *name;
43
37
        char modname[];
63
57
        return alias->modname;
64
58
}
65
59
 
 
60
const char *kmod_option_get_options(const struct kmod_list *l) {
 
61
        const struct kmod_options *alias = l->data;
 
62
        return alias->options;
 
63
}
 
64
 
 
65
const char *kmod_option_get_modname(const struct kmod_list *l) {
 
66
        const struct kmod_options *alias = l->data;
 
67
        return alias->modname;
 
68
}
 
69
 
 
70
const char *kmod_command_get_command(const struct kmod_list *l) {
 
71
        const struct kmod_command *alias = l->data;
 
72
        return alias->command;
 
73
}
 
74
 
 
75
const char *kmod_command_get_modname(const struct kmod_list *l) {
 
76
        const struct kmod_command *alias = l->data;
 
77
        return alias->modname;
 
78
}
 
79
 
66
80
static int kmod_config_add_command(struct kmod_config *config,
67
81
                                                const char *modname,
68
82
                                                const char *command,
438
452
        return NULL;
439
453
}
440
454
 
441
 
int kmod_config_new(struct kmod_ctx *ctx, struct kmod_config **p_config)
 
455
int kmod_config_new(struct kmod_ctx *ctx, struct kmod_config **p_config, const char * const *config_paths)
442
456
{
443
457
        struct kmod_config *config;
444
458
        size_t i;
449
463
 
450
464
        config->ctx = ctx;
451
465
 
452
 
        for (i = 0; i < ARRAY_SIZE(config_files); i++) {
 
466
        for (i = 0; config_paths[i] != NULL; i++) {
 
467
                const char *path = config_paths[i];
453
468
                struct kmod_list *list = NULL;
 
469
                struct stat st;
454
470
                DIR *d;
455
 
                int fd;
456
 
 
457
 
                d = conf_files_list(ctx, &list, config_files[i]);
 
471
 
 
472
                if (stat(path, &st) != 0) {
 
473
                        DBG(ctx, "could not load '%s': %s\n",
 
474
                                path, strerror(errno));
 
475
                        continue;
 
476
                }
 
477
 
 
478
                if (S_ISREG(st.st_mode)) {
 
479
                        int fd = open(path, O_RDONLY);
 
480
                        DBG(ctx, "parsing file '%s': %d\n", path, fd);
 
481
                        if (fd >= 0)
 
482
                                kmod_config_parse(config, fd, path);
 
483
                        continue;
 
484
                } else if (!S_ISDIR(st.st_mode)) {
 
485
                        ERR(ctx, "unsupported file mode %s: %#x\n",
 
486
                                path, st.st_mode);
 
487
                        continue;
 
488
                }
 
489
 
 
490
                d = conf_files_list(ctx, &list, path);
458
491
 
459
492
                /* there's no entry */
460
493
                if (list == NULL)
461
494
                        continue;
462
 
 
463
 
                /* there's only one entry, and it's a file */
464
495
                if (d == NULL) {
465
 
                        DBG(ctx, "parsing file '%s'\n", config_files[i]);
466
 
                        list = kmod_list_remove(list);
467
 
                        fd = open(config_files[i], O_RDONLY);
468
 
                        if (fd >= 0)
469
 
                                kmod_config_parse(config, fd, config_files[i]);
470
 
 
 
496
                        ERR(ctx, "returned list but no directory?\n");
 
497
                        while (list) {
 
498
                                free(list->data);
 
499
                                kmod_list_remove(list);
 
500
                        }
471
501
                        continue;
472
502
                }
473
503
 
474
504
                /* treat all the entries in that dir */
475
505
                for (; list != NULL; list = kmod_list_remove(list)) {
476
 
                        DBG(ctx, "parsing file '%s/%s'\n", config_files[i],
477
 
                                                        (char *) list->data);
478
 
                        fd = openat(dirfd(d), list->data, O_RDONLY);
 
506
                        int fd = openat(dirfd(d), list->data, O_RDONLY);
 
507
                        DBG(ctx, "parsing file '%s/%s': %d\n", path,
 
508
                                (const char *) list->data, fd);
479
509
                        if (fd >= 0)
480
510
                                kmod_config_parse(config, fd, list->data);
481
511