/* * alpm.h * * Copyright (c) 2006-2011 Pacman Development Team * Copyright (c) 2002-2006 by Judd Vinet * Copyright (c) 2005 by Aurelien Foret * Copyright (c) 2005 by Christian Hamar * Copyright (c) 2005, 2006 by Miklos Vajna * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _ALPM_H #define _ALPM_H #ifdef __cplusplus extern "C" { #endif #include /* for off_t */ #include /* for time_t */ #include /* for va_list */ #include #define DEPRECATED __attribute__((deprecated)) /* * Arch Linux Package Management library */ /** @addtogroup alpm_api Public API * The libalpm Public API * @{ */ /* * Enumerations * These ones are used in multiple contexts, so are forward-declared. */ /** * Install reasons. * Why the package was installed. */ 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; /** 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\t", where the given md5sum is that of * the file as provided by the package. * @param pkg a pointer to package * @return a reference to an internal list of strings. */ alpm_list_t *alpm_pkg_get_backup(alpm_pkg_t *pkg); /** Returns the database containing pkg. * Returns a pointer to the alpm_db_t structure the package is * originating from, or NULL if the package was loaded from a file. * @param pkg a pointer to package * @return a pointer to the DB containing pkg, or NULL. */ alpm_db_t *alpm_pkg_get_db(alpm_pkg_t *pkg); /* End of alpm_pkg_t accessors */ /* @} */ /** Open a package changelog for reading. * Similar to fopen in functionality, except that the returned 'file * stream' could really be from an archive as well as from the database. * @param pkg the package to read the changelog of (either file or db) * @return a 'file stream' to the package changelog */ void *alpm_pkg_changelog_open(alpm_pkg_t *pkg); /** Read data from an open changelog 'file stream'. * Similar to fread in functionality, this function takes a buffer and * amount of data to read. If an error occurs pm_errno will be set. * @param ptr a buffer to fill with raw changelog data * @param size the size of the buffer * @param pkg the package that the changelog is being read from * @param fp a 'file stream' to the package changelog * @return the number of characters read, or 0 if there is no more data or an * error occurred. */ size_t alpm_pkg_changelog_read(void *ptr, size_t size, const alpm_pkg_t *pkg, const void *fp); /*int alpm_pkg_changelog_feof(const alpm_pkg_t *pkg, void *fp);*/ int alpm_pkg_changelog_close(const alpm_pkg_t *pkg, void *fp); /** Returns whether the package has an install scriptlet. * @return 0 if FALSE, TRUE otherwise */ int alpm_pkg_has_scriptlet(alpm_pkg_t *pkg); /** Returns the size of download. * Returns the size of the files that will be downloaded to install a * package. * @param newpkg the new package to upgrade to * @return the size of the download */ off_t alpm_pkg_download_size(alpm_pkg_t *newpkg); alpm_list_t *alpm_pkg_unused_deltas(alpm_pkg_t *pkg); /* End of alpm_pkg */ /** @} */ /* * Signatures */ int alpm_pkg_check_pgp_signature(alpm_pkg_t *pkg, alpm_sigresult_t *result); int alpm_db_check_pgp_signature(alpm_db_t *db, alpm_sigresult_t *result); int alpm_sigresult_cleanup(alpm_sigresult_t *result); /* * Groups */ alpm_list_t *alpm_find_group_pkgs(alpm_list_t *dbs, const char *name); /* * Sync */ alpm_pkg_t *alpm_sync_newversion(alpm_pkg_t *pkg, alpm_list_t *dbs_sync); /** @addtogroup alpm_api_trans Transaction Functions * Functions to manipulate libalpm transactions * @{ */ /** Transaction flags */ typedef enum _alpm_transflag_t { /** Ignore dependency checks. */ ALPM_TRANS_FLAG_NODEPS = 1, /** Ignore file conflicts and overwrite files. */ ALPM_TRANS_FLAG_FORCE = (1 << 1), /** Delete files even if they are tagged as backup. */ ALPM_TRANS_FLAG_NOSAVE = (1 << 2), /** Ignore version numbers when checking dependencies. */ ALPM_TRANS_FLAG_NODEPVERSION = (1 << 3), /** Remove also any packages depending on a package being removed. */ ALPM_TRANS_FLAG_CASCADE = (1 << 4), /** Remove packages and their unneeded deps (not explicitly installed). */ ALPM_TRANS_FLAG_RECURSE = (1 << 5), /** Modify database but do not commit changes to the filesystem. */ ALPM_TRANS_FLAG_DBONLY = (1 << 6), /* (1 << 7) flag can go here */ /** Use ALPM_PKG_REASON_DEPEND when installing packages. */ ALPM_TRANS_FLAG_ALLDEPS = (1 << 8), /** Only download packages and do not actually install. */ ALPM_TRANS_FLAG_DOWNLOADONLY = (1 << 9), /** Do not execute install scriptlets after installing. */ ALPM_TRANS_FLAG_NOSCRIPTLET = (1 << 10), /** Ignore dependency conflicts. */ ALPM_TRANS_FLAG_NOCONFLICTS = (1 << 11), /* (1 << 12) flag can go here */ /** Do not install a package if it is already installed and up to date. */ ALPM_TRANS_FLAG_NEEDED = (1 << 13), /** Use ALPM_PKG_REASON_EXPLICIT when installing packages. */ ALPM_TRANS_FLAG_ALLEXPLICIT = (1 << 14), /** Do not remove a package if it is needed by another one. */ ALPM_TRANS_FLAG_UNNEEDED = (1 << 15), /** Remove also explicitly installed unneeded deps (use with ALPM_TRANS_FLAG_RECURSE). */ ALPM_TRANS_FLAG_RECURSEALL = (1 << 16), /** Do not lock the database during the operation. */ ALPM_TRANS_FLAG_NOLOCK = (1 << 17) } alpm_transflag_t; /** Transaction events. * NULL parameters are passed to in all events unless specified otherwise. */ typedef enum _alpm_transevt_t { /** Dependencies will be computed for a package. */ ALPM_TRANS_EVT_CHECKDEPS_START = 1, /** Dependencies were computed for a package. */ ALPM_TRANS_EVT_CHECKDEPS_DONE, /** File conflicts will be computed for a package. */ ALPM_TRANS_EVT_FILECONFLICTS_START, /** File conflicts were computed for a package. */ ALPM_TRANS_EVT_FILECONFLICTS_DONE, /** Dependencies will be resolved for target package. */ ALPM_TRANS_EVT_RESOLVEDEPS_START, /** Dependencies were resolved for target package. */ ALPM_TRANS_EVT_RESOLVEDEPS_DONE, /** Inter-conflicts will be checked for target package. */ ALPM_TRANS_EVT_INTERCONFLICTS_START, /** Inter-conflicts were checked for target package. */ ALPM_TRANS_EVT_INTERCONFLICTS_DONE, /** Package will be installed. * A pointer to the target package is passed to the callback. */ ALPM_TRANS_EVT_ADD_START, /** Package was installed. * A pointer to the new package is passed to the callback. */ ALPM_TRANS_EVT_ADD_DONE, /** Package will be removed. * A pointer to the target package is passed to the callback. */ ALPM_TRANS_EVT_REMOVE_START, /** Package was removed. * A pointer to the removed package is passed to the callback. */ ALPM_TRANS_EVT_REMOVE_DONE, /** Package will be upgraded. * A pointer to the upgraded package is passed to the callback. */ ALPM_TRANS_EVT_UPGRADE_START, /** Package was upgraded. * A pointer to the new package, and a pointer to the old package is passed * to the callback, respectively. */ ALPM_TRANS_EVT_UPGRADE_DONE, /** Target package's integrity will be checked. */ ALPM_TRANS_EVT_INTEGRITY_START, /** Target package's integrity was checked. */ ALPM_TRANS_EVT_INTEGRITY_DONE, /** Target deltas's integrity will be checked. */ ALPM_TRANS_EVT_DELTA_INTEGRITY_START, /** Target delta's integrity was checked. */ ALPM_TRANS_EVT_DELTA_INTEGRITY_DONE, /** Deltas will be applied to packages. */ ALPM_TRANS_EVT_DELTA_PATCHES_START, /** Deltas were applied to packages. */ ALPM_TRANS_EVT_DELTA_PATCHES_DONE, /** Delta patch will be applied to target package. * The filename of the package and the filename of the patch is passed to the * callback. */ ALPM_TRANS_EVT_DELTA_PATCH_START, /** Delta patch was applied to target package. */ ALPM_TRANS_EVT_DELTA_PATCH_DONE, /** Delta patch failed to apply to target package. */ ALPM_TRANS_EVT_DELTA_PATCH_FAILED, /** Scriptlet has printed information. * A line of text is passed to the callback. */ ALPM_TRANS_EVT_SCRIPTLET_INFO, /** Files will be downloaded from a repository. * The repository's tree name is passed to the callback. */ ALPM_TRANS_EVT_RETRIEVE_START, /** Disk space usage will be computed for a package */ ALPM_TRANS_EVT_DISKSPACE_START, /** Disk space usage was computed for a package */ ALPM_TRANS_EVT_DISKSPACE_DONE, } alpm_transevt_t; /** Transaction Conversations (ie, questions) */ typedef enum _alpm_transconv_t { ALPM_TRANS_CONV_INSTALL_IGNOREPKG = 1, ALPM_TRANS_CONV_REPLACE_PKG = (1 << 1), ALPM_TRANS_CONV_CONFLICT_PKG = (1 << 2), ALPM_TRANS_CONV_CORRUPTED_PKG = (1 << 3), ALPM_TRANS_CONV_LOCAL_NEWER = (1 << 4), ALPM_TRANS_CONV_REMOVE_PKGS = (1 << 5), ALPM_TRANS_CONV_SELECT_PROVIDER = (1 << 6), } alpm_transconv_t; /** Transaction Progress */ typedef enum _alpm_transprog_t { ALPM_TRANS_PROGRESS_ADD_START, ALPM_TRANS_PROGRESS_UPGRADE_START, ALPM_TRANS_PROGRESS_REMOVE_START, ALPM_TRANS_PROGRESS_CONFLICTS_START, ALPM_TRANS_PROGRESS_DISKSPACE_START, ALPM_TRANS_PROGRESS_INTEGRITY_START, } alpm_transprog_t; /** Transaction Event callback */ typedef void (*alpm_trans_cb_event)(alpm_transevt_t, void *, void *); /** Transaction Conversation callback */ typedef void (*alpm_trans_cb_conv)(alpm_transconv_t, void *, void *, void *, int *); /** Transaction Progress callback */ typedef void (*alpm_trans_cb_progress)(alpm_transprog_t, const char *, int, size_t, size_t); /** Returns the bitfield of flags for the current transaction. * @param handle the context handle * @return the bitfield of transaction flags */ alpm_transflag_t alpm_trans_get_flags(alpm_handle_t *handle); /** Returns a list of packages added by the transaction. * @param handle the context handle * @return a list of alpm_pkg_t structures */ alpm_list_t * alpm_trans_get_add(alpm_handle_t *handle); /** Returns the list of packages removed by the transaction. * @param handle the context handle * @return a list of alpm_pkg_t structures */ alpm_list_t * alpm_trans_get_remove(alpm_handle_t *handle); /** Initialize the transaction. * @param handle the context handle * @param flags flags of the transaction (like nodeps, etc) * @param event event callback function pointer * @param conv question callback function pointer * @param progress progress callback function pointer * @return 0 on success, -1 on error (pm_errno is set accordingly) */ int alpm_trans_init(alpm_handle_t *handle, alpm_transflag_t flags, alpm_trans_cb_event cb_event, alpm_trans_cb_conv conv, alpm_trans_cb_progress cb_progress); /** Prepare a transaction. * @param handle the context handle * @param data the address of an alpm_list where a list * of alpm_depmissing_t objects is dumped (conflicting packages) * @return 0 on success, -1 on error (pm_errno is set accordingly) */ int alpm_trans_prepare(alpm_handle_t *handle, alpm_list_t **data); /** Commit a transaction. * @param handle the context handle * @param data the address of an alpm_list where detailed description * of an error can be dumped (ie. list of conflicting files) * @return 0 on success, -1 on error (pm_errno is set accordingly) */ int alpm_trans_commit(alpm_handle_t *handle, alpm_list_t **data); /** Interrupt a transaction. * @param handle the context handle * @return 0 on success, -1 on error (pm_errno is set accordingly) */ int alpm_trans_interrupt(alpm_handle_t *handle); /** Release a transaction. * @param handle the context handle * @return 0 on success, -1 on error (pm_errno is set accordingly) */ 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 * information. * @{ */ alpm_list_t *alpm_checkdeps(alpm_handle_t *handle, alpm_list_t *pkglist, alpm_list_t *remove, alpm_list_t *upgrade, int reversedeps); alpm_pkg_t *alpm_find_satisfier(alpm_list_t *pkgs, const char *depstring); alpm_pkg_t *alpm_find_dbs_satisfier(alpm_handle_t *handle, alpm_list_t *dbs, const char *depstring); alpm_list_t *alpm_checkconflicts(alpm_handle_t *handle, alpm_list_t *pkglist); /** Returns a newly allocated string representing the dependency information. * @param dep a dependency info structure * @return a formatted string, e.g. "glibc>=2.12" */ char *alpm_dep_compute_string(const alpm_depend_t *dep); /** @} */ /** @} */ /* * Helpers */ /* checksums */ char *alpm_compute_md5sum(const char *name); /** @addtogroup alpm_api_errors Error Codes * @{ */ enum _alpm_errno_t { ALPM_ERR_MEMORY = 1, ALPM_ERR_SYSTEM, ALPM_ERR_BADPERMS, ALPM_ERR_NOT_A_FILE, ALPM_ERR_NOT_A_DIR, ALPM_ERR_WRONG_ARGS, ALPM_ERR_DISK_SPACE, /* Interface */ ALPM_ERR_HANDLE_NULL, ALPM_ERR_HANDLE_NOT_NULL, ALPM_ERR_HANDLE_LOCK, /* Databases */ ALPM_ERR_DB_OPEN, ALPM_ERR_DB_CREATE, ALPM_ERR_DB_NULL, ALPM_ERR_DB_NOT_NULL, ALPM_ERR_DB_NOT_FOUND, ALPM_ERR_DB_INVALID, ALPM_ERR_DB_INVALID_SIG, ALPM_ERR_DB_VERSION, ALPM_ERR_DB_WRITE, ALPM_ERR_DB_REMOVE, /* Servers */ ALPM_ERR_SERVER_BAD_URL, ALPM_ERR_SERVER_NONE, /* Transactions */ ALPM_ERR_TRANS_NOT_NULL, ALPM_ERR_TRANS_NULL, ALPM_ERR_TRANS_DUP_TARGET, ALPM_ERR_TRANS_NOT_INITIALIZED, ALPM_ERR_TRANS_NOT_PREPARED, ALPM_ERR_TRANS_ABORT, ALPM_ERR_TRANS_TYPE, ALPM_ERR_TRANS_NOT_LOCKED, /* Packages */ ALPM_ERR_PKG_NOT_FOUND, ALPM_ERR_PKG_IGNORED, ALPM_ERR_PKG_INVALID, ALPM_ERR_PKG_INVALID_CHECKSUM, ALPM_ERR_PKG_INVALID_SIG, ALPM_ERR_PKG_OPEN, ALPM_ERR_PKG_CANT_REMOVE, ALPM_ERR_PKG_INVALID_NAME, ALPM_ERR_PKG_INVALID_ARCH, ALPM_ERR_PKG_REPO_NOT_FOUND, /* Signatures */ ALPM_ERR_SIG_MISSING, ALPM_ERR_SIG_INVALID, /* Deltas */ ALPM_ERR_DLT_INVALID, ALPM_ERR_DLT_PATCHFAILED, /* Dependencies */ ALPM_ERR_UNSATISFIED_DEPS, ALPM_ERR_CONFLICTING_DEPS, ALPM_ERR_FILE_CONFLICTS, /* Misc */ ALPM_ERR_RETRIEVE, ALPM_ERR_INVALID_REGEX, /* External library errors */ ALPM_ERR_LIBARCHIVE, ALPM_ERR_LIBCURL, ALPM_ERR_EXTERNAL_DOWNLOAD, ALPM_ERR_GPGME }; /** Returns the current error code from the handle. */ enum _alpm_errno_t alpm_errno(alpm_handle_t *handle); /** Returns the string corresponding to an error number. */ const char *alpm_strerror(enum _alpm_errno_t err); /* End of alpm_api_errors */ /** @} */ alpm_handle_t *alpm_initialize(const char *root, const char *dbpath, enum _alpm_errno_t *err); int alpm_release(alpm_handle_t *handle); const char *alpm_version(void); /* End of alpm_api */ /** @} */ #ifdef __cplusplus } #endif #endif /* _ALPM_H */ /* vim: set ts=2 sw=2 noet: */