diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 4a2d2fc1..51e9e5b4 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -20,6 +20,16 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+
+/**
+ * @file alpm.h
+ * @author Pacman Development Team
+ * @date 26 Jan 2020
+ * @brief Arch Linux Package Manager Library
+ *
+ * bork
+ */
+
#ifndef ALPM_H
#define ALPM_H
@@ -38,267 +48,313 @@ extern "C" {
#include
/*
- * Arch Linux Package Management library
+ * Opaque Structures
*/
-/*
- * Opaque Structures
+/** The libalpm context handle.
+ *
+ * This struct represents an instance of libalpm.
*/
typedef struct __alpm_handle_t alpm_handle_t;
+
+/** A database.
+ *
+ * A database is a container that stores metadata about packages.
+ *
+ * A database can be located on the local filesystem or on a remote server.
+ *
+ * To use a database, it must first be registered via \link alpm_register_syncdb \endlink.
+ * If the database is already preasant in the dbpath then it will be usable. Otherwise,
+ * the database needs to be downloaded using \link alpm_db_update \endlink. Even if the
+ * source of the database is the local filesystem.
+ *
+ * After this, the database can be used to query packages and groups. Any packages or groups
+ * from the database will continue to be owned by the database and do not need to be freed by
+ * the user. They will be freed when the database is unregistered.
+ *
+ * Databases are automatically unregistered when the \link alpm_handle_t \endlink is released.
+ */
typedef struct __alpm_db_t alpm_db_t;
+
+/** A package
+ *
+ * A package can be loaded from disk via \link alpm_pkg_load \endlink or retrieved from a database.
+ * Packages from databases are automatically freed when the database is unregistered. Packages loaded
+ * from a file must be freed manually.
+ *
+ * Packages can then be queried for metadata or added to a \link alpm_trans_t transaction \endlink
+ * to be added or removed from the system.
+ */
typedef struct __alpm_pkg_t alpm_pkg_t;
+
+/** Transaction structure used internally by libalpm */
typedef struct __alpm_trans_t alpm_trans_t;
-/** @addtogroup alpm_api_errors Error Codes
+/** @addtogroup alpm_api ALPM
+ * @brief The libalpm Public API
+ * @{
+ */
+
+/** @addtogroup alpm_errors Error Codes
+ * @brief The error codes used by libalpm
* @{
*/
+
+/** libalpm's error type */
typedef enum _alpm_errno_t {
+ /** No error */
ALPM_ERR_OK = 0,
+ /** Failed to allocate memory */
ALPM_ERR_MEMORY,
+ /** A system error occurred */
ALPM_ERR_SYSTEM,
+ /** Permmision denied */
ALPM_ERR_BADPERMS,
+ /** Should be a file */
ALPM_ERR_NOT_A_FILE,
+ /** Should be a directory */
ALPM_ERR_NOT_A_DIR,
+ /** Function was called with invalid arguments */
ALPM_ERR_WRONG_ARGS,
+ /** Insufficient disk space */
ALPM_ERR_DISK_SPACE,
/* Interface */
+ /** Handle should be null */
ALPM_ERR_HANDLE_NULL,
+ /** Handle should not be null */
ALPM_ERR_HANDLE_NOT_NULL,
+ /** Failed to acquire lock */
ALPM_ERR_HANDLE_LOCK,
/* Databases */
+ /** Failed to open database */
ALPM_ERR_DB_OPEN,
+ /** Failed to create database */
ALPM_ERR_DB_CREATE,
+ /** Database should not be null */
ALPM_ERR_DB_NULL,
+ /** Database should be null */
ALPM_ERR_DB_NOT_NULL,
+ /** The database could not be found */
ALPM_ERR_DB_NOT_FOUND,
+ /** Database is invalid */
ALPM_ERR_DB_INVALID,
+ /** Database has an invalid signature */
ALPM_ERR_DB_INVALID_SIG,
+ /** The localdb is in a newer/older format than libalpm expects */
ALPM_ERR_DB_VERSION,
+ /** Fauked to write to the database */
ALPM_ERR_DB_WRITE,
+ /** Fauked to remove entry from database */
ALPM_ERR_DB_REMOVE,
/* Servers */
+ /** Server URL is in an invalid format */
ALPM_ERR_SERVER_BAD_URL,
+ /** The database has no configured servers */
ALPM_ERR_SERVER_NONE,
/* Transactions */
+ /** A transaction is already initialized */
ALPM_ERR_TRANS_NOT_NULL,
+ /** A transaction has not been initialized */
ALPM_ERR_TRANS_NULL,
+ /** Duplicate target in transaction */
ALPM_ERR_TRANS_DUP_TARGET,
+ /** A transaction has not been initialized */
ALPM_ERR_TRANS_NOT_INITIALIZED,
+ /** Transaction has not been prepared */
ALPM_ERR_TRANS_NOT_PREPARED,
+ /** Transaction was aborted */
ALPM_ERR_TRANS_ABORT,
+ /** Failed to interrupt transaction */
ALPM_ERR_TRANS_TYPE,
+ /** Transaction tried to commit without locking the database */
ALPM_ERR_TRANS_NOT_LOCKED,
+ /** A hook failed to run */
ALPM_ERR_TRANS_HOOK_FAILED,
/* Packages */
+ /** Package not found */
ALPM_ERR_PKG_NOT_FOUND,
+ /** Package is in ignorepkg */
ALPM_ERR_PKG_IGNORED,
+ /** Package is invalid */
ALPM_ERR_PKG_INVALID,
+ /** Package has an invalid checksum */
ALPM_ERR_PKG_INVALID_CHECKSUM,
+ /** Package has an invalid signature */
ALPM_ERR_PKG_INVALID_SIG,
+ /** Package does not have a signature */
ALPM_ERR_PKG_MISSING_SIG,
+ /** Cannot open the package file */
ALPM_ERR_PKG_OPEN,
+ /** Failed to remove package files */
ALPM_ERR_PKG_CANT_REMOVE,
+ /** Package has an invalid name */
ALPM_ERR_PKG_INVALID_NAME,
+ /** Package has an invalid architecute */
ALPM_ERR_PKG_INVALID_ARCH,
+ /** Unused */
ALPM_ERR_PKG_REPO_NOT_FOUND,
/* Signatures */
+ /** Signatues are missing */
ALPM_ERR_SIG_MISSING,
+ /** Signatures are invalid */
ALPM_ERR_SIG_INVALID,
/* Dependencies */
+ /** Dependencies could not be satisfied */
ALPM_ERR_UNSATISFIED_DEPS,
+ /** Conflicting dependencies */
ALPM_ERR_CONFLICTING_DEPS,
+ /** Files conflict. */
ALPM_ERR_FILE_CONFLICTS,
/* Misc */
+ /** Download failed */
ALPM_ERR_RETRIEVE,
+ /** Invalid Regex */
ALPM_ERR_INVALID_REGEX,
/* External library errors */
+ /** Error in libarchive */
ALPM_ERR_LIBARCHIVE,
+ /** Error in libcurl */
ALPM_ERR_LIBCURL,
+ /** Error in external download program */
ALPM_ERR_EXTERNAL_DOWNLOAD,
+ /** Error in gpgme */
ALPM_ERR_GPGME,
- /* Missing compile-time features */
+ /** Missing compile-time features */
ALPM_ERR_MISSING_CAPABILITY_SIGNATURES
} alpm_errno_t;
-/** Returns the current error code from the handle. */
+/** Returns the current error code from the handle.
+ * @param handle the context handle
+ * @return the current error code of the handle
+ */
alpm_errno_t alpm_errno(alpm_handle_t *handle);
-/** Returns the string corresponding to an error number. */
+/** Returns the string corresponding to an error number.
+ * @param err the error code to get the string for
+ * @return the string relating to the given error code
+ */
const char *alpm_strerror(alpm_errno_t err);
/* End of alpm_api_errors */
/** @} */
-/** @addtogroup alpm_api Public API
- * The libalpm Public API
+/** \addtogroup alpm_handle Handle
+ * @brief Functions to initialize and release libalpm
* @{
*/
-typedef int64_t alpm_time_t;
-
-/*
- * Enumerations
- * These ones are used in multiple contexts, so are forward-declared.
+/** Initializes the library.
+ * Creates handle, connects to database and creates lockfile.
+ * This must be called before any other functions are called.
+ * @param root the root path for all filesystem operations
+ * @param dbpath the absolute path to the libalpm database
+ * @param err an optional variable to hold any error return codes
+ * @return a context handle on success, NULL on error, err will be set if provided
*/
+alpm_handle_t *alpm_initialize(const char *root, const char *dbpath,
+ alpm_errno_t *err);
-/** Package install reasons. */
-typedef enum _alpm_pkgreason_t {
- /** Explicitly requested by the user. */
- ALPM_PKG_REASON_EXPLICIT = 0,
- /** Installed as a dependency for another package. */
- ALPM_PKG_REASON_DEPEND = 1
-} alpm_pkgreason_t;
+/** Release the library.
+ * Disconnects from the database, releases transaction, removes handle and lockfile
+ * This should be the last alpm call you make.
+ * After this returns, handle should be considered invalid and cannot be reused
+ * in any way.
+ * @param handle the context handle
+ * @return 0 on success, -1 on error
+ */
+int alpm_release(alpm_handle_t *handle);
-/** Location a package object was loaded from. */
-typedef enum _alpm_pkgfrom_t {
- ALPM_PKG_FROM_FILE = 1,
- ALPM_PKG_FROM_LOCALDB,
- ALPM_PKG_FROM_SYNCDB
-} alpm_pkgfrom_t;
+/** @} */
-/** Method used to validate a package. */
-typedef enum _alpm_pkgvalidation_t {
- ALPM_PKG_VALIDATION_UNKNOWN = 0,
- ALPM_PKG_VALIDATION_NONE = (1 << 0),
- ALPM_PKG_VALIDATION_MD5SUM = (1 << 1),
- ALPM_PKG_VALIDATION_SHA256SUM = (1 << 2),
- ALPM_PKG_VALIDATION_SIGNATURE = (1 << 3)
-} alpm_pkgvalidation_t;
-/** Types of version constraints in dependency specs. */
-typedef enum _alpm_depmod_t {
- /** No version constraint */
- ALPM_DEP_MOD_ANY = 1,
- /** Test version equality (package=x.y.z) */
- ALPM_DEP_MOD_EQ,
- /** Test for at least a version (package>=x.y.z) */
- ALPM_DEP_MOD_GE,
- /** Test for at most a version (package<=x.y.z) */
- ALPM_DEP_MOD_LE,
- /** Test for greater than some version (package>x.y.z) */
- ALPM_DEP_MOD_GT,
- /** Test for less than some version (package=x.y.z) */
+ ALPM_DEP_MOD_GE,
+ /** Test for at most a version (package<=x.y.z) */
+ ALPM_DEP_MOD_LE,
+ /** Test for greater than some version (package>x.y.z) */
+ ALPM_DEP_MOD_GT,
+ /** Test for less than some version (packagedata;
* result = alpm_db_update(0, db);
*
* if(result < 0) {
- * printf("Unable to update database: %s\n", alpm_strerrorlast());
+ * printf("Unable to update database: %s\n", alpm_strerror(alpm_errno(handle)));
* } else if(result == 1) {
* printf("Database already up to date\n");
* } else {
@@ -1031,7 +1784,7 @@ int alpm_db_remove_server(alpm_db_t *db, const char *url);
* @endcode
*
* @note After a successful update, the \link alpm_db_get_pkgcache()
- * package cache \endlink will be invalidated
+ * package cache and all packages within it \endlink will be invalidated
* @param force if true, then forces the update, otherwise update only in case
* the database isn't up to date
* @param db pointer to the package database to update
@@ -1053,6 +1806,19 @@ alpm_pkg_t *alpm_db_get_pkg(alpm_db_t *db, const char *name);
*/
alpm_list_t *alpm_db_get_pkgcache(alpm_db_t *db);
+/*
+ * Groups
+ */
+
+/** Find group members across a list of databases.
+ * If a member exists in several databases, only the first database is used.
+ * IgnorePkg is also handled.
+ * @param dbs the list of alpm_db_t *
+ * @param name the name of the group
+ * @return the list of alpm_pkg_t * (caller is responsible for alpm_list_free)
+ */
+alpm_list_t *alpm_find_group_pkgs(alpm_list_t *dbs, const char *name);
+
/** Get a group entry from a package database.
* @param db pointer to the package database to get the group from
* @param name of the group
@@ -1076,11 +1842,17 @@ alpm_list_t *alpm_db_get_groupcache(alpm_db_t *db);
int alpm_db_search(alpm_db_t *db, const alpm_list_t *needles,
alpm_list_t **ret);
+/** The usage level of a database */
typedef enum _alpm_db_usage_t {
+ /** Enable refreshes for this database */
ALPM_DB_USAGE_SYNC = 1,
+ /** Enable search for this database */
ALPM_DB_USAGE_SEARCH = (1 << 1),
+ /** Enable installing packages from this database */
ALPM_DB_USAGE_INSTALL = (1 << 2),
+ /** Enable sysupgrades with this database */
ALPM_DB_USAGE_UPGRADE = (1 << 3),
+ /** Enable all usage levels */
ALPM_DB_USAGE_ALL = (1 << 4) - 1,
} alpm_db_usage_t;
@@ -1098,13 +1870,79 @@ int alpm_db_set_usage(alpm_db_t *db, int usage);
*/
int alpm_db_get_usage(alpm_db_t *db, int *usage);
+/** Remove the database lock file
+ * @param handle the context handle
+ * @return 0 on success, -1 on error
+ *
+ * @note Safe to call from inside signal handlers.
+ */
+int alpm_unlock(alpm_handle_t *handle);
+
/** @} */
-/** @addtogroup alpm_api_packages Package Functions
- * Functions to manipulate libalpm packages
+/** @addtogroup alpm_packages Package
+ * @brief Functions to manipulate libalpm packages
* @{
*/
+/** Package install reasons. */
+typedef enum _alpm_pkgreason_t {
+ /** Explicitly requested by the user. */
+ ALPM_PKG_REASON_EXPLICIT = 0,
+ /** Installed as a dependency for another package. */
+ ALPM_PKG_REASON_DEPEND = 1
+} alpm_pkgreason_t;
+
+/** Location a package object was loaded from. */
+typedef enum _alpm_pkgfrom_t {
+ /** Loaded from a file via \link alpm_pkg_load \endlink */
+ ALPM_PKG_FROM_FILE = 1,
+ /** From the local database */
+ ALPM_PKG_FROM_LOCALDB,
+ /** From a sync database */
+ ALPM_PKG_FROM_SYNCDB
+} alpm_pkgfrom_t;
+
+/** Method used to validate a package. */
+typedef enum _alpm_pkgvalidation_t {
+ /** The package's validation type is unknown */
+ ALPM_PKG_VALIDATION_UNKNOWN = 0,
+ /** The package does not have any validation */
+ ALPM_PKG_VALIDATION_NONE = (1 << 0),
+ /** The package is validated with md5 */
+ ALPM_PKG_VALIDATION_MD5SUM = (1 << 1),
+ /** The package is validated with sha256 */
+ ALPM_PKG_VALIDATION_SHA256SUM = (1 << 2),
+ /** The package is validated with a PGP signature */
+ ALPM_PKG_VALIDATION_SIGNATURE = (1 << 3)
+} alpm_pkgvalidation_t;
+
+/** File in a package */
+typedef struct _alpm_file_t {
+ /** Name of the file */
+ char *name;
+ /** Size of the file */
+ off_t size;
+ /** The file's permissions */
+ mode_t mode;
+} alpm_file_t;
+
+/** Package filelist container */
+typedef struct _alpm_filelist_t {
+ /** Amount of files in the array */
+ size_t count;
+ /** An array of files */
+ alpm_file_t *files;
+} alpm_filelist_t;
+
+/** Local package or package file backup entry */
+typedef struct _alpm_backup_t {
+ /** Name of the file (without .pacsave extension) */
+ char *name;
+ /** Hash of the filename (used internally) */
+ char *hash;
+} alpm_backup_t;
+
/** Create a package from a file.
* If full is false, the archive is read only until all necessary
* metadata is found. If it is true, the entire archive is read, which
@@ -1130,6 +1968,9 @@ int alpm_pkg_load(alpm_handle_t *handle, const char *filename, int full,
alpm_pkg_t *alpm_pkg_find(alpm_list_t *haystack, const char *needle);
/** Free a package.
+ *
+ * Only packages loaded with \link alpm_pkg_load \endlink can be freed.
+ * Packages from databases will be freed by libalpm when they are unregistered.
* @param pkg package pointer to free
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
@@ -1404,6 +2245,7 @@ size_t alpm_pkg_changelog_read(void *ptr, size_t size,
/** Close a package changelog for reading.
* @param pkg the package to close the changelog of (either file or db)
+ * @param fp the 'file stream' to the package changelog to close
* @return 0 on success, -1 on error
*/
int alpm_pkg_changelog_close(const alpm_pkg_t *pkg, void *fp);
@@ -1425,7 +2267,7 @@ int alpm_pkg_mtree_next(const alpm_pkg_t *pkg, struct archive *archive,
/** Close a package mtree file.
* @param pkg the local package to close the mtree of
- * @param the archive to close
+ * @param archive the archive to close
*/
int alpm_pkg_mtree_close(const alpm_pkg_t *pkg, struct archive *archive);
@@ -1450,6 +2292,12 @@ off_t alpm_pkg_download_size(alpm_pkg_t *newpkg);
*/
int alpm_pkg_set_reason(alpm_pkg_t *pkg, alpm_pkgreason_t reason);
+/** Fetch a remote pkg.
+ * @param handle the context handle
+ * @param url URL of the package to download
+ * @return the downloaded filepath on success, NULL on error
+ */
+char *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url);
/* End of alpm_pkg */
/** @} */
@@ -1458,6 +2306,7 @@ int alpm_pkg_set_reason(alpm_pkg_t *pkg, alpm_pkgreason_t reason);
* Filelists
*/
+
/** Determines whether a package filelist contains a given path.
* The provided path should be relative to the install root with no leading
* slashes, e.g. "etc/localtime". When searching for directories, the path must
@@ -1468,68 +2317,6 @@ int alpm_pkg_set_reason(alpm_pkg_t *pkg, alpm_pkgreason_t reason);
*/
alpm_file_t *alpm_filelist_contains(alpm_filelist_t *filelist, const char *path);
-/*
- * Signatures
- */
-
-/**
- * Check the PGP signature for the given package file.
- * @param pkg the package to check
- * @param siglist a pointer to storage for signature results
- * @return a int value : 0 (valid), 1 (invalid), -1 (an error occurred)
- */
-int alpm_pkg_check_pgp_signature(alpm_pkg_t *pkg, alpm_siglist_t *siglist);
-
-/**
- * Check the PGP signature for the given database.
- * @param db the database to check
- * @param siglist a pointer to storage for signature results
- * @return a int value : 0 (valid), 1 (invalid), -1 (an error occurred)
- */
-int alpm_db_check_pgp_signature(alpm_db_t *db, alpm_siglist_t *siglist);
-
-/**
- * Clean up and free a signature result list.
- * Note that this does not free the siglist object itself in case that
- * was allocated on the stack; this is the responsibility of the caller.
- * @param siglist a pointer to storage for signature results
- * @return 0 on success, -1 on error
- */
-int alpm_siglist_cleanup(alpm_siglist_t *siglist);
-
-/**
- * Decode a loaded signature in base64 form.
- * @param base64_data the signature to attempt to decode
- * @param data the decoded data; must be freed by the caller
- * @param data_len the length of the returned data
- * @return 0 on success, -1 on failure to properly decode
- */
-int alpm_decode_signature(const char *base64_data,
- unsigned char **data, size_t *data_len);
-
-/**
- * Extract the Issuer Key ID from a signature
- * @param sig PGP signature
- * @param len length of signature
- * @param keys a pointer to storage for key IDs
- * @return 0 on success, -1 on error
- */
-int alpm_extract_keyid(alpm_handle_t *handle, const char *identifier,
- const unsigned char *sig, const size_t len, alpm_list_t **keys);
-
-/*
- * Groups
- */
-
-/** Find group members across a list of databases.
- * If a member exists in several databases, only the first database is used.
- * IgnorePkg is also handled.
- * @param dbs the list of alpm_db_t *
- * @param name the name of the group
- * @return the list of alpm_pkg_t * (caller is responsible for alpm_list_free)
- */
-alpm_list_t *alpm_find_group_pkgs(alpm_list_t *dbs, const char *name);
-
/*
* Sync
*/
@@ -1539,9 +2326,30 @@ alpm_list_t *alpm_find_group_pkgs(alpm_list_t *dbs, const char *name);
*/
alpm_pkg_t *alpm_sync_get_new_version(alpm_pkg_t *pkg, alpm_list_t *dbs_sync);
-/** @addtogroup alpm_api_trans Transaction Functions
- * Functions to manipulate libalpm transactions
+/** @} */
+
+/** @addtogroup alpm_trans Transaction
+ * @brief Functions to manipulate libalpm transactions
+ *
+ * Transactions are the way to add/remove packages to/from the system.
+ *
+ * Only one transaction can exist at a time.
+ *
+ * The basic workflow of a transaction is to:
+ *
+ * Initialize with \link alpm_trans_init \endlink
+ *
+ * Choose which packages to add with \link alpm_add_pkg \endlink and \link alpm_remove_pkg \endlink
+ *
+ * Prepare the transaction with \link alpm_trans_prepare \endlink
+ *
+ * Commit the transaction with \link alpm_trans_commit \endlink
+ *
+ * Release the transaction with \link alpm_trans_release \endlink
+ *
+ * A transaction can be released at any time. A transaction does not have to be committed.
* @{
+ *
*/
/** Transaction flags */
@@ -1587,6 +2395,29 @@ typedef enum _alpm_transflag_t {
*/
int alpm_trans_get_flags(alpm_handle_t *handle);
+/** Search for packages to upgrade and add them to the transaction.
+ * @param handle the context handle
+ * @param enable_downgrade allow downgrading of packages if the remote version is lower
+ * @return 0 on success, -1 on error (pm_errno is set accordingly)
+ */
+int alpm_sync_sysupgrade(alpm_handle_t *handle, int enable_downgrade);
+
+/** Add a package to the transaction.
+ * If the package was loaded by alpm_pkg_load(), it will be freed upon
+ * alpm_trans_release() invocation.
+ * @param handle the context handle
+ * @param pkg the package to add
+ * @return 0 on success, -1 on error (pm_errno is set accordingly)
+ */
+int alpm_add_pkg(alpm_handle_t *handle, alpm_pkg_t *pkg);
+
+/** Add a package removal action to the transaction.
+ * @param handle the context handle
+ * @param pkg the package to uninstall
+ * @return 0 on success, -1 on error (pm_errno is set accordingly)
+ */
+int alpm_remove_pkg(alpm_handle_t *handle, alpm_pkg_t *pkg);
+
/** Returns a list of packages added by the transaction.
* @param handle the context handle
* @return a list of alpm_pkg_t structures
@@ -1635,36 +2466,8 @@ int alpm_trans_interrupt(alpm_handle_t *handle);
int alpm_trans_release(alpm_handle_t *handle);
/** @} */
-/** @name Common Transactions */
-/** @{ */
-
-/** Search for packages to upgrade and add them to the transaction.
- * @param handle the context handle
- * @param enable_downgrade allow downgrading of packages if the remote version is lower
- * @return 0 on success, -1 on error (pm_errno is set accordingly)
- */
-int alpm_sync_sysupgrade(alpm_handle_t *handle, int enable_downgrade);
-
-/** Add a package to the transaction.
- * If the package was loaded by alpm_pkg_load(), it will be freed upon
- * alpm_trans_release() invocation.
- * @param handle the context handle
- * @param pkg the package to add
- * @return 0 on success, -1 on error (pm_errno is set accordingly)
- */
-int alpm_add_pkg(alpm_handle_t *handle, alpm_pkg_t *pkg);
-
-/** Add a package removal action to the transaction.
- * @param handle the context handle
- * @param pkg the package to uninstall
- * @return 0 on success, -1 on error (pm_errno is set accordingly)
- */
-int alpm_remove_pkg(alpm_handle_t *handle, alpm_pkg_t *pkg);
-
-/** @} */
-
-/** @addtogroup alpm_api_depends Dependency Functions
- * Functions dealing with libalpm representation of dependency
+/** @addtogroup alpm_depends Dependency
+ * @brief Functions dealing with libalpm representation of dependency
* information.
* @{
*/
@@ -1731,99 +2534,124 @@ alpm_depend_t *alpm_dep_from_string(const char *depstring);
*/
void alpm_dep_free(alpm_depend_t *dep);
-/** @} */
+/**
+ * Free a fileconflict and its members.
+ * @param conflict the fileconflict to free
+ */
+void alpm_fileconflict_free(alpm_fileconflict_t *conflict);
-/** @} */
+/**
+ * Free a depmissing and its members.
+ * @param miss the depmissing to free
+ */
+void alpm_depmissing_free(alpm_depmissing_t *miss);
-/*
- * Helpers
+/**
+ * Free a conflict and its members.
+ * @param conflict the conflict to free
*/
+void alpm_conflict_free(alpm_conflict_t *conflict);
-/* checksums */
+/** @} */
-/** \addtogroup alpm_misc Miscellaneous Functions
- * @brief Various libalpm functions
+/** @addtogroup alpm_sig Signature checking
+ * @brief Functions to check signatures
* @{
*/
-/** Get the md5 sum of file.
- * @param filename name of the file
- * @return the checksum on success, NULL on error
+/**
+ * Check the PGP signature for the given package file.
+ * @param pkg the package to check
+ * @param siglist a pointer to storage for signature results
+ * @return a int value : 0 (valid), 1 (invalid), -1 (an error occurred)
*/
-char *alpm_compute_md5sum(const char *filename);
+int alpm_pkg_check_pgp_signature(alpm_pkg_t *pkg, alpm_siglist_t *siglist);
-/** Get the sha256 sum of file.
- * @param filename name of the file
- * @return the checksum on success, NULL on error
+/**
+ * Check the PGP signature for the given database.
+ * @param db the database to check
+ * @param siglist a pointer to storage for signature results
+ * @return a int value : 0 (valid), 1 (invalid), -1 (an error occurred)
*/
-char *alpm_compute_sha256sum(const char *filename);
-
-/** @} */
+int alpm_db_check_pgp_signature(alpm_db_t *db, alpm_siglist_t *siglist);
-/** \addtogroup alpm_interface Interface Functions
- * @brief Functions to initialize and release libalpm
- * @{
+/**
+ * Clean up and free a signature result list.
+ * Note that this does not free the siglist object itself in case that
+ * was allocated on the stack; this is the responsibility of the caller.
+ * @param siglist a pointer to storage for signature results
+ * @return 0 on success, -1 on error
*/
+int alpm_siglist_cleanup(alpm_siglist_t *siglist);
-/** Initializes the library.
- * Creates handle, connects to database and creates lockfile.
- * This must be called before any other functions are called.
- * @param root the root path for all filesystem operations
- * @param dbpath the absolute path to the libalpm database
- * @param err an optional variable to hold any error return codes
- * @return a context handle on success, NULL on error, err will be set if provided
+/**
+ * Decode a loaded signature in base64 form.
+ * @param base64_data the signature to attempt to decode
+ * @param data the decoded data; must be freed by the caller
+ * @param data_len the length of the returned data
+ * @return 0 on success, -1 on failure to properly decode
*/
-alpm_handle_t *alpm_initialize(const char *root, const char *dbpath,
- alpm_errno_t *err);
+int alpm_decode_signature(const char *base64_data,
+ unsigned char **data, size_t *data_len);
-/** Release the library.
- * Disconnects from the database, removes handle and lockfile
- * This should be the last alpm call you make.
- * After this returns, handle should be considered invalid and cannot be reused
- * in any way.
- * @param myhandle the context handle
+/**
+ * Extract the Issuer Key ID from a signature
+ * @param handle the context handle
+ * @param identifier the key's identifier
+ * @param sig PGP signature
+ * @param len length of signature
+ * @param keys a pointer to storage for key IDs
* @return 0 on success, -1 on error
*/
-int alpm_release(alpm_handle_t *handle);
+int alpm_extract_keyid(alpm_handle_t *handle, const char *identifier,
+ const unsigned char *sig, const size_t len, alpm_list_t **keys);
/** @} */
-/** Remove the database lock file
- * @param handle the context handle
- * @return 0 on success, -1 on error
- *
- * @note Safe to call from inside signal handlers.
+/** \addtogroup alpm_misc Miscellaneous
+ * @brief Various libalpm functions
+ * @{
*/
-int alpm_unlock(alpm_handle_t *handle);
+/*
+ * Helpers
+ */
+
+/* checksums */
+
+/** Get the md5 sum of file.
+ * @param filename name of the file
+ * @return the checksum on success, NULL on error
+ */
+char *alpm_compute_md5sum(const char *filename);
+
+/** Get the sha256 sum of file.
+ * @param filename name of the file
+ * @return the checksum on success, NULL on error
+ */
+char *alpm_compute_sha256sum(const char *filename);
+
+/** Enum of possible compile time features */
enum alpm_caps {
+ /** localization */
ALPM_CAPABILITY_NLS = (1 << 0),
+ /** Ability to download */
ALPM_CAPABILITY_DOWNLOADER = (1 << 1),
+ /** Signature checking */
ALPM_CAPABILITY_SIGNATURES = (1 << 2)
};
/** Get the version of library.
* @return the library version, e.g. "6.0.4"
- * */
+ */
const char *alpm_version(void);
/** Get the capabilities of the library.
* @return a bitmask of the capabilities
- * */
-int alpm_capabilities(void);
-
-/**
- * Free a fileconflict and its members.
- * @param conflict the fileconflict to free
*/
-void alpm_fileconflict_free(alpm_fileconflict_t *conflict);
-void alpm_depmissing_free(alpm_depmissing_t *miss);
+int alpm_capabilities(void);
-/**
- * Free a conflict and its members.
- * @param conflict the conflict to free
- */
-void alpm_conflict_free(alpm_conflict_t *conflict);
+/** @} */
/* End of alpm_api */
/** @} */
diff --git a/lib/libalpm/alpm_list.h b/lib/libalpm/alpm_list.h
index 4e18f36c..c9bfcf9d 100644
--- a/lib/libalpm/alpm_list.h
+++ b/lib/libalpm/alpm_list.h
@@ -17,6 +17,13 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+
+/**
+ * @file alpm_list.h
+ * @author Pacman Development Team
+ * @date 26 Jan 2020
+ * @brief A doubly linked list for use with libalpm
+ */
#ifndef ALPM_LIST_H
#define ALPM_LIST_H
@@ -30,13 +37,16 @@
extern "C" {
#endif
-/**
- * @brief Linked list type used by libalpm.
+/** \addtogroup alpm_list ALPM List
+ *
+ * @brief A doubly linked list for use with libalpm
*
* It is exposed so front ends can use it to prevent the need to reimplement
* lists of their own; however, it is not required that the front end uses
* it.
*/
+
+
typedef struct __alpm_list_t {
/** data held by the list node */
void *data;
diff --git a/lib/libalpm/version.c b/lib/libalpm/version.c
index ae220ff6..27df0508 100644
--- a/lib/libalpm/version.c
+++ b/lib/libalpm/version.c
@@ -202,7 +202,7 @@ static int rpmvercmp(const char *a, const char *b)
* - if one is empty and two is not an alpha, two is newer.
* - if one is an alpha, two is newer.
* - otherwise one is newer.
- * */
+ */
if ( (!*one && !isalpha((int)*two))
|| isalpha((int)*one) ) {
ret = -1;