示例#1
0
文件: divertcmd.c 项目: guillemj/dpkg
static bool
diversion_is_shared(struct pkgset *set, struct fsys_namenode *namenode)
{
	const char *archname;
	struct pkginfo *pkg;
	struct dpkg_arch *arch;
	struct fsys_node_pkgs_iter *iter;
	bool shared = false;

	if (set == NULL)
		return false;

	archname = getenv("DPKG_MAINTSCRIPT_ARCH");
	arch = dpkg_arch_find(archname);
	if (arch->type == DPKG_ARCH_NONE || arch->type == DPKG_ARCH_EMPTY)
		return false;

	for (pkg = &set->pkg; pkg; pkg = pkg->arch_next)
		ensure_packagefiles_available(pkg);

	iter = fsys_node_pkgs_iter_new(namenode);
	while ((pkg = fsys_node_pkgs_iter_next(iter))) {
		if (pkg->set == set && pkg->installed.arch != arch) {
			shared = true;
			break;
		}
	}
	fsys_node_pkgs_iter_free(iter);

	return shared;
}
示例#2
0
文件: divertcmd.c 项目: guillemj/dpkg
static bool
diversion_is_essential(struct fsys_namenode *namenode)
{
	struct pkginfo *pkg;
	struct pkg_hash_iter *pkg_iter;
	struct fsys_node_pkgs_iter *iter;
	bool essential = false;

	pkg_iter = pkg_hash_iter_new();
	while ((pkg = pkg_hash_iter_next_pkg(pkg_iter))) {
		if (pkg->installed.essential)
			ensure_packagefiles_available(pkg);
	}
	pkg_hash_iter_free(pkg_iter);

	iter = fsys_node_pkgs_iter_new(namenode);
	while ((pkg = fsys_node_pkgs_iter_next(iter))) {
		if (pkg->installed.essential) {
			essential = true;
			break;
		}
	}
	fsys_node_pkgs_iter_free(iter);

	return essential;
}
示例#3
0
文件: verify.c 项目: guillemj/dpkg
static void
verify_package(struct pkginfo *pkg)
{
	struct fsys_namenode_list *file;
	struct varbuf filename = VARBUF_INIT;

	ensure_packagefiles_available(pkg);
	parse_filehash(pkg, &pkg->installed);
	pkg_conffiles_mark_old(pkg);

	for (file = pkg->files; file; file = file->next) {
		struct verify_checks checks;
		struct fsys_namenode *fnn;
		char hash[MD5HASHLEN + 1];
		int failures = 0;

		fnn = namenodetouse(file->namenode, pkg, &pkg->installed);

		if (strcmp(fnn->newhash, EMPTYHASHFLAG) == 0) {
			if (fnn->oldhash == NULL)
				continue;
			else
				fnn->newhash = fnn->oldhash;
		}

		varbuf_reset(&filename);
		varbuf_add_str(&filename, instdir);
		varbuf_add_str(&filename, fnn->name);
		varbuf_end_str(&filename);

		memset(&checks, 0, sizeof(checks));

		md5hash(pkg, hash, filename.buf);
		if (strcmp(hash, fnn->newhash) != 0) {
			checks.md5sum = VERIFY_FAIL;
			failures++;
		}

		if (failures)
			verify_output(fnn, &checks);
	}

	varbuf_destroy(&filename);
}
示例#4
0
文件: filesdb.c 项目: pexip/os-dpkg
void ensure_allinstfiles_available(void) {
  struct pkg_array array;
  struct pkginfo *pkg;
  struct progress progress;
  int i;

  if (allpackagesdone) return;
  if (saidread<2) {
    int max = pkg_db_count_pkg();

    saidread=1;
    progress_init(&progress, _("(Reading database ... "), max);
  }

  pkg_array_init_from_db(&array);

  pkg_files_optimize_load(&array);

  for (i = 0; i < array.n_pkgs; i++) {
    pkg = array.pkgs[i];
    ensure_packagefiles_available(pkg);

    if (saidread == 1)
      progress_step(&progress);
  }

  pkg_array_destroy(&array);

  allpackagesdone = true;

  if (saidread==1) {
    progress_done(&progress);
    printf(P_("%d file or directory currently installed.)\n",
              "%d files and directories currently installed.)\n", nfiles),
           nfiles);
    saidread=2;
  }
}
示例#5
0
文件: divertcmd.c 项目: guillemj/dpkg
static bool
diversion_is_owned_by_self(struct pkgset *set, struct fsys_namenode *namenode)
{
	struct pkginfo *pkg;
	struct fsys_node_pkgs_iter *iter;
	bool owned = false;

	if (set == NULL)
		return false;

	for (pkg = &set->pkg; pkg; pkg = pkg->arch_next)
		ensure_packagefiles_available(pkg);

	iter = fsys_node_pkgs_iter_new(namenode);
	while ((pkg = fsys_node_pkgs_iter_next(iter))) {
		if (pkg->set == set) {
			owned = true;
			break;
		}
	}
	fsys_node_pkgs_iter_free(iter);

	return owned;
}
示例#6
0
文件: verify.c 项目: mwhudson/dpkg
static void
verify_package(struct pkginfo *pkg)
{
	struct fileinlist *file;

	ensure_packagefiles_available(pkg);
	parse_filehash(pkg, &pkg->installed);
	pkg_conffiles_mark_old(pkg);

	for (file = pkg->clientdata->files; file; file = file->next) {
		struct verify_checks checks;
		struct filenamenode *fnn;
		char hash[MD5HASHLEN + 1];
		int failures = 0;

		fnn = namenodetouse(file->namenode, pkg, &pkg->installed);

		if (strcmp(fnn->newhash, EMPTYHASHFLAG) == 0) {
			if (fnn->oldhash == NULL)
				continue;
			else
				fnn->newhash = fnn->oldhash;
		}

		memset(&checks, 0, sizeof(checks));

		md5hash(pkg, hash, fnn->name);
		if (strcmp(hash, fnn->newhash) != 0) {
			checks.md5sum = VERIFY_FAIL;
			failures++;
		}

		if (failures)
			verify_output(fnn, &checks);
	}
}