Mots-clé : programmation C

Zeemoz – dev : entrées terminées

Ca y est maintenant on peut entrer tout ça sans problème, ça fonctionne :

0 => marseille
1 => Marseille
2 => MARSEILLE
3 => abbeville st lucien
4 => abbeville saint lucien
5 => abbeville-saint-lucien
6 => aix en provence entre 200000 et 500000 euros
7 => aix en provence
8 => entre 200000 et 500000 euros
9 => 13 entre 200000 et 500000 euros
10 => 13013 entre 200000 et 500000 euros
11 => 13013 entre 200000 et 500000euros
12 => 13013 entre 200000 et 500000
13 => loyer entre 200000 et 500000
14 => prix entre 200000 et 500000

Je crois que je vais recommencer à être un peu fatigué. Bonne fin de nuit à tout le monde…

Apache : notes pour les filtres

Voilà ce que j’ai mis longtemps à comprendre :

Lorsqu’un client envoie quelque chose à httpd, le serveur Web commence à créer des seaux qu’il remplit au fur et à mesure : et quand un seau est plein, il en remplit un autre etc jusqu’à ce qu’il ait un nombre de seaux suffisants. Ces seaux sont rangés dans une brigade. Une brigade de seaux. Une bucket brigade, en Anglais. Et là, il les fait passer au premier filtre qu’il a sur sa liste. Ce filtre peut à son tour, ajouter d’autres seaux, en enlever, ou même, tout supprimer et créer toute une série d’autres seaux. Toujours est-il que quand on développe un filtre, il faut toujours avoir en tête plusieurs choses :

  • Il va toujours y avoir une série de seaux qu’il va falloir parcourir, ce ne sera jamais un seul seau simple et seul. La boucle de parcours sera toujours de la forme :
    /* on demande à lire une série de seaux : */
    rv = ap_get_brigade(f->next, bb, AP_MODE_READBYTES, APR_BLOCK_READ, readbytes);
    /* si erreur, la gérer, sinon boucle pour lire seau après seau : */
    for (b = APR_BRIGADE_FIRST(bb);
         b != APR_BRIGADE_SENTINEL(bb);
         b = nextb) {
        nextb = APR_BUCKET_NEXT(b);
        ...
        traitement de ce qu'on a reçu
        ...
    }
  • Le serveur Apache gère une chaine de filtres, qui se suivent dans un ordre qu’il est impossible à connaitre du point de vue d’un filtre. En résumé, on ne sait jamais, quand on programme un filtre, quels sont les filtres qui ont été appelés avant le nôtre, ou quels sont les filtres le seront après. Bon ok. Il y a quand même une possibilité de dire grossièrement où on veut que le filtre soit, dans la chaine. En réalité il est possible de préciser l’un cinq niveaux grossiers parmi :
    1. APR_HOOK_REALLY_FIRST
    2. APR_HOOK_FIRST
    3. APR_HOOK_MIDDLE
    4. APR_HOOK_LAST
    5. APR_HOOK_REALLY_LAST

    Revenons à notre brigade, pleine de seaux, mais dont on ne sait pas exactement ce qu’elle contient, mais on le suppose. Lorsque celle-ci arrive et que notre filtre est appelé, on ne sait que grossièrement où est placé le filtre dans la chaine, donc il se peut que la brigade arrive avec des données en plus qui proviennent d’autres filtres mais qui ne nous concernent pas (entre autres des données personnelles qui vont d’un filtre à l’autre, des méta-données, en Anglais METADATA). C’est pour cela qu’il faut toujours s’assurer que ce ne sont pas des métadonnées qui ne nous concernent pas : c’est la macro APR_BUCKET_IS_METADATA :
    /* on demande à lire une série de seaux : */
    rv = ap_get_brigade(f->next, bb, AP_MODE_READBYTES, APR_BLOCK_READ, readbytes);
    /* si erreur, la gérer, sinon boucle pour lire seau après seau : */
    for (b = APR_BRIGADE_FIRST(bb);
         b != APR_BRIGADE_SENTINEL(bb);
         b = nextb) {
        nextb = APR_BUCKET_NEXT(b);
        if ( ! APR_BUCKET_IS_METADATA(b) ) {
            ...
            traitement de ce qu'on a reçu
            ...
        }
    }

Zeemoz : créer un nouveau module C pour Apache

Aller dans le répertoire des sources, et taper :

/opt/httpd-2.2.4/bin/apxs -g -n modulenouveau

Il va créer un répertoire ./modulenouveau et à l’intérieur les fichiers Makefile et mod_modulenouveau.c, qui contient le squelette du code tel qu’attendu par Apache.
Ensuite il ne reste qu’à remplir.
Pour le script d’installation, il n’y a qu’à copier /usr/bin/modsearch_install.sh en modmodulenouveau_install.sh et modifier uniquement les variables $SOURCES et $MOD.

Zeemoz : version ou config de libtool

Il y a souvent un problème avec soit la version, soit la config, de libtool.
Il faut toujours que libtool soit configuré pour compiler des librairies partagées, ce qu’il ne fait pas par défaut.
Il faut aller dans /opt/httpd/build/libtool et vérifier que le paramètre "build_libtool_libs" soit à "yes" :
# Whether or not to build shared libraries.
build_libtool_libs=yes

Prog C : les paramètres de scanf

Mémoire pour les paramètres de scanf
Comme je n’arrive jamais à me souvenir des options de conversion, et qu’elles sont en Anglais donc c’est plus long pour moi à décoder, les voici les voilà :
Paramètres scanf :

  1. %u est à déclarer comme
    unsigned int
  2. %hu est à déclarer comme
    unsigned short int
  3. %lu est à déclarer comme
    unsigned long int
  4. %d est à déclarer comme
    int
  5. %hd est à déclarer comme
    short int
  6. %ld est à déclarer comme
    long int

Exemple sscanf :
Déclaration de variables :
unsigned int u;
unsigned short int hu;
unsigned long int lu;
int d;
short int hd;
long int ld;

Exécution :
sscanf(ma_chaine_en_entree, "%u %hu %lu %d %hd %ld",
&u, &hu, &lu, &d, &hd, &ld);

Zeemoz : mémo Apache

  1. Tuer les sémaphores d’Apache
    /opt/httpd/erase_semaphores.sh
  2. Fuites mémoires Apache
    Pour vérifier si Apache a des fuites mémoire, il suffit juste de le faire tourner comme n’importe quel éxécutable, via valgrind :
    valgrind --leak-check=full --log-file=./valgrind.log /opt/httpd/bin/httpd

Zeemoz : plantage Apache

Apache a créé des milliers de sémaphores en mémoire puis a planté. Ces sémaphores sont des descripteurs de ressources écrites dans un système de fichiers virtuel (/dev/shm pour shared memory), autrement dit un ramdisk.

En plantant, les processus httpd n’ont pas pu nettoyer leurs sémaphores, laissant le ramdisk saturé. C’est pourquoi au redémarrage, httpd ne peut créer sa ressource et conclut à un « no space left« .

On voit les sémaphores avec la commande suivante :
ipcs -s | grep www-data

Il y a une astuce avec awk ou perl pour les effacer, ensuite un apachectl start et ça repart.