Petit jeu avec pacman...

Ce qui ne concerne ni le forum ni des problèmes
Répondre
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Petit jeu avec pacman...

Message par mimas »

...en fait c'est la lib de pacman : alpm.

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;
}
J'essaierai de faire un truc plus beau et plus détaillé, parce que là c'est coded-like-a-pig(tm). :)

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. ;)
Anarchy for the triple A.
Avatar de l’utilisateur
bapt
Daikyu
Messages : 85
Inscription : jeu. 20 sept. 2007, 09:20

Message par bapt »

Cool tant qu'à faire, se serait pas mal aussi de documenter un peu cette lib, en tout les parties que tu as "découverte", ça serait très utile à mon avis.
Avatar de l’utilisateur
d2_racing
yeomen
Messages : 243
Inscription : sam. 12 mai 2007, 19:13
Localisation : Québec,Canada

Message par d2_racing »

stdio.h...que de souvenir dans le temps du CEGEP...c'est du C ce programme là :)
Un Gentooiste,un Debianeu et un Archer :)
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message par wain »

OH mais quelle bonne idée :D
J'en connais que ça pourrait intéresser :lol:
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

wain a écrit :OH mais quelle bonne idée :D
J'en connais que ça pourrait intéresser :lol:
c'est sûr. :) Je suis en train de commencer un binding pour lua afin de me familiariser avec la lib. Un binding en python serait plus judicieux mais je n'ai encore jamais fait de modules pour. :p

Pour les utilitaires, par exemple un programme qui liste les paquets orphelins (pas requis et installés en tant que dépendance). Le code me semble assez clair pour ne pas être commenté, mais si il y a des questions...

getorphans.c

Code : Tout sélectionner

#include <stdio.h>
#include <stdlib.h>

#include <alpm.h>
#include <alpm_list.h>


int main(int argc, char** argv)
{
	alpm_list_t *i;
	pmpkg_t *pkg = NULL;
	pmdb_t *db_local = NULL;
	
	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");
		alpm_release();
		return 1;
	}
	
	for (i = alpm_db_getpkgcache(db_local); i ; i = alpm_list_next(i)) 
	{
		pkg = alpm_list_getdata(i);
		if ( alpm_list_count(alpm_pkg_get_requiredby(pkg)) == 0 &&
			 alpm_pkg_get_reason(pkg) == PM_PKG_REASON_DEPEND )
		{
			printf("%s\n", alpm_pkg_get_name(pkg));
		}
	}
	alpm_release();
	return 0;
}
Pour compiler : gcc getorphans.c -o getorphans -lalpm
Dernière modification par mimas le jeu. 08 nov. 2007, 16:52, modifié 1 fois.
Anarchy for the triple A.
ths
Daikyu
Messages : 52
Inscription : mar. 11 sept. 2007, 23:41

Message par ths »

Tres bonne idée le coups de lister les orphelins.
nik11
Hankyu
Messages : 45
Inscription : lun. 01 oct. 2007, 19:29

Message par nik11 »

Interessant comme petit projet avec pacman. :)
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Le binding "partiel" pour lua de la librairie alpm est dispo ici : luaalpm.tar.gz.

Il me manquait jusqu'à présent la motivation pour documenter un peu afin de le publier. :p Il est partiel et pas foncièrement exempt de bugs (lawyer inside), Cependant il convient très bien pour mon usage actuel et ne m'a pas fait de misère, sauf problème interface chaise/compileur.

Il faut le paquet lua pour lancer les deux exemples, et une doc html est inclue.
Anarchy for the triple A.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message par wain »

Terrible !!
ça marche, et bien même ;)

Ca me donne envie de découvrir d'avantage Lua. Ce language a l'air très sympatique. Je me ferai bien une réécriture de yaourt du coup 8)
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Lua n'est pas mal mais un peu limité par défaut, heureusement qu'il existe des extensions pour étendre son domaine d'action. :)

En ce qui concerne les scripts qui touchent la gestion du système, j'ai pas mal apprécié la vision des développeurs de Pardus
High Thoughts Must Have High Language
As said by Aristophanes, 405 B.C., this great wisdom is still not yet understood by many free software developers.

Our main concern was not only the speed of initialization process, but maintainability of the code base. Our previous experience with Gentoo init system while adding internationalization support showed that shell scripts are a maintainability nightmare.
source : http://www.pardus.org.tr/eng/projects/c ... ardus.html

Il me semble donc maintenant que le shell est bien mais à petite dose, que les langages de haut niveaux ont une flexibilité et lisibilité qui leurs donne un avantage certains sur les scripts shell. et pour alpm, c'est pas la vitesse qui compte vu le choix sur la façon de stocker les infos. :p

En ce qui concerne alpm, j'ai noté que pas mal de fonctions déclarées dans les includes ne sont pas exportées, donc inutilisables. :( Je ne sais pas si elles sont réellement utiles mais ça donne une impression de manque de sérieux en ce qui concerne la librairie et le volonté de la rendre pacman modulaire (pas de début de 'binding' officiel, tout le monde réécrit ses fonctions utilisant la base dans son programme...). C'est dommage.
Anarchy for the triple A.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message par wain »

Je suis d'accord avec toi. Sortir une libraire sans un seul binding complet c'est sans intérêt. De manière général, Archlinux est un projet qui n'accepte pas les développements non-officiels. Je lisais encore la semaine dernière sur la ML de pacman un message du nouveau leader qui disait en gros "arrêter de nous envoyer vos patchs de merde" :?
Je ne compte plus les contributions sur le bbs anglais qui n'ont jamais donné suite, faute de trouver un écho au près de la dev team.
C'est le coup de geule sur Arch que je pousse depuis des années. Ca ne changera pas de si tôt !
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

wain a écrit :Je lisais encore la semaine dernière sur la ML de pacman un message du nouveau leader qui disait en gros "arrêter de nous envoyer vos patchs de merde" :?
Réponse claire : on les emmerde.

Il y a pas mal de choix officiels qui m'exaspèrent, mais je n'ai pas encore trouvé plus sympa comme distro alors je sulfate, j'adapte et je taille. :)
Anarchy for the triple A.
Répondre