mohawk:

- utilisation de libevent2
- 'listen on ...' par vhost

Makefile:

- emplacement du chroot suivant MOHAWK_VERSION
- tout le code de debug est encadré par USE_DEBUG
- test sur l'OS (FreeBSD / NetBSD / OpenBSd / DragonflyBSD)
- génération des fichiers de configuration à partir de templates
- utilisation de bsd.prog.mk (<3)

mhtpasswd && chroot.sh:

- style

token.l:

- utilisation de yylineno (affichage du n° de ligne lors des erreurs de parsing)
- suppression du mot 'set'
- ajout de auth_path, auth_patterns, authentication, clone, dirlist, mime_type,
  no_auth_patterns, syslog_facility et reset
- les listes ont un nom 'au pluriel'

parse.y:

- définition de *_RESET
- macro CLONE_HASH, CLONE_LIST, NUMBER_IS_PORT, SET_MOHAWK_LIST, SET_MOHAWK_HASH
  RESET_MOHAWK_HASH, RESET_MOHAWK_LIST
- changement du nom de la structure de conf
- réduction du nombre de variables globales
- yyerror affiche le n° de ligne du fichier de conf
- prise en compte des adresse '0.0.0.0' et '::' dans interface() et host():
  il faut absolument connaitre toutes les adresses correspondantes
- les adresses ipv6 local link ne sont pas utilisées
- nouvelle fonctionnalité: clonage d'un vhost
- ajout de tests de cohérence dans vhost_add()
- réorganisation des tokens et des commandes
- ajout de la commande RESET, utilisée lors d'un clonage

dump.c:

- directement intégré à mohawk, l'option -D active le dump de la config
- prise en compte de la nouvelle configuration des vhosts

main.c:

- nouvelles options:

	* -D : dump de la configuration
  * -n : vérifie uniquement la syntaxe du fichier de configuration
  * -p pidfile : précise l'emplacement du fichier 'pid'

Cette dernière option est nécessaire car suite au changement d'identité et à un éventuel chroot,
le fichier 'pid' risque de ne plus être accessible. Charge au script d'init de supprimer ce fichier
à l'arrêt de mohawk.


libevent:

L'utilisation de cette librairie repose sur une structure (struct evhttp) et des fonctions de rappel
associées à cette structure.

void
main(void)
{
    struct event_base *eb;
    struct evhttp *httpd;
    
    eb = event_base_new();
    httpd = evhttp_new(eb);
    evhttp_set_allowed_methods(httpd, EVHTTP_REQ_GET | EVHTTP_REQ_POST | EVHTTP_REQ_HEAD);
    evhttp_bind_socket(httpd, '127.0.0.1', 80);
    evhttp_set_gencb(httpd, do_request, NULL);
    
    event_base_dispatch(eb);
    exit(EXIT_SUCCESS):
}

// fonction de rappel
void
do_request(struct evhttp_request *req, void *cb_data)
{
    evhttp_send_error(req, HTTP_SERVUNAVAIL, 'This server can serve any request, sorry');
    return;
}

La gestion des hôtes virtuels dans libevent se borne à associer une structure http à une autre:

    ...
    struct evhttp *virtual_httpd;
    
    virtual_httpd = evhttp_new(eb);
    evhttp_set_allowed_methods(virtual_httpd, EVHTTP_REQ_GET);
    //do not bind socket, this is a virtual host
    evhttp_set_gencb(httpd, do_virtual, NULL);

    evhttp_add_virtual_host(httpd, 'virtual.example.com', virtual_httpd);
    ...

// fonction de rappel
void
do_virtual(struct evhttp_request *req, void *cb_data)
{
    evhttp_send_error(req, HTTP_SERVUNAVAIL, 'This virtual server can serve any request, sorry');
    return;
}

mohawk définit 2 fonctions de rappel:

- do_status (getrusage, informations sensibles ?)
- do_request, fonction principale, qui appelera au besoin:
  * do_cgi, gestion des scripts cgi
  * do_dir, listing d'un répertoire
  * do_file, envoi d'un fichier

La gestion des hôtes virtuels dans mohawk se fait au travers d'une structure vhost;

struct vhost {
        TAILQ_HEAD(, mohawk_list) auth_patterns;
        TAILQ_HEAD(, mohawk_list) cgi_patterns;
        TAILQ_HEAD(, mohawk_list) index_names;
        TAILQ_HEAD(, mohawk_list) no_auth_patterns;
        TAILQ_HEAD(, mohawk_list) no_cgi_maps;
        TAILQ_HEAD(, mohawk_list) no_log_patterns;
        TAILQ_HEAD(, mohawk_list) restrict_froms;
        TAILQ_HEAD(, mohawk_hash) cgi_env;
        TAILQ_HEAD(, mohawk_hash) cgi_map;
        SLIST_HEAD(, address_info) address_infos;
        const char *auth_path;
        const char *charset;
        const char *dirlist_css_url;
        const char *host;
        const char *mohawk_name;
        const char *rootdir;
        const char *status_url;
        int authentication;
        int cgi_env_count;
        int cgi_expose_mohawk_version;
        int dirlist;
        int maxage;
        int x_forwarded_for;
        SLIST_ENTRY(vhost) entry;
};

où address_infos est la liste des ip/port sur lequels peut répondre l'hôte virtuel.

Afin de connaitre le couple ip/port sur lequel s'est connecté le client, on passe en
paramètre des fonctions de rappel l'adresse d'une structure callback_data:

struct callback_data {
    struct vhost *vh;
    struct evhttp *httpd;
    char *host;
    char *service;
    int port;
    TAILQ_ENTRY(callback_data) entry;
};

La fonction do_vhost renseigne, pour chaque address_info de chaque vhost une structure
httpd et une structure callback_data. Si l'appel à evhttp_bind_socket() échoue, on recherche
dans la liste des callback_data le couple ip/port. S'il est trouvé, on ajoute un hôte virtuel
au httpd correspondant.
