Le serveur
contrôle le stockage des articles : il renomme les articles postés par les utilisateurs, il supprime les articles dont la date de postage est supérieure à un certain délai (7 jours par défaut). Seul le propriétaire du serveur
peut modifier ces articles (voir la partie sécurité section 4 page ), mais tout utilisateur peut, en utilisant le posteur
, créer un article dans ce répertoire, qui sera renommé par le serveur
. Bien entendu, tous les articles de ce répertoire sont en accès libre en lecture pour tous les utilisateurs.
Le nom du fichier temporaire crée par le posteur
et contenant l'article passe par un tube nommé. C'est le chemin complet de ce fichier temporaire qui passe par ce tube.
La taille du nom de l'article, ainsi que la taille du nom du chemin de l'article sont définis respectivement par les macros et
si elles sont définies sur le système, sinon par les macros POSIX
et
. L'utilisation des limites de la machine de préférence par rapport aux normes POSIX permet d'utiliser des chemins d'articles qui peuvent être supérieures aux normes POSIX (par exemple, sur certains systèmes, la limite POSIX de la taille d'un chemin est de 255 caractères, alors que la limite du système est de 1023 caractères, soit environ 4 fois plus ; l'utilisation de la limite de 1023 caractères est donc plus souple).
Dans tous les cas, le nombre maximum de caractères pouvant être écrits atomiquement dans le tube est inférieur à la somme de la taille du nom d'un fichier (ou article, dans le cadre du FORUM DE DISCUSSION
) et de la taille du nom d'un répertoire : si on utilise les normes POSIX (ie. les macros ou
ne sont pas définies), le nombre maximum de caractères pouvant être écrits atomiquement dans le tube est défini par
, valeur qui sera utilisée pour définir la taille du tube, et si on utilise les limites de la machine, on utilise
pour définir la taille du tube.
Le fait que le nom complet du fichier temporaire contenant l'article ait une taille strictement inférieure à la taille maximum de caractères pouvant être écrits atomiquement dans le tube nous assure que un nom de fichier arrivera en entier au serveur
, et sans être mélangé avec un autre nom de fichier temporaire (par exemple, si un autre utilisateur lance le posteur
, et que celui-ci envoie au serveur
au même moment le nom d'un fichier temporaire).
Tous les jours à la même heure, le serveur
supprime les articles plus vieux qu'une certaine date. Le délai d'expiration peut être passé en argument au serveur
(option -v, suivie du délai en jours). Si aucun délai n'est spécifié au serveur, tous les articles plus vieux de 7 jours sont périodiquement supprimés. L'expiration s'effectue à 01 H 00 (cette heure est choisie de façon arbitraire, mais correspond à une heure où peu d'utilisateurs sont susceptibles d'utiliser le serveur
). L'heure à laquelle l'expiration est lancée peut aussi être spécifiée en argument (option -m, suivie de l'heure).
Une fois lancé, le serveur
commence par vérifier que le répertoire contenant les articles est bien vide. Si ce répertoire n'est pas vide, il efface tous les fichiers contenus dans ce répertoire. Si le serveur
doit être relancé une seconde fois (ou plus), par exemple si la machine sur laquelle tourne le serveur
s'est arrêtée et a du se relancer, une option permet de préciser combien d'articles ont déjà été postés afin qu'ils ne soient pas effacés (option -r, suivie du numéro du dernier article).
Le tube nommé utilisé par le serveur
(et par le posteur
) est crée par le serveur
si il n'existe pas déjà, et ses droits sont mis à jour si ils ne sont pas bons. Cela permet de ne pas avoir à effacer ce tube si on doit relancer le serveur
.
Lorsque le serveur
se lance, il vérifie qu'aucun fichier verrou n'existe. Si c'est la cas, il quitte proprement, sinon il en crée un. Cela sert à éviter que deux serveurs soient lancés en même temps : un seul serveur
doit pouvoir lire dans le tube, et modifier le répertoire contenant les articles.
La boucle principale du serveur
est une boucle ``infinie'' (tant qu'on n'a pas envoyé de signal approprié au serveur
pour le tuer, et tant que aucune erreur n'interviens, celui-ci tourne). C'est dans cette boucle principale qu'un nom de fichier temporaire peut être lu et renommé. Le tube nommé étant ouvert en mode non bloquant, si aucune donnée n'est à lire dans le tube, un nouveau tour de boucle est effectué. Pour éviter de trop surcharger le système, lorsque aucune donnée n'est envoyée au serveur
par le tube nommé, le serveur
est ``endormi'' pendant 1 seconde grâce à la fonction . A chaque début de boucle, l'heure courante est comparée à l'heure de mise à jour. Si ces deux heures correspondent, la mise à jour quotidienne est effectuée.
Cette façon de faire permet au serveur de pouvoir gérer plusieurs postages d'articles en même temps, puisque l'écriture dans un tube est bloquante. De plus, on est sûr que les noms des fichiers ne se mélangerons pas, en raison de l'atomicité de l'écriture dans un tube.