Puisque pacman a été modularisé pour permettre à des programmes tiers d'accéder à la base, je me suis dis : pourquoi pas.
Après avoir un peu galéré avec la librairie (qui est vachement pas très documenté en fait ), j'ai fait des coups de copier-coller et d'ajustement pour arriver à faire un petit programme à la con(tm) qui affiche les paquets installés (soit listing complet ou choix à la ligne de commande).
Compilation : gcc test-alpm.c -o test-alpm -lalpm
Usage : ./test-alpm [nom_paquet]
Source de test-alpm.c
Code : Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <alpm.h>
#include <alpm_list.h>
alpm_list_t *pm_targets;
pmdb_t *db_local;
void list_dblocale()
{
alpm_list_t *i;
for (i = alpm_db_getpkgcache(db_local); i ; i = alpm_list_next(i)) {
pmpkg_t *pkg = alpm_list_getdata(i);
printf("%s\t- %s\n", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
}
alpm_list_free(i);
}
int main(int argc, char** argv)
{
if (alpm_initialize() == -1) {
puts ("Erreur: alpm_initialize()");
return 1;
}
db_local = alpm_db_register("local");
if (db_local == NULL) {
puts ("Erreur: alpm_db_register");
return 1;
}
if (argc == 2) {
pm_targets = alpm_list_add(pm_targets,argv[1]);
alpm_list_t *ret = alpm_db_search(db_local,pm_targets);
if (ret == NULL) {
puts ("db_search: not found");
return 1;
}
pmpkg_t *pkg = alpm_list_getdata(ret);
printf("%s\t- %s\n", alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
}
else
{
list_dblocale();
}
alpm_release();
alpm_list_free(pm_targets);
return 0;
}
Je me dit qu'une suite de petits outils permettant d'avoir des informations précises pourraient permettre d'alléger certains programmes relatifs à la gestion des paquets.