Message ID | 20220324170354.67733-1-saul.wold@windriver.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | depmod: Add support for excluding a directory | expand |
Hi Saul, On Thu, Mar 24, 2022 at 10:03:54AM -0700, Saul Wold wrote: >This adds support to depmod to enable a new exclude directive in >the depmod.d/exclude.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> Overall it looks good to me. I'd not mention exclude.conf name and rather say depmod.d/*.conf like in the man page. It's up to distros/users to use whatever name they wish. >--- > man/depmod.d.xml | 14 +++++++++++++ > tools/depmod.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 67 insertions(+) > >diff --git a/man/depmod.d.xml b/man/depmod.d.xml >index b315e93..9ab790a 100644 >--- a/man/depmod.d.xml >+++ b/man/depmod.d.xml >@@ -131,6 +131,20 @@ > </para> > </listitem> > </varlistentry> >+ <varlistentry> >+ <term>external <replaceable>excludedir</replaceable> >+ </term> wrong copy and paste? >+ <listitem> >+ <para> >+ This specifies the trailing directories that will be excluded >+ during the search for kernel modules. >+ </para> >+ <para> >+ The <replaceable>excludedir</replaceable> the trailing directory s/the/is the/ ? >+ to exclude >+ </para> >+ </listitem> >+ </varlistentry> > </variablelist> > </refsect1> > >diff --git a/tools/depmod.c b/tools/depmod.c >index eb810b8..4ac758c 100644 >--- a/tools/depmod.c >+++ b/tools/depmod.c >@@ -458,6 +458,12 @@ struct cfg_external { > char path[]; > }; > >+struct cfg_exclude { >+ struct cfg_exclude *next; >+ size_t len; >+ char exclude_dir[]; >+}; >+ > struct cfg { > const char *kversion; > char dirname[PATH_MAX]; >@@ -469,6 +475,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 +587,31 @@ 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); + len + 1 as we want to store the \0 too. >+ if (exc == NULL) { >+ ERR("exclude add: out of memory\n"); >+ return -ENOMEM; >+ } >+ exc->len = len; >+ memcpy(exc->exclude_dir, path, len); 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 +689,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 +894,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); >+ } > } > > >@@ -1239,12 +1282,22 @@ static int depmod_modules_search_dir(struct depmod *depmod, DIR *d, size_t basel > const char *name = de->d_name; > size_t namelen; > uint8_t is_dir; >+ struct cfg_exclude *exc; >+ int exclude = 0; > > if (name[0] == '.' && (name[1] == '\0' || > (name[1] == '.' && name[2] == '\0'))) > continue; > if (streq(name, "build") || streq(name, "source")) > continue; >+ >+ for (exc = depmod->cfg->excludes; exc != NULL; exc = exc->next) { >+ if (streq(name, exc->exclude_dir)) >+ exclude = 1; I'd suggest to add a `break;` here, but even better would be to move this part to a helper should_skip_dir() so you can simply return and here we do if (should_skip_dir(depmod->cfg, name)) continue; Lucas De Marchi >+ } >+ if (exclude) >+ continue; >+ > namelen = strlen(name); > if (scratchbuf_alloc(s_path, baselen + namelen + 2) < 0) { > err = -ENOMEM; >-- >2.31.1 >
diff --git a/man/depmod.d.xml b/man/depmod.d.xml index b315e93..9ab790a 100644 --- a/man/depmod.d.xml +++ b/man/depmod.d.xml @@ -131,6 +131,20 @@ </para> </listitem> </varlistentry> + <varlistentry> + <term>external <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> the trailing directory + to exclude + </para> + </listitem> + </varlistentry> </variablelist> </refsect1> diff --git a/tools/depmod.c b/tools/depmod.c index eb810b8..4ac758c 100644 --- a/tools/depmod.c +++ b/tools/depmod.c @@ -458,6 +458,12 @@ struct cfg_external { char path[]; }; +struct cfg_exclude { + struct cfg_exclude *next; + size_t len; + char exclude_dir[]; +}; + struct cfg { const char *kversion; char dirname[PATH_MAX]; @@ -469,6 +475,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 +587,31 @@ 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); + if (exc == NULL) { + ERR("exclude add: out of memory\n"); + return -ENOMEM; + } + exc->len = len; + memcpy(exc->exclude_dir, path, len); + + 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 +689,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 +894,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); + } } @@ -1239,12 +1282,22 @@ static int depmod_modules_search_dir(struct depmod *depmod, DIR *d, size_t basel const char *name = de->d_name; size_t namelen; uint8_t is_dir; + struct cfg_exclude *exc; + int exclude = 0; if (name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) continue; if (streq(name, "build") || streq(name, "source")) continue; + + for (exc = depmod->cfg->excludes; exc != NULL; exc = exc->next) { + if (streq(name, exc->exclude_dir)) + exclude = 1; + } + if (exclude) + continue; + namelen = strlen(name); if (scratchbuf_alloc(s_path, baselen + namelen + 2) < 0) { err = -ENOMEM;
This adds support to depmod to enable a new exclude directive in the depmod.d/exclude.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> --- man/depmod.d.xml | 14 +++++++++++++ tools/depmod.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+)