int package(const char *pkg_name, const char *dir_name) { int ret; int pkg_fd; struct swan_package_info pkg_info; struct swan_file_info file_info; char tmp_path[1024], *name_p; int shrink_image_table[] = { SWAN_IMAGE_SYSTEM, SWAN_IMAGE_RECOVERY, SWAN_IMAGE_USERDATA, SWAN_IMAGE_VENDOR, }; struct swan_image_info *p, *p_end; name_p = text_path_cat(tmp_path, sizeof(tmp_path), dir_name, NULL); if (swan_machine_type == SWAN_BOARD_UNKNOWN) { text_copy(name_p, "system.img"); swan_machine_type = get_swan_board_type_by_system_img(tmp_path); } if (swan_machine_type == SWAN_BOARD_UNKNOWN) { pr_err_info("Machine type no set"); } else { struct swan_image_info *img_info; img_info = get_swan_image_info_by_type(SWAN_IMAGE_LOGO); if (img_info) { text_copy(img_info->filename, get_logo_name_by_board_type(swan_machine_type)); } img_info = get_swan_image_info_by_type(SWAN_IMAGE_BUSYBOX); if (img_info) { text_copy(img_info->filename, get_busybox_name_by_board_type(swan_machine_type)); } } pkg_fd = open(pkg_name, O_RDWR | O_CREAT | O_SYNC | O_TRUNC | O_BINARY, 0777); if (pkg_fd < 0) { pr_err_info("open file \"%s\"", pkg_name); return -1; } text_copy(name_p, HEADER_BIN_NAME); ret = write_upgrade_program(pkg_fd, &file_info, tmp_path); if (ret < 0) { pr_err_info("write_upgrade_program"); goto out_close_pkg; } ret = lseek(pkg_fd, sizeof(pkg_info), SEEK_CUR); if (ret < 0) { pr_err_info("lseek"); goto out_close_pkg; } ret = write_resource_image(pkg_fd, &pkg_info, dir_name, get_resource_name_by_board_type(swan_machine_type), RESOURCE_IMAGE_NAME, I600_RESOURCE_NAME, I200_RESOURCE_NAME, MODEM_RESOURCE_NAME, NULL); if (ret < 0) { pr_err_info("write_resource_image"); goto out_close_pkg; } pkg_info.image_count = 0; for (p = swan_images, p_end = p + ARRAY_SIZE(swan_images); p < p_end; p++) { text_copy(name_p, p->filename); if (array_has_element(p->type, (int *) swan_exclude_images, swan_exclude_image_count) || file_test(tmp_path, "r") < 0) { println_cyan("exclude image \"%s\"", tmp_path); continue; } if (swan_need_shrink && array_has_element(p->type, shrink_image_table, ARRAY_SIZE(shrink_image_table))) { ret = swan_shrink_image(dir_name, p); if (ret < 0) { pr_err_info("image_shrink"); goto out_close_pkg; } } ret = write_simple_image(pkg_fd, dir_name, p, &swan_emmc_part_table); if (ret < 0) { pr_err_info("write_image"); goto out_close_pkg; } pkg_info.image_count++; } pkg_info.crc32 = 0; ret = ffile_crc32_seek(pkg_fd, sizeof(file_info) + file_info.header_size + sizeof(pkg_info), 0, &pkg_info.crc32); if (ret < 0) { pr_err_info("ffile_crc32"); goto out_close_pkg; } strncpy(pkg_info.volume, swan_vfat_volume, sizeof(pkg_info.volume)); pkg_info.mkfs_mask = swan_mkfs_mask; pkg_info.board_type = swan_machine_type; pkg_info.upgrade_flags = swan_upgrade_flags; pkg_info.part_table = swan_emmc_part_table; show_package_info(&pkg_info); ret = lseek(pkg_fd, sizeof(file_info) + file_info.header_size, SEEK_SET); if (ret < 0) { pr_err_info("lseek"); goto out_close_pkg; } ret = write_package_info(pkg_fd, &pkg_info); if (ret < 0) { pr_err_info("write_package_info"); goto out_close_pkg; } ret = swan_set_md5sum(pkg_name); if (ret < 0) { pr_err_info("swan_set_md5sum"); } out_close_pkg: close(pkg_fd); if (ret < 0) { remove(pkg_name); return ret; } return 0; }
int main(int argc, char **argv) { unsigned packages_found = 0; pkg_t **packages = NULL; int i, sflag; #if defined MTRACE mtrace(); #endif if (parse_options(argc, argv)) usage(*argv); parse_config (); putchar ('\n'); xstrstr = (opt.case_insensitive) ? strcasestr : strstr; xstrcmp = (opt.case_insensitive) ? strcasecmp : strcmp; /* Load packages installed and split all folds. * Save in a global installed_t struct because * too many function they need. */ nginst = installed (&ginst); /* update */ if (opt.update) update(); /* upgrade all packages */ if (opt.upgrade) upgrade (opt.package); /* search */ if (opt.search || opt.get || opt.view || opt.getsrc || opt.buildsrc) { packages_list_check (true, PKGLIST_CHECK_QUIT_ON_ALL); fprintf (stdout, "Searching %s: ", (opt.package) ? opt.package : "all"); fflush (stdout); sflag = (!opt.package || !opt.use_regex) ? MATCH_ALL_NAME : MATCH_USING_REGEX; packages = pkgl2pkgt (search (sflag, opt.package), &packages_found); if (packages_found == 0) fprintf (stdout, "nothing found."); else fprintf (stdout, "found %u package%s.\n", packages_found, (packages_found > 1) ? "s" : ""); if (packages_found > 1000) fprintf (stdout, "Sorting packages: "); fflush (stdout); sort_pkg (&packages, &packages_found); if (packages_found > 1000) fprintf (stdout, "done.\n"); putchar ('\n'); show_pkg_found (packages, packages_found); } /* get */ if (opt.get) get (&packages, &packages_found); /* get build sources */ if (opt.getsrc || opt.buildsrc) pkgsrc_get (&packages, &packages_found); /* check for missing shared libraries */ if (opt.shared_dep) check_shared_dep (opt.package); /* check for missing packager-indicated library */ if (opt.packager_dep) search_packager_lib (opt.package); /* view */ if (opt.view) show_package_info (packages, packages_found); /* show packages installed */ if (opt.installed) installed_packages (opt.package); /* show non-slackware packages installed */ if (opt.nslack_installed) unofficial_packages (opt.package); /* show obsolete packages, installed but missing from repositories */ if (opt.obsolete) obsolete_packages (opt.package); /* show blacklisted packages available */ if (opt.show_blacklisted) blacklisted_packages (opt.package); if (opt.replaceable) replaceable_packages (opt.package); /* show repositoies stat */ if (opt.rstat) rstat(); /* clean slackyd directory */ if (opt.purge_all) { fprintf (stdout, "Cleaning cache...\n"); purge (PURGE_ALL); } if (opt.purge) { fprintf (stdout, "Removing packages and sources...\n"); purge (PURGE_PKG); } putchar ('\n'); /* cleanup */ free_installed_t (&ginst, nginst); pkg_t_free_all (&packages, packages_found); for (i = (signed)N_REPOS - 1; i >= 0; i--) { free (REPOS[i].name); free (REPOS[i].hostname); free (REPOS[i].path); } free (REPOS); free (opt.package); free (opt.config); free (opt.cache); while ((opt.nblacklisted--) > 0) { regfree (&opt.blacklisted[opt.nblacklisted]); } free (opt.blacklisted); return EXIT_SUCCESS; }