You are not logged in.
Pages: 1
I am trying to install a package using alpm, I initialize handle, get pkg pointer from db... everything is ok,when i call alpm_trans_init() it exits with error, i don't know what is the reason, it outputs unexpected error when i output the error number.
this is my code:
alpm_errno_t err;
alpm_handle_t * handle = alpm_initialize("/", "/var/lib/pacman", &err);
//check for any errors
if(!handle){
std::cerr << "Error while initializing ALPM handle or regestring databases." << std::endl;
return {};
}
//set the call back function to show progress
alpm_option_set_dlcb(handle,(alpm_cb_download)progressCallBack,NULL);
alpm_db_t* extra_repo = alpm_register_syncdb(handle, "extra", ALPM_DB_USAGE_INSTALL)
if(community_repo== NULL)
{
std::cerr << "Error while registring sync database." << std::endl;
alpm_release(handle);
return 1;
}
alpm_pkg_t * pkg = alpm_db_get_pkg(extra_repo,"vlc");
if(pkg == NULL)
{
std::cerr << "Error while getting pkg from database" << std::endl;
alpm_release(handle);
return 1;
}
int trans = alpm_trans_init(handle,ALPM_TRANS_FLAG_ALLEXPLICIT); //it happens here
if(trans == -1) {
std::cerr << "Error while initializing transaction,reason:"<< alpm_strerror(err) << std::endl;
alpm_trans_release(handle);
alpm_release(handle);
return 1;
}
trans = alpm_add_pkg(handle,pkg);
if(trans == -1) {
std::cerr << "Error while adding package to transaction,reason:" << alpm_strerror(err) << std::endl;
alpm_release(handle);
return 1;
}
alpm_list_t * list = NULL;
trans = alpm_trans_prepare(handle,&list);
if(trans == -1) {
std::cerr << "Error while preparing transaction" << std::endl;
alpm_release(handle);
return 1;
}
trans = alpm_trans_commit(handle,&list);
if(trans == -1) {
std::cerr << "Error while comming transaction" << std::endl;
alpm_release(handle);
return 1;
}
}
this is what if statement print:
Error while initializing transaction,reason:unexpected error
Offline
i edited the code and it looks like this now:
alpm_errno_t err;
alpm_handle_t *handle = alpm_initialize("/", "/var/lib/pacman", &err);
// set the call back function to show progress
alpm_option_set_dlcb(handle, (alpm_cb_download)progressCallBack, NULL);
// check for any errors
if (!handle){
std::cerr << "Error while initializing ALPM handle or regestring databases." << std::endl;
return -1;
}
alpm_db_t *community_repo = alpm_register_syncdb(handle, "community", ALPM_DB_USAGE_INSTALL);
if (community_repo == NULL){
std::cerr << "Error while registring sync database." << std::endl;
alpm_release(handle);
return -1;
}
alpm_pkg_t *pkg = alpm_db_get_pkg(community_repo, argv[1]);
if (pkg == NULL){
std::cerr << "Error while getting pkg from database" << std::endl;
alpm_release(handle);
return -1;
}
if (alpm_trans_init(handle, ALPM_TRANS_FLAG_NEEDED | ALPM_PKG_REASON_EXPLICIT) != 0){
std::cerr << "Error while initializing transaction:" << alpm_strerror(alpm_errno(handle)) << std::endl;
alpm_trans_release(handle);
alpm_release(handle);
return -1;
}
if (alpm_add_pkg(handle, pkg) != 0){
std::cerr << "Error while adding package to transaction:" << alpm_strerror(alpm_errno(handle)) << std::endl;
alpm_release(handle);
return -1;
}
alpm_list_t *list = NULL;
// trans = alpm_trans_prepare(handle, &list);
if (alpm_trans_prepare(handle, &list) != 0){
std::cerr << "Error while preparing transaction:" << alpm_strerror(alpm_errno(handle)) << std::endl;
alpm_release(handle);
return -1;
}
if (alpm_trans_commit(handle, &list) != 0){
std::cerr << "Error while commiting transaction:" << alpm_strerror(alpm_errno(handle)) << std::endl;
alpm_release(handle);
return -1;
}
//unregister database after usage
alpm_db_unregister(community_repo);
//unlock the database
alpm_unlock(handle);
but now i get another error, it is somehow weird cause pacman is working without any problem:
Error while commiting transaction:no servers configured for repository
Offline
You have added the community repository, but you did not configure a server for it. You did not set up signaure verification either, you probably want to enable that. libalpm does not parse the pacman.conf. If you want that, then you'll have to do that yourself. (Or use the helper library from pacutils similar to this)
Last edited by progandy (2023-05-22 17:50:06)
| alias CUTF='LANG=en_XX.UTF-8@POSIX ' |
Offline
alpm no read pacman.conf, it's at you to parse this file and add datas in alpm options
lts - zsh - Kde - Intel Core i3 - 6Go RAM - GeForce 405 video-nouveau
Offline
You have added the community repository, but you did not configure a server for it. You did not set up signaure verification either, you probably want to enable that. libalpm does not parse the pacman.conf. If you want that, then you'll have to do that yourself. (Or use the helper library from pacutils similar to this)
i have implemented that but getting error while getting pkg pointer:
alpm_errno_t err;
pu_config_t *config = pu_config_new();
pu_ui_config_load(config, "/etc/pacman.conf");
alpm_handle_t *handle = pu_initialize_handle_from_config(config);
alpm_list_t *sync_dbs = pu_register_syncdbs(handle, config->repos);
// set the call back function to show progress
alpm_option_set_dlcb(handle, (alpm_cb_download)progressCallBack, NULL);
// check for any errors
if (!handle){
std::cerr << "Error while initializing ALPM handle or regestring databases." << std::endl;
return -1;
}
alpm_pkg_t *pkg = NULL;
for (alpm_list_t *db = sync_dbs; db; db = alpm_list_next(db))
{
pkg = alpm_db_get_pkg(db->data, argv[1]);
if (!pkg)
{
std::cerr << "Error while getting pkg from database" << std::endl;
}
}
....
the error:
error: invalid conversion from ‘void*’ to ‘alpm_db_t*’ [-fpermissive]
55 | pkg = alpm_db_get_pkg(db->data, argv[1]);
| ~~~~^~~~
| |
| void*
Offline
That last error is clear, you need to cast the pointer to the appropriate type. That or use -fpermissive.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
That last error is clear, you need to cast the pointer to the appropriate type. That or use -fpermissive.
the server error has gone, but another one appeared:
Error while commiting transaction:failed to retrieve some files
this is the code now:
alpm_errno_t err;
alpm_handle_t *handle = alpm_initialize("/", "/var/lib/pacman", &err);
// set the call back function to show progress
alpm_option_set_dlcb(handle, (alpm_cb_download)progressCallBack, NULL);
// check for any errors
if (!handle){
std::cerr << "Error while initializing ALPM handle or regestring databases." << std::endl;
return -1;
}
alpm_db_t *community_repo = alpm_register_syncdb(handle, "community", ALPM_DB_USAGE_INSTALL);
if (community_repo == NULL){
std::cerr << "Error while registring sync database." << std::endl;
alpm_release(handle);
return -1;
}
alpm_db_add_server(community_repo, "https://geo.mirror.pkgbuild.com/");
alpm_pkg_t *pkg = alpm_db_get_pkg(community_repo, argv[1]);
if (pkg == NULL){
std::cerr << "Error while getting pkg from database" << std::endl;
alpm_release(handle);
return -1;
}
if (alpm_trans_init(handle, ALPM_TRANS_FLAG_NODEPS | ALPM_TRANS_FLAG_NOCONFLICTS) != 0)
{
std::cerr << "Error while initializing transaction:" << alpm_strerror(alpm_errno(handle)) << std::endl;
alpm_trans_release(handle);
alpm_release(handle);
return -1;
}
if (alpm_add_pkg(handle, pkg) != 0){
std::cerr << "Error while adding package to transaction:" << alpm_strerror(alpm_errno(handle)) << std::endl;
alpm_release(handle);
return -1;
}
alpm_list_t *list = NULL;
// trans = alpm_trans_prepare(handle, &list);
if (alpm_trans_prepare(handle, &list) != 0){
std::cerr << "Error while preparing transaction:" << alpm_strerror(alpm_errno(handle)) << std::endl;
alpm_release(handle);
return -1;
}
if (alpm_trans_commit(handle, &list) != 0){
std::cerr << "Error while commiting transaction:" << alpm_strerror(alpm_errno(handle)) << std::endl;
alpm_release(handle);
return -1;
}
Offline
Pages: 1