static int image_override_bootmedia(struct image_cfg_element *image_cfg, int *cfgn, const char *bootmedia) { struct image_cfg_element *e; int bootfrom; int cfgi = *cfgn; if (!bootmedia) return 0; bootfrom = image_boot_mode_id(bootmedia); if (!bootfrom) { fprintf(stderr, "Invalid boot media '%s'\n", bootmedia); return -1; } e = image_find_option(image_cfg, *cfgn, IMAGE_CFG_BOOT_FROM); if (e) { e->bootfrom = bootfrom; return 0; } image_cfg[cfgi].type = IMAGE_CFG_BOOT_FROM; image_cfg[cfgi].bootfrom = bootfrom; cfgi++; *cfgn = cfgi; return 0; }
static int image_create_config_parse_oneline(char *line, struct image_cfg_element *el) { char *keyword, *saveptr; char deliminiters[] = " \t"; keyword = strtok_r(line, deliminiters, &saveptr); if (!strcmp(keyword, "VERSION")) { char *value = strtok_r(NULL, deliminiters, &saveptr); el->type = IMAGE_CFG_VERSION; el->version = atoi(value); } else if (!strcmp(keyword, "BOOT_FROM")) { char *value = strtok_r(NULL, deliminiters, &saveptr); int ret = image_boot_mode_id(value); if (ret < 0) { fprintf(stderr, "Invalid boot media '%s'\n", value); return -1; } el->type = IMAGE_CFG_BOOT_FROM; el->bootfrom = ret; } else if (!strcmp(keyword, "NAND_BLKSZ")) { char *value = strtok_r(NULL, deliminiters, &saveptr); el->type = IMAGE_CFG_NAND_BLKSZ; el->nandblksz = strtoul(value, NULL, 16); } else if (!strcmp(keyword, "NAND_BADBLK_LOCATION")) { char *value = strtok_r(NULL, deliminiters, &saveptr); el->type = IMAGE_CFG_NAND_BADBLK_LOCATION; el->nandbadblklocation = strtoul(value, NULL, 16); } else if (!strcmp(keyword, "NAND_ECC_MODE")) { char *value = strtok_r(NULL, deliminiters, &saveptr); int ret = image_nand_ecc_mode_id(value); if (ret < 0) { fprintf(stderr, "Invalid NAND ECC mode '%s'\n", value); return -1; } el->type = IMAGE_CFG_NAND_ECC_MODE; el->nandeccmode = ret; } else if (!strcmp(keyword, "NAND_PAGE_SIZE")) { char *value = strtok_r(NULL, deliminiters, &saveptr); el->type = IMAGE_CFG_NAND_PAGESZ; el->nandpagesz = strtoul(value, NULL, 16); } else if (!strcmp(keyword, "BINARY")) { char *value = strtok_r(NULL, deliminiters, &saveptr); int argi = 0; el->type = IMAGE_CFG_BINARY; el->binary.file = strdup(value); while (1) { value = strtok_r(NULL, deliminiters, &saveptr); if (!value) break; el->binary.args[argi] = strtoul(value, NULL, 16); argi++; if (argi >= BINARY_MAX_ARGS) { fprintf(stderr, "Too many argument for binary\n"); return -1; } } el->binary.nargs = argi; } else if (!strcmp(keyword, "DATA")) { char *value1 = strtok_r(NULL, deliminiters, &saveptr); char *value2 = strtok_r(NULL, deliminiters, &saveptr); if (!value1 || !value2) { fprintf(stderr, "Invalid number of arguments for DATA\n"); return -1; } el->type = IMAGE_CFG_DATA; el->regdata.raddr = strtoul(value1, NULL, 16); el->regdata.rdata = strtoul(value2, NULL, 16); } else if (!strcmp(keyword, "BAUDRATE")) { char *value = strtok_r(NULL, deliminiters, &saveptr); el->type = IMAGE_CFG_BAUDRATE; el->baudrate = strtoul(value, NULL, 10); } else if (!strcmp(keyword, "DEBUG")) { char *value = strtok_r(NULL, deliminiters, &saveptr); el->type = IMAGE_CFG_DEBUG; el->debug = strtoul(value, NULL, 10); } else { fprintf(stderr, "Ignoring unknown line '%s'\n", line); } return 0; }
static int image_create_config_parse_oneline(char *line, struct image_cfg_element *el) { char *keyword, *saveptr; keyword = strtok_r(line, " ", &saveptr); if (!strcmp(keyword, "VERSION")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_VERSION; el->version = atoi(value); } else if (!strcmp(keyword, "BOOT_FROM")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_BOOT_FROM; el->bootfrom = image_boot_mode_id(value); if (el->bootfrom < 0) { fprintf(stderr, "Invalid boot media '%s'\n", value); return -1; } } else if (!strcmp(keyword, "DESTADDR")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_DEST_ADDR; el->dstaddr = strtol(value, NULL, 16); } else if (!strcmp(keyword, "EXECADDR")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_EXEC_ADDR; el->execaddr = strtol(value, NULL, 16); } else if (!strcmp(keyword, "NAND_BLKSZ")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_NAND_BLKSZ; el->nandblksz = strtol(value, NULL, 16); } else if (!strcmp(keyword, "NAND_BADBLK_LOCATION")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_NAND_BADBLK_LOCATION; el->nandbadblklocation = strtol(value, NULL, 16); } else if (!strcmp(keyword, "NAND_ECCMODE")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_NAND_ECC_MODE; el->nandeccmode = image_nand_ecc_mode_id(value); if (el->nandeccmode < 0) { fprintf(stderr, "Invalid NAND ECC mode '%s'\n", value); return -1; } } else if (!strcmp(keyword, "NAND_PAGESZ")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_NAND_PAGESZ; el->nandpagesz = strtol(value, NULL, 16); } else if (!strcmp(keyword, "BINARY")) { char *value = strtok_r(NULL, " ", &saveptr); int argi = 0; el->type = IMAGE_CFG_BINARY; el->binary.file = strdup(value); while (1) { value = strtok_r(NULL, " ", &saveptr); if (!value) break; el->binary.args[argi] = strtol(value, NULL, 16); argi++; if (argi >= BINARY_MAX_ARGS) { fprintf(stderr, "Too many argument for binary\n"); return -1; } } el->binary.nargs = argi; } else if (!strcmp(keyword, "DATA")) { char *value1 = strtok_r(NULL, " ", &saveptr); char *value2 = strtok_r(NULL, " ", &saveptr); if (!value1 || !value2) { fprintf(stderr, "Invalid number of arguments for DATA\n"); return -1; } el->type = IMAGE_CFG_DATA; el->regdata.raddr = strtol(value1, NULL, 16); el->regdata.rdata = strtol(value2, NULL, 16); } else if (!strcmp(keyword, "PAYLOAD")) { char *value = strtok_r(NULL, " ", &saveptr); el->type = IMAGE_CFG_PAYLOAD; el->payload = strdup(value); } else { fprintf(stderr, "Ignoring unknown line '%s'\n", line); } return 0; }