LysKOM-Projektet -------------------------------- Specifikation av protokoll A mellan klient och server -------------------------------- av Lars Aronsson 25 juni 1991 LysKOM LysKOM {r ett datakonferenssystem. Andra liknande system {r QZ-KOM och PortaCOM. LysKOM {r Copyright (C) 1990 datorf|reningen Lysator vid Universitetet och Tekniska H|gskolan i Link|ping. Var och en till}ts fritt kopiera, {ndra och distribuera LysKOM dokument och program, givet att mottagarna ges samma r{ttigheter. Varken Lysator eller dess medlemmar tar n}got som helst ansvar f|r dokumentens eller programmens riktighet eller f|ljderna av deras anv{ndande. Den h{r texten Den h{r texten specificerar version A av det protokoll som anv{nds mellan en klient (anv{ndarens program) och en server (databasen). Den h{r texten {r t{nkt att inneh}lla allt du beh|ver veta f|r att skriva en klient utan att veta n}got om servern, eller tv{rtom. Mitt syfte {r att den h{r texten skall vara s} fullst{ndig och korrekt som m|jligt. Om du hittar n}gra fel, eller kommer p} n}got som saknas, s} h|r g{rna av dig till mig. F|ljande {r de saker som jag vet saknas i den h{r texten: Vad som lagras i en anv{ndares "user-area", och hur. Filer Den h{r filen {r en mer systematisk sammanst{llning av nedan uppr{knade filer. Det {r m|jligt att filerna har {ndrat namn, antal och utseende n{r du l{ser detta. S} h{r hette de den 3 juni 1991: 2kom/doc/com-spec -- borta! 2kom/doc/security-levels.txt 2kom/include/kom-types.h 2kom/include/kom-errno.h 2kom/isc-client/com.h 2kom/server/fncdef.txt -- borta? 2kom/include/services.h Underliggande protokoll LysKOM Protokoll A kan k|ras ovanp} vilken tillf|rlitlig dubbelriktad 8-bitars bytekanal som helst. I n|dfall kan det ocks} k|ras p} en 7-bitars bytekanal. Idag k|rs det ovanp} Telnet/TCP/IP. P} Lysator anv{nds telnetport 4894 p} IP-host 130.236.254.1 (lysator). Data i protokoll A sker i ASCII klartext. I hollerithstr{ngar (se nedan) f}r godtyckliga 8-bitars bytes f|rekomma, men tanken {r att man skall kunna k|ra protokollet "r}tt" fr}n en textterminal. Abstrakt syntaxnotation I den h{r specifikationen har en BNF-liknande grammatik anv{nts f|r att beskriva protokollets dataelement. Det {r mycket vetenskapligt, f|r s} g|r de som specar OSI-protokoll. Den h{r grammatiken borde likna ASN.1 mer {n den g|r, men jag har inte ASN.1-specen h{r. Dataf{lt har givits namn med liten begynnelsebokstav, datatyper med stor. Operatorn "::=" definierar (som i BNF) och ":" ger typ (som i Pascal). Kommentarer inleds med "!" och avslutas med radslut (som i BLISS). Semikolon anv{nds som i C. De grundl{ggande typerna och deras notation beskrivs h{rn{st. Grundl{ggande datatyper Dataelementen som skickas med protokollet }tskiljs av (godtyckliga sekvenser av) mellanslag, tab-tecken, line-feed, return, eller NULL. Undvik att skicka NULL, men var beredd p} att tolka det som ett mellanslag. INTEGER {r icke-negativa heltal som skall rymmas p} 32 bitar. De skickas som text p} decimal form. HOLLERITH {r textstr{ngar. F|rst skickas str{ngens l{ngd som en INTEGER, sedan bokstaven "H" och d{refter (utan }tskiljande mellanslag!) texten. Texten f}r inneh}lla vilka byte-v{rden som helst fr}n 0 till 255. BITSTRING skickas som text representerande ett heltal p} bin{r form. Antal bitar i str{ngen framg}r alltid av sammanhanget. [ven inledande nollor m}ste skickas. Siffran "1" representerar sant v{rde och "0" falskt. Bitarna skickas i den ordning de st}r listade i den abstrakta syntaxen. shape-of-world : BITSTRING ( is-flat; is-round; is-3d; is-2d; ! e.g. "0110" ) ARRAY {r en lista med ett visst antal element. Elementens typ noteras omedelbart efter ordet ARRAY. F|rst skickas en INTEGER som ger antalet element, sedan skickas tecknet "{", d{refter alla elementen i f|ljd och slutligen tecknet "}". Tecknen "{" och "}" fyller egentligen ingen funktion, men underl{ttar n{r man k|r protokollet "r}tt". Exempel: hackers : ARRAY HOLLERITH; ! e.g. 4 { 8Haronsson 7Hbellman 4Hinge 5Hceder } SELECTION {r en INTEGER med efterf|ljande svans. Vilken typ svansen har beror p} v{rdet av heltalet. F|r vissa v{rden kan svansen vara tom. V{rdet anges i den abstrakta syntaxen med "nummer=namn". Exempel: phrase : SELECTION ( 1=hello name:HOLLERITH; ! e.g. "1 4HJohn" 2=howdy ; ! e.g. "2" ) RPC {r en mycket speciell notation som anv{nds f|r protokoll med remote procedure calls, dvs fr}gor och svar. Notationen f|r RPC ser ut som SELECTION, men varje alternativ har tv} svansar: fr}gan och svaret. Selectornumret skickas bara tillsammans med fr}gan. Exempel: phrases : RPC ( 1=cost inventory:INTEGER; price:INTEGER; 2=time timezone:INTEGER; hours:INTEGER; 3=name ; name:HOLLERITH; ) ! e.g. "1 23"->"498" "3"->"4HLars" "2 1"->"1430" Datastrukturen struct/record markeras i den abstrakta syntaxen bara med omgivande "(" och ")". Detta inneb{r inte att n}gra extra tecken skickas i protokollet. Dialog En session b|rjar alltid med en uppkoppling, d{r klienten v{ljer protokoll genom att skicka en uppkopplingsbeg{ran : ( "A"; loginnamn : HOLLERITH; ) vilken besvaras fr}n servern av en uppkopplingsbekr{ftelse : "LysKOM\n" D{refter har vi finns bara RPC-protokollet commands. Klienten f}r skicka flera fr}gor innan den f}tt svar p} det f|rsta. F|r att h}lla reda p} till vilket anrop ett visst svar h|r, v{ljer klienten ett referensnummer att medf|lja och samma nummer }terfinns i svaret. Det {r klientens sak att fritt v{lja och h}lla reda p} referensnumren. fr}ga : ( ref-no : INTEGER; commands-call; ) som, om allt g}r som det skall, besvaras fr}n servern med ok-return : ( "="; ref-no : INTEGER; commands-return; ) eller, om n}got misslyckades, med error-return : ( "%"; ref-no : INTEGER; error-no : Error-No; error-status : INTEGER; ) Det skall inte vara n}got tomrum mellan "=" respektive "%" och ref-no. Observera att {ven f|r de funktioner d{r f-return {r inneh}llsl|st svarar servern med "=" eller "%" och ref-number. S{kerhetsniv}er och privilegiebittar S{kerhet och privilegier byggs i LysKOM med tv} komponenter: Varje person har sig ett antal bittar tilldelad (man kan s{ga att personen tillh|r ett antal grupper) och varje session har dessutom en s{kerhetsniv} (ett tal). Varje r{ttighet kr{ver en viss bitt och en viss minsta niv}. De senast aktuella kombinationerna bitt-niv}-r{ttighet beskrivs i filen 2kom/doc/security-levels.txt, h{r ges en vackrare tabell: Bitt Niv} R{ttighet ------------------------------------------------------ wheel Normalt ej tilldelad 0 Alltid logga in, {ven vid "crowded" 6 S{tta alla Priv_bits f|r alla personer 7 S{tta password f|r alla personer 8 Vara organisat|r (supervisor) f|r allt 10 Kan l{sa alla texter ------------------------------------------------------ admin Normalt ej tilldelad 1 St{nga av servern 1 S{tta motd_of_kom 1 L{sa last_login 2 L{sa status f|r hemliga m|ten och personer 2 L{sa de skyddade delarna av statusen 2 L{sa hela text_statusen, {ven vid hemliga mottagare 3 Byta namn p} alla 4 Addera/subtrahera medlemmar 4 Addera/subtrahera mottagare till texter 5 S{tta superm|te 5 Radera texter 6 S{tta administrat|r ------------------------------------------------------ statistic Normalt ej tilldelad 2 L{sa statistikdelarna av Person-structen, {ven om de {r skyddade. ------------------------------------------------------ create_conf Normalt tilldelad 0 Skapa m|ten ------------------------------------------------------ create_pers Normalt tilldelad 0 Skapa personer ------------------------------------------------------ Enligt Thomas Bellmans erfarenheter anv{nder en administrat|r i praktiskt arbete bara niv}erna 0 och 255. I st{llet f|r s{kerhetsniv}er borde de enskilda privilegiebittarna sl}s p} och av individuellt. Detta kanske l|ses elegantare i kommande versioner av protokollet. Felkoder De felkoder som f|rekommer som svar p} RPC-anrop {r nedanst}ende. H{r {r de f|rklarade i nummerordning. Det finns en kort lista i alfabetisk ordning strax efter}t. Error-No : SELECTION ( 0=no-error; ! No error has occured 2=not-impl; ! Not implemented yet 3=obsolete; ! No longer implemented 4=pwd; ! Wrong or illegal password 5=long-str; ! String too long 6=login; ! Not logged in. 7=login-disallowed; ! System is in 'singel-user mode' 8=conf-zero; ! Attempt to use conference number 0. 9=undef-conf; ! Undefined or secret conference 10=undef-pers; ! Undefined or secret person 11=access; ! No 'read/write permission' 12=perm; ! No permission 13=not-member; ! Not member in conf 14=no-such-text; ! No such global text-no, or no access 15=text-zero; ! Can't use text no 0 16=no-such-local-text;! No such local text-no 17=local-text-zero; ! Can't use local text no 0 18=bad-name; ! Too short or too long ! or contains illegal chars 19=index-out-of-range; 20=conf-exists; ! Already exists 21=pers-exists; ! Already exists 22=secret-public; ! Cannot be secret and !rd-prot 23=letter-box; ! Cannot change letter-box flag 24=ldb-err; ! Should never happen, ! unless Willf|r makes a mistake. 25=ill-misc; ! Illegal misc field. ! err-stat holds field no 26=illegal-info-type; ! Info-type parameter was illegal. ! This means that there is a ! bug in the client. 27=already-recipient; ! Already recipient to this text. 28=already-comment; ! Already comment to this text. 29=already-footnote; ! Already footnote to this text. 30=not-recipient; ! Not recipient 31=not-comment; ! Not comment to this text. 32=not-footnote; ! Not footnote to this text. 33=recipient-limit; ! Too many recipients 34=comm-limit; ! Too many comments 35=foot-limit; ! Too many footnotes 36=mark-limit; ! Too many marks. 37=not-author; ! Only the author may add footnotes or ! delete texts. 38=no-connect; ! Can't connect to specified server 39=out-of-memory; ! Couldn't get memory for result 40=server-is-crazy; ! Client can't understand server 41=client-is-crazy; ! Client thinks that server says it ! can't understand client. 42=undef-session; ! This session doesn't exist ) Nummer Felmeddelande Nummer Felmeddelande ------------------------------------------------------ 11 access 28 already-comment 29 already-footnote 27 already-recipient 18 bad-name 41 client-is-crazy 34 comm-limit 20 conf-exists 8 conf-zero 35 foot-limit 25 ill-misc 26 illegal-info-type 19 index-out-of-range 24 ldb-err 23 letter-box 17 local-text-zero 6 login 7 login-disallowed 5 long-str 36 mark-limit 38 no-connect 0 no-error 16 no-such-local-text 14 no-such-text 37 not-author 31 not-comment 32 not-footnote 2 not-impl 13 not-member 30 not-recipient 3 obsolete 39 out-of-memory 12 perm 21 pers-exists 4 pwd 33 recipient-limit 22 secret-public 40 server-is-crazy 15 text-zero 9 undef-conf 10 undef-pers 42 undef-session ------------------------------------------------------ Asynkrona anrop N{r som helst kan servern skicka ut ett asynkront anrop. En klient beh|ver inte bry sig om dem. Det g}r bra att l{sa undan dem n{r ett svar skall l{sas. Asynkrona meddelanden b|rjar alltid med ":" och ett heltal som talar om hur m}nga parametrar som kommer. D{refter kommer en selector och parametrarna. Precis som f|r ok- och error-return {r d{r inget tomrum mellan ":" och f|rsta heltalet. I f|rklaringen nedan listas de asynkrona anropen i nummerordning, men en alfabetiskt sorterad lista f|ljer strax d{rp}. asynk-meddelande ::= ( ":"; antal-params:INTEGER; meddelande : SELECTION ( 0=new-text ( text-no : Text-No; text-stat : Text-stat ) ! En ny text har skapats. 1=logout person : Pers-No; ! G}r {ven under namnet "i-am-off" (i C-koden). ! K{llkoden f|r Elispklienten g|r g{llande att ! asynkrona anropet nummer 1 {r taget ur bruk. ! Det {r ersatt av anrop 13 som anger sessionsnummer. 2=who-info ( person : Pers-No; conference : Conf-No; what-am-i-doing : HOLLERITH; ) ! K{llkoden f|r Elispklienten g|r g{llande att ! asynkrona anropet nummer 2 heter login, men att ! det hur som helst {r taget ur bruk och ersatt av ! asynkrona anropet nummer 9. 3=conf-deleted ! Anv ej av Elispklienten ??? 4=conf-created ! Anv ej av Elispklienten ??? 5=conf-changed-name ( conf-no : Conf-No; old-name : HOLLERITH; new-name : HOLLERITH; ) ! G}r {ven under namnet "new-name" (i C-koden). 6=i-am-on info : Who-Info; 7=database-is-syncing ; 8=forced-leave-conf ! Anv ej av Elispklienten ??? 9=login ( pers-no : Pers-No; session-no : Session-No; ) 10=broadcast-message ( sender : Pers-No; message : HOLLERITH; ) ! Det vore estetiskt f|rdelaktigt om servern aldrig skickade ! asynkrona anropet nummer 10 utan h|ll sig till nummer 12. 11=crowded ; ! Asynkrona anropet nummer 11 betyder att n}gon har ! misslyckats logga in, eftersom servern inte har fler ! lediga f|rbindelser. Den ansvarsk{nnande anv{ndaren ! kan nu v{lja att logga ut f|r att bereda plats. 12=directed-message ( recipient : Pers-No; sender : Pers-No; message : HOLLERITH; ) ! Om argumentet recipient {r noll (0) i asynkrona anropet ! nummer 12, s} {r meddelandet riktat till alla inloggade. ! Det {r {nnu inte m|jligt att rikta ett meddelande till ! en viss session. 13=new-logout ( pers-no : Pers-No; session-no : Session-No; ) ) ) En asterisk (*) efter numret i tabellen nedan anger att det asynkrona anropet ersatts av n}got annat. Se ovan under respektive anrop f|r n{rmare beskrivning. Nr Asynkront anrop Nr Asynkront anrop ------------------------------------------------------ 10 broadcast-message 5 conf-changed-name 4 conf-created 3 conf-deleted 11 crowded 7 database-is-syncing 12 directed-message 8 forced-leave-conf 6 i-am-on 9 login 1* logout 13 new-logout 0 new-text 2* who-info ------------------------------------------------------ RPC-anrop Klienten skickar RPC-anrop med parametrar till servern. Servern svarar endera med ett felmeddelande (se ovan i avsnitten Dialog och Felkoder) eller med ett returv{rde. Nedan ges BNF-grammatiken f|r de datatyper som anv{nds i parametrar och returv{rden. RPC-anropen listas i alfabetisk ordning, men en numeriskt sorterad lista f|ljer strax efter}t. commands : RPC ( ! Anropsnummer och -namn ! Datayp f|r anropsparameter ! Datatyp f|r returv{rde 32=add-comment params : ( comment : Text-No; comment-to : Text-No; ) ; 37=add-footnote params : ( footnote : Text-No; footnote-to : Text-No; ) ; 14=add-member params : ( conf-no : Conf-No; pers-no : Pers-No; priority : INTEGER; where : INTEGER; ) ; ! Addera angiven person som medlem i angivet m|te ! Priority {r prioriteten p} l{slistan ! Where {r placering p} listan, 0 (noll) eller st|rre ! RPC-anropet nummer 14 anv{nds {ven senare f|r att {ndra ! prioritet och plats p} listan. 30=add-recipient ! The sequence "conf-no, type" is a reversed Misc-Info. ! Type is recpt or cc_recpt. add-recipient-params : ( text-no : Text-No; conf-no : Conf-No; type : INTEGER; ) ; 45=broadcast message : HOLLERITH; ; ! Ett privilegierat anrop. ! Samma effekt kan n}s genom magisk parameter till anrop 53. ! En gammal felaktig kommentar g|r g{llande att parametern ! skulle vara ett text-no, men s} {r inte fallet. 3=change-name change-name-params : ( conf-no : Conf-No; new-name : HOLLERITH; ) ; ! Anropet nummer 3 byter namn p} angivet m|te eller person. 4=change-what-i-am-doing what-am-i-doing : HOLLERITH; ; ! Den medskickade texten kommer att visas i vilka-listan, ! se {ven anropet nummer 51. 10=create-conf params : ( name : HOLLERITH; type : Conf-Type; ) result : Conf-No; 5=create-person create-person-params : ( name : HOLLERITH; passwd : HOLLERITH; ) Pers-No; ! En ny person skapas med angivet namn och l|senord. ! Den skapade personens personnummer returneras. 28=create-text ! create-text-return returns text number zero on error ! NB! Only Misc-Infos 0,1,2,4 can be sent here. params : ( text : HOLLERITH; misc-info : ARRAY Misc-Info ) result : Text-No; 11=delete-conf conf : Conf-No; ; ! Utpl}na ett m|te eller en person. 29=delete-text Text-No; ; 55=disconnect session-no : Session-No; ; ! Disconnect a session. You can disconnect your own session ! (even if you are not logged in) and any session where you ! are supervisor of the user that is logged in on that ! session. 42=enable ena-level : INTEGER; ; ! This is a privileged call. ! Set ena-level. Zero means don't use any privileges. 50=get-conf-stat conf-no : Conf-No; result : Conference; ! Returnera m|tesstatus f|r angivet m|te 13=get-conf-stat-old params : ( conf-no : Conf-No; mask : INTEGER; ) result : Conference ! Eftersom den mask som ing}r i params f|ga beaktas, ! har anropet nummer 13 ersatts av anropet 50. ! M|tesstatusen f|r det angivna m|tet returneras. ! Om masken {r ett j{mnt tal, s} skickas ett tomt f{lt (0H) ! name i svaret. Fr}n b|rjan var det t{nkt: ! mask = name + members + texts + list-sizes -- just use 255 47=get-created-texts params : ( person : Pers-No; first : Local-Text-No; no-of-texts : INTEGER; ) created-texts : Text-List; ! NB! first is a text number local to the person who wrote it. ! It is not a Local-Text-No in his mailbox. 34=get-map params : ( conf-no : Conf-No; first-local-no : Local-Text-No; no-of-texts : INTEGER; ) result : Text-List; 23=get-marks ; Mark-List; 48=get-members params : ( conf : Conf-No; first : INTEGER; no-of-members : INTEGER; ) members : Member-List; ! first should perhaps be Local-Conf-No... 46=get-membership params : ( person : Pers-No; first : INTEGER; no-of-confs : INTEGER; mask : BITSTRING (want-read-texts); ) memberships : Membership-List; ! first should perhaps be Local-Conf-No... 49=get-person-stat person : Pers-No; result : Person; ! Personstatusen f|r den angivna personen returneras. 6=get-person-stat-old params : ( person : Pers-No; mask : INTEGER; ) result : Person; ! Eftersom den mask som ing}r i params f|ga beaktas, ! har anropet nummer 6 ersatts av anropet 49. ! Personstatusen f|r den angivna personen returneras. ! Om masken {r ett j{mnt tal, s} skickas ett tomt f{lt (0H) ! username i svaret. 36=get-server-info ; result : Info; ! Return various information about the server. ! Anrop 36 hette tidigare get-info med samma semantik. 54=get-session-info session-no : Session-No; result : Session-Info; 25=get-text params : ( text : Text-No; start-char : INTEGER; end-char : INTEGER; ) result : HOLLERITH; 26=get-text-stat params : Text-No; result : Text-Stat; 35=get-time ; Time; 52=get-unread-confs pers-no : Pers-No; conf-no-list : ARRAY Conf-No; 0=login login-params : ( person : Pers-No; passwd : HOLLERITH; ) ; 1=logout ; ; ! Anropet nummer 1 misslyckas aldrig. 12=lookup-name name : HOLLERITH; result : Conf-List-Old; ! Expandera ett f|rkortat namn och returnera en lista ! med nummer p} de m|ten och personer som det kan vara. ! Se kommentaren vid definitionen av Conf-List. 27=mark-as-read params : ( conference : Conf-No; texts : ARRAY Local-Text-No; ) ; 24=mark-text params : ( text : Text-No; mark-type : INTEGER; ) ! mark-type = permanently-marked -- just use 255 (?) ! The server only stores (does not act upon) this value. ; 2=pepsi Conf-No; ; ! Anropet nummer 2 anv{nds f|r att g} till det angivna m|tet. ! Det engelska namnet {r change conference. ! Namnet "Pepsi" h|r till avdelningen mer krystade vitsar. 9=query-read-texts params : ( pers-no : Pers-No; conf-no : Conf-No; ) result : Membership; ! Man kan fr}ga efter ol{sta utan att logga in. 53=send-message params : ( recipient : Pers-No; message : HOLLERITH; ) ; ! Ett privilegierat anrop. ! Om mottagaren {r nummer noll, skickas meddlandet till ! samtliga inloggade personer. Detta kan ers{tta anrop 45. 17=set-conf-motd params : ( conf-no : Conf-No; text-no : Text-No; ) ; ! S{tt lappen text-no p} d|rren till conf-no. ! Set-presentation och set-etc-motd trollar dessutom ! med f{ltet no-of-marks i textstatusen f|r den gamla ! och den nya presentationstexten. ! Anrop 17 hette f|rr set-etc-motd med samma semantik. 21=set-conf-type params : ( conf-no : Conf-No; type : Conf-Type ) ; ! M|tet conf-no {r av typen type. 22=set-garb-nice params : ( conf-no : Conf-No; nice : Garb-Nice; ) ; ! Inl{gg i m|tet conf-no sparas i nice dagar innan de raderas. 41=set-motd-of-lyskom motd : Text-No; ; ! This is a privileged call. ! The text indicated by the parameter is set to be the message ! of the day of LysKOM. 8=set-passwd params : ( person : Pers-No; old-pwd : HOLLERITH; new-pwd : HOLLERITH; ) ; ! Ge personen ett nytt l|senord. Old-pwd {r det (gamla) ! l|senordet f|r personen som g|r RPC-anropet (inte ! n|dv{ndigt samma som anges av f|rsta argumentet). 19=set-permitted-submitters params : ( conf-no : Conf-No; perm-sub : Conf-No; ) ; ! M|tet conf-no {r skrivskyddat. ! Endast medlemmar i perm-sub f}r skriva inl{gg i conf-no. ! Om perm-sub {r 0 (noll) (???) {r m|tet inte skrivskyddat. 16=set-presentation params : ( conf-no : Conf-No; text-no : Text-No; ) ; ! [ndra presentationen f|r angivet m|te eller person. ! Ange text-no 0 (noll) f|r att ta bort presentationen. ! Set-presentation och set-etc-motd trollar dessutom ! med f{ltet no-of-marks i textstatusen f|r den gamla ! och den nya presentationstexten. 7=set-priv-bits params : ( person : Pers-No; privileges : Priv-Bits ) ; ! Ge eller ta n}gra bittar f|r den angivna personen. 20=set-super-conf params : ( conf-no : Conf-No; super-conf : Conf-No; ) ; ! G|r super-conf till superm|te (organisat|r?) f|r m|tet ! conf-no. Om conf-no {r skrivskyddat, s} skickas eventuella ! brev vidare till superm|tet. 18=set-supervisor params : ( conf-no : Conf-No; admin : Conf-No; ) ; ! G|r alla medlemmar i m|tet admin till administrat|rer (???) ! f|r m|tet conf-no. Admin {r typiskt en persons brevl}da. 40=set-unread params : ( conference : Conf-No; no-of-unread : INTEGER; ) ; ! Endast l{sa no-of-unread senaste i angivet m|te. 57=set-user-area params : ( pers-no : Pers-No; user-area : Text-No; ) ; ! Angiven text anv{nds f|r att lagra angiven persons ! variabler. Hur detta g}r till borde kanske behandlas ! i ett separat kapitel. 44=shutdown exit-val : INTEGER; ; ! This is a privileged call. ! Shutdown server. ! An old comment says exit-val is not used by the server. ! Samma effekt n}s genom kill -HUP mot servern. 33=sub-comment params : ( comment : Text-No; comment-to : Text-No; ) ; 38=sub-footnote params : ( footnote : Text-No; footnote-to : Text-No; ) ; 15=sub-member params : ( conf-no : Conf-No; pers-no : Pers-No; ) ; ! Subtrahera angiven person som medlem i angivet m|te. 31=sub-recipient params : ( text-no : Text-No; conf-no : Conf-No; ) ; 43=sync ; ; ! Make LysKOM sync its files. This is a privileged call. ! Samma effekt n}s med kill -SIGUSR1 mot servern. 56=who-am-i ; sesson-no : Session-No; 39=who-is-on-old ; result : Who-Info-List-Old; ! Anrop nummer 39 {r ersatt av anrop 51, vars svar ger ! mer information. 51=who-is-on ; result : Who-Info-List; ! Svaret {r en lista med information om nu aktiva sessioner. ) De anrop vars nummer i listan nedan f|ljs av en asterisk (*) {r ersatta av modernare verianter i den nuvarande versionen (0.33) av Elisp-klienten. Nummer RPC-Anrop Nummer RPC-Anrop ------------------------------------------------------ 0 login 1 logout 2 pepsi 3 change-name 4 change-what-i-am-doing 5 create-person 6* get-person-stat-old 7 set-priv-bits 8 set-passwd 9 query-read-texts 10 create-conf 11 delete-conf 12 lookup-name 13* get-conf-stat-old 14 add-member 15 sub-member 16 set-presentation 17 set-conf-motd 18 set-supervisor 19 set-permitted-submitters 20 set-super-conf 21 set-conf-type 22 set-garb-nice 23 get-marks 24 mark-text 25 get-text 26 get-text-stat 27 mark-as-read 28 create-text 29 delete-text 30 add-recipient 31 sub-recipient 32 add-comment 33 sub-comment 34 get-map 35 get-time 36 get-server-info 37 add-footnote 38 sub-footnote 39* who-is-on-old 40 set-unread 41 set-motd-of-lyskom 42 enable 43 sync 44 shutdown 45* broadcast 46 get-membership 47 get-created-texts 48 get-members 49 get-person-stat 50 get-conf-stat 51 who-is-on 52 get-unread-confs 53 send-message 54 get-session-info 55 disconnect 56 who-am-i 57 set-user-area ------------------------------------------------------ Konstruerade datatyper H{r definieras de datatyper som sedan anv{nds i RPC-anrop fr}n klienten till servern och i asynkrona anrop fr}n servern till klienten. Datatyperna listas i bokstavsordning. ! Pers-no and Conf-no are u_shorts in the same domain. Conf-No ::= INTEGER; Conf-No-List ::= ARRAY Conf-No; ! Anv{nds var? Conf-List ::= ARRAY ( conference : Conf-No; type : Conf-Type; ) ! Som svar p} anrop 12 ges Conf-List-Old, som inte kan formuleras ! med den h{r BNF-grammatiken. Conf-List borde returneras, men d} ! vore inte LysKOM bak}tkompatibelt. ! Conf-List-Old: "3 { 3 45 62 } { 1001 0000 1001 }" ! Conf-List: "3 { 3 1001 45 0000 62 1001 }" Conf-Type ::= BITSTRING ( rd_prot; ! Can anyone become a member? original; ! Comments forbidden? secret; ! Secret mailboxes cannot easily login by name letterbox; ! Mailbox ) Conference ::= ( name : HOLLERITH; type : Conf-Type; creation-time : Time; last-written : Time; creator : Pers-No; presentation : Text-No; supervisor : Conf-No; permitted-submitters : Conf-No; ! Zero means anybody super-conf : Conf-No; ! Zero means author msg-of-day : Text-No; ! Every conf has one nice : Garb-Nice; no-of-members : INTEGER; first-local-no : Local-Text-No; ! Oldest text still stored no-of-texts : INTEGER; ! How many texts stored ) Garb-Nice ::= INTEGER; ! Number of days Info ::= ( version : INTEGER; conf-pres-conf : Conf-No; ! M|tet Pres (nya) m|ten pers-pres-conf : Conf-No; ! M|tet Pres (nya) medlemmar motd-conf : Conf-No; ! M|tet Lappar p} d|rren kom-news-conf : Conf-No; ! M|tet Nyheter om LysKOM motd-of-lyskom : Text-No; ! Visas vid login ) ! kom-types.h defines Info-Datum as the tail in Misc-Info ! kom-types.h defines Info-Type as the selector in Misc-Info Local-Text-No ::= INTEGER; Mark ::= ( text-no : Text-No; type : INTEGER ) ! Servern ger sig inte p} att tolka markeringstypen, ! det {r helt upp till klienten. Mark-List ::= ARRAY Mark; Member ::= Pers-No; Member-List ::= ARRAY Member; Membership ::= ( last-time-read : Time; conference : Conf-No; priority : INTEGER; last-text-read : Local-Text-No; read-texts : ARRAY Local-Text-No; ) Membership-List ::= ARRAY Membership; Misc-Info ::= SELECTION ( 0=recpt recipient : Conf-No; ! Mottagare 1=cc-recpt cc-recipient : Conf-No; ! Extra kopia 2=comm-to comment-to : Text-No; ! Kommentar till 3=comm-in commented-in: Text-No; ! Kommentar i 4=footn-to footnote-to : Text-No; ! Fotnot till 5=footn-in footnoted-in : Text-No; ! Fotnot i 6=loc-no local-no : Local-Text-No ! Lokalt textnummer 7=rec-time received-at : Time; ! Mottaget tid 8=sent-by sender : Pers-No; ! S{nt av 9=sent-at sent-at : Time; ! S{nt n{r ! 10=...-recpt ??? ! F|r k{nnedom ) Pers-List ::= ARRAY Pers-No; Pers-No ::= Conf-no; Person ::= ( username : HOLLERITH; ! E-mail adress privileges : Priv-Bits; flags : Personal-Flags; last-login : Time; ! Eller logout? user-area : Text-No; total-time-present : INTEGER; ! I sekunder sessions : INTEGER; created-lines : INTEGER; created-bytes : INTEGER; read-texts : INTEGER; no-of-text-fetches : INTEGER; created-persons : INTEGER; created-confs : INTEGER; first-created-local-no : INTEGER; ! Well, local isn't really true but... no-of-created-texts : INTEGER; ! Numbers of texts in the ARRAY, ! i.e. not erased ones. no-of-marks : INTEGER; no-of-confs : INTEGER; ) ! /mo Personal-Flags ::= BITSTRING ( unread-is-secret; ! V{rdet 1 betyder att antalet ol{sta texter h}lls hemligt flg2; flg3; flg4; flg5; flg6; flg7; flg8; ) ! Se avsnittet ovan om s{kerhetsniv}er och privilegiebittar. Priv-Bits ::= BITSTRING ( wheel; admin; statistic; create_pers; create_conf; change_name; flg7; flg8; flg9; flg10; flg11; flg12; flg13; flg14; flg15; flg16; ) ! Session-Info {r v{ldigt likt Who-Info. Session-Info ::= ( person : Pers-No; working-conference : Conf-No; session : Session-No; what-am-i-doing : HOLLERITH; username : HOLLERITH; ! user@host idle-time : INTEGER; ! Sekunder sedan senaste anrop connection-time : Time; ! Tid och datum f|r uppkoppling ! Detta {r ej detsamma som login-tid ) ! Session numbers are unique to each session. A person can have ! more than one session running at the same time. Session numbers ! are assigned starting from 1 up. Session numbers are not reused ! during the lifetime of the server. See Who-Info-List Session-No ::= INTEGER; Text-List ::= ( first-local-no : Local-Text-No; texts : ARRAY Text-No; ) ! Text-No is a u_long. Text-No ::= INTEGER; Text-Stat ::= ( creation-time : Time; author : Pers-No; no-of-lines : INTEGER; no-of-chars : String-Size; no-of-marks : INTEGER; misc-info : ARRAY Misc-Info; ) ! UNIX struct tm. No time zone. Time ::= ( seconds : INTEGER; ! 0 ... 59 minutes : INTEGER; ! 0 ... 59 hours : INTEGER; ! 0 ... 23 mday : INTEGER; ! 1 ... 31 month : INTEGER; ! jan = 0 ... dec = 11 year : INTEGER; ! Sedan 1900 weekday : INTEGER; ! s|n = 0 ... SAT = 6 yearday : INTEGER; ! 0 ... 365 isdst : INTEGER; ! positivt = sommartid, 0 = normaltid ) Who-Info-Old ::= ( person : Pers-No; what-am-i-doing : HOLLERITH; working-conference : Conf-No; ) Who-Info-List-Old ::= ARRAY Who-Info-Old; Who-Info ::= ( person : Pers-No; working-conference : Conf-No; session : Session-No; what-am-i-doing : HOLLERITH; username : HOLLERITH; ! user@hostname ) Who-Info-List ::= ARRAY Who-Info; Exempel Nedan ett exempel fr}n en verklig LysKOM-session. Kommentarer har jag gett med "!" som i grammatiken. Exemplet {r gammalt och inneh}ller en del detaljer som senare tagits ur bruk, men det ger {nd} en ide om hur det r}a protokollet ser ut. $ telnet laila 4894 Trying 130.236.254.12 ... Connected to laila.lysator.liu.se. Escape character is '^]'. A8Haronsson ! Jag k|r protokoll A LysKOM ! LysKOM svarar 1 12 13HLars Aronsson ! lookup-name =1 2 { 8 38 } { 1001 1001 } ! Person 8 eller Person 38 :3 2 21 7 0H ! Person 21 gick till m|te 7 :1 1 56 ! Person 56 loggade just ut 2 0 8 8H******** ! login Person 8 med password :3 2 8 0 0H ! Person 8 loggade just in =2 ! login OK 3 10 23HAntikommunistiskt Forum 0000 ! Jag skapar ett |ppet m|te =3 57 ! OK, m|te 57 skapat 4 1 ! Jag loggar ut :1 1 8 ! Person 8 loggade just ut =4 ! logout OK