YogHandle* YogVM_import_package(YogEnv* env, YogVM* vm, YogHandle* name) { YogHandle* parent = NULL; YogHandle* top = NULL; uint_t n = 0; while (1) { int_t pos = YogString_find_char(env, HDL2VAL(name), n, '.'); YogHandle* s = pos < 0 ? name : VAL2HDL(env, YogString_slice(env, name, 0, pos)); YogHandle* pkg = VAL2HDL(env, import_package(env, vm, s)); set_package_as_parent_attr(env, vm, parent, name, n, pos, pkg); if (top == NULL) { top = pkg; } if (pos < 0) { break; } parent = pkg; n = pos + 1; } return top; }
int pack_update(const char* srcdir, const char* dstfile) { struct update_header header; FILE *fp; int i; char buf[PATH_MAX]; printf("------ PACKAGE ------\n"); memset(&header, 0, sizeof(header)); snprintf(buf, sizeof(buf), "%s/%s", srcdir, "parameter"); if (parse_parameter(buf)) return -1; snprintf(buf, sizeof(buf), "%s/%s", srcdir, "package-file"); if (get_packages(buf)) return -1; fp = fopen(dstfile, "w"); if (!fp) return -1; fwrite(&header, sizeof(header), 1, fp); for (i = 0; i < package_image.num_package; ++i) { strcpy(header.parts[i].name, package_image.packages[i].name); strcpy(header.parts[i].filename, package_image.packages[i].filename); header.parts[i].nand_addr = package_image.packages[i].nand_addr; header.parts[i].nand_size = package_image.packages[i].nand_size; if (strcmp(package_image.packages[i].filename, "SELF") == 0) continue; snprintf(buf, sizeof(buf), "%s/%s", srcdir, header.parts[i].filename); printf("Add file: %s\n", buf); import_package(fp, &header.parts[i], buf); } strcpy(header.magic, "RKAF"); strcpy(header.manufacturer, package_image.manufacturer); strcpy(header.model, package_image.machine_model); strcpy(header.id, package_image.machine_id); header.length = ftell(fp); header.num_parts = package_image.num_package; header.version = package_image.version; for (i = header.num_parts - 1; i >= 0; --i) { if (strcmp(header.parts[i].filename, "SELF") == 0) { header.parts[i].size = header.length + 4; header.parts[i].padded_size = (header.parts[i].size + 511) / 512 *512; } } fseek(fp, 0, SEEK_SET); fwrite(&header, sizeof(header), 1, fp); fclose(fp); append_crc(dstfile); printf("------ OK ------\n"); return 0; }
int pack_update(const char* srcdir, const char* dstfile) { struct update_header header; FILE *fp = NULL; unsigned int i; printf("------ PACKAGE ------\n"); memset(&header, 0, sizeof(header)); fp = fopen(dstfile, "wb+"); if (!fp) { printf("Can't open destination file \"%s\": %s\n", dstfile, strerror(errno)); return -1; } if (chdir(srcdir)) return -1; if (parse_parameter("parameter")) return -1; if (get_packages("package-file")) return -1; fwrite(&header, sizeof(header), 1, fp); for (i = 0; i < package_image.num_package; ++i) { strcpy(header.parts[i].name, package_image.packages[i].name); strcpy(header.parts[i].filename, package_image.packages[i].filename); header.parts[i].nand_addr = package_image.packages[i].nand_addr; header.parts[i].nand_size = package_image.packages[i].nand_size; if (strcmp(package_image.packages[i].filename, "SELF") == 0) continue; printf("Add file: %s\n", header.parts[i].filename); import_package(fp, &header.parts[i], header.parts[i].filename); } memcpy(header.magic, RKAFP_MAGIC, sizeof(header.magic)); strcpy(header.manufacturer, package_image.manufacturer); strcpy(header.model, package_image.machine_model); strcpy(header.id, package_image.machine_id); header.length = ftell(fp); header.num_parts = package_image.num_package; header.version = package_image.version; for (i = 0; i < header.num_parts; i++) { if (strcmp(header.parts[i].filename, "SELF") == 0) { header.parts[i].size = header.length + 4; header.parts[i].padded_size = (header.parts[i].size + 511) / 512 *512; } } fseek(fp, 0, SEEK_SET); fwrite(&header, sizeof(header), 1, fp); append_crc(fp); fclose(fp); printf("------ OK ------\n"); return 0; }