Example #1
0
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;
}
Example #2
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;
}