On 5/25/20 12:33 PM, Sascha Hauer wrote: > When globalvars are renamed across releases it's not nice when variables > in the persistent environment loose their meaning. This adds a helper > function which adds an alias for the old names. When the persistent > variables still use the old names then their values are automatically > written to variables with the new names. This still breaks scripts in env that reference an alias_deprecated variable, but I guess that's an ok trade-off as the user gets a warning on boot, even if the script doesn't run. Reviewed-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> > Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> > --- > common/globalvar.c | 41 +++++++++++++++++++++++++++++++++++++++-- > include/globalvar.h | 5 +++++ > 2 files changed, 44 insertions(+), 2 deletions(-) > > diff --git a/common/globalvar.c b/common/globalvar.c > index c87f2c9339..5e91cc815f 100644 > --- a/common/globalvar.c > +++ b/common/globalvar.c > @@ -293,6 +293,40 @@ int nvvar_remove(const char *name) > return ret; > } > > +struct globalvar_deprecated { > + char *newname; > + char *oldname; > + struct list_head list; > +}; > + > +static LIST_HEAD(globalvar_deprecated_list); > + > +void globalvar_alias_deprecated(const char *oldname, const char *newname) > +{ > + struct globalvar_deprecated *gd; > + > + gd = xzalloc(sizeof(*gd)); > + gd->newname = xstrdup(newname); > + gd->oldname = xstrdup(oldname); > + list_add_tail(&gd->list, &globalvar_deprecated_list); > +} > + > +static const char *globalvar_new_name(const char *oldname) > +{ > + struct globalvar_deprecated *gd; > + > + list_for_each_entry(gd, &globalvar_deprecated_list, list) { > + if (!strcmp(oldname, gd->oldname)) { > + pr_warn("nv.%s is deprecated, converting to nv.%s\n", oldname, > + gd->newname); > + nv_dirty = 1; > + return gd->newname; > + } > + } > + > + return oldname; > +} > + > int nvvar_load(void) > { > char *val; > @@ -308,6 +342,8 @@ int nvvar_load(void) > return -ENOENT; > > while ((d = readdir(dir))) { > + const char *n; > + > if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) > continue; > > @@ -316,10 +352,11 @@ int nvvar_load(void) > pr_debug("%s: Setting \"%s\" to \"%s\"\n", > __func__, d->d_name, val); > > - ret = __nvvar_add(d->d_name, val); > + n = globalvar_new_name(d->d_name); > + ret = __nvvar_add(n, val); > if (ret) > pr_err("failed to create nv variable %s: %s\n", > - d->d_name, strerror(-ret)); > + n, strerror(-ret)); > } > > closedir(dir); > diff --git a/include/globalvar.h b/include/globalvar.h > index fc85e93e14..db229e239c 100644 > --- a/include/globalvar.h > +++ b/include/globalvar.h > @@ -33,6 +33,7 @@ int nvvar_remove(const char *name); > void globalvar_print(void); > > void dev_param_init_from_nv(struct device_d *dev, const char *name); > +void globalvar_alias_deprecated(const char *newname, const char *oldname); > > #else > static inline int globalvar_add_simple(const char *name, const char *value) > @@ -114,6 +115,10 @@ static inline void dev_param_init_from_nv(struct device_d *dev, const char *name > { > } > > +static inline void globalvar_alias_deprecated(const char *newname, const char *oldname) > +{ > +} > + > #endif > > void nv_var_set_clean(void); > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox