From laffer1 at midnightbsd.org Sat May 25 13:39:55 2019 From: laffer1 at midnightbsd.org (laffer1 at midnightbsd.org) Date: Sat, 25 May 2019 13:39:55 -0400 (EDT) Subject: [Midnightbsd-cvs] src [12197] trunk/lib/libmport/mport.h: add additional flags for monitoring changes Message-ID: <201905251739.x4PHdt4I065688@stargazer.midnightbsd.org> Revision: 12197 http://svnweb.midnightbsd.org/src/?rev=12197 Author: laffer1 Date: 2019-05-25 13:39:54 -0400 (Sat, 25 May 2019) Log Message: ----------- add additional flags for monitoring changes Modified Paths: -------------- trunk/lib/libmport/mport.h Modified: trunk/lib/libmport/mport.h =================================================================== --- trunk/lib/libmport/mport.h 2019-05-25 17:38:01 UTC (rev 12196) +++ trunk/lib/libmport/mport.h 2019-05-25 17:39:54 UTC (rev 12197) @@ -36,6 +36,7 @@ #include #include #include +#include #include "mport_dispatch.h" @@ -165,6 +166,9 @@ char *version; char *d_pkgname; char *d_version; + int level; + bool already_installed; + bool needs_upgrade; } mportDependsEntry; int mport_index_depends_list(mportInstance *, const char *, const char *, mportDependsEntry ***); From laffer1 at midnightbsd.org Sat May 25 13:40:21 2019 From: laffer1 at midnightbsd.org (laffer1 at midnightbsd.org) Date: Sat, 25 May 2019 13:40:21 -0400 (EDT) Subject: [Midnightbsd-cvs] src [12198] trunk/lib/libmport/install_primative.c: cleanup and check for null values Message-ID: <201905251740.x4PHeLcU065757@stargazer.midnightbsd.org> Revision: 12198 http://svnweb.midnightbsd.org/src/?rev=12198 Author: laffer1 Date: 2019-05-25 13:40:20 -0400 (Sat, 25 May 2019) Log Message: ----------- cleanup and check for null values Modified Paths: -------------- trunk/lib/libmport/install_primative.c Modified: trunk/lib/libmport/install_primative.c =================================================================== --- trunk/lib/libmport/install_primative.c 2019-05-25 17:39:54 UTC (rev 12197) +++ trunk/lib/libmport/install_primative.c 2019-05-25 17:40:20 UTC (rev 12198) @@ -59,8 +59,10 @@ if (prefix != NULL) { /* override the default prefix with the given prefix */ free(pkg->prefix); - if ((pkg->prefix = strdup(prefix)) == NULL) /* all hope is lost! bail */ + if ((pkg->prefix = strdup(prefix)) == NULL) { + /* all hope is lost! bail */ RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory."); + } } if ((mport_check_preconditions(mport, pkg, MPORT_PRECHECK_INSTALLED | MPORT_PRECHECK_DEPENDS | @@ -67,9 +69,12 @@ MPORT_PRECHECK_CONFLICTS) != MPORT_OK) || (mport_bundle_read_install_pkg(mport, bundle, pkg) != MPORT_OK)) { - mport_call_msg_cb(mport, "Unable to install %s-%s: %s", pkg->name, pkg->version, - mport_err_string()); - /* TODO: WHY WAS THIS HERE mport_set_err(MPORT_OK, NULL); */ + if (pkg->name != NULL && pkg->version != NULL) + mport_call_msg_cb(mport, "Unable to install %s-%s: %s", pkg->name, pkg->version, + mport_err_string()); + else + mport_call_msg_cb(mport, "Unknown error. State is invalid."); + error = true; break; /* do not keep going if we have a package failure! */ } From laffer1 at midnightbsd.org Sat May 25 13:41:04 2019 From: laffer1 at midnightbsd.org (laffer1 at midnightbsd.org) Date: Sat, 25 May 2019 13:41:04 -0400 (EDT) Subject: [Midnightbsd-cvs] src [12199] trunk/lib/libmport/index.c: add stdint Message-ID: <201905251741.x4PHf4rg065835@stargazer.midnightbsd.org> Revision: 12199 http://svnweb.midnightbsd.org/src/?rev=12199 Author: laffer1 Date: 2019-05-25 13:41:03 -0400 (Sat, 25 May 2019) Log Message: ----------- add stdint Modified Paths: -------------- trunk/lib/libmport/index.c Modified: trunk/lib/libmport/index.c =================================================================== --- trunk/lib/libmport/index.c 2019-05-25 17:40:20 UTC (rev 12198) +++ trunk/lib/libmport/index.c 2019-05-25 17:41:03 UTC (rev 12199) @@ -35,6 +35,7 @@ #include #include #include +#include #include #include From laffer1 at midnightbsd.org Sat May 25 13:42:07 2019 From: laffer1 at midnightbsd.org (laffer1 at midnightbsd.org) Date: Sat, 25 May 2019 13:42:07 -0400 (EDT) Subject: [Midnightbsd-cvs] src [12200] trunk/lib/libmport: rework install logic to try to use a recursive query in sqlite instead Message-ID: <201905251742.x4PHg7wx065924@stargazer.midnightbsd.org> Revision: 12200 http://svnweb.midnightbsd.org/src/?rev=12200 Author: laffer1 Date: 2019-05-25 13:42:06 -0400 (Sat, 25 May 2019) Log Message: ----------- rework install logic to try to use a recursive query in sqlite instead Modified Paths: -------------- trunk/lib/libmport/index_depends.c trunk/lib/libmport/install.c Modified: trunk/lib/libmport/index_depends.c =================================================================== --- trunk/lib/libmport/index_depends.c 2019-05-25 17:41:03 UTC (rev 12199) +++ trunk/lib/libmport/index_depends.c 2019-05-25 17:42:06 UTC (rev 12200) @@ -56,25 +56,25 @@ MPORT_CHECK_FOR_INDEX(mport, "mport_index_depends_list()") if (mport_db_prepare(mport->db, &stmt, - "SELECT COUNT(*) FROM idx.depends WHERE pkg = %Q and version = %Q", + "with RECURSIVE under_dep (parent, parent_ver, pkg, version, level) as ( values('?', '?', %Q, %Q, 0) union all select depends.pkg as parent, depends.version as parent_ver, depends.d_pkg as pkg, depends.d_version as version, under_dep.level + 1 from depends JOIN under_dep on depends.pkg = under_dep.pkg) select count(*) FROM under_dep where level > 0;", pkgname, version) != MPORT_OK) { sqlite3_finalize(stmt); RETURN_CURRENT_ERROR; } - + switch (sqlite3_step(stmt)) { - case SQLITE_ROW: - count = sqlite3_column_int(stmt, 0); - break; - case SQLITE_DONE: - ret = SET_ERROR(MPORT_ERR_FATAL, - "No rows returned from a 'SELECT COUNT(*)' query."); - goto DONE; - break; - default: - ret = SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db)); - goto DONE; - break; + case SQLITE_ROW: + count = sqlite3_column_int(stmt, 0); + break; + case SQLITE_DONE: + ret = SET_ERROR(MPORT_ERR_FATAL, + "No rows returned from a 'SELECT COUNT(*)' query."); + goto DONE; + break; + default: + ret = SET_ERROR(MPORT_ERR_FATAL, sqlite3_errmsg(mport->db)); + goto DONE; + break; } sqlite3_finalize(stmt); @@ -86,7 +86,8 @@ return MPORT_OK; if (mport_db_prepare(mport->db, &stmt, - "SELECT pkg, version, d_pkg, d_version FROM idx.depends WHERE pkg= %Q and version=%Q", pkgname, version) != MPORT_OK) { + "with RECURSIVE under_dep (parent, parent_ver, pkg, version, level) as ( values('?', '?', %Q, %Q, 0) union all select depends.pkg as parent, depends.version as parent_ver, depends.d_pkg as pkg, depends.d_version as version, under_dep.level + 1 from depends JOIN under_dep on depends.pkg = under_dep.pkg) select parent, parent_ver, pkg, version, level FROM under_dep where level > 0;" + , pkgname, version) != MPORT_OK) { ret = mport_err_code(); goto DONE; } @@ -99,11 +100,16 @@ ret = MPORT_ERR_FATAL; goto DONE; } - + + /* parent, parent_ver, pkg, version, level */ e[i]->pkgname = strdup(sqlite3_column_text(stmt, 0)); e[i]->version = strdup(sqlite3_column_text(stmt, 1)); e[i]->d_pkgname = strdup(sqlite3_column_text(stmt, 2)); e[i]->d_version = strdup(sqlite3_column_text(stmt, 3)); + e[i]->level = sqlite3_column_int(stmt, 4); + /* default these to false */ + e[i]->already_installed = false; + e[i]->needs_upgrade = false; if (e[i]->pkgname == NULL || e[i]->version == NULL || Modified: trunk/lib/libmport/install.c =================================================================== --- trunk/lib/libmport/install.c 2019-05-25 17:41:03 UTC (rev 12199) +++ trunk/lib/libmport/install.c 2019-05-25 17:42:06 UTC (rev 12200) @@ -36,82 +36,82 @@ MPORT_PUBLIC_API int mport_install(mportInstance *mport, const char *pkgname, const char *version, const char *prefix) { - mportIndexEntry **e; - char *filename; - int ret = MPORT_OK; - int e_loc = 0; + mportIndexEntry **e; + char *filename; + int ret = MPORT_OK; + int e_loc = 0; - MPORT_CHECK_FOR_INDEX(mport, "mport_install()"); - - if (mport_index_lookup_pkgname(mport, pkgname, &e) != MPORT_OK) - RETURN_CURRENT_ERROR; + MPORT_CHECK_FOR_INDEX(mport, "mport_install()"); - /* we don't support installing more than one top-level package at a time. - * Consider a situation like this: - * - * mport_install(mport, "p5-Class-DBI*"); - * - * Say this matches p5-Class-DBI and p5-Class-DBI-AbstractSearch - * and say the order from the index puts p5-Class-DBI-AbstractSearch - * first. - * - * p5-Class-DBI-AbstractSearch is installed, and its depends installed. - * However, p5-Class-DBI is a depend of p5-Class-DBI-AbstractSearch, so - * when it comes time to install p5-Class-DBI, we can't - because it is - * already installed. - * - * If a user facing application wants this functionality, it would be - * easy to piece together with mport_index_lookup_pkgname(), a - * check for already installed packages, and mport_install(). - */ + if (mport_index_lookup_pkgname(mport, pkgname, &e) != MPORT_OK) + RETURN_CURRENT_ERROR; - if (e[1] != NULL) { - if (version != NULL) { - while (e[e_loc] != NULL) { - if (strcmp(e[e_loc]->version, version) == 0) { - break; - } - e_loc++; - } - if (e[e_loc] == NULL) { - mport_index_entry_free_vec(e); - RETURN_ERRORX(MPORT_ERR_FATAL, "Cound not resolve '%s-%s'.", - pkgname, version); - } - } else { - mport_index_entry_free_vec(e); - RETURN_ERRORX(MPORT_ERR_FATAL, "Could not resolve '%s' to a single package.", pkgname); - } - } - - asprintf(&filename, "%s/%s", MPORT_FETCH_STAGING_DIR, e[e_loc]->bundlefile); - if (filename == NULL) { - mport_index_entry_free_vec(e); - RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory."); - } + /* we don't support installing more than one top-level package at a time. + * Consider a situation like this: + * + * mport_install(mport, "p5-Class-DBI*"); + * + * Say this matches p5-Class-DBI and p5-Class-DBI-AbstractSearch + * and say the order from the index puts p5-Class-DBI-AbstractSearch + * first. + * + * p5-Class-DBI-AbstractSearch is installed, and its depends installed. + * However, p5-Class-DBI is a depend of p5-Class-DBI-AbstractSearch, so + * when it comes time to install p5-Class-DBI, we can't - because it is + * already installed. + * + * If a user facing application wants this functionality, it would be + * easy to piece together with mport_index_lookup_pkgname(), a + * check for already installed packages, and mport_install(). + */ - if (!mport_file_exists(filename)) { - if (mport_fetch_bundle(mport, e[e_loc]->bundlefile) != MPORT_OK) { - free(filename); - mport_index_entry_free_vec(e); - RETURN_CURRENT_ERROR; - } - } + if (e[1] != NULL) { + if (version != NULL) { + while (e[e_loc] != NULL) { + if (strcmp(e[e_loc]->version, version) == 0) { + break; + } + e_loc++; + } + if (e[e_loc] == NULL) { + mport_index_entry_free_vec(e); + RETURN_ERRORX(MPORT_ERR_FATAL, "Could not resolve '%s-%s'.", + pkgname, version); + } + } else { + mport_index_entry_free_vec(e); + RETURN_ERRORX(MPORT_ERR_FATAL, "Could not resolve '%s' to a single package.", pkgname); + } + } - if (mport_verify_hash(filename, e[e_loc]->hash) == 0) { - free(filename); - mport_index_entry_free_vec(e); + asprintf(&filename, "%s/%s", MPORT_FETCH_STAGING_DIR, e[e_loc]->bundlefile); + if (filename == NULL) { + mport_index_entry_free_vec(e); + RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory."); + } - if (unlink(filename) == 0) - RETURN_ERROR(MPORT_ERR_FATAL, "Package failed hash verification and was removed.\n"); - else - RETURN_ERROR(MPORT_ERR_FATAL, "Package failed hash verification, but could not be removed.\n"); - } - - ret = mport_install_primative(mport, filename, prefix); + if (!mport_file_exists(filename)) { + if (mport_fetch_bundle(mport, e[e_loc]->bundlefile) != MPORT_OK) { + free(filename); + mport_index_entry_free_vec(e); + RETURN_CURRENT_ERROR; + } + } - free(filename); - mport_index_entry_free_vec(e); - - return ret; + if (mport_verify_hash(filename, e[e_loc]->hash) == 0) { + free(filename); + mport_index_entry_free_vec(e); + + if (unlink(filename) == 0) + RETURN_ERROR(MPORT_ERR_FATAL, "Package failed hash verification and was removed.\n"); + else + RETURN_ERROR(MPORT_ERR_FATAL, "Package failed hash verification, but could not be removed.\n"); + } + + ret = mport_install_primative(mport, filename, prefix); + + free(filename); + mport_index_entry_free_vec(e); + + return ret; } From laffer1 at midnightbsd.org Sun May 26 11:21:45 2019 From: laffer1 at midnightbsd.org (laffer1 at midnightbsd.org) Date: Sun, 26 May 2019 11:21:45 -0400 (EDT) Subject: [Midnightbsd-cvs] src [12201] trunk/usr.sbin/mport/mport.c: add pkg leaf Message-ID: <201905261521.x4QFLjqc027923@stargazer.midnightbsd.org> Revision: 12201 http://svnweb.midnightbsd.org/src/?rev=12201 Author: laffer1 Date: 2019-05-26 11:21:44 -0400 (Sun, 26 May 2019) Log Message: ----------- add pkg leaf Modified Paths: -------------- trunk/usr.sbin/mport/mport.c Modified: trunk/usr.sbin/mport/mport.c =================================================================== --- trunk/usr.sbin/mport/mport.c 2019-05-25 17:42:06 UTC (rev 12200) +++ trunk/usr.sbin/mport/mport.c 2019-05-26 15:21:44 UTC (rev 12201) @@ -36,6 +36,7 @@ #include #include #include +#include "../libmport/mport.h" #define MPORT_TOOLS_PATH "/usr/libexec/" #define MPORT_LOCAL_PKG_PATH "/var/db/mport/downloads" @@ -43,7 +44,7 @@ static void usage(void); static void loadIndex(mportInstance *); static mportIndexEntry ** lookupIndex(mportInstance *, const char *); -static int install_depends(mportInstance *, const char *, const char *); +static int install_depends(mportInstance *, const char *, const char *, bool first); static int install(mportInstance *, const char *); static int cpeList(mportInstance *); static int configGet(mportInstance *, const char *); @@ -244,26 +245,28 @@ __block int local_argc = argc; __block char *const * local_argv = argv; local_argv++; - if (local_argc > 2) { - int ch, qflag, oflag; - qflag = oflag = 0; - while ((ch = getopt(local_argc, local_argv, "qo")) != -1) { - switch (ch) { - case 'q': - qflag = 1; - break; - case 'o': - oflag = 1; - break; + if (local_argc > 2) { + int ch, qflag, oflag; + qflag = oflag = 0; + while ((ch = getopt(local_argc, local_argv, "qo")) != -1) { + switch (ch) { + case 'q': + qflag = 1; + break; + case 'o': + oflag = 1; + break; + default: + break; + } } + local_argc -= optind; + local_argv += optind; + + which(mport, *local_argv, qflag, oflag); + } else { + usage(); } - local_argc -= optind; - local_argv += optind; - - which(mport, *local_argv, qflag, oflag); - } else { - usage(); - } }); } else { mport_instance_free(mport); @@ -478,7 +481,7 @@ /* recursive function */ int -install_depends(mportInstance *mport, const char *packageName, const char *version) { +install_depends(mportInstance *mport, const char *packageName, const char *version, bool first) { mportPackageMeta **packs; mportDependsEntry **depends; @@ -501,13 +504,15 @@ } else if (packs == NULL) { /* Package is not installed */ while (*depends != NULL) { - install_depends(mport, (*depends)->d_pkgname, (*depends)->d_version); + install_depends(mport, (*depends)->d_pkgname, (*depends)->d_version, false); depends++; - } + } + if (mport_install(mport, packageName, version, NULL) != MPORT_OK) { warnx("%s", mport_err_string()); return mport_err_code(); } + mport_index_depends_free_vec(depends); } else { /* already installed */ @@ -552,7 +557,7 @@ } } - resultCode = install_depends(mport, (*indexEntry)->pkgname, (*indexEntry)->version); + resultCode = install_depends(mport, (*indexEntry)->pkgname, (*indexEntry)->version, true); mport_index_entry_free_vec(indexEntry); From laffer1 at midnightbsd.org Sun May 26 11:29:12 2019 From: laffer1 at midnightbsd.org (laffer1 at midnightbsd.org) Date: Sun, 26 May 2019 11:29:12 -0400 (EDT) Subject: [Midnightbsd-cvs] src [12202] trunk/usr.sbin/mport/mport.c: pass first down Message-ID: <201905261529.x4QFTCXX028269@stargazer.midnightbsd.org> Revision: 12202 http://svnweb.midnightbsd.org/src/?rev=12202 Author: laffer1 Date: 2019-05-26 11:29:11 -0400 (Sun, 26 May 2019) Log Message: ----------- pass first down Modified Paths: -------------- trunk/usr.sbin/mport/mport.c Modified: trunk/usr.sbin/mport/mport.c =================================================================== --- trunk/usr.sbin/mport/mport.c 2019-05-26 15:21:44 UTC (rev 12201) +++ trunk/usr.sbin/mport/mport.c 2019-05-26 15:29:11 UTC (rev 12202) @@ -504,7 +504,7 @@ } else if (packs == NULL) { /* Package is not installed */ while (*depends != NULL) { - install_depends(mport, (*depends)->d_pkgname, (*depends)->d_version, false); + install_depends(mport, (*depends)->d_pkgname, (*depends)->d_version, first); depends++; } From laffer1 at midnightbsd.org Sun May 26 13:08:16 2019 From: laffer1 at midnightbsd.org (laffer1 at midnightbsd.org) Date: Sun, 26 May 2019 13:08:16 -0400 (EDT) Subject: [Midnightbsd-cvs] src [12203] trunk/lib/libmport/bundle_read_install_pkg.c: do not treat it as a pattern Message-ID: <201905261708.x4QH8GAs033184@stargazer.midnightbsd.org> Revision: 12203 http://svnweb.midnightbsd.org/src/?rev=12203 Author: laffer1 Date: 2019-05-26 13:08:16 -0400 (Sun, 26 May 2019) Log Message: ----------- do not treat it as a pattern Modified Paths: -------------- trunk/lib/libmport/bundle_read_install_pkg.c Modified: trunk/lib/libmport/bundle_read_install_pkg.c =================================================================== --- trunk/lib/libmport/bundle_read_install_pkg.c 2019-05-26 15:29:11 UTC (rev 12202) +++ trunk/lib/libmport/bundle_read_install_pkg.c 2019-05-26 17:08:16 UTC (rev 12203) @@ -956,7 +956,7 @@ 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, (size_t) st.st_size, file) != (size_t) st.st_size) { + if (fread(buf, sizeof(char), (size_t) st.st_size, file) != (size_t) st.st_size) { free(buf); RETURN_ERRORX(MPORT_ERR_FATAL, "Read error: %s", strerror(errno)); } @@ -964,7 +964,7 @@ buf[st.st_size] = '\0'; if (buf[0] != '\0') - mport_call_msg_cb(mport, buf); + mport_call_msg_cb(mport, "%s", buf); free(buf); From laffer1 at midnightbsd.org Sun May 26 13:22:01 2019 From: laffer1 at midnightbsd.org (laffer1 at midnightbsd.org) Date: Sun, 26 May 2019 13:22:01 -0400 (EDT) Subject: [Midnightbsd-cvs] src [12204] stable/1.1/lib/libmport/bundle_read_install_pkg.c: fix some bugs with pkg message printing Message-ID: <201905261722.x4QHM1k4034206@stargazer.midnightbsd.org> Revision: 12204 http://svnweb.midnightbsd.org/src/?rev=12204 Author: laffer1 Date: 2019-05-26 13:22:01 -0400 (Sun, 26 May 2019) Log Message: ----------- fix some bugs with pkg message printing Modified Paths: -------------- stable/1.1/lib/libmport/bundle_read_install_pkg.c Modified: stable/1.1/lib/libmport/bundle_read_install_pkg.c =================================================================== --- stable/1.1/lib/libmport/bundle_read_install_pkg.c 2019-05-26 17:08:16 UTC (rev 12203) +++ stable/1.1/lib/libmport/bundle_read_install_pkg.c 2019-05-26 17:22:01 UTC (rev 12204) @@ -952,14 +952,15 @@ 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, (size_t) st.st_size, file) != (size_t) st.st_size) { + if (fread(buf, sizeof(char), (size_t) st.st_size, file) != (size_t) st.st_size) { free(buf); RETURN_ERRORX(MPORT_ERR_FATAL, "Read error: %s", strerror(errno)); } - buf[st.st_size] = 0; + buf[st.st_size] = '\0'; - mport_call_msg_cb(mport, buf); + if (buf[0] != '\0') + mport_call_msg_cb(mport, "%s", buf); free(buf);