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;