Radish alpha
H
HardenedBSD Package Manager
Radicle
Git (anonymous pull)
Log in to clone via SSH
Add pkg-check -l for reanalysing SHLIBS
Bryan Drewery committed 13 years ago
commit 8a04caf2d07bd8f4a335598f9bc29ce485cec357
parent db23d3e7b57847279b261314d2ff9783e5828643
5 files changed +95 -11
modified libpkg/pkg.h
@@ -977,6 +977,7 @@ int pkg_shutdown(void);

void pkg_test_filesum(struct pkg *);
void pkg_recompute(struct pkgdb *, struct pkg *);
+
int pkgdb_reanalyse_shlibs(struct pkgdb *, struct pkg *);

int pkg_get_myarch(char *pkgarch, size_t sz);

modified libpkg/pkgdb.c
@@ -1727,7 +1727,6 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int complete)
	struct pkg_license *license = NULL;
	struct pkg_user *user = NULL;
	struct pkg_group *group = NULL;
-
	struct pkg_shlib *shlib = NULL;
	struct pkgdb_it *it = NULL;

	sqlite3 *s;
@@ -1951,6 +1950,20 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int complete)
	/*
	 * Insert shlibs
	 */
+
	if (pkgdb_update_shlibs(pkg, package_id, s) != EPKG_OK)
+
		goto cleanup;
+

+
	retcode = EPKG_OK;
+

+
	cleanup:
+

+
	return (retcode);
+
}
+

+
int
+
pkgdb_update_shlibs(struct pkg *pkg, int64_t package_id, sqlite3 *s)
+
{
+
	struct pkg_shlib *shlib = NULL;

	while (pkg_shlibs(pkg, &shlib) == EPKG_OK) {
		if (run_prstmt(SHLIBS1, pkg_shlib_name(shlib))
@@ -1959,17 +1972,63 @@ pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int complete)
		    run_prstmt(SHLIBS2, package_id, pkg_shlib_name(shlib))
		    != SQLITE_DONE) {
			ERROR_SQLITE(s);
-
			goto cleanup;
+
			return (EPKG_FATAL);
		}
	}

-
	retcode = EPKG_OK;
+
	return (EPKG_OK);
+
}

-
	cleanup:
+
int
+
pkgdb_reanalyse_shlibs(struct pkgdb *db, struct pkg *pkg)
+
{
+
	sqlite3 *s;
+
	int64_t package_id;
+
	int ret = EPKG_OK;
+
	const char sql[] = "DELETE FROM pkg_shlibs WHERE package_id = ?1;";
+
	sqlite3_stmt *stmt_del;

-
	return (retcode);
+
	assert(db != NULL);
+

+
	if (pkg_is_valid(pkg) != EPKG_OK) {
+
		pkg_emit_error("the package is not valid");
+
		return (EPKG_FATAL);
+
	}
+

+
	if ((ret = pkg_analyse_files(db, pkg)) == EPKG_OK) {
+
		if (!db->prstmt_initialized && prstmt_initialize(db) != EPKG_OK)
+
			return (EPKG_FATAL);
+

+
		s = db->sqlite;
+
		pkg_get(pkg, PKG_ROWID, &package_id);
+

+
		/* Clean out old shlibs first */
+
		if (sqlite3_prepare_v2(db->sqlite, sql, -1, &stmt_del, NULL) != SQLITE_OK) {
+
			ERROR_SQLITE(db->sqlite);
+
			return (EPKG_FATAL);
+
		}
+

+
		sqlite3_bind_int64(stmt_del, 1, package_id);
+

+
		ret = sqlite3_step(stmt_del);
+
		sqlite3_finalize(stmt_del);
+

+
		if (ret != SQLITE_DONE) {
+
			ERROR_SQLITE(db->sqlite);
+
			return (EPKG_FATAL);
+
		}
+

+
		if (sql_exec(db->sqlite, "DELETE FROM shlibs WHERE id NOT IN (SELECT DISTINCT shlib_id FROM pkg_shlibs);") != EPKG_OK)
+
			return (EPKG_FATAL);
+

+
		/* Save shlibs */
+
		ret = pkgdb_update_shlibs(pkg, package_id, s);
+
	}
+

+
	return (ret);
}

+

