/** 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 SYMEXPORT *alpm_initialize(const char *root, const char *dbpath, alpm_errno_t *err) { alpm_errno_t myerr; const char *lf = "db.lck"; char *hookdir; size_t lockfilelen; alpm_handle_t *myhandle = _alpm_handle_new(); if(myhandle == NULL) { goto nomem; } if((myerr = _alpm_set_directory_option(root, &(myhandle->root), 1))) { goto cleanup; } if((myerr = _alpm_set_directory_option(dbpath, &(myhandle->dbpath), 1))) { goto cleanup; } /* to contatenate myhandle->root (ends with a slash) with SYSHOOKDIR (starts * with a slash) correctly, we skip SYSHOOKDIR[0]; the regular +1 therefore * disappears from the allocation */ MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR), goto nomem); sprintf(hookdir, "%s%s", myhandle->root, SYSHOOKDIR + 1); myhandle->hookdirs = alpm_list_add(NULL, hookdir); /* set default database extension */ STRDUP(myhandle->dbext, ".db", goto nomem); lockfilelen = strlen(myhandle->dbpath) + strlen(lf) + 1; MALLOC(myhandle->lockfile, lockfilelen, goto nomem); snprintf(myhandle->lockfile, lockfilelen, "%s%s", myhandle->dbpath, lf); if(_alpm_db_register_local(myhandle) == NULL) { myerr = myhandle->pm_errno; goto cleanup; } #ifdef ENABLE_NLS bindtextdomain("libalpm", LOCALEDIR); #endif return myhandle; nomem: myerr = ALPM_ERR_MEMORY; cleanup: _alpm_handle_free(myhandle); if(err) { *err = myerr; } return NULL; }
/** 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 SYMEXPORT *alpm_initialize(const char *root, const char *dbpath, alpm_errno_t *err) { alpm_errno_t myerr; const char *lf = "db.lck"; char *hookdir; size_t lockfilelen; alpm_handle_t *myhandle = _alpm_handle_new(); if(myhandle == NULL) { myerr = ALPM_ERR_MEMORY; goto cleanup; } if((myerr = _alpm_set_directory_option(root, &(myhandle->root), 1))) { goto cleanup; } if((myerr = _alpm_set_directory_option(dbpath, &(myhandle->dbpath), 1))) { goto cleanup; } MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR) + 1, goto cleanup); sprintf(hookdir, "%s%s", myhandle->root, SYSHOOKDIR); myhandle->hookdirs = alpm_list_add(NULL, hookdir); /* set default database extension */ STRDUP(myhandle->dbext, ".db", 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 = myhandle->pm_errno; goto cleanup; } #ifdef ENABLE_NLS bindtextdomain("libalpm", LOCALEDIR); #endif return myhandle; cleanup: _alpm_handle_free(myhandle); if(err && myerr) { *err = myerr; } return NULL; }