int unpack_rom(const char* filepath, const char* dstfile) { struct _rkfw_header rom_header; FILE *fp = fopen(filepath, "rb"); if (!fp) { fprintf(stderr, "Can't open file %s\n, reason: %s\n", filepath, strerror(errno)); goto unpack_fail; } fseek(fp, 0, SEEK_SET); if (1 != fread(&rom_header, sizeof(rom_header), 1, fp)) goto unpack_fail; if (strncmp(RK_ROM_HEADER_CODE, rom_header.head_code, sizeof(rom_header.head_code)) != 0) { fprintf(stderr, "Invalid rom file: %s\n", filepath); goto unpack_fail; } printf("rom version: %x.%x.%x\n", (rom_header.version >> 24) & 0xFF, (rom_header.version >> 16) & 0xFF, (rom_header.version) & 0xFFFF); printf("build time: %d-%02d-%02d %02d:%02d:%02d\n", rom_header.year, rom_header.month, rom_header.day, rom_header.hour, rom_header.minute, rom_header.second); printf("chip: %x\n", rom_header.chip); printf("checking md5sum...."); fflush(stdout); if (check_md5sum(fp, rom_header.image_offset + rom_header.image_length) != 0) { printf("Not match!\n"); goto unpack_fail; } printf("OK\n"); //export_data(loader_filename, rom_header.loader_offset, rom_header.loader_length, fp); export_data(dstfile, rom_header.image_offset, rom_header.image_length, fp); fclose(fp); return 0; unpack_fail: if (fp) fclose(fp); return -1; }
int main(int argc, char **argv) { alpm_list_t *i; int ret = 0; if(!(config = parse_opts(argc, argv))) { ret = 1; goto cleanup; } if(checks == 0) { checks = CHECK_DEPENDS | CHECK_FILES; } if(!(handle = pu_initialize_handle_from_config(config))) { fprintf(stderr, "error: failed to initialize alpm.\n"); ret = 1; goto cleanup; } localdb = alpm_get_localdb(handle); pkgcache = alpm_db_get_pkgcache(localdb); for(; optind < argc; ++optind) { if(load_pkg(argv[optind]) == NULL) { ret = 1; } } if(!isatty(fileno(stdin)) && errno != EBADF) { char *buf = NULL; size_t len = 0; ssize_t read; while((read = getdelim(&buf, &len, isep, stdin)) != -1) { if(buf[read - 1] == isep) { buf[read - 1] = '\0'; } if(load_pkg(buf) == NULL) { ret = 1; } } free(buf); } if(ret) { goto cleanup; } if(packages == NULL) { packages = alpm_list_copy(pkgcache); recursive = 0; } else if(recursive) { /* load [opt-]depends */ alpm_list_t *i, *originals = alpm_list_copy(packages); for(i = originals; i; i = alpm_list_next(i)) { add_deps(i->data); } alpm_list_free(originals); } for(i = packages; i; i = alpm_list_next(i)) { int pkgerr = 0; #define RUNCHECK(t, b) if((checks & t) && b != 0) { pkgerr = ret = 1; } RUNCHECK(CHECK_DEPENDS, check_depends(i->data)); RUNCHECK(CHECK_OPT_DEPENDS, check_opt_depends(i->data)); RUNCHECK(CHECK_FILES, check_files(i->data)); RUNCHECK(CHECK_FILE_PROPERTIES, check_file_properties(i->data)); RUNCHECK(CHECK_MD5SUM, check_md5sum(i->data)); RUNCHECK(CHECK_SHA256SUM, check_sha256sum(i->data)); #undef RUNCHECK if(pkgerr && list_broken) { printf("%s\n", alpm_pkg_get_name(i->data)); } } cleanup: alpm_list_free(packages); alpm_release(handle); pu_config_free(config); return ret; }