[Midnightbsd-cvs] src [7686] stable/0.8/lib/libmport: sync stable libmport with recent changes to current to fix some stability problems on i386.
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sun Aug 7 16:29:27 EDT 2016
Revision: 7686
http://svnweb.midnightbsd.org/src/?rev=7686
Author: laffer1
Date: 2016-08-07 16:29:26 -0400 (Sun, 07 Aug 2016)
Log Message:
-----------
sync stable libmport with recent changes to current to fix some stability problems on i386.
Modified Paths:
--------------
stable/0.8/lib/libmport/bundle_read.c
stable/0.8/lib/libmport/bundle_read_install_pkg.c
stable/0.8/lib/libmport/bundle_read_update_pkg.c
stable/0.8/lib/libmport/check_preconditions.c
stable/0.8/lib/libmport/db.c
stable/0.8/lib/libmport/index.c
stable/0.8/lib/libmport/index_depends.c
stable/0.8/lib/libmport/instance.c
stable/0.8/lib/libmport/merge_primative.c
stable/0.8/lib/libmport/mport.h
stable/0.8/lib/libmport/plist.c
stable/0.8/lib/libmport/setting.c
stable/0.8/lib/libmport/stats.c
stable/0.8/lib/libmport/update_primative.c
stable/0.8/lib/libmport/verify.c
Modified: stable/0.8/lib/libmport/bundle_read.c
===================================================================
--- stable/0.8/lib/libmport/bundle_read.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/bundle_read.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -258,9 +258,10 @@
bundle->stub_attached = 1;
- if (mport_db_prepare(mport->db, &stmt, "SELECT value FROM stub.meta WHERE field='bundle_format_version'") != MPORT_OK)
- RETURN_CURRENT_ERROR;
-
+ if (mport_db_prepare(mport->db, &stmt, "SELECT value FROM stub.meta WHERE field='bundle_format_version'") != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
ret = sqlite3_step(stmt);
switch (ret) {
Modified: stable/0.8/lib/libmport/bundle_read_install_pkg.c
===================================================================
--- stable/0.8/lib/libmport/bundle_read_install_pkg.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/bundle_read_install_pkg.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -42,6 +42,8 @@
#include <archive_entry.h>
+enum phase { PREINSTALL, ACTUALINSTALL, POSTINSTALL};
+
static int do_pre_install(mportInstance *, mportBundleRead *, mportPackageMeta *);
static int do_actual_install(mportInstance *, mportBundleRead *, mportPackageMeta *);
static int do_post_install(mportInstance *, mportBundleRead *, mportPackageMeta *);
@@ -49,6 +51,13 @@
static int run_pkg_install(mportInstance *, mportBundleRead *, mportPackageMeta *, const char *);
static int run_mtree(mportInstance *, mportBundleRead *, mportPackageMeta *);
static int display_pkg_msg(mportInstance *, mportBundleRead *, mportPackageMeta *);
+static int get_file_count(mportInstance *, char *, int *);
+static int create_package_row(mportInstance *, mportPackageMeta *);
+static int create_categories(mportInstance *mport, mportPackageMeta *pkg);
+static int create_depends(mportInstance *mport, mportPackageMeta *pkg);
+static int create_sample_file(const char *file);
+static int mark_complete(mportInstance *, mportPackageMeta *);
+static int mport_bundle_read_get_assetlist(mportInstance *mport, mportPackageMeta *pkg, mportAssetList **alist_p, enum phase);
/**
* This is a wrapper for all bund read install operations
@@ -80,233 +89,369 @@
static int
do_pre_install(mportInstance *mport, mportBundleRead *bundle, mportPackageMeta *pkg)
{
- int ret;
- char cwd[FILENAME_MAX];
- char file[FILENAME_MAX];
- sqlite3_stmt *assets = NULL;
- sqlite3 *db = mport->db;
- mportAssetListEntryType type;
- const char *data;
+ char cwd[FILENAME_MAX];
+ char file[FILENAME_MAX];
+ mportAssetList *alist;
+ mportAssetListEntry *e = NULL;
- /* run mtree */
- if (run_mtree(mport, bundle, pkg) != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ /* run mtree */
+ if (run_mtree(mport, bundle, pkg) != MPORT_OK)
+ RETURN_CURRENT_ERROR;
- /* run pkg-install PRE-INSTALL */
- if (run_pkg_install(mport, bundle, pkg, "PRE-INSTALL") != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ /* run pkg-install PRE-INSTALL */
+ if (run_pkg_install(mport, bundle, pkg, "PRE-INSTALL") != MPORT_OK)
+ RETURN_CURRENT_ERROR;
- /* Process @preexec steps */
- if (mport_db_prepare(db, &assets, "SELECT type, data FROM stub.assets WHERE pkg=%Q and type in (%d, %d)", pkg->name, ASSET_CWD, ASSET_PREEXEC) != MPORT_OK)
- goto ERROR;
+ /* Process @preexec steps */
+ if (mport_bundle_read_get_assetlist(mport, pkg, &alist, PREINSTALL) != MPORT_OK)
+ goto ERROR;
- (void) strlcpy(cwd, pkg->prefix, sizeof(cwd));
+ (void) strlcpy(cwd, pkg->prefix, sizeof(cwd));
- if (mport_chdir(mport, cwd) != MPORT_OK)
- goto ERROR;
+ if (mport_chdir(mport, cwd) != MPORT_OK)
+ goto ERROR;
- while (1) {
- ret = sqlite3_step(assets);
+ STAILQ_FOREACH(e, alist, next) {
+ switch (e->type) {
+ case ASSET_CWD:
+ (void) strlcpy(cwd, e->data == NULL ? pkg->prefix : e->data, sizeof(cwd));
+ if (mport_chdir(mport, cwd) != MPORT_OK)
+ goto ERROR;
- if (ret == SQLITE_DONE)
- break;
+ break;
+ case ASSET_PREEXEC:
+ if (mport_run_asset_exec(mport, e->data, cwd, file) != MPORT_OK)
+ goto ERROR;
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+ }
- if (ret != SQLITE_ROW) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
- goto ERROR;
- }
+ mport_assetlist_free(alist);
+ mport_pkgmeta_logevent(mport, pkg, "preexec");
- type = (mportAssetListEntryType) sqlite3_column_int(assets, 0);
- data = sqlite3_column_text(assets, 1);
+ return MPORT_OK;
- switch (type) {
- case ASSET_CWD:
- (void) strlcpy(cwd, data == NULL ? pkg->prefix : data, sizeof(cwd));
- if (mport_chdir(mport, cwd) != MPORT_OK)
- goto ERROR;
+ ERROR:
+ // TODO: asset list free
+ RETURN_CURRENT_ERROR;
+}
- break;
- case ASSET_PREEXEC:
- if (mport_run_asset_exec(mport, data, cwd, file) != MPORT_OK)
- goto ERROR;
- break;
- default:
- /* do nothing */
- break;
- }
- }
- sqlite3_finalize(assets);
- mport_pkgmeta_logevent(mport, pkg, "preexec");
+/* get the file count for the progress meter */
+static int
+get_file_count(mportInstance *mport, char *pkg_name, int *file_total)
+{
+ __block sqlite3_stmt *count;
+ __block int result = MPORT_OK;
+ __block char *err;
- return MPORT_OK;
+ if (mport_db_prepare(mport->db, &count,
+ "SELECT COUNT(*) FROM stub.assets WHERE (type=%i or type=%i or type=%i or type=%i) AND pkg=%Q",
+ ASSET_FILE, ASSET_SAMPLE, ASSET_SHELL, ASSET_FILE_OWNER_MODE, pkg_name) != MPORT_OK) {
+ sqlite3_finalize(count);
+ RETURN_CURRENT_ERROR;
+ }
- ERROR:
- sqlite3_finalize(assets);
- RETURN_CURRENT_ERROR;
+ dispatch_sync(mportSQLSerial, ^{
+ switch (sqlite3_step(count)) {
+ case SQLITE_ROW:
+ *file_total = sqlite3_column_int(count, 0);
+ sqlite3_finalize(count);
+ break;
+ default:
+ err = (char *) sqlite3_errmsg(mport->db);
+ result = MPORT_ERR_FATAL;
+ sqlite3_finalize(count);
+ }
+ });
+
+ if (result == MPORT_ERR_FATAL)
+ SET_ERRORX(result, "Error reading file count %s", err);
+ return result;
}
static int
+create_package_row(mportInstance *mport, mportPackageMeta *pkg)
+{
+ /* Insert the package meta row into the packages table (We use pack here because things might have been twiddled) */
+ /* Note that this will be marked as dirty by default */
+ if (mport_db_do(mport->db,
+ "INSERT INTO packages (pkg, version, origin, prefix, lang, options, comment, os_release, cpe, locked) VALUES (%Q,%Q,%Q,%Q,%Q,%Q,%Q,%Q,%Q,0)",
+ pkg->name, pkg->version, pkg->origin, pkg->prefix, pkg->lang, pkg->options, pkg->comment,
+ pkg->os_release, pkg->cpe) != MPORT_OK)
+ RETURN_CURRENT_ERROR;
+
+ return MPORT_OK;
+}
+
+static int
+create_depends(mportInstance *mport, mportPackageMeta *pkg)
+{
+ /* Insert the depends into the master table */
+ if (mport_db_do(mport->db,
+ "INSERT INTO depends (pkg, depend_pkgname, depend_pkgversion, depend_port) SELECT pkg,depend_pkgname,depend_pkgversion,depend_port FROM stub.depends WHERE pkg=%Q",
+ pkg->name) != MPORT_OK)
+ RETURN_CURRENT_ERROR;
+
+ return MPORT_OK;
+}
+
+static int
+create_categories(mportInstance *mport, mportPackageMeta *pkg)
+{
+ /* Insert the categories into the master table */
+ if (mport_db_do(mport->db, "INSERT INTO categories (pkg, category) SELECT pkg, category FROM stub.categories WHERE pkg=%Q",
+ pkg->name) != MPORT_OK)
+ RETURN_CURRENT_ERROR;
+
+ return MPORT_OK;
+}
+
+static int
+create_sample_file(const char *file)
+{
+ char nonSample[FILENAME_MAX];
+ strlcpy(nonSample, file, FILENAME_MAX);
+ char *sptr = strcasestr(nonSample, ".sample");
+ if (sptr != NULL) {
+ sptr[0] = '\0'; /* hack off .sample */
+ if (!mport_file_exists(nonSample)) {
+ if (mport_copy_file(file, nonSample) != MPORT_OK)
+ RETURN_CURRENT_ERROR;
+ }
+ }
+
+ return MPORT_OK;
+}
+
+/**
+ * Get the list of assets (plist entries) from the stub attached database (package we are installing)
+ * filtered on entries that are not pre/post exec.
+ */
+static int
+mport_bundle_read_get_assetlist(mportInstance *mport, mportPackageMeta *pkg, mportAssetList **alist_p, enum phase state)
+{
+ __block mportAssetList *alist;
+ __block sqlite3_stmt *stmt = NULL;
+ __block int result = MPORT_OK;
+ __block char *err;
+
+ if ((alist = mport_assetlist_new()) == NULL)
+ RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory.");
+
+ *alist_p = alist;
+
+ if (state == PREINSTALL) {
+ if (mport_db_prepare(mport->db, &stmt, "SELECT type,data,checksum,owner,grp,mode FROM stub.assets WHERE pkg=%Q and type in (%d, %d)", pkg->name, ASSET_CWD, ASSET_PREEXEC) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
+ } else if (state == ACTUALINSTALL) {
+ if (mport_db_prepare(mport->db, &stmt,
+ "SELECT type,data,checksum,owner,grp,mode FROM stub.assets WHERE pkg=%Q and type not in (%d, %d)",
+ pkg->name, ASSET_PREEXEC, ASSET_POSTEXEC) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
+ } else if (state == POSTINSTALL) {
+ if (mport_db_prepare(mport->db, &stmt, "SELECT type,data,checksum,owner,grp,mode FROM stub.assets WHERE pkg=%Q and type in (%d, %d)", pkg->name, ASSET_CWD, ASSET_POSTEXEC) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
+ }
+
+ if (stmt == NULL) {
+ RETURN_ERROR(MPORT_ERR_FATAL, "Statement was null");
+ }
+
+ dispatch_sync(mportSQLSerial, ^{
+ while (1) {
+ mportAssetListEntry *e;
+
+ int ret = sqlite3_step(stmt);
+
+ if (ret == SQLITE_BUSY || ret == SQLITE_LOCKED) {
+ sleep(1);
+ ret = sqlite3_step(stmt);
+ }
+
+ if (ret == SQLITE_DONE)
+ break;
+
+ if (ret != SQLITE_ROW) {
+ err = (char *) sqlite3_errmsg(mport->db);
+ result = MPORT_ERR_FATAL;
+ break; // we finalize below
+ }
+
+ e = (mportAssetListEntry *) calloc(1, sizeof(mportAssetListEntry));
+
+ if (e == NULL) {
+ err = "Out of memory";
+ result = MPORT_ERR_FATAL;
+ break; // we finalize below
+ }
+
+ e->type = (mportAssetListEntryType) sqlite3_column_int(stmt, 0);
+ const unsigned char *data = sqlite3_column_text(stmt, 1);
+ const unsigned char *checksum = sqlite3_column_text(stmt, 2);
+ const unsigned char *owner = sqlite3_column_text(stmt, 3);
+ const unsigned char *group = sqlite3_column_text(stmt, 4);
+ const unsigned char *mode = sqlite3_column_text(stmt, 5);
+
+ if (data == NULL) {
+ err = "Out of memory";
+ result = MPORT_ERR_FATAL;
+ break; // we finalize below
+ }
+
+ e->data = strdup((char *) data);
+ if (checksum != NULL)
+ e->checksum = strdup((char *) checksum);
+ if (owner != NULL)
+ e->owner = strdup((char *) owner);
+ if (group != NULL)
+ e->group = strdup((char *) group);
+ if (mode != NULL)
+ e->mode = strdup((char *) mode);
+
+ if (e->data == NULL) {
+ err = "Out of memory";
+ result = MPORT_ERR_FATAL;
+ break;
+ }
+
+ STAILQ_INSERT_TAIL(alist, e, next);
+ }
+
+ sqlite3_finalize(stmt);
+ });
+
+ if (result == MPORT_ERR_FATAL)
+ SET_ERRORX(result, "Error reading assets %s", err);
+ return result;
+}
+
+static int
do_actual_install(mportInstance *mport, mportBundleRead *bundle, mportPackageMeta *pkg)
{
- int file_total, ret;
+ mportAssetList *alist = NULL;
+ mportAssetListEntry *e = NULL;
+ int file_total;
int file_count = 0;
- mportAssetListEntryType type;
struct archive_entry *entry;
- const char *data, *checksum;
- char *orig_cwd;
+ char *orig_cwd = NULL;
uid_t owner = 0; /* root */
gid_t group = 0; /* wheel */
- mode_t *set;
+ mode_t *set = NULL;
mode_t newmode;
- mode_t *dirset;
+ mode_t *dirset = NULL;
mode_t dirnewmode;
char *mode = NULL;
char *mkdirp = NULL;
struct stat sb;
char file[FILENAME_MAX], cwd[FILENAME_MAX], dir[FILENAME_MAX];
- char *fm_owner, *fm_group, *fm_mode;
- sqlite3_stmt *assets = NULL, *count, *insert = NULL;
- sqlite3 *db;
+ sqlite3_stmt *insert = NULL;
- db = mport->db;
-
/* sadly, we can't just use abs pathnames, because it will break hardlinks */
orig_cwd = getcwd(NULL, 0);
- /* get the file count for the progress meter */
- if (mport_db_prepare(db, &count,
- "SELECT COUNT(*) FROM stub.assets WHERE (type=%i or type=%i or type=%i or type=%i) AND pkg=%Q",
- ASSET_FILE, ASSET_SAMPLE, ASSET_SHELL, ASSET_FILE_OWNER_MODE, pkg->name) != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (get_file_count(mport, pkg->name, &file_total) != MPORT_OK)
+ goto ERROR;
- switch (sqlite3_step(count)) {
- case SQLITE_ROW:
- file_total = sqlite3_column_int(count, 0);
- sqlite3_finalize(count);
- break;
- default:
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
- sqlite3_finalize(count);
- RETURN_CURRENT_ERROR;
- }
-
mport_call_progress_init_cb(mport, "Installing %s-%s", pkg->name, pkg->version);
- /* Insert the package meta row into the packages table (We use pack here because things might have been twiddled) */
- /* Note that this will be marked as dirty by default */
- if (mport_db_do(db,
- "INSERT INTO packages (pkg, version, origin, prefix, lang, options, comment, os_release, cpe, locked) VALUES (%Q,%Q,%Q,%Q,%Q,%Q,%Q,%Q,%Q,0)",
- pkg->name, pkg->version, pkg->origin, pkg->prefix, pkg->lang, pkg->options, pkg->comment,
- pkg->os_release, pkg->cpe) != MPORT_OK)
- goto ERROR;
+ if (mport_bundle_read_get_assetlist(mport, pkg, &alist, ACTUALINSTALL) != MPORT_OK)
+ goto ERROR;
+ if (create_package_row(mport, pkg) != MPORT_OK)
+ goto ERROR;
+
+ if (create_depends(mport, pkg) != MPORT_OK)
+ goto ERROR;
+
+ if (create_categories(mport, pkg) != MPORT_OK)
+ goto ERROR;
+
/* Insert the assets into the master table (We do this one by one because we want to insert file
* assets as absolute paths. */
- if (mport_db_prepare(db, &insert, "INSERT INTO assets (pkg, type, data, checksum, owner, grp, mode) values (%Q,?,?,?,?,?,?)", pkg->name) !=
+ if (mport_db_prepare(mport->db, &insert, "INSERT INTO assets (pkg, type, data, checksum, owner, grp, mode) values (%Q,?,?,?,?,?,?)", pkg->name) !=
MPORT_OK)
goto ERROR;
- /* Insert the depends into the master table */
- if (mport_db_do(db,
- "INSERT INTO depends (pkg, depend_pkgname, depend_pkgversion, depend_port) SELECT pkg,depend_pkgname,depend_pkgversion,depend_port FROM stub.depends WHERE pkg=%Q",
- pkg->name) != MPORT_OK)
- goto ERROR;
- /* Insert the categories into the master table */
- if (mport_db_do(db, "INSERT INTO categories (pkg, category) SELECT pkg, category FROM stub.categories WHERE pkg=%Q",
- pkg->name) != MPORT_OK)
- goto ERROR;
- if (mport_db_prepare(db, &assets, "SELECT type,data,checksum,owner,grp,mode FROM stub.assets WHERE pkg=%Q and type not in (%d, %d)", pkg->name, ASSET_PREEXEC, ASSET_POSTEXEC) != MPORT_OK)
- goto ERROR;
-
(void) strlcpy(cwd, pkg->prefix, sizeof(cwd));
if (mport_chdir(mport, cwd) != MPORT_OK)
goto ERROR;
- while (1) {
- ret = sqlite3_step(assets);
-
- if (ret == SQLITE_DONE)
- break;
-
- if (ret != SQLITE_ROW) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
- goto ERROR;
- }
-
- type = (mportAssetListEntryType) sqlite3_column_int(assets, 0);
- data = (char *) sqlite3_column_text(assets, 1);
- checksum = (char *) sqlite3_column_text(assets, 2);
- fm_owner = (char *) sqlite3_column_text(assets, 3);
- fm_group = (char *) sqlite3_column_text(assets, 4);
- fm_mode = (char *) sqlite3_column_text(assets, 5);
-
- switch (type) {
+ STAILQ_FOREACH(e, alist, next) {
+ switch (e->type) {
case ASSET_CWD:
- (void) strlcpy(cwd, data == NULL ? pkg->prefix : data, sizeof(cwd));
+ (void) strlcpy(cwd, e->data == NULL ? pkg->prefix : e->data, sizeof(cwd));
if (mport_chdir(mport, cwd) != MPORT_OK)
goto ERROR;
-
break;
case ASSET_CHMOD:
if (mode != NULL)
free(mode);
/* TODO: should we reset the mode rather than NULL here */
- if (data == NULL)
+ if (e->data == NULL)
mode = NULL;
else
- mode = strdup(data);
+ mode = strdup(e->data);
break;
case ASSET_CHOWN:
- owner = mport_get_uid(data);
+ owner = mport_get_uid(e->data);
break;
case ASSET_CHGRP:
- group = mport_get_gid(data);
+ group = mport_get_gid(e->data);
break;
case ASSET_DIR:
case ASSET_DIRRM:
case ASSET_DIRRMTRY:
- case ASSET_DIR_OWNER_MODE:
- mkdirp = strdup(data); /* need a char * here */
- if (mport_mkdirp(mkdirp, S_IRWXU | S_IRWXG | S_IRWXO) == 0) {
- free(mkdirp);
- SET_ERRORX(MPORT_ERR_FATAL, "Unable to create directory %s", data);
- goto ERROR;
- }
- free(mkdirp);
+ case ASSET_DIR_OWNER_MODE:
+ mkdirp = strdup(e->data); /* need a char * here */
+ if (mkdirp == NULL || mport_mkdirp(mkdirp, S_IRWXU | S_IRWXG | S_IRWXO) == 0) {
+ free(mkdirp);
+ SET_ERRORX(MPORT_ERR_FATAL, "Unable to create directory %s", e->data);
+ goto ERROR;
+ }
+ free(mkdirp);
- if (fm_mode != NULL && fm_mode[0] != '\0') {
- if ((dirset = setmode(fm_mode)) == NULL)
+ if (e->mode != NULL && e->mode[0] != '\0') {
+ if ((dirset = setmode(e->mode)) == NULL)
goto ERROR;
dirnewmode = getmode(dirset, sb.st_mode);
free(dirset);
- if (chmod(data, dirnewmode))
+ if (chmod(e->data, dirnewmode))
goto ERROR;
- }
- if (fm_owner != NULL && fm_group != NULL && fm_owner[0] != '\0' && fm_group[0] != '\0') {
- if (chown(data, mport_get_uid(fm_owner), mport_get_gid(fm_group)) == -1) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
- goto ERROR;
- }
- } else if (fm_owner != NULL && fm_owner[0] != '\0') {
- if (chown(data, mport_get_uid(fm_owner), group) == -1) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
- goto ERROR;
- }
- } else if (fm_group != NULL && fm_group[0] != '\0') {
- if (chown(data, owner, mport_get_gid(fm_group)) == -1) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
- goto ERROR;
- }
+ }
+ if (e->owner != NULL && e->group != NULL && e->owner[0] != '\0' && e->group[0] != '\0') {
+ if (chown(e->data, mport_get_uid(e->owner), mport_get_gid(e->group)) == -1) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
+ goto ERROR;
+ }
+ } else if (e->owner != NULL && e->owner[0] != '\0') {
+ if (chown(e->data, mport_get_uid(e->owner), group) == -1) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
+ goto ERROR;
+ }
+ } else if (e->group != NULL && e->group[0] != '\0') {
+ if (chown(e->data, owner, mport_get_gid(e->group)) == -1) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
+ goto ERROR;
+ }
}
- break;
+ break;
case ASSET_EXEC:
- if (mport_run_asset_exec(mport, data, cwd, file) != MPORT_OK)
+ if (mport_run_asset_exec(mport, e->data, cwd, file) != MPORT_OK)
goto ERROR;
break;
case ASSET_FILE_OWNER_MODE:
- /* FALLS THROUGH */
+ /* FALLS THROUGH */
case ASSET_FILE:
/* FALLS THROUGH */
case ASSET_SHELL:
@@ -315,11 +460,11 @@
if (mport_bundle_read_next_entry(bundle, &entry) != MPORT_OK)
goto ERROR;
- (void) snprintf(file, FILENAME_MAX, "%s%s/%s", mport->root, cwd, data);
- if (entry == NULL) {
- SET_ERROR(MPORT_ERR_FATAL, "Unexpected EOF with archive file");
- goto ERROR;
- }
+ (void) snprintf(file, FILENAME_MAX, "%s%s/%s", mport->root, cwd, e->data);
+ if (entry == NULL) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unexpected EOF with archive file");
+ goto ERROR;
+ }
archive_entry_set_pathname(entry, file);
@@ -327,96 +472,87 @@
goto ERROR;
if (lstat(file, &sb)) {
- SET_ERRORX(MPORT_ERR_FATAL, "Unable to stat file %s", file);
+ SET_ERRORX(MPORT_ERR_FATAL, "Unable to stat file %s", file);
goto ERROR;
- }
+ }
if (S_ISREG(sb.st_mode)) {
- if (type == ASSET_FILE_OWNER_MODE) {
- /* Test for owner and group settings, otherwise roll with our default. */
- if (fm_owner != NULL && fm_group != NULL && fm_owner[0] != '\0' && fm_group[0] != '\0') {
+ if (e->type == ASSET_FILE_OWNER_MODE) {
+ /* Test for owner and group settings, otherwise roll with our default. */
+ if (e->owner != NULL && e->group != NULL && e->owner[0] != '\0' && e->group[0] != '\0') {
#ifdef DEBUG
- fprintf(stderr, "owner %s and group %s\n", fm_owner, fm_group);
+ fprintf(stderr, "owner %s and group %s\n", fm_owner, fm_group);
#endif
- if (chown(file, mport_get_uid(fm_owner), mport_get_gid(fm_group)) == -1) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
- goto ERROR;
- }
- } else if (fm_owner != NULL && fm_owner[0] != '\0') {
+ if (chown(file, mport_get_uid(e->owner), mport_get_gid(e->group)) == -1) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
+ goto ERROR;
+ }
+ } else if (e->owner != NULL && e->owner[0] != '\0') {
#ifdef DEBUG
- fprintf(stderr, "owner %s\n", fm_owner);
+ fprintf(stderr, "owner %s\n", e->owner);
#endif
- if (chown(file, mport_get_uid(fm_owner), group) == -1) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
- goto ERROR;
- }
- } else if (fm_group != NULL && fm_group[0] != '\0') {
+ if (chown(file, mport_get_uid(e->owner), group) == -1) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
+ goto ERROR;
+ }
+ } else if (e->group != NULL && e->group[0] != '\0') {
#ifdef DEBUG
- fprintf(stderr, "group %s\n", fm_group);
+ fprintf(stderr, "group %s\n", e->group);
#endif
- if (chown(file, owner, mport_get_gid(fm_group)) == -1) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
- goto ERROR;
- }
- } else {
- // use default.
- if (chown(file, owner, group) == -1) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
- goto ERROR;
- }
- }
- } else {
- /* Set the owner and group */
- if (chown(file, owner, group) == -1) {
- SET_ERRORX(MPORT_ERR_FATAL, "Unable to set permissions on file %s", file);
- goto ERROR;
- }
- }
+ if (chown(file, owner, mport_get_gid(e->group)) == -1) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
+ goto ERROR;
+ }
+ } else {
+ // use default.
+ if (chown(file, owner, group) == -1) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to change owner");
+ goto ERROR;
+ }
+ }
+ } else {
+ /* Set the owner and group */
+ if (chown(file, owner, group) == -1) {
+ SET_ERRORX(MPORT_ERR_FATAL, "Unable to set permissions on file %s", file);
+ goto ERROR;
+ }
+ }
/* Set the file permissions, assumes non NFSv4 */
if (mode != NULL) {
if (stat(file, &sb)) {
- SET_ERRORX(MPORT_ERR_FATAL, "Unable to stat file %s", file);
+ SET_ERRORX(MPORT_ERR_FATAL, "Unable to stat file %s", file);
goto ERROR;
- }
- if (type == ASSET_FILE_OWNER_MODE && fm_mode != NULL) {
- if ((set = setmode(fm_mode)) == NULL) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to set mode");
- goto ERROR;
- }
- } else {
+ }
+ if (e->type == ASSET_FILE_OWNER_MODE && e->mode != NULL) {
+ if ((set = setmode(e->mode)) == NULL) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to set mode");
+ goto ERROR;
+ }
+ } else {
if ((set = setmode(mode)) == NULL) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to set mode");
- goto ERROR;
- }
- }
- newmode = getmode(set, sb.st_mode);
- free(set);
- if (chmod(file, newmode)) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to set file permissions");
- goto ERROR;
- }
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to set mode");
+ goto ERROR;
+ }
+ }
+ newmode = getmode(set, sb.st_mode);
+ free(set);
+ if (chmod(file, newmode)) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to set file permissions");
+ goto ERROR;
+ }
}
/* shell registration */
- if (type == ASSET_SHELL) {
- if (mport_shell_register(file) != MPORT_OK)
- goto ERROR;
+ if (e->type == ASSET_SHELL && mport_shell_register(file) != MPORT_OK) {
+ goto ERROR;
}
- /* for sample files, if we don't have an existing file
- make a new one */
- if (type == ASSET_SAMPLE) {
- char nonSample[FILENAME_MAX];
- strlcpy(nonSample, file, FILENAME_MAX);
- char *sptr = strcasestr(nonSample, ".sample");
- if (sptr != NULL) {
- sptr[0] = '\0'; /* hack off .sample */
- if (!mport_file_exists(nonSample)) {
- mport_copy_file(file, nonSample);
- }
- }
- }
+ /* for sample files, if we don't have an existing file, make a new one */
+ if (e->type == ASSET_SAMPLE && create_sample_file(file) != MPORT_OK) {
+ SET_ERRORX(MPORT_ERR_FATAL, "Unable to create sample file from %s", file);
+ goto ERROR;
+ }
}
(mport->progress_step_cb)(++file_count, file_total, file);
@@ -428,92 +564,92 @@
}
/* insert this asset into the master database */
- if (sqlite3_bind_int(insert, 1, (int) type) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ if (sqlite3_bind_int(insert, 1, (int) e->type) != SQLITE_OK) {
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
- if (type == ASSET_FILE || type == ASSET_SAMPLE || type == ASSET_SHELL || type == ASSET_FILE_OWNER_MODE) {
+ if (e->type == ASSET_FILE || e->type == ASSET_SAMPLE || e->type == ASSET_SHELL || e->type == ASSET_FILE_OWNER_MODE) {
/* don't put the root in the database! */
if (sqlite3_bind_text(insert, 2, file + strlen(mport->root), -1, SQLITE_STATIC) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
- if (sqlite3_bind_text(insert, 3, checksum, -1, SQLITE_STATIC) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ if (sqlite3_bind_text(insert, 3, e->checksum, -1, SQLITE_STATIC) != SQLITE_OK) {
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
- if (sqlite3_bind_text(insert, 4, fm_owner, -1, SQLITE_STATIC) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ if (sqlite3_bind_text(insert, 4, e->owner, -1, SQLITE_STATIC) != SQLITE_OK) {
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
- if (sqlite3_bind_text(insert, 5, fm_group, -1, SQLITE_STATIC) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ if (sqlite3_bind_text(insert, 5, e->group, -1, SQLITE_STATIC) != SQLITE_OK) {
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
- if (sqlite3_bind_text(insert, 6, fm_mode, -1, SQLITE_STATIC) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ if (sqlite3_bind_text(insert, 6, e->mode, -1, SQLITE_STATIC) != SQLITE_OK) {
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
- } else if (type == ASSET_DIR || type == ASSET_DIRRM || type == ASSET_DIRRMTRY) {
+ } else if (e->type == ASSET_DIR || e->type == ASSET_DIRRM || e->type == ASSET_DIRRMTRY) {
/* if data starts with /, it's most likely an absolute path. Don't prepend cwd */
- if (data != NULL && data[0] == '/')
- (void) snprintf(dir, FILENAME_MAX, "%s", data);
- else
- (void) snprintf(dir, FILENAME_MAX, "%s/%s", cwd, data);
+ if (e->data != NULL && e->data[0] == '/')
+ (void) snprintf(dir, FILENAME_MAX, "%s", e->data);
+ else
+ (void) snprintf(dir, FILENAME_MAX, "%s/%s", cwd, e->data);
if (sqlite3_bind_text(insert, 2, dir, -1, SQLITE_STATIC) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
if (sqlite3_bind_null(insert, 3) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
if (sqlite3_bind_null(insert, 4) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
if (sqlite3_bind_null(insert, 5) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
if (sqlite3_bind_null(insert, 6) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
} else {
- if (sqlite3_bind_text(insert, 2, data, -1, SQLITE_STATIC) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ if (sqlite3_bind_text(insert, 2, e->data, -1, SQLITE_STATIC) != SQLITE_OK) {
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
if (sqlite3_bind_null(insert, 3) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
if (sqlite3_bind_null(insert, 4) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
if (sqlite3_bind_null(insert, 5) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
if (sqlite3_bind_null(insert, 6) != SQLITE_OK) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
}
if (sqlite3_step(insert) != SQLITE_DONE) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
+ SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db));
goto ERROR;
}
@@ -520,24 +656,21 @@
sqlite3_reset(insert);
}
- sqlite3_finalize(assets);
sqlite3_finalize(insert);
- if (mport_db_do(db, "UPDATE packages SET status='clean' WHERE pkg=%Q", pkg->name) != MPORT_OK) {
- SET_ERROR(MPORT_ERR_FATAL, "Unable to mark package clean");
- goto ERROR;
- }
- mport_pkgmeta_logevent(mport, pkg, "Installed");
+ mport_pkgmeta_logevent(mport, pkg, "Installed");
+
(mport->progress_free_cb)();
(void) mport_chdir(NULL, orig_cwd);
free(orig_cwd);
+ mport_assetlist_free(alist);
return MPORT_OK;
ERROR:
- sqlite3_finalize(assets);
- sqlite3_finalize(insert);
+ sqlite3_finalize(insert);
(mport->progress_free_cb)();
free(orig_cwd);
+ mport_assetlist_free(alist);
//rollback();
RETURN_CURRENT_ERROR;
}
@@ -553,6 +686,18 @@
}
static int
+mark_complete(mportInstance *mport, mportPackageMeta *pkg)
+{
+ if (mport_db_do(mport->db, "UPDATE packages SET status='clean' WHERE pkg=%Q", pkg->name) != MPORT_OK) {
+ SET_ERROR(MPORT_ERR_FATAL, "Unable to mark package clean");
+ RETURN_CURRENT_ERROR;
+ }
+
+ return MPORT_OK;
+}
+
+
+static int
do_post_install(mportInstance *mport, mportBundleRead *bundle, mportPackageMeta *pkg)
{
char to[FILENAME_MAX], from[FILENAME_MAX];
@@ -568,24 +713,23 @@
if (display_pkg_msg(mport, bundle, pkg) != MPORT_OK)
RETURN_CURRENT_ERROR;
- return run_pkg_install(mport, bundle, pkg, "POST-INSTALL");
+ if (run_pkg_install(mport, bundle, pkg, "POST-INSTALL") != MPORT_OK)
+ RETURN_CURRENT_ERROR;
+
+ return mark_complete(mport, pkg);
}
+
static int
run_postexec(mportInstance *mport, mportPackageMeta *pkg)
{
- int ret;
- char cwd[FILENAME_MAX];
- sqlite3_stmt *assets = NULL;
- sqlite3 *db;
- mportAssetListEntryType type;
- const char *data;
+ mportAssetList *alist;
+ mportAssetListEntry *e = NULL;
+ char cwd[FILENAME_MAX];
- db = mport->db;
-
/* Process @postexec steps */
- if (mport_db_prepare(db, &assets, "SELECT type, data FROM stub.assets WHERE pkg=%Q and type in (%d, %d)", pkg->name, ASSET_CWD, ASSET_POSTEXEC) != MPORT_OK)
- goto ERROR;
+ if (mport_bundle_read_get_assetlist(mport, pkg, &alist, POSTINSTALL) != MPORT_OK)
+ goto ERROR;
(void) strlcpy(cwd, pkg->prefix, sizeof(cwd));
@@ -592,37 +736,24 @@
if (mport_chdir(mport, cwd) != MPORT_OK)
goto ERROR;
- while (1) {
- ret = sqlite3_step(assets);
-
- if (ret == SQLITE_DONE)
- break;
-
- if (ret != SQLITE_ROW) {
- SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
- goto ERROR;
- }
-
- type = (mportAssetListEntryType) sqlite3_column_int(assets, 0);
- data = (char *) sqlite3_column_text(assets, 1);
-
+ STAILQ_FOREACH(e, alist, next) {
char file[FILENAME_MAX];
- if (data == NULL) {
+ if (e->data == NULL) {
snprintf(file, sizeof(file), "%s", mport->root);
- } else if (*data == '/') {
- snprintf(file, sizeof(file), "%s%s", mport->root, data);
+ } else if (e->data[0] == '/') {
+ snprintf(file, sizeof(file), "%s%s", mport->root, e->data);
} else {
- snprintf(file, sizeof(file), "%s%s/%s", mport->root, pkg->prefix, data);
+ snprintf(file, sizeof(file), "%s%s/%s", mport->root, pkg->prefix, e->data);
}
- switch (type) {
+ switch (e->type) {
case ASSET_CWD:
- (void) strlcpy(cwd, data == NULL ? pkg->prefix : data, sizeof(cwd));
+ (void) strlcpy(cwd, e->data == NULL ? pkg->prefix : e->data, sizeof(cwd));
if (mport_chdir(mport, cwd) != MPORT_OK)
goto ERROR;
break;
case ASSET_POSTEXEC:
- if (mport_run_asset_exec(mport, data, cwd, file) != MPORT_OK)
+ if (mport_run_asset_exec(mport, e->data, cwd, file) != MPORT_OK)
goto ERROR;
break;
default:
@@ -630,13 +761,14 @@
break;
}
}
- sqlite3_finalize(assets);
+
+ mport_assetlist_free(alist);
mport_pkgmeta_logevent(mport, pkg, "postexec");
return MPORT_OK;
ERROR:
- sqlite3_finalize(assets);
+ // TODO: asset list free
RETURN_CURRENT_ERROR;
}
@@ -699,10 +831,10 @@
if ((file = fopen(filename, "r")) == NULL)
RETURN_ERRORX(MPORT_ERR_FATAL, "Couldn't open %s: %s", filename, strerror(errno));
- if ((buf = (char *) calloc((st.st_size + 1), sizeof(char))) == NULL)
+ if ((buf = (char *) calloc((size_t)(st.st_size + 1), sizeof(char))) == NULL)
RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory.");
- if (fread(buf, 1, st.st_size, file) != (size_t) st.st_size) {
+ if (fread(buf, 1, (size_t)st.st_size, file) != (size_t) st.st_size) {
free(buf);
RETURN_ERRORX(MPORT_ERR_FATAL, "Read error: %s", strerror(errno));
}
Modified: stable/0.8/lib/libmport/bundle_read_update_pkg.c
===================================================================
--- stable/0.8/lib/libmport/bundle_read_update_pkg.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/bundle_read_update_pkg.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__MBSDID("$MidnightBSD: src/lib/libmport/bundle_read_update_pkg.c,v 1.8 2011/07/24 15:59:08 laffer1 Exp $");
+__MBSDID("$MidnightBSD$");
#include "mport.h"
#include "mport_private.h"
@@ -170,8 +170,10 @@
sqlite3_stmt *stmt;
char *entry;
- if (mport_db_prepare(mport->db, &stmt, "SELECT COUNT(*) FROM depends WHERE pkg=%Q", pkg->name) != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(mport->db, &stmt, "SELECT COUNT(*) FROM depends WHERE pkg=%Q", pkg->name) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
ret = sqlite3_step(stmt);
@@ -193,8 +195,10 @@
if ((extra->depends = (char **)calloc(count + 1, sizeof(char *))) == NULL)
RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory.");
- if (mport_db_prepare(mport->db, &stmt, "SELECT depend_pkgname, depend_pkgversion, depend_port FROM depends WHERE pkg=%Q", pkg->name) != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(mport->db, &stmt, "SELECT depend_pkgname, depend_pkgversion, depend_port FROM depends WHERE pkg=%Q", pkg->name) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
i = 0;
while (1) {
Modified: stable/0.8/lib/libmport/check_preconditions.c
===================================================================
--- stable/0.8/lib/libmport/check_preconditions.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/check_preconditions.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -81,8 +81,10 @@
char *system_os_release;
/* check if the package is already installed */
- if (mport_db_prepare(db, &stmt, "SELECT version, os_release FROM packages WHERE pkg=%Q", pack->name) != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(db, &stmt, "SELECT version, os_release FROM packages WHERE pkg=%Q", pack->name) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
switch (sqlite3_step(stmt)) {
case SQLITE_DONE:
@@ -123,15 +125,19 @@
int ret;
const char *inst_name, *inst_version;
- if (mport_db_prepare(db, &stmt, "SELECT packages.pkg, packages.version FROM stub.conflicts LEFT JOIN packages ON packages.pkg GLOB stub.conflicts.conflict_pkg AND packages.version GLOB stub.conflicts.conflict_version WHERE stub.conflicts.pkg=%Q AND packages.pkg IS NOT NULL", pack->name) != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(db, &stmt,
+ "SELECT packages.pkg, packages.version FROM stub.conflicts LEFT JOIN packages ON packages.pkg GLOB stub.conflicts.conflict_pkg AND packages.version GLOB stub.conflicts.conflict_version WHERE stub.conflicts.pkg=%Q AND packages.pkg IS NOT NULL", pack->name) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
+
while (1) {
ret = sqlite3_step(stmt);
if (ret == SQLITE_ROW) {
- inst_name = sqlite3_column_text(stmt, 0);
- inst_version = sqlite3_column_text(stmt, 1);
+ inst_name = (const char *) sqlite3_column_text(stmt, 0);
+ inst_version = (const char *) sqlite3_column_text(stmt, 1);
SET_ERRORX(MPORT_ERR_FATAL, "Installed package %s-%s conflicts with %s", inst_name, inst_version, pack->name);
sqlite3_finalize(stmt);
Modified: stable/0.8/lib/libmport/db.c
===================================================================
--- stable/0.8/lib/libmport/db.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/db.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -47,45 +47,46 @@
* sqlite3_vmprintf() for format information.
*/
int
-mport_db_do(sqlite3 *db, const char *fmt, ...) {
- va_list args;
- char *sql;
- __block int result = MPORT_OK;
- __block char *err;
+mport_db_do(sqlite3 *db, const char *fmt, ...)
+{
+ va_list args;
+ char *sql;
+ __block int result = MPORT_OK;
+ __block char *err;
- va_start(args, fmt);
+ va_start(args, fmt);
- sql = sqlite3_vmprintf(fmt, args);
+ sql = sqlite3_vmprintf(fmt, args);
- va_end(args);
+ va_end(args);
- if (sql == NULL)
- RETURN_ERROR(MPORT_ERR_FATAL, "Couldn't allocate memory for sql statement");
+ if (sql == NULL)
+ RETURN_ERROR(MPORT_ERR_FATAL, "Couldn't allocate memory for sql statement");
- dispatch_sync(mportSQLSerial, ^{
- int sqlcode = sqlite3_exec(db, sql, 0, 0, 0);
- /* if we get an error code, we want to run it again in some cases */
- if (sqlcode == SQLITE_BUSY || sqlcode == SQLITE_LOCKED) {
- sleep(1);
- if (sqlite3_exec(db, sql, 0, 0, 0) != SQLITE_OK) {
- sqlite3_free(sql);
- err = (char *)sqlite3_errmsg(db);
- result = MPORT_ERR_FATAL;
- }
- } else if (sqlcode != SQLITE_OK) {
- sqlite3_free(sql);
- err = (char *)sqlite3_errmsg(db);
- result = MPORT_ERR_FATAL;
- }
+ dispatch_sync(mportSQLSerial, ^{
+ int sqlcode = sqlite3_exec(db, sql, 0, 0, 0);
+ /* if we get an error code, we want to run it again in some cases */
+ if (sqlcode == SQLITE_BUSY || sqlcode == SQLITE_LOCKED) {
+ sleep(1);
+ if (sqlite3_exec(db, sql, 0, 0, 0) != SQLITE_OK) {
+ err = (char *) sqlite3_errmsg(db);
+ result = MPORT_ERR_FATAL;
+ }
+ } else if (sqlcode != SQLITE_OK) {
+ err = (char *) sqlite3_errmsg(db);
+ result = MPORT_ERR_FATAL;
+ }
- sqlite3_free(sql);
- });
+ sqlite3_free(sql);
+ });
- return result;
+ if (result == MPORT_ERR_FATAL)
+ SET_ERRORX(result, "sql error preparing '%s' : %s", sql, err);
+
+ return result;
}
-
/* mport_db_prepare(sqlite3 *, sqlite3_stmt **, const char *, ...)
*
* A wrapper for preparing sqlite statements into statement structs.
@@ -93,27 +94,39 @@
* may be null if this function does not return MPORT_OK.
*/
int
-mport_db_prepare(sqlite3 *db, sqlite3_stmt **stmt, const char * fmt, ...)
+mport_db_prepare(sqlite3 *db, sqlite3_stmt **stmt, const char *fmt, ...)
{
- va_list args;
- char *sql;
-
- va_start(args, fmt);
- sql = sqlite3_vmprintf(fmt, args);
- va_end(args);
-
- if (sql == NULL)
- RETURN_ERROR(MPORT_ERR_FATAL, "Couldn't allocate memory for sql statement");
-
- if (sqlite3_prepare_v2(db, sql, -1, stmt, NULL) != SQLITE_OK) {
- SET_ERRORX(MPORT_ERR_FATAL, "sql error preparing '%s': %s", sql, sqlite3_errmsg(db));
- sqlite3_free(sql);
- RETURN_CURRENT_ERROR;
- }
-
- sqlite3_free(sql);
-
- return MPORT_OK;
+ va_list args;
+ char *sql;
+ __block int result = MPORT_OK;
+ __block char *err;
+
+ va_start(args, fmt);
+ sql = sqlite3_vmprintf(fmt, args);
+ va_end(args);
+
+ if (sql == NULL)
+ RETURN_ERROR(MPORT_ERR_FATAL, "Couldn't allocate memory for sql statement");
+
+ dispatch_sync(mportSQLSerial, ^{
+ int sqlcode = sqlite3_prepare_v2(db, sql, -1, stmt, NULL);
+ if (sqlcode == SQLITE_BUSY || sqlcode == SQLITE_LOCKED) {
+ sleep(1);
+ if (sqlite3_prepare_v2(db, sql, -1, stmt, NULL) != SQLITE_OK) {
+ err = (char *) sqlite3_errmsg(db);
+ result = MPORT_ERR_FATAL;
+ }
+ } else if (sqlcode != SQLITE_OK) {
+ err = (char *) sqlite3_errmsg(db);
+ result = MPORT_ERR_FATAL;
+ }
+
+ sqlite3_free(sql);
+ });
+
+ if (result == MPORT_ERR_FATAL)
+ SET_ERRORX(result, "sql error preparing '%s' : %s", sql, err);
+ return result;
}
Modified: stable/0.8/lib/libmport/index.c
===================================================================
--- stable/0.8/lib/libmport/index.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/index.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -196,8 +196,10 @@
sqlite3_stmt *stmt;
/* XXX the country is hard coded until a configuration system is created */
- if (mport_db_prepare(mport->db, &stmt, "SELECT COUNT(*) FROM idx.mirrors WHERE country='us'") != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(mport->db, &stmt, "SELECT COUNT(*) FROM idx.mirrors WHERE country='us'") != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
switch (sqlite3_step(stmt)) {
case SQLITE_ROW:
@@ -220,8 +222,10 @@
*list_p = list;
i = 0;
- if (mport_db_prepare(mport->db, &stmt, "SELECT mirror FROM idx.mirrors WHERE country='us'") != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(mport->db, &stmt, "SELECT mirror FROM idx.mirrors WHERE country='us'") != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
while (1) {
ret = sqlite3_step(stmt);
@@ -271,8 +275,10 @@
if (lookup_alias(mport, pkgname, &lookup) != MPORT_OK)
RETURN_CURRENT_ERROR;
- if (mport_db_prepare(mport->db, &stmt, "SELECT COUNT(*) FROM idx.packages WHERE pkg GLOB %Q", lookup) != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(mport->db, &stmt, "SELECT COUNT(*) FROM idx.packages WHERE pkg GLOB %Q", lookup) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
switch (sqlite3_step(stmt)) {
case SQLITE_ROW:
Modified: stable/0.8/lib/libmport/index_depends.c
===================================================================
--- stable/0.8/lib/libmport/index_depends.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/index_depends.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__MBSDID("$MidnightBSD: src/lib/libmport/index_depends.c,v 1.1 2013/03/17 18:06:18 laffer1 Exp $");
+__MBSDID("$MidnightBSD$");
#include "mport.h"
#include "mport_private.h"
@@ -57,8 +57,10 @@
if (mport_db_prepare(mport->db, &stmt,
"SELECT COUNT(*) FROM idx.depends WHERE pkg = %Q and version = %Q",
- pkgname, version) != MPORT_OK)
+ pkgname, version) != MPORT_OK) {
+ sqlite3_finalize(stmt);
RETURN_CURRENT_ERROR;
+ }
switch (sqlite3_step(stmt)) {
case SQLITE_ROW:
Modified: stable/0.8/lib/libmport/instance.c
===================================================================
--- stable/0.8/lib/libmport/instance.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/instance.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -107,6 +107,8 @@
db_version = mport_get_database_version(mport->db);
}
+ mport_db_do(mport->db, "PRAGMA journal_mode=WAL");
+
return mport_upgrade_master_schema(mport->db, db_version);
}
@@ -118,7 +120,7 @@
__block int databaseVersion = -1; /* ERROR condition */
dispatch_sync(mportSQLSerial, ^{
- sqlite3_stmt *stmt_version;
+ sqlite3_stmt *stmt_version;
if (sqlite3_prepare_v2(db, "PRAGMA user_version;", -1, &stmt_version, NULL) == SQLITE_OK) {
while (sqlite3_step(stmt_version) == SQLITE_ROW) {
databaseVersion = sqlite3_column_int(stmt_version, 0);
Modified: stable/0.8/lib/libmport/merge_primative.c
===================================================================
--- stable/0.8/lib/libmport/merge_primative.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/merge_primative.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -271,8 +271,10 @@
ret = MPORT_OK;
- if (mport_db_prepare(db, &stmt, "SELECT pkg FROM packages") != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(db, &stmt, "SELECT pkg FROM packages") != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
while (1) {
sret = sqlite3_step(stmt);
@@ -357,8 +359,10 @@
mportBundleRead *inbundle;
struct archive_entry *entry;
- if (mport_db_prepare(db, &stmt, "SELECT pkg FROM packages") != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(db, &stmt, "SELECT pkg FROM packages") != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
while (1) {
ret = sqlite3_step(stmt);
Modified: stable/0.8/lib/libmport/mport.h
===================================================================
--- stable/0.8/lib/libmport/mport.h 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/mport.h 2016-08-07 20:29:26 UTC (rev 7686)
@@ -91,6 +91,7 @@
struct _AssetListEntry {
mportAssetListEntryType type;
char *data;
+ char *checksum;
char *owner;
char *group;
char *mode;
Modified: stable/0.8/lib/libmport/plist.c
===================================================================
--- stable/0.8/lib/libmport/plist.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/plist.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -65,6 +65,11 @@
n = STAILQ_FIRST(list);
STAILQ_REMOVE_HEAD(list, next);
free(n->data);
+ free(n->checksum);
+ free(n->owner);
+ free(n->group);
+ free(n->mode);
+ /* type is not a pointer */
free(n);
}
@@ -116,7 +121,8 @@
if (cmnd == NULL)
RETURN_ERROR(MPORT_ERR_FATAL, "Malformed plist file.");
- entry->type = parse_command(cmnd);
+ entry->checksum = NULL; /* checksum is only used by bundle read install */
+ entry->type = parse_command(cmnd);
if (entry->type == ASSET_FILE_OWNER_MODE)
parse_file_owner_mode(&entry, cmnd);
if (entry->type == ASSET_DIR_OWNER_MODE) {
Modified: stable/0.8/lib/libmport/setting.c
===================================================================
--- stable/0.8/lib/libmport/setting.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/setting.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -42,8 +42,10 @@
if (name == NULL)
return NULL;
- if (mport_db_prepare(mport->db, &stmt, "SELECT val FROM settings WHERE name=%Q", name) != MPORT_OK)
- return NULL;
+ if (mport_db_prepare(mport->db, &stmt, "SELECT val FROM settings WHERE name=%Q", name) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ return NULL;
+ }
switch (sqlite3_step(stmt)) {
case SQLITE_ROW:
Modified: stable/0.8/lib/libmport/stats.c
===================================================================
--- stable/0.8/lib/libmport/stats.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/stats.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -27,36 +27,56 @@
MPORT_PUBLIC_API int
mport_stats(mportInstance *mport, mportStats **stats)
{
- sqlite3_stmt *stmt;
- sqlite3 *db = mport->db;
- mportStats *s;
+ __block sqlite3_stmt *stmt;
+ __block sqlite3 *db = mport->db;
+ __block mportStats *s;
+ __block int result = MPORT_OK;
+ __block char *err;
- if ((s = mport_stats_new()) == NULL)
- RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory.");
+ if ((s = mport_stats_new()) == NULL)
+ RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory.");
- *stats = s;
+ *stats = s;
- if (mport_db_prepare(db, &stmt, "SELECT COUNT(*) FROM packages") != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(db, &stmt, "SELECT COUNT(*) FROM packages") != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
- if (sqlite3_step(stmt) != SQLITE_ROW) {
- sqlite3_finalize(stmt);
- RETURN_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
- }
+ dispatch_sync(mportSQLSerial, ^{
+ if (sqlite3_step(stmt) != SQLITE_ROW) {
+ sqlite3_finalize(stmt);
+ err = (char *) sqlite3_errmsg(db);
+ result = MPORT_ERR_FATAL;
+ return;
+ }
- s->pkg_installed = (unsigned int) sqlite3_column_int(stmt, 0);
- sqlite3_finalize(stmt);
+ s->pkg_installed = (unsigned int) sqlite3_column_int(stmt, 0);
+ sqlite3_finalize(stmt);
+ });
+ if (result == MPORT_ERR_FATAL) {
+ SET_ERRORX(result, "%s", err);
+ return result;
+ }
- if (mport_db_prepare(db, &stmt, "SELECT COUNT(*) FROM idx.packages") != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(db, &stmt, "SELECT COUNT(*) FROM idx.packages") != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
- if (sqlite3_step(stmt) != SQLITE_ROW) {
- sqlite3_finalize(stmt);
- RETURN_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(db));
- }
+ dispatch_sync(mportSQLSerial, ^{
+ if (sqlite3_step(stmt) != SQLITE_ROW) {
+ sqlite3_finalize(stmt);
+ err = (char *) sqlite3_errmsg(db);
+ result = MPORT_ERR_FATAL;
+ return;
+ }
- s->pkg_available = (unsigned int) sqlite3_column_int(stmt, 0);
- sqlite3_finalize(stmt);
+ s->pkg_available = (unsigned int) sqlite3_column_int(stmt, 0);
+ sqlite3_finalize(stmt);
+ });
- return (MPORT_OK);
+ if (result == MPORT_ERR_FATAL)
+ SET_ERRORX(result, "%s", err);
+ return result;
}
Modified: stable/0.8/lib/libmport/update_primative.c
===================================================================
--- stable/0.8/lib/libmport/update_primative.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/update_primative.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -86,8 +86,10 @@
int ret = MPORT_OK;
const char *prefix;
- if (mport_db_prepare(mport->db, &stmt, "SELECT prefix FROM packages WHERE pkg=%Q", pkg->name) != MPORT_OK)
- RETURN_CURRENT_ERROR;
+ if (mport_db_prepare(mport->db, &stmt, "SELECT prefix FROM packages WHERE pkg=%Q", pkg->name) != MPORT_OK) {
+ sqlite3_finalize(stmt);
+ RETURN_CURRENT_ERROR;
+ }
switch (sqlite3_step(stmt)) {
case SQLITE_ROW:
Modified: stable/0.8/lib/libmport/verify.c
===================================================================
--- stable/0.8/lib/libmport/verify.c 2016-08-07 20:22:22 UTC (rev 7685)
+++ stable/0.8/lib/libmport/verify.c 2016-08-07 20:29:26 UTC (rev 7686)
@@ -49,8 +49,10 @@
char md5[33];
mport_call_msg_cb(mport, "Verifying %s-%s", pack->name, pack->version);
- if (mport_db_prepare(mport->db, &stmt, "SELECT type,data,checksum FROM assets WHERE pkg=%Q", pack->name) != MPORT_OK)
+ if (mport_db_prepare(mport->db, &stmt, "SELECT type,data,checksum FROM assets WHERE pkg=%Q", pack->name) != MPORT_OK) {
+ sqlite3_finalize(stmt);
RETURN_CURRENT_ERROR;
+ }
while (1) {
ret = sqlite3_step(stmt);
More information about the Midnightbsd-cvs
mailing list