# Moteur de recherche pour capsule gemini (C)
2021-05-01T21:07:51Z

## EN
Need a search engine for you capsule?
I just wrote one in C.

=> /cgi-bin/search See it in action
=> /code/gemini_cgis.tgz Source code

Edit config.h to suit your needs (yes, path are hardcoded to enjoy OpenBSD's unveil safety).
Run "make".
Copy to your capsule.

CGI support is required.

## FR
J'en parlais juste avant, j'avais fait un moteur de recherche pour ma capsule gemini en utilisant grep : 

=> /log/2021-05-01-recherche-gemini.gmi

J'évoquais l'envie de l'écrire en C. C'est chose faîte.
C'est fou ce qu'on code vite quand tout le monde dort à la maison.
Sieste <3.

Bref.

C'est nettement plus rapide qu'avec grep dans un script shell, comme vous vous en doutez.
Mais plus important, il profite du support de "pledge" et "unveil", ce qui me rassure en ce qui concerne un CGI.

### Pour faire vite

=> /cgi-bin/search Essayez le moteur de recherche
=> /code/gemini_cgis.tgz Code source


### Des détails

La mise en oeuvre est la suivante : 

* Le dossier à scanner est modifié à la compilation. J'y tiens, je ne veux pas passer en argument un chemin vers un fichier ou dossier : trop de risque de donner accès au contenu de mon serveur.
* Dès le début, on appelle "pledge" et "unveil" sur le dossier à scanner : on ne doit pas pouvoir en sortir.
* On récupère la recherche dans la variable d'environnement "QUERY_STRING". Pas d'inquiétude à propos de son contenu comme avec un script shell qui pourrait lancer d'autres commandes sur mon système. Si la variable est vide, alors on envoie le code "10" pour que l'utilisateur entre sa recherche.
* On scanne le dossier à la recherche de fichiers "gmi".
* Si on trouve des sous-dossiers, on les scanne aussi.
* On lit les fichiers "gmi" ligne par ligne et on appelle "strcasestr" pour faire des recherches insensible sà la casse.
* On affiche un lien vers le fichier contenant la ligne avec le résultat de recherche.

> Et si on a une recherche qui correspond à plusieurs lignes?

Impossible avec gemini : un paragraphe = 1 ligne de texte. Encore une raison d'apprécier ce protocole, c'est vraiment simple de développer pour ce dernier.

Imaginer en html tout ce qu'on auraît du faire : virer les tags "<p>", dé-échapper les entités html "&amp;", et j'en passe.

On pourrait imaginer appeler une fonction différente de "strcasestr" pour notre recherche.
Par exemple "fnmatch" pour profiter du globbing.
Ou encore "regexec" pour implémenter une recherche en regexp.

Je n'en ai pas besoin, mais si ça vous intéresse, vous pourrez facilement modifier le code ;)

### Et maintenant ?

J'imagine qu'il serait pas mal d'implémenter un cache.
Créer dans un dossier "cache" des fichiers portant le même nom que la requête et contenant le résultat.
Avant de lancer une recherche, on regarde si ce fichier existe et si oui, on en retourne le contenu.

Ça suppose de vider le cache régulièrement. Dans un cron : 

```
find /path/to/capsule/cgi-bin/cache/ -type f -mtime +2 -delete
```

Par ailleurs, ça veut dire ECRIRE dans un fichier sur le serveur, donc modifier les permissions pour "unveil" et "pledge", autrement dit réduire les conditions de sécurité. Pas envie ^^

## Une réaction?

=> mailto:bla@bla.si3t.ch?subject=capsule-search-engine-c Envoyez votre commentaire par mail.
=> /log/commentaires Mode d'emploi de la liste de diffusion pour recevoir les réponses.