int
pkgdb_register_finale(struct pkgdb *db, int retcode)
{
modified libpkg/private/pkg.h
@@ -270,6 +270,7 @@ int pkgdb_load_group(struct pkgdb *db, struct pkg *pkg);
int pkgdb_load_shlib(struct pkgdb *db, struct pkg *pkg);

int pkgdb_register_pkg(struct pkgdb *db, struct pkg *pkg, int complete);
+
int pkgdb_update_shlibs(struct pkg *pkg, int64_t package_id, sqlite3 *s);
int pkgdb_register_finale(struct pkgdb *db, int retcode);

#endif
modified pkg/check.c
@@ -221,7 +221,7 @@ check_summary(struct pkgdb *db, struct deps_head *dh)
void
usage_check(void)
{
-
	fprintf(stderr, "usage: pkg check [-dsr] [-vy] [-a | -gxX <pattern>]\n\n");
+
	fprintf(stderr, "usage: pkg check [-dlsr] [-vy] [-a | -gxX <pattern>]\n\n");
	fprintf(stderr, "For more information see 'pkg help check'.\n");
}

@@ -239,13 +239,15 @@ exec_check(int argc, char **argv)
	bool dcheck = false;
	bool checksums = false;
	bool recompute = false;
+
	bool reanalyse_shlibs = false;
+
	bool shlibs;
	int nbpkgs = 0;
	int i;
	int verbose = 0;

	struct deps_head dh = STAILQ_HEAD_INITIALIZER(dh);

-
	while ((ch = getopt(argc, argv, "yagdxXsrv")) != -1) {
+
	while ((ch = getopt(argc, argv, "yagdlxXsrv")) != -1) {
		switch (ch) {
			case 'a':
				match = MATCH_ALL;
@@ -266,6 +268,14 @@ exec_check(int argc, char **argv)
				dcheck = true;
				flags |= PKG_LOAD_DEPS;
				break;
+
			case 'l':
+
				pkg_config_bool(PKG_CONFIG_SHLIBS, &shlibs);
+
				if (!shlibs)
+
					errx(EX_USAGE, "reanalyzing shlibs requires SHLIBS"
+
						       " in pkg.conf.");
+
				reanalyse_shlibs = true;
+
				flags |= PKG_LOAD_FILES;
+
				break;
			case 's':
				checksums = true;
				flags |= PKG_LOAD_FILES;
@@ -289,9 +299,9 @@ exec_check(int argc, char **argv)
	argv += optind;

	/* Default to all packages if no pkg provided */
-
	if (argc == 0 && (dcheck || checksums || recompute)) {
+
	if (argc == 0 && (dcheck || checksums || recompute || reanalyse_shlibs)) {
		match = MATCH_ALL;
-
	} else if ((argc == 0 && match != MATCH_ALL) || !(dcheck || checksums || recompute)) {
+
	} else if ((argc == 0 && match != MATCH_ALL) || !(dcheck || checksums || recompute || reanalyse_shlibs)) {
		usage_check();
		return (EX_USAGE);
	}
@@ -333,6 +343,12 @@ exec_check(int argc, char **argv)
					printf("Recomputing size and checksums: %s\n", pkgname);
				pkg_recompute(db, pkg);
			}
+
			if (reanalyse_shlibs) {
+
				if (verbose)
+
					printf("Reanalyzing files for shlibs: %s\n", pkgname);
+
				if (pkgdb_reanalyse_shlibs(db, pkg) != EPKG_OK)
+
					printf("Failed to reanalyse for shlibs: %s\n", pkgname);
+
			}
		}

		if (geteuid() == 0 && nbpkgs > 0) {
modified pkg/pkg-check.8
@@ -15,7 +15,7 @@
.\"     @(#)pkg.8
.\" $FreeBSD$
.\"
-
.Dd May 30, 2012
+
.Dd July 9, 2012
.Dt PKG-CHECK 8
.Os
.Sh NAME
@@ -23,7 +23,7 @@
.Nd sanity checks installed packages
.Sh SYNOPSIS
.Nm
-
.Op Fl dsr
+
.Op Fl dlsr
.Op Fl vy
.Op Fl a | gxX Ar <pattern>
.Sh DESCRIPTION
@@ -32,6 +32,13 @@
is used to check for and install missing dependencies.
.Pp
.Nm
+
.Fl l
+
is used to reanalyse SHLIBS of installed packages.
+
See
+
.Xr pkg.conf 5
+
for more information on SHLIBS.
+
.Pp
+
.Nm
.Fl r
is used to recompute sizes and checksums of installed packages.
.Pp