diff options
author | ngie <ngie@FreeBSD.org> | 2015-12-15 19:52:02 +0000 |
---|---|---|
committer | ngie <ngie@FreeBSD.org> | 2015-12-15 19:52:02 +0000 |
commit | 3fed53d02350ae9cbd7b2786b72b83d2e292b8d1 (patch) | |
tree | 57320bb171eaf81a24aa51f751919d972710edf9 /sys/boot/uboot/common/main.c | |
parent | 17ca717571c27f52897c406a71864f864ca65710 (diff) | |
parent | 3713a6d4d1859668807d1f8c46fc21b15334f7c9 (diff) | |
download | FreeBSD-src-3fed53d02350ae9cbd7b2786b72b83d2e292b8d1.zip FreeBSD-src-3fed53d02350ae9cbd7b2786b72b83d2e292b8d1.tar.gz |
MFhead @ r292285
Diffstat (limited to 'sys/boot/uboot/common/main.c')
-rw-r--r-- | sys/boot/uboot/common/main.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/sys/boot/uboot/common/main.c b/sys/boot/uboot/common/main.c index 28cbbd5..3071426 100644 --- a/sys/boot/uboot/common/main.c +++ b/sys/boot/uboot/common/main.c @@ -573,17 +573,41 @@ enum ubenv_action { static void handle_uboot_env_var(enum ubenv_action action, const char * var) { - const char * val; - char ubv[128]; + char ldvar[128]; + const char *val; + char *wrk; + int len; + + /* + * On an import with the variable name formatted as ldname=ubname, + * import the uboot variable ubname into the loader variable ldname, + * otherwise the historical behavior is to import to uboot.ubname. + */ + if (action == UBENV_IMPORT) { + len = strcspn(var, "="); + if (var[len] == 0) { + strcpy(ldvar, "uboot."); + strncat(ldvar, var, sizeof(ldvar) - 7); + } else { + len = MIN(len, sizeof(ldvar) - 1); + strncpy(ldvar, var, len); + ldvar[len] = 0; + var = &var[len + 1]; + } + } /* * If the user prepended "uboot." (which is how they usually see these * names) strip it off as a convenience. */ if (strncmp(var, "uboot.", 6) == 0) { - snprintf(ubv, sizeof(ubv), "%s", &var[6]); - var = ubv; + var = &var[6]; } + + /* If ldvar is malformed or there's no variable name left, punt. */ + if (ldvar[0] == 0 || var[0] == 0) + return; + val = ub_env_get(var); if (action == UBENV_SHOW) { if (val == NULL) @@ -592,8 +616,7 @@ handle_uboot_env_var(enum ubenv_action action, const char * var) printf("uboot.%s=%s\n", var, val); } else if (action == UBENV_IMPORT) { if (val != NULL) { - snprintf(ubv, sizeof(ubv), "uboot.%s", var); - setenv(ubv, val, 1); + setenv(ldvar, val, 1); } } } |