int unpack(const char *pkg_name, const char *dir_name) { int ret; int pkg_fd; int img_fd; struct swan_file_info file_info; struct swan_package_info pkg_info; struct swan_image_info img_info; char tmp_path[1024]; pr_std_info("unpack upgrade file \"%s\" -> \"%s\"", pkg_name, dir_name); ret = swan_check_md5sum(pkg_name); if (ret < 0) { pr_err_info("swan_check_md5sum"); return ret; } pkg_fd = open(pkg_name, O_RDONLY | O_BINARY); if (pkg_fd < 0) { pr_err_info("open file \"%s\"", pkg_name); return -1; } ret = cavan_mkdir(dir_name); if (ret < 0) { pr_err_info("cavan_mkdir"); goto out_close_pkg; } text_path_cat(tmp_path, sizeof(tmp_path), dir_name, HEADER_BIN_NAME); ret = read_upgrade_program(pkg_fd, &file_info, tmp_path); if (ret < 0) { pr_err_info("get_upgrade_program"); goto out_close_pkg; } ret = read_resource_image(pkg_fd, &pkg_info, dir_name, 0, 0); if (ret < 0) { pr_err_info("get_resource_image"); goto out_close_pkg; } while (pkg_info.image_count) { ret = read_image_info(pkg_fd, &img_info); if (ret < 0) { pr_err_info("read_image_info"); goto out_close_pkg; } text_path_cat(tmp_path, sizeof(tmp_path), dir_name, img_info.filename); img_fd = open(tmp_path, O_WRONLY | O_CREAT | O_SYNC | O_TRUNC | O_BINARY, 0777); if (img_fd < 0) { pr_err_info("open"); goto out_close_pkg; } ret = read_simple_image(pkg_fd, img_fd, img_info.length, 0); if (ret < 0) { pr_err_info("get_image"); goto out_close_img; } close(img_fd); pkg_info.image_count--; } println_green("Decompression upgrade package \"%s\" to \"%s\" is ok", pkg_name, dir_name); ret = 0; goto out_close_pkg; out_close_img: close(img_fd); out_close_pkg: close(pkg_fd); if (ret < 0) { rmdir(dir_name); } return ret; }
int main(int argc, char *argv[]) { int i; int ret; int fd_in; int fd_out; struct bmp_file_header file_hdr; assert(argc == 3); fd_in = open(argv[1], O_RDONLY | O_BINARY); if (fd_in < 0) { print_error("open file \"%s\"", argv[1]); return -1; } if (file_test(argv[2], "d") < 0) { cavan_mkdir(argv[2]); } for (i = 0; i < 10; i++) { ret = bmp_read_file_header(fd_in, &file_hdr); if (ret < 0) { break; } fd_out = open(format_text("%s/%d.bmp", argv[2], i), O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0777); if (fd_out < 0) { print_error("open target file"); break; } ret = ffile_write(fd_out, &file_hdr, sizeof(file_hdr)); if (ret < (int) sizeof(file_hdr)) { print_error("write file header"); goto out_close_out; } ret = ffile_ncopy(fd_in, fd_out, file_hdr.size - sizeof(file_hdr)); if (ret < 0) { error_msg("write file"); goto out_close_out; } close(fd_out); } ret = 0; goto out_close_in; out_close_out: close(fd_out); out_close_in: close(fd_in); return ret; }