[Midnightbsd-cvs] src [7029] trunk/lib/libmport: Add support for locking and unlocking packages to libmport.
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sun Jun 14 14:02:35 EDT 2015
Revision: 7029
http://svnweb.midnightbsd.org/src/?rev=7029
Author: laffer1
Date: 2015-06-14 14:02:34 -0400 (Sun, 14 Jun 2015)
Log Message:
-----------
Add support for locking and unlocking packages to libmport. This will allow a user to block update or delete operations on packages
Modified Paths:
--------------
trunk/lib/libmport/Makefile
trunk/lib/libmport/bundle_read_install_pkg.c
trunk/lib/libmport/db.c
trunk/lib/libmport/delete_primative.c
trunk/lib/libmport/mport.h
trunk/lib/libmport/mport_private.h
trunk/lib/libmport/pkgmeta.c
trunk/lib/libmport/update_primative.c
Added Paths:
-----------
trunk/lib/libmport/lock.c
Modified: trunk/lib/libmport/Makefile
===================================================================
--- trunk/lib/libmport/Makefile 2015-06-13 20:47:07 UTC (rev 7028)
+++ trunk/lib/libmport/Makefile 2015-06-14 18:02:34 UTC (rev 7029)
@@ -6,7 +6,8 @@
version_cmp.c check_preconditions.c delete_primative.c \
default_cbs.c merge_primative.c bundle_read_install_pkg.c \
update_primative.c bundle_read_update_pkg.c pkgmeta.c \
- fetch.c index.c index_depends.c install.c clean.c setting.c verify.c
+ fetch.c index.c index_depends.c install.c clean.c setting.c \
+ verify.c lock.c
INCS= mport.h
CFLAGS+= -I${.CURDIR} -g
Modified: trunk/lib/libmport/bundle_read_install_pkg.c
===================================================================
--- trunk/lib/libmport/bundle_read_install_pkg.c 2015-06-13 20:47:07 UTC (rev 7028)
+++ trunk/lib/libmport/bundle_read_install_pkg.c 2015-06-14 18:02:34 UTC (rev 7029)
@@ -124,7 +124,7 @@
/* 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) VALUES (%Q,%Q,%Q,%Q,%Q,%Q,%Q,%Q,%Q)", pkg->name, pkg->version, pkg->origin, pkg->prefix, pkg->lang, pkg->options, pkg->comment, pkg->os_release, pkg->cpe) != MPORT_OK)
+ 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)", pkg->name, pkg->version, pkg->origin, pkg->prefix, pkg->lang, pkg->options, pkg->comment, pkg->os_release, pkg->cpe, 0) != MPORT_OK)
goto ERROR;
/* Insert the assets into the master table (We do this one by one because we want to insert file
Modified: trunk/lib/libmport/db.c
===================================================================
--- trunk/lib/libmport/db.c 2015-06-13 20:47:07 UTC (rev 7028)
+++ trunk/lib/libmport/db.c 2015-06-14 18:02:34 UTC (rev 7029)
@@ -36,6 +36,7 @@
static int mport_upgrade_master_schema_0to2(sqlite3 *);
static int mport_upgrade_master_schema_2to3(sqlite3 *);
+static int mport_upgrade_master_schema_3to4(sqlite3 *);
/* mport_db_do(sqlite3 *db, const char *sql, ...)
@@ -192,9 +193,11 @@
mport_upgrade_master_schema_2to3(db);
case 2:
mport_upgrade_master_schema_2to3(db);
+ case 3:
+ mport_upgrade_master_schema_3to4(db);
mport_set_database_version(db);
break;
- case 3:
+ case 4:
break;
default:
RETURN_ERROR(MPORT_ERR_FATAL, "Invalid master database version");
@@ -222,11 +225,20 @@
return (MPORT_OK);
}
+static int
+mport_upgrade_master_schema_3to4(sqlite3 *db)
+{
+ RUN_SQL(db, "ALTER TABLE Packages ADD COLUMN locked int");
+ RUN_SQL(db, "update packages set locked=0");
+
+ return (MPORT_OK);
+}
+
int
mport_generate_master_schema(sqlite3 *db)
{
- RUN_SQL(db, "CREATE TABLE IF NOT EXISTS packages (pkg text NOT NULL, version text NOT NULL, origin text NOT NULL, prefix text NOT NULL, lang text, options text, status text default 'dirty', comment text, os_release text, cpe text)");
+ RUN_SQL(db, "CREATE TABLE IF NOT EXISTS packages (pkg text NOT NULL, version text NOT NULL, origin text NOT NULL, prefix text NOT NULL, lang text, options text, status text default 'dirty', comment text, os_release text, cpe text, locked int NOT NULL)");
RUN_SQL(db, "CREATE UNIQUE INDEX IF NOT EXISTS packages_pkg ON packages (pkg)");
RUN_SQL(db, "CREATE INDEX IF NOT EXISTS packages_origin ON packages (origin)");
Modified: trunk/lib/libmport/delete_primative.c
===================================================================
--- trunk/lib/libmport/delete_primative.c 2015-06-13 20:47:07 UTC (rev 7028)
+++ trunk/lib/libmport/delete_primative.c 2015-06-14 18:02:34 UTC (rev 7029)
@@ -73,6 +73,11 @@
sqlite3_finalize(stmt);
RETURN_CURRENT_ERROR;
}
+
+ if (mport_lock_islocked(pack) == MPORT_LOCKED) {
+ SET_ERROR(MPORT_ERR_FATAL, "Package is locked.");
+ RETURN_CURRENT_ERROR;
+ }
mport_call_progress_init_cb(mport, "Deleteing %s-%s", pack->name, pack->version);
Added: trunk/lib/libmport/lock.c
===================================================================
--- trunk/lib/libmport/lock.c (rev 0)
+++ trunk/lib/libmport/lock.c 2015-06-14 18:02:34 UTC (rev 7029)
@@ -0,0 +1,77 @@
+/*-
+ * Copyright (c) 2015 Lucas Holt
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include <sys/cdefs.h>
+__MBSDID("$MidnightBSD$");
+
+#include <sys/cdefs.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+#include "mport.h"
+#include "mport_private.h"
+
+MPORT_PUBLIC_API int
+mport_lock_lock(mportInstance *mport, mportPackageMeta *pkg) {
+
+ /* we are already locked, just return */
+ if (mport_lock_islocked(pkg) == MPORT_LOCKED) {
+ return (MPORT_OK);
+ }
+
+ if (mport_db_do(mport->db, "update packages set locked=1 where pkg=%Q", pkg->name) != MPORT_OK) {
+ RETURN_CURRENT_ERROR;
+ }
+
+ return (MPORT_OK);
+}
+
+MPORT_PUBLIC_API int
+mport_lock_unlock(mportInstance *mport, mportPackageMeta *pkg) {
+ if (mport_lock_islocked(pkg) == MPORT_LOCKED) {
+ if (mport_db_do(mport->db, "update packages set locked=0 where pkg=%Q", pkg->name) != MPORT_OK) {
+ RETURN_CURRENT_ERROR;
+ }
+ }
+
+ return (MPORT_OK);
+}
+
+/*
+ * check if a pkg is locked. We don't want someone to upgrade a package or remove it if it's locked.
+ * MPORT_LOCKED is returned for an unknown package or a locked package as we can't do anything.
+ */
+MPORT_PUBLIC_API int
+mport_lock_islocked(mportPackageMeta *pkg) {
+ if (pkg == NULL)
+ return MPORT_LOCKED;
+
+ if (pkg->locked == 1)
+ return MPORT_LOCKED;
+
+ return MPORT_UNLOCKED;
+}
Property changes on: trunk/lib/libmport/lock.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Modified: trunk/lib/libmport/mport.h
===================================================================
--- trunk/lib/libmport/mport.h 2015-06-13 20:47:07 UTC (rev 7028)
+++ trunk/lib/libmport/mport.h 2015-06-14 18:02:34 UTC (rev 7029)
@@ -73,7 +73,6 @@
void mport_default_progress_step_cb(int, int, const char *);
void mport_default_progress_free_cb(void);
-/* For now this is just the FreeBSD list, this will change soon. */
enum _AssetListEntryType {
ASSET_INVALID, ASSET_FILE, ASSET_CWD, ASSET_CHMOD, ASSET_CHOWN, ASSET_CHGRP,
ASSET_COMMENT, ASSET_IGNORE, ASSET_NAME, ASSET_EXEC, ASSET_UNEXEC,
@@ -113,6 +112,7 @@
char **categories;
char *os_release;
char *cpe;
+ int locked;
} mportPackageMeta;
@@ -218,6 +218,16 @@
char * mport_version(void);
char * mport_get_osrelease(void);
+/* Locks */
+enum _LockState {
+ MPORT_UNLOCKED, MPORT_LOCKED
+};
+typedef enum _LockState mportLockState;
+
+int mport_lock_lock(mportInstance *, mportPackageMeta *);
+int mport_lock_unlock(mportInstance *, mportPackageMeta *);
+int mport_lock_islocked(mportPackageMeta *);
+
#endif /* ! defined _MPORT_H */
Modified: trunk/lib/libmport/mport_private.h
===================================================================
--- trunk/lib/libmport/mport_private.h 2015-06-13 20:47:07 UTC (rev 7028)
+++ trunk/lib/libmport/mport_private.h 2015-06-14 18:02:34 UTC (rev 7029)
@@ -42,7 +42,7 @@
#define MPORT_PUBLIC_API
-#define MPORT_MASTER_VERSION 3
+#define MPORT_MASTER_VERSION 4
#define MPORT_BUNDLE_VERSION 3
#define MPORT_BUNDLE_VERSION_STR "3"
Modified: trunk/lib/libmport/pkgmeta.c
===================================================================
--- trunk/lib/libmport/pkgmeta.c 2015-06-13 20:47:07 UTC (rev 7028)
+++ trunk/lib/libmport/pkgmeta.c 2015-06-14 18:02:34 UTC (rev 7029)
@@ -199,7 +199,7 @@
return MPORT_OK;
}
- if (mport_db_prepare(db, &stmt, "SELECT pkg, version, origin, lang, prefix, comment, os_release, cpe FROM packages WHERE %s", where) != MPORT_OK) {
+ if (mport_db_prepare(db, &stmt, "SELECT pkg, version, origin, lang, prefix, comment, os_release, cpe, locked FROM packages WHERE %s", where) != MPORT_OK) {
sqlite3_finalize(stmt);
RETURN_CURRENT_ERROR;
}
@@ -244,7 +244,7 @@
return MPORT_OK;
}
- if (mport_db_prepare(db, &stmt, "SELECT pkg, version, origin, lang, prefix, comment, os_release, cpe FROM packages ORDER BY pkg, version") != MPORT_OK) {
+ if (mport_db_prepare(db, &stmt, "SELECT pkg, version, origin, lang, prefix, comment, os_release, cpe, locked FROM packages ORDER BY pkg, version") != MPORT_OK) {
sqlite3_finalize(stmt);
RETURN_CURRENT_ERROR;
}
@@ -289,7 +289,7 @@
}
if (mport_db_prepare(mport->db, &stmt,
- "SELECT packages.pkg, packages.version, packages.origin, packages.lang, packages.prefix, packages.comment, packages.os_release, packages.cpe FROM packages,depends WHERE packages.pkg=depends.depend_pkgname AND depends.pkg=%Q",
+ "SELECT packages.pkg, packages.version, packages.origin, packages.lang, packages.prefix, packages.comment, packages.os_release, packages.cpe, packages.locked FROM packages,depends WHERE packages.pkg=depends.depend_pkgname AND depends.pkg=%Q",
pkg->name) != MPORT_OK) {
sqlite3_finalize(stmt);
RETURN_CURRENT_ERROR;
@@ -513,6 +513,8 @@
}
if ((pack->cpe = strdup(tmp)) == NULL)
RETURN_ERROR(MPORT_ERR_FATAL, "Out of memory.");
+
+ pack->locked = sqlite3_column_int(stmt, 8);
return MPORT_OK;
}
Modified: trunk/lib/libmport/update_primative.c
===================================================================
--- trunk/lib/libmport/update_primative.c 2015-06-13 20:47:07 UTC (rev 7028)
+++ trunk/lib/libmport/update_primative.c 2015-06-14 18:02:34 UTC (rev 7029)
@@ -57,6 +57,12 @@
for (i=0; *(pkgs + i) != NULL; i++) {
pkg = pkgs[i];
+ if (mport_lock_islocked(pkg) == MPORT_LOCKED) {
+ mport_call_msg_cb(mport, "Unable to update %s-%s: pacakge is locked.", pkg->name, pkg->version);
+ mport_set_err(MPORT_OK, NULL);
+ continue;
+ }
+
if (
(mport_check_preconditions(mport, pkg, MPORT_PRECHECK_UPGRADEABLE|MPORT_PRECHECK_CONFLICTS|MPORT_PRECHECK_DEPENDS) != MPORT_OK)
||
More information about the Midnightbsd-cvs
mailing list