char *slurp(const char *url)
by Emile `iMil' Heitor - 2009-03-10
Pour mon projet top secret que j’ai, j’avais besoin de télécharger un fichier, en C, via FTP ou HTTP. En cherchant ce qui est fait dans pkg_install, et plus particulièrement dans admin/audit.c, j’ai trouvé un bon exemple d’utilisation de la libfetch, dont le man est à mon avis complètement indigeste.
Petit résumé.
Afin de visualiser un code complet et fonctionnel sur l’utilisation de la libfetch, le fichier audit.c
précedemment cité fera reference.
Considérons une fonction, fetch_url qui prendra en paramètre une URL. Afin d’utiliser la libfetch, nous auront besoin du header fetch.h
. Voici donc le début de notre fichier contenant la fonction fetch_url :
La première fonction que nous allons utiliser se nomme fetchXGetURL()
, elle permettra de valider que l’url passée en paramètre est bien de la forme proto://hostname/peut-etre-quelque-chose
, elle renverra une sorte de descripteur, de type fetchIO
et placera la taille du fichier visé dans la variable st
, de type struct url_stat
, le 3eme parametre représente les flags eventuels, nous n’en passons pas :
Une fois le descripteur ouvert et les informations sur la cible récupérées dans la variable st
, nous pouvons préparer le conteneur, un pointeur de type char *
dont nous pouvons d’ores et déjà reserver la taille :
On aura bien entendu préalablement déclaré les variables buf_len
et buf
:
On n’oubliera evidemment pas de libérer buf
lorsque l’on en aura plus besoin grace à un free(buf)
.
Arrive la boucle principale, qui bouclera tant que la taille de ce qui est lu + ce qui a déjà été lu est inferieure à la taille présente dans st.size
, soit buf_len
. La fonction issue de la libfetch en charge de la lecture se nomme fetchIO_read()
:
Et voila ! la variable buf
contient maintenant le resultat de la lecture de l’url const char *url
, à vous d’inventer le reste :)