summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libalpm/alpm.c72
-rw-r--r--lib/libalpm/alpm.h36
-rw-r--r--lib/libalpm/be_local.c2
-rw-r--r--lib/libalpm/db.c2
-rw-r--r--lib/libalpm/db.h4
-rw-r--r--lib/libalpm/handle.c44
-rw-r--r--lib/libalpm/handle.h3
7 files changed, 72 insertions, 91 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
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index bc06cc09..ee55d0b9 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -86,14 +86,6 @@ typedef struct __pmconflict_t pmconflict_t;
typedef struct __pmfileconflict_t pmfileconflict_t;
/*
- * Library
- */
-
-int alpm_initialize(void);
-int alpm_release(void);
-const char *alpm_version(void);
-
-/*
* Logging facilities
*/
@@ -165,15 +157,14 @@ alpm_cb_totaldl alpm_option_get_totaldlcb(void);
/** Sets the callback used to report total download size. */
int alpm_option_set_totaldlcb(alpm_cb_totaldl cb);
-/** Returns the root of the destination filesystem. */
+/** Returns the root of the destination filesystem. Read-only. */
const char *alpm_option_get_root(void);
-/** Sets the root of the destination filesystem. */
-int alpm_option_set_root(const char *root);
-/** Returns the path to the database directory. */
+/** Returns the path to the database directory. Read-only. */
const char *alpm_option_get_dbpath(void);
-/** Sets the path to the database directory. */
-int alpm_option_set_dbpath(const char *dbpath);
+
+/** Get the name of the database lock file. Read-only. */
+const char *alpm_option_get_lockfile(void);
/** @name Accessors to the list of package cache directories.
* @{
@@ -189,15 +180,6 @@ const char *alpm_option_get_logfile(void);
/** Sets the logfile name. */
int alpm_option_set_logfile(const char *logfile);
-/** Get the name of the database lock file.
- *
- * This properly is read-only, and determined from
- * the database path.
- *
- * @sa alpm_option_set_dbpath(const char*)
- */
-const char *alpm_option_get_lockfile(void);
-
/** Returns the signature directory path. */
const char *alpm_option_get_signaturedir(void);
/** Sets the signature directory path. */
@@ -302,9 +284,10 @@ pmdb_t *alpm_db_register_sync(const char *treename);
int alpm_db_unregister(pmdb_t *db);
/** Unregister all package databases.
+ * @param handle the context handle
* @return 0 on success, -1 on error (pm_errno is set accordingly)
*/
-int alpm_db_unregister_all(void);
+int alpm_db_unregister_all(pmhandle_t *handle);
/** Get the name of a package database.
* @param db pointer to the package database
@@ -1054,6 +1037,11 @@ const char *alpm_strerrorlast(void);
/* End of alpm_api_errors */
/** @} */
+pmhandle_t *alpm_initialize(const char *root, const char *dbpath,
+ enum _pmerrno_t *err);
+int alpm_release(pmhandle_t *handle);
+const char *alpm_version(void);
+
/* End of alpm_api */
/** @} */
diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
index 64af4b95..3a0887d0 100644
--- a/lib/libalpm/be_local.c
+++ b/lib/libalpm/be_local.c
@@ -936,7 +936,7 @@ pmdb_t *_alpm_db_register_local(pmhandle_t *handle)
db = _alpm_db_new("local", 1);
if(db == NULL) {
- RET_ERR(PM_ERR_DB_CREATE, NULL);
+ return NULL;
}
db->ops = &local_db_ops;
db->handle = handle;
diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c
index 9b1f4fbb..fda8428a 100644
--- a/lib/libalpm/db.c
+++ b/lib/libalpm/db.c
@@ -71,7 +71,7 @@ void _alpm_db_unregister(pmdb_t *db)
}
/** Unregister all package databases. */
-int SYMEXPORT alpm_db_unregister_all(void)
+int SYMEXPORT alpm_db_unregister_all(pmhandle_t *handle)
{
alpm_list_t *i;
pmdb_t *db;
diff --git a/lib/libalpm/db.h b/lib/libalpm/db.h
index 3a7ab72f..9ecf31f7 100644
--- a/lib/libalpm/db.h
+++ b/lib/libalpm/db.h
@@ -22,9 +22,6 @@
#ifndef _ALPM_DB_H
#define _ALPM_DB_H
-#include "alpm.h"
-#include "pkghash.h"
-
#include <time.h>
/* libarchive */
@@ -32,6 +29,7 @@
#include <archive_entry.h>
#include "alpm.h"
+#include "pkghash.h"
#include "signing.h"
/* Database entries */
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index ccd13f11..80ad5601 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -313,7 +313,7 @@ static char *canonicalize_path(const char *path) {
return new_path;
}
-int _alpm_set_directory_option(const char *value,
+enum _pmerrno_t _alpm_set_directory_option(const char *value,
char **storage, int must_exist)
{
struct stat st;
@@ -322,19 +322,16 @@ int _alpm_set_directory_option(const char *value,
path = value;
if(!path) {
- pm_errno = PM_ERR_WRONG_ARGS;
- return -1;
+ return PM_ERR_WRONG_ARGS;
}
if(must_exist) {
if(stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) {
- pm_errno = PM_ERR_NOT_A_DIR;
- return -1;
+ return PM_ERR_NOT_A_DIR;
}
real = calloc(PATH_MAX + 1, sizeof(char));
if(!realpath(path, real)) {
free(real);
- pm_errno = PM_ERR_NOT_A_DIR;
- return -1;
+ return PM_ERR_NOT_A_DIR;
}
path = real;
}
@@ -347,39 +344,6 @@ int _alpm_set_directory_option(const char *value,
return 0;
}
-int SYMEXPORT alpm_option_set_root(const char *root)
-{
- ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
-
- if(_alpm_set_directory_option(root, &(handle->root), 1)) {
- return -1;
- }
- _alpm_log(PM_LOG_DEBUG, "option 'root' = %s\n", handle->root);
- return 0;
-}
-
-int SYMEXPORT alpm_option_set_dbpath(const char *dbpath)
-{
- const char *lf = "db.lck";
- size_t lockfilelen;
-
- ASSERT(handle != NULL, RET_ERR(PM_ERR_HANDLE_NULL, -1));
-
- if(_alpm_set_directory_option(dbpath, &(handle->dbpath), 1)) {
- return -1;
- }
- _alpm_log(PM_LOG_DEBUG, "option 'dbpath' = %s\n", handle->dbpath);
-
- if(handle->lockfile) {
- FREE(handle->lockfile);
- }
- lockfilelen = strlen(handle->dbpath) + strlen(lf) + 1;
- handle->lockfile = calloc(lockfilelen, sizeof(char));
- snprintf(handle->lockfile, lockfilelen, "%s%s", handle->dbpath, lf);
- _alpm_log(PM_LOG_DEBUG, "option 'lockfile' = %s\n", handle->lockfile);
- return 0;
-}
-
int SYMEXPORT alpm_option_add_cachedir(const char *cachedir)
{
char *newcachedir;
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index b72c9b0f..ecfefccc 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -75,7 +75,8 @@ struct __pmhandle_t {
pmhandle_t *_alpm_handle_new(void);
void _alpm_handle_free(pmhandle_t *handle);
-int _alpm_set_directory_option(const char *value, char **storage, int must_exist);
+enum _pmerrno_t _alpm_set_directory_option(const char *value,
+ char **storage, int must_exist);
#endif /* _ALPM_HANDLE_H */