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)
- gnration 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:

- dfinition 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
- rduction 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 utilises
- nouvelle fonctionnalit: clonage d'un vhost
- ajout de tests de cohrence dans vhost_add()
- rorganisation des tokens et des commandes
- ajout de la commande RESET, utilise lors d'un clonage

dump.c:

- directement intgr  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 : vrifie uniquement la syntaxe du fichier de configuration
  * -p pidfile : prcise l'emplacement du fichier 'pid'

Cette dernire option est ncessaire 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'arrt de mohawk.


libevent:

L'utilisation de cette librairie repose sur une structure (struct evhttp) et des fonctions de rappel
associes  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 htes 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 dfinit 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 rpertoire
  * do_file, envoi d'un fichier

La gestion des htes 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 rpondre l'hte virtuel.

Afin de connaitre le couple ip/port sur lequel s'est connect le client, on passe en
paramtre 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 hte virtuel
au httpd correspondant.
