1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| int env_do_env_set(int flag, int argc, char *const argv[], int env_flag) { int i, len; char *name, *value, *s; struct env_entry e, *ep;
debug("Initial value for argc=%d\n", argc);
#if !IS_ENABLED(CONFIG_XPL_BUILD) && IS_ENABLED(CONFIG_CMD_NVEDIT_EFI) if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'e') return do_env_set_efi(NULL, flag, --argc, ++argv); #endif while (argc > 1 && **(argv + 1) == '-') { char *arg = *++argv;
--argc; while (*++arg) { switch (*arg) { case 'f': env_flag |= H_FORCE; break; default: return CMD_RET_USAGE; } } } if (strchr(name, '=')) { printf("## Error: illegal character '=' " "in variable name \"%s\"\n", name); return 1; } if (argc < 3 || argv[2] == NULL) { int rc = hdelete_r(name, &env_htab, env_flag);
return rc && rc != -ENOENT ? 1 : 0; } for (i = 2, len = 0; i < argc; ++i) len += strlen(argv[i]) + 1;
value = malloc(len); if (value == NULL) { printf("## Can't malloc %d bytes\n", len); return 1; } for (i = 2, s = value; i < argc; ++i) { char *v = argv[i];
while ((*s++ = *v++) != '\0') ; *(s - 1) = ' '; } if (s != value) *--s = '\0';
e.key = name; e.data = value; hsearch_r(e, ENV_ENTER, &ep, &env_htab, env_flag); free(value); if (!ep) { printf("## Error inserting \"%s\" variable, errno=%d\n", name, errno); return 1; }
return 0; }
|