diff options
author | Saul Wold <saul.wold@windriver.com> | 2022-03-31 14:56:28 -0700 |
---|---|---|
committer | Lucas De Marchi <lucas.demarchi@intel.com> | 2022-04-01 21:44:15 -0700 |
commit | f50e2d67575ac5f256fb853ca9d29aeac92d9a57 (patch) | |
tree | 5572de35e561be93dd5f8169d33b47e435218597 | |
parent | 7089386eeff8f6942456159ee9a7296403631ffd (diff) | |
download | kmod-f50e2d67575ac5f256fb853ca9d29aeac92d9a57.tar.gz kmod-f50e2d67575ac5f256fb853ca9d29aeac92d9a57.tar.bz2 kmod-f50e2d67575ac5f256fb853ca9d29aeac92d9a57.zip |
depmod: Add support for excluding a directory
This adds support to depmod to enable a new exclude directive in
the depmod.d/*.conf configuration file. Currently depmod
already excludes directories named source or build. This change
will allow additional directories like .debug to be excluded also
via a new exclude directive.
depmod.d/exclude.conf example:
exclude .debug
Signed-off-by: Saul Wold <saul.wold@windriver.com>
[ Fix warnings and make should_exclude_dir() return bool ]
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
-rw-r--r-- | man/depmod.d.xml | 14 | ||||
-rw-r--r-- | tools/depmod.c | 66 |
2 files changed, 76 insertions, 4 deletions
diff --git a/man/depmod.d.xml b/man/depmod.d.xml index b315e93..76548e9 100644 --- a/man/depmod.d.xml +++ b/man/depmod.d.xml @@ -131,6 +131,20 @@ </para> </listitem> </varlistentry> + <varlistentry> + <term>exclude <replaceable>excludedir</replaceable> + </term> + <listitem> + <para> + This specifies the trailing directories that will be excluded + during the search for kernel modules. + </para> + <para> + The <replaceable>excludedir</replaceable> is the trailing directory + to exclude + </para> + </listitem> + </varlistentry> </variablelist> </refsect1> diff --git a/tools/depmod.c b/tools/depmod.c index 07a35ba..4117dd1 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -458,6 +458,11 @@ struct cfg_external { char path[]; }; +struct cfg_exclude { + struct cfg_exclude *next; + char exclude_dir[]; +}; + struct cfg { const char *kversion; char dirname[PATH_MAX]; @@ -469,6 +474,7 @@ struct cfg { struct cfg_override *overrides; struct cfg_search *searches; struct cfg_external *externals; + struct cfg_exclude *excludes; }; static enum search_type cfg_define_search_type(const char *path) @@ -580,6 +586,30 @@ static void cfg_external_free(struct cfg_external *ext) free(ext); } +static int cfg_exclude_add(struct cfg *cfg, const char *path) +{ + struct cfg_exclude *exc; + size_t len = strlen(path); + + exc = malloc(sizeof(struct cfg_exclude) + len + 1); + if (exc == NULL) { + ERR("exclude add: out of memory\n"); + return -ENOMEM; + } + memcpy(exc->exclude_dir, path, len + 1); + + DBG("exclude add: %s\n", path); + + exc->next = cfg->excludes; + cfg->excludes = exc; + return 0; +} + +static void cfg_exclude_free(struct cfg_exclude *exc) +{ + free(exc); +} + static int cfg_kernel_matches(const struct cfg *cfg, const char *pattern) { regex_t re; @@ -657,6 +687,11 @@ static int cfg_file_parse(struct cfg *cfg, const char *filename) } cfg_external_add(cfg, dir); + } else if (streq(cmd, "exclude")) { + const char *sp; + while ((sp = strtok_r(NULL, "\t ", &saveptr)) != NULL) { + cfg_exclude_add(cfg, sp); + } } else if (streq(cmd, "include") || streq(cmd, "make_map_files")) { INF("%s:%u: command %s not implemented yet\n", @@ -857,6 +892,12 @@ static void cfg_free(struct cfg *cfg) cfg->externals = cfg->externals->next; cfg_external_free(tmp); } + + while (cfg->excludes) { + struct cfg_exclude *tmp = cfg->excludes; + cfg->excludes = cfg->excludes->next; + cfg_exclude_free(tmp); + } } @@ -1229,6 +1270,25 @@ add: return 0; } +static bool should_exclude_dir(const struct cfg *cfg, const char *name) +{ + struct cfg_exclude *exc; + + if (name[0] == '.' && (name[1] == '\0' || + (name[1] == '.' && name[2] == '\0'))) + return true; + + if (streq(name, "build") || streq(name, "source")) + return true; + + for (exc = cfg->excludes; exc != NULL; exc = exc->next) { + if (streq(name, exc->exclude_dir)) + return true; + } + + return false; +} + static int depmod_modules_search_dir(struct depmod *depmod, DIR *d, size_t baselen, struct scratchbuf *s_path) { struct dirent *de; @@ -1240,11 +1300,9 @@ static int depmod_modules_search_dir(struct depmod *depmod, DIR *d, size_t basel size_t namelen; uint8_t is_dir; - if (name[0] == '.' && (name[1] == '\0' || - (name[1] == '.' && name[2] == '\0'))) - continue; - if (streq(name, "build") || streq(name, "source")) + if (should_exclude_dir(depmod->cfg, name)) continue; + namelen = strlen(name); if (scratchbuf_alloc(s_path, baselen + namelen + 2) < 0) { err = -ENOMEM; |