summaryrefslogtreecommitdiffstats
path: root/lib/libalpm/alpm.c
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-06-03 22:24:01 +0200
committerDan McGee <dan@archlinux.org>2011-06-07 18:37:05 +0200
commitfb4b422fc4567238332050b9a6c8c1cac2a8f091 (patch)
tree047457f6cadf5493406b0ca4fa8c60230481d92d /lib/libalpm/alpm.c
parent992fa50dfd4faba93e37364bded015ea04d1fe15 (diff)
downloadpacman-fb4b422fc4567238332050b9a6c8c1cac2a8f091.tar.gz
pacman-fb4b422fc4567238332050b9a6c8c1cac2a8f091.tar.xz
New signatures for alpm initialize and release
These new method signatures return and take handle objects to operate on so we can move away from the idea of one global handle in the API. There is also another important change and that deals with the setting of root and dbpaths. These are now done at initialization time instead of using setter methods. This allows the library to operate more safely knowing that paths won't change underneath it. Signed-off-by: Dan McGee <dan@archlinux.org>
Diffstat (limited to 'lib/libalpm/alpm.c')
-rw-r--r--lib/libalpm/alpm.c72
1 files changed, 51 insertions, 21 deletions
diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c
index 55f6ecd1..d5168709 100644
--- a/lib/libalpm/alpm.c
+++ b/lib/libalpm/alpm.c
@@ -45,21 +45,37 @@ extern pmhandle_t *handle;
/** Initializes the library. This must be called before any other
* functions are called.
- * @return 0 on success, -1 on error (pm_errno is set accordingly)
+ * @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
*/
-int SYMEXPORT alpm_initialize(void)
+pmhandle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
+ enum _pmerrno_t *err)
{
- ASSERT(handle == NULL, RET_ERR(PM_ERR_HANDLE_NOT_NULL, -1));
-
- handle = _alpm_handle_new();
- if(handle == NULL) {
- RET_ERR(PM_ERR_MEMORY, -1);
+ enum _pmerrno_t myerr;
+ const char *lf = "db.lck";
+ size_t lockfilelen;
+ pmhandle_t *myhandle = _alpm_handle_new();
+
+ if(myhandle == NULL) {
+ myerr = PM_ERR_MEMORY;
+ goto cleanup;
}
- if(_alpm_db_register_local(handle) == NULL) {
- /* error code should be set */
- _alpm_handle_free(handle);
- handle = NULL;
- return -1;
+ if((myerr = _alpm_set_directory_option(root, &(myhandle->root), 1))) {
+ goto cleanup;
+ }
+ if((myerr = _alpm_set_directory_option(dbpath, &(myhandle->dbpath), 1))) {
+ goto cleanup;
+ }
+
+ lockfilelen = strlen(myhandle->dbpath) + strlen(lf) + 1;
+ myhandle->lockfile = calloc(lockfilelen, sizeof(char));
+ snprintf(myhandle->lockfile, lockfilelen, "%s%s", myhandle->dbpath, lf);
+
+ if(_alpm_db_register_local(myhandle) == NULL) {
+ myerr = PM_ERR_DB_CREATE;
+ goto cleanup;
}
#ifdef ENABLE_NLS
@@ -68,33 +84,47 @@ int SYMEXPORT alpm_initialize(void)
#ifdef HAVE_LIBCURL
curl_global_init(CURL_GLOBAL_SSL);
- handle->curl = curl_easy_init();
+ myhandle->curl = curl_easy_init();
#endif
- return 0;
+ /* TODO temporary until global var removed */
+ handle = myhandle;
+ return myhandle;
+
+cleanup:
+ _alpm_handle_free(myhandle);
+ if(err && myerr) {
+ *err = myerr;
+ }
+ return NULL;
}
/** Release the library. This should be the last alpm call you make.
- * @return 0 on success, -1 on error (pm_errno is set accordingly)
+ * 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 SYMEXPORT alpm_release(void)
+int SYMEXPORT alpm_release(pmhandle_t *myhandle)
{
pmdb_t *db;
- ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
+ ASSERT(myhandle != NULL, return -1);
/* close local database */
- db = handle->db_local;
+ db = myhandle->db_local;
if(db) {
db->ops->unregister(db);
- handle->db_local = NULL;
+ myhandle->db_local = NULL;
}
- if(alpm_db_unregister_all() == -1) {
+ if(alpm_db_unregister_all(myhandle) == -1) {
return -1;
}
- _alpm_handle_free(handle);
+ _alpm_handle_free(myhandle);
+ myhandle = NULL;
+ /* TODO temporary until global var removed */
handle = NULL;
#ifdef HAVE_LIBCURL