Et voici la version 1.3.1 J'ai ajoute un espace apres "filt", et j'ai enfin documente les erreurs et les statistiques. Planar ------------------------------------------------------------------------------ Specifications de l'interface mur, version 1.3.1 # Description ^^^^^^^^^^^ Une brique est un carre indivisible de 32 x 32 caracteres. Le mur est compose de 2^27 x 2^27 briques. L'utilisateur est place au debut a une position aleatoire, mais non vide. Toutes les coordonnees font ensuite reference a cette position de depart. Les et sont donc des entiers decimaux qui seront utilises modulo 2^27 pour calculer la position de la brique. On decrit une brique par 32 lignes de 32 caracteres. Une ligne plus longue sera tronquee, une ligne plus courte sera completee par des trous. Un trou est un caractere ASCII DEL '\177' qui signifie : "garder le caractere deja present a cet endroit". Tout caractere de code ASCII inferieur a 32 sera remplace par un espace. Chaque ligne est terminee par un newline '\n'. Initialisation ^^^^^^^^^^^^^^ Lancer murof, qui est le Gardien des structures de donnees du mur. On communique avec le Gardien par son entree et sa sortie standard avec des messages d'au moins une ligne, et commencant par un des mots-cles qui sont expliques ci-dessous. Le mot-cle et ses arguments sont separes par exactement un espace. A l'initialisation, le Gardien rend `helo' si l'initialisation s'est bien passee, ou bien `erro' ou `fatl' en cas d'erreur. On peut aussi communiquer avec le Gardien par l'intermediaire d'un filtre, qui peut implementer des algorithmes de cryptage, de cache, etc; ce qui permet aux gourous d'etendre leur interface facilement. Fonctionnement ^^^^^^^^^^^^^^ Un programme d'interface (ou l'utilisateur lui-meme, ou un filtre) communique avec le Gardien en envoyant l'un des codes `read', `writ', `eras', `warp', `stat', `filt' ou `exit' (en ASCII). A chaque fois, le Gardien rend au moins une ligne de reponse. Tout ceci s'applique aussi a la communication entre l'interface et un filtre, ou entre deux filtres si on les a empiles. L'interface n'a pas besoin de savoir si elle parle a un filtre ou directement au Gardien. Codes renvoyes par le Gardien ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ helo 1.31 # Si l'initialisation s'est bien passee. `1.31' est le numero de version du protocole. Il sera toujours de la forme . dans les versions futures. erro Si une erreur se produit, mais que l'on peut continuer. Le est toute la fin de la ligne (apres l'espace qui suit ). fatl Si une erreur fatale se produit. Dans ce cas, le Gardien est meurt et coupe la connexion c'est-a-dire qu'il ferme son entree et sa sortie standard. brik Suivi de 32 lignes, suivi de ---- lors de l'envoi d'une brique par le Gardien. Le Gardien peut supprimer les espaces a la fin d'une ligne; en particulier, les lignes blanches peuvent etre reduites a un newline. stts Suivi d'un certain nombre de lignes de la forme : : suivi de ---- lors de l'envoi des statistiques par le Gardien. Un nom de champ commence toujours par une lettre. ---- Termine l'envoi des statistiques ou des 32 lignes d'une brique. empt Si la brique demandee par read est vide (32 lignes blanches). Dans ce cas, il n'y a pas de ---- terminateur. wrtn Pour confirmer l'ecriture ou l'effacement d'une brique. wrpd Pour confirmer le warp. fltr Filter function not implemented. Pour signaler qu'une requete destinee a un filtre est parvenue jusqu'au serveur. Ca ne peut arriver que si l'interface envoie une telle requete alors que le filtre correspondant est absent. Un filtre peut aussi renvoyer une reponse de la forme # "fltr ", avec un message de moins de 1099 caracteres. # bye! Pour confirmer que l'on quitte. Le Gardien meurt et coupe la connexion. Codes envoyes vers le Gardien ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ read Demande la lecture de la brique en (x, y). Reponses possibles : brik, empt, erro, fatl. writ Suivi de 32 lignes, suivi de ---- Pour ecrire une brique en (x, y). Chaque trou est remplace par le caractere qui se trouve a la meme position dans l'ancienne brique (x, y). Reponses possibles : wrtn, erro, fatl. ---- Termine l'envoi des 32 lignes d'une brique. eras Pour ecrire une brique vide (32 lignes d'espaces) en (x, y). Reponses possibles : wrtn, erro, fatl. warp Fait un "warp" (saute a une position aleatoire non vide). Toutes les coordonnees suivantes seront relatives a cette nouvelle position. Reponses possibles : wrpd, erro, fatl. stat Demande des statistiques sur l'utilisation du mur. Reponses possibles : stts, erro, fatl. filt # Pour envoyer une requete a un filtre. La est une chaine de longueur inferieure a 1099 caracteres terminee par un newline. Reponses possibles : Le gardien repondra toujours par fltr, mais un filtre peut renvoyer erro ou fatl. exit Demande la fin de la session. Reponses possibles : bye!. Une fin de fichier sur l'entree standard du Gardien a le meme effet. Messages d'erreur # ^^^^^^^^^^^^^^^^^ # Le gardien peut renvoyer l'un des messages suivants. Un filtre peut # renvoyer d'autres messages. # # 1 maintenance functions are reserved to the owner # 2 usage: murof [-C mblocks nbuckets roX roY] [-D] [-A] # 3 you cannot use "mur" at the moment # 4 cannot open # 5 stdin or stdout is closed # 6 cannot read # 7 initialization failed # 8 read-only brick # 10 cannot lock brick # 13 bad parameter at mur creation # 14 this program must be used on clipper # 100 line too long # 101 syntax error: integer expected for # 101 syntax error: two integers expected for # 101 syntax error: version number expected for # 102 unknown message: # 104 missing '----' at end of brick # 105 do not send replies to the server # # # Statistiques # ^^^^^^^^^^^^ # Le gardien renvoie les statistiques suivantes dans une reponse "stts". # Un filtre peut ajouter, enlever ou changer des statistiques. # # Version: 1.31 # Full: n1/n2/n3 (n4%) # n1 = nombre de blocs occupes # n2 = nombre de blocs alloues # n3 = nombre maximum de blocs # n4 = 100 * n1/n3 # Since: n1 (date) # date de la derniere initialisation du mur # n1 : en secondes depuis le 1er janvier 1970 0h00 # date : en clair # Les statistiques suivantes sont en nombre de briques depuis la derniere # initialisation : # Read: n briques lues # Empty: n briques lues vides # Written: n briques ecrites # Added: n briques ecrites qui etaient vides avant d'etre ecrites # Erased: n briques ecrites qui sont vides apres avoir ete ecrites # Blasted: n briques effacees pour faire de la place # # # Exemple de session ^^^^^^^^^^^^^^^^^^ Les lignes precedees de > viennent du Gardien, et les lignes precedees de < viennent du client. Les crochets entourent des commentaires. >helo 1.31 # brik > [Cette ligne est vide.] > Ceci est un graffito [Toutes les lignes renvoyees par le] > qui tient sur une brique. [ Gardien comportent de 0 a 32] > xxx [ caracteres.] [28 autres lignes de graffiti.] >---- wrtn wrpd empt erro 13 Cannot lock brick Version: 1.31 # >Full: 3180/6120/65536 (4%) >Since: 695574897 (Thu Jan 16 16:14:57 1992) >Read: 159791 >Empty: 120617 >Written: 3028 >Added: 1255 >Erased: 689 >Blasted: 0 >---- bye! Acces ^^^^^ Pour causer a un Gardien, sur clipper : lancer le Gardien par /usr/local/games/lib/mur/murof.bin ou /usr/local/games/lib/mur/murof sur les machines de la salle S : lancer le gardien par rsh clipper /usr/local/games/lib/mur/murof.bin ou /usr/local/games/lib/mur/murof sur poly : lancer une connexion a un Gardien par ~doligez/net/netclient clipper.ens.fr 4575 sur une machine de l'Internet qui connait clipper (ou qui a BIND) : se connecter a la socket TCP numero 4575 sur clipper.ens.fr. Il y a un serveur qui lance un Gardien et qui le branche sur la socket. sur une machine de l'Internet : l'adresse de clipper est 129.199.129.1