CSLNotebookEntryToAlpineusersDateJanuary19,1984FromMarkBrownandEdTaftLocationPaloAltoSubjectAlpinepublicinterfaces(version10)OrganizationPARC/CSLXEROXReleaseas[Indigo]Documentation>AlpineInterfaces.tiogaDraft[Indigo]Doc>AlpineInterfaces.tiogaLasteditedbyTaft,January19,198412:49:34pmAbstractThesearethelowest-levelpublicinterfacestotheAlpinefilesystem.ThismemodescribesthefunctionsprovidedbyAlpineatthislevel,andaccompaniestheMesadefinitionsfilesthemselvesindescribingtheinterfacesAlpineEnvironment,AlpineFile,AlpineTransaction,AlpineFS,andseveralothers.Seetheendofthismemoforachangehistoryandalistofunfinishedbusiness.1.IntroductionThismemodocumentsthefilesysteminterfacesseenbyAlpineclients.TheAlpineinterfacesareintendedtosupporthigher-levelfacilitiessuchastheCedardatabaseandtheCedarfilesystem,andnottosupportapplication-levelclientsdirectly.Multipleinstancesoftheseinterfacesmaybeimportedbyasingleclient,somerepresentinglocalfilesystemsandothersrepresentingremoteserversthatareaccessedthroughremoteprocedurecalls(RPC).AnAlpinefilesystemconsistsofasinglelog,usedtoimplementatomictransactionsondata,andasetoflogicaldiskvolumescontainingfiles.Alogisstoredondiskforonlinerecoveryfromclient-abortedtransactionsandsoftfailures,andistransferredtoofflinestorageforusebythebackupsystemincaseofhardmediafailures.Avolumemaybequiescedandmovedfromoneservermachinetoanother,orstoredofflineforextendedperiods.TheseinterfacesaretheonlyonesseenbyclientsofanAlpineserver.Thisincludesclientsthatmaysharetheservermachine,suchasadirectoryordatabasesystem.2.OrganizationAlltheinterfacesandotherfilesrequiredbyaclientofAlpinearemadeavailablevia[Indigo]Top>AlpineUser.df.TheprimarydocumentationfortheAlpineinterfacesistheinterfacesourcefilesthemselves,whichareheavilycommented.Thedocumentyouarereadingisintendedprincipallyasahigh-leveloverviewofAlpine'sconceptsandfacilities,thoughitalsocontainsmorep^ ?q [r1[q([r3C[8p:q W=r1W=_Iq(W=s3CW=6]q Sar1Sa !&\q(Sa r3CSas7Sa8Sat{Kq A sA3q @Fs@F*q > Vs>*g%Gq <#s<# s !&, ,\.0u57p@ G 8 [ % ,7>@Er 4cS !R&*-.1I3! :?CQE 3 ]_t O#&S)P-4`7 ?9ACH# 1b u . y r *). $ *.0,49w>  #&8'*-.9124@69>=J?DoG 'u ?$*50 15O ;{>@sFhHe % L  E"'*..? 6:?AD $'$N] !{SM!"$& (+-4l8 @\B]EHe    #%R'(,.138=}@ ] v8. e 'k)$-2O479;@cDF  [!#),U04S7;@B_G t   ]k!$&*,s.X27*:8?CF  %'r*w-u  y r Mq $d $*,.Q249<AGR  vrn"%%Y* 47F:> EhG/ oh !z#(F /28;=BC W 7  "(O.1 6;=f@eETVm$9ALPINEPUBLICINTERFACES2detailedelaborationsonthesemanticsofsomeoftheoperations.(IfyouarereadingthisdocumentinPressform,youwillfindlistingsofthepublicinterfacesattheend.)TherearethreelayersofpublicAlpineinterfaces.Theonesinthelowestlayeraretheonesdirectlyexported(remotelyorlocally)byanAlpineinstanceitself.Whenusingtheseinterfaces,theclientprogramisrequiredtointeractdirectlywiththeRPCfacilities,todealwiththecomplexitiesofbindingtomultipleinstancesofthesameinterfaces(whennecessary),andtoexplicitlymanagevariousAlpineobjectssuchastransactionsandopenfiles.ThesecondlayerisathinveneerovertheloweronecalledtheAlpObjectpackage.ItisexportedbytheAlpineUserImplsconfiguration,whichrunsontheclientmachine.IthidesmostofthecomplexitiesofRPCandbinding,anditprovidesautomaticallymanagedobject-orientedaccesstoalltheoperationsexportedbyanAlpineinstance.MostclientprogramsrequiringdirectaccesstoAlpinefacilitiesareexpectedtousetheveneerinsteadofthedirectAlpineinterfaces.(Nevertheless,thelowest-levelAlpineinterfacesareofinteresttoclientprogrammersbecausetheyalonecontaintheauthoritativedocumentationofthesemanticsoftheAlpineoperations.)ThehighestlayerisaclassofCedar'sFSinterfacecalledAlpineFS.ItalsoisexportedbytheAlpineUserImplsconfiguration.ThisinterfaceprovidesanoperationforcreatinganFS.OpenFileforanAlpinefile,uponwhichthestandardFSgenericoperationsmaybeperformed.Additionally,AlpineFSwillcreateastandardIO.STREAMforanAlpinefile.TheAlpineFSinterfaceissuitableformostordinaryclientprograms;thelower-levelAlpineinterfacesarerequiredonlybyrelativelyspecializedclients.2.1.AlpineinterfacesAnAlpineinstancedirectlyexportsfourpublicAlpineinterfaces.TheinterfacesAlpineFileandAlpineTransactioncontainalltheoperationsmostclientswillrequire.AlpineOwnerandAlpineVolumeconsistprimarilyofadministrativeoperations,thoughthereareafewthatmayusefullybecalledbyordinaryclients.(Alpineexportsotherinterfacesaswell,buttheyareintendedonlyforadministratorsorwizardsandarenotdocumentedhere.)Additionally,thereisapublicdefinitionsfile,AlpineEnvironment,thatdeclarespublictypes,constants,andotherthingsusedinoneormoreoftheinterfaces.Thesedefinitionsarealsodeclared(indirectly)intheinterfacesthatusethem,somostclientsshouldnotneedtorefertoAlpineEnvironmentdirectly;thus,forexample,AlpineTransaction.TransIDandAlpineFile.TransIDarethesametype,whichisactuallydefinedinAlpineEnvironment.ThisislikewisetrueofSIGNALsandERRORswiththesamenameinmultipleinterfaces;forexample,AlpineFile.UnknownandAlpineOwner.Unknownhavethesamevalue,soenablingonewillalsocatchoccurrencesoftheother.AlpineFileprovidesalloperationsonfilesthemselves,includingcreatinganddeletingfiles,readingandwritingdata,andmanipulatinganyofafixedsetoffileproperties.AlpineTransactioncontainseverythingtodowithtransactions.AnAlpineservermaybeaskedtobethecoordinatorforanewtransactionoraworkerforanexistingone;thisinterfaceincludesoperationsforbothpurposes.AlpineOwnerdealswithadatastructurecalledtheownerdatabase,whosemainpurposeistoprovideaclientrootfileandadministrativecontrolssuchasdiskspaceaccounting.AlpineVolumeprovidesoperationsforinterrogatingand(forqualifiedclients)changingthesetofvolumesinoperationonaserver.Foreachprocedureineachinterface,thelistofSIGNALsandERRORsthattheprocedurecanraiseisgivenasastylizedcommentintroducedby!''immediatelyfollowingthedeclaration.Forsignalsthattakeenumeratedarguments,thepossiblevaluesoftheargumentsaregiven(butareomittedifallthevaluesarepossible).Additionally,RPC.CallFailedcanberaisedduringanyremotecall;seesection3.4.r g'q!g'"Ug'r%rg'q&Dg'r*:g'q*g'wHDg'r _'3 ~!#'.(+f 2{47L9>AdG ] t3 "9&s ,.50 [x] C$ +=.182589j<?ApD Y]C$ )9,04R7 >@_D W AR1!]$ *H+.14 ;=~B}D Vx ! (+-H 398W=(AF] Tg D Q6(aT!$'k+E.24u;(@BXC PD   !2%()v,0PD,PDr/PD57':=?pA N  ;S )_/@8<>@|B L#"f&V,26;<A G; KNW,O!#h'I+ 2Q ;6= E  I !p %*-1R6 8H @) G 9R E@9 %(-28:x=w?EG/ C g &(+-36;J=< E`G B5}Ik!#N(! .13 ; C[ @ ~'q@@rW@ "i&),^289z>@D > 9 "# (M*003J5F ;8 Bv ;  r 8H-Z|#}&+/ 6v9{ ? F 6lUO %p(-%/5 =@W 4  &+/Z13%58< A^CuG 3R:K1! ()-5/25O;>I@ 1 [$  // L.u! (0+J8M;tAE - V,!| I#$(*, 37 >AD  + | #%_(,14368m;== *9M+Q-:B&E ( cH$')'.h1Wq3(3(r7(8(q;](<(r?n(@(CF & ^ 0$14CG/ %C ik/u  $ +-0 "  !#& .49S< ARD !  Vj "g$ %J(*,/ < $&[(z+ 36 :>ACG   Pu[ ">#$)+-2u58 =B V )f  e^ &+-15$8=%@FEG 3!8 $*-D.15   "d$ ,/28h=<C.EG Z17a b( $!&(q*+1r.0q23r67:=4CFT  T #%( /58H ?BUF G  -#'), 2599<>|CvE GE GrG/ G b  - )+-t1p58v=@BdF TVm$ALPINEPUBLICINTERFACES32.2.AlpObjectinterfacesAlpineUserImplsexportsthreemaininterfacesofinteresttoordinaryclients.TheyaredistinguishedfromthedirectAlpineinterfacesinthattheirnamesbeginwithAlp''ratherthanAlpine''.AlpInstancecontainsanoperationforobtainingahandleonaspecificAlpineinstance,localorremote.ItmanagestheinteractionswithRPCanddealswithalltheproblemsofdynamicinstantiationofinterfaces.AlpTransactioncontainsthesameoperationsasAlpineTransactions.However,theoperationthatcreatesanewtransactionreturnsahandleforalocalobjectwhichembodiesboththetransactionitselfanditsassociatedAlpineInstancehandle;andthishandleispassedtotheotheroperations.AlpTransactionalsocontainstheoperationsdefinedinAlpineOwnerandAlpineVolume.AlpFilelikewiseparallelsAlpineFile,buttheoperationsthatopenorcreateafilereturnahandleforalocalobjectrepresentingthefile,thetransaction,andtheAlpineinstance.2.3.AlpineFSinterfaceAlpineUserImplsalsoexportsahigher-levelinterface,AlpineFS.Itcontainsthreemajorclassesofoperations:procedurestoopenAlpinefilesandproduceanFS.OpenFile,toopenanIO.STREAMforanAlpinefile,andtoperformvariousfilemanipulationssuchascopyinganddeleting.MostoperationsareidenticalorsimilartothecorrespondingonesinCedar'sFSinterface,andmostaspectsofAlpineandRPCarehidden.3.AccessingAlpineThepublicinterfacesexportedfromanAlpineserverareaccessedusingtheCedarRemoteProcedureCall(RPC)facility.Forcomprehensiveinformationonthisfacility,youshouldreadtheLupineUser'sGuide[Lupine,1982].AuthenticationofusercredentialsdependsonGrapevine,andisprovidedmore-or-lessautomaticallybyRPC.Controlofaccesstodatastoredintheserverisbasedonthecaller'smembershipinGrapevinegroupsassociatedwiththedata.TheAlpinesystemcanalsobeinstantiatedonalocalworkstationandusedtomanagefilesthere.Inthissituation,thesamepublicinterfacesareused,butcallstothemdonotinvolveRPC.Authenticationisautomatic,butaccesscontrolworksjustthesameasintheremotecase.Sections3.1and3.2belowdescribehowtoaccesstheAlpineinterfacesdirectly.Section3.3describeshowtoaccessAlpineviatheAlpObjectinterfaces,whichiswhatmostclientsrequiringdirectaccesstotheAlpinefacilitiesareexpectedtodo.IfyouareusingtheAlpObjectinterfaces,anunderstandingofsections3.1and3.2isnotessential,thoughitmaybehelpfulwhenthingsgowrong.TheinformationinthesubsequentsectionsappliesregardlessofwhetherAlpineisbeingcalleddirectlyorviatheAlpObjectinterfaces.IfyouareusingtheAlpineFSinterface,youshouldskipimmediatelytosection7.Thematerialintheinterveningsectionsisprimarilyofinteresttoclientsofthelower-levelinterfaces.However,thoughthedetailsofthoseinterfacesarenotrelevant,certainaspectsofAlpine'sfacilitiesarevisibleattheAlpineFSlevel;forexample,accesscontrol(section3.5),fileproperties(section4.5),andtransactionsandlocks(section5).3.1.BindingAclientbindstoalocalstubimplementationofaremotely-exportedinterfaceusingthenormalMesafacilities(binder,loader,etc.)Forexample,thestubimplementationforAlpineFileiscalledAlpineFileRpcClientImpl,andisinstantiatedontheclientmachine.r g'q!g'"Ug'r%rg'q&Dg'r*:g'q*g'wHDg'v _,  r [I ~" (*/o1 6;}>A1 Z6 S D"&*K.115H9V<| W z &"{$+/,183j49>DYG Vq E#a&)v,024b:l<&A Tl Q "H )#*7|=@jF PI~ q$8&'+/+3D9y<?+ F2 N ;  "%H',.-x13I59 ? L { ) )! *_- J #&`( /2n57;=?CE H ) S !$ +_.0u4v E r B:pP7 t ( ."46L;?_CiG @  5!$'Z,. 78<8>'q@@@@rEc@G >k&~! *./47=@ G; =Db( #0&q(0-5/y 58P;@wBAF ; Hu 8N yr 4g -"u$G(,.4.79=C 3X N> "s *,(.36;%>Rv@3XA3XEw 1r?1( "O$n' / 47M >AC 0  )$&*,?/>3[57];c<@BD .b }A %4(O* ++Q- - ')*.B 58;=BE *?  3 #%)a+.0C357<@3 ( X H!I#&J)+u-#/4* &#"1%&*,1j 7<AC $u T" )8-N.2(59?CG " Y ] C"$>')c-/68 <> G !'<" $l%(*/Z379=@^ G  ? [o #]% *J.0!37<>i@B  ]6Ne %(b,/ 79m>?BG  S 4 8!&(,.1 8 >D  x {"',1k3Q8 >o@EjG/ g>ud %_*-0F 6<?:B  !7v q r "( 8vl""? r'")R*i5;V>A;E z 5"d(+/& 9Notethateachremoteinterfacemustbeimportedinthisway;so,forexample,toimportAlpineFileandAlpineTransactionfromaparticularAlpineserverrequiresinvokingtheImportInterfaceprocedureineachofthecorrespondingRpcControlinterfaces.AruntimebindingmaybebrokenbycallingtheUnimportInterfaceprocedure,whichcausesthelocalandremoteRPCstoforgetabouttheassociationbetweentheclientandimplementation.AclientthatknowsitisfinisheddealingwithaparticularinstanceoftheinterfaceshouldinvokethistoconserveresourcesintheRPCmachinery.TheforegoingdescriptionassumesstaticbindingtoexactlyoneinstanceofanAlpineinterface,e.g.,bymeansofaMesa.configfileorthesimplebindingperformedbytheloader(thoughthedeterminationofwhichinstanceoftheinterfaceisbeingusedneednotbemadeuntilexecutiontime).Dynamicinstantiationofarbitrarynumbersofinstances(bothlocalandremote)issubstantiallymorecomplicated.TheimplementationoftheAlpObjectpackageprovidesoneexampleofhowthismaybedone.3.2.ConversationestablishmentCallingImportInterfaceisstrictlyaruntimebindingoperation;itdoesnotgiverisetoanyexplicitcommunicationwiththeserver.BeforecallinganyAlpineprocedure,itisfirstnecessarytoestablishaconversationwiththeservermachine.Theconversationembodiestheauthenticatedidentitiesofboththeclientandtheserver,anditisalsothebasisfor(optional)encryption-basedsecurecommunication.AconversationisestablishedbycallingRPC.StartConversation,passingtheclient'sRNameandpassword(ordinarilyobtainedfromCedar'sUserCredentialsinterface)andtheserver'sRName.StartConversationfirstcommunicateswithaGrapevineauthenticationservertoobtainaconversationkeythatwillbeknownonlytotheclientandserverRPCmachinery,anditassociatesanewly-allocatedRPC.Conversation(whosepurposewillbeexplainedshortly)withthiskey.Thisisallthatisrequiredtocarryonasecure,authenticatedconversationwiththeserver[Needham&Schroeder,1978].ConversationmaintenanceisfacilitatedbythefollowingRPCconvention:ifthefirstargumentofaremoteprocedurecallisoftypeRPC.Conversation,thenRPCwillensurethatthecommunicationbetweenclientandservermachines(forthatcall)isencryptedbythekeycorrespondingtotheConversation.Thus,allproceduresexportedbyAlpineinterfacesrequireaConversationastheirfirstargument.ThisConversationservestwopurposes:itcausesRPCtoencryptthecommunication,asjustexplained;andontheserversideitidentifiestheclientofeachcall.Afewremarksmaybemadeaboutthisorganization.AConversationrepresentsnothingmorethananauthenticatedcommunicationpathbetweenapairofprincipals;thereisnoinherentassociationbetweenconversationsandanythingelse(interfaces,processes,transactions,etc.)SoasingleConversationcanbe(andtypicallywillbe)usedtomakecallstomultipleremoteinterfaces,suchastheAlpineFiler g'q!g'"Ug'r%rg'q&Dg'r*:g'q*g'wHDg'r _/yq Cf! (*-/38<7>B=G/ ] ^ !:$'2!39c;$A`C [ %P(*i.2n7 >@DF Z9  !$ +15}9~; X VN$+f-B/J 6<A]E? ToqxI m" 'n-1/`14- > E-G RV@l&)( 0%2A{G/ Q |#' ,h 38:y<"=F D%F OymvOyrOy  v,OyrOy$(k+)1>-@CSH# M %['W) 0<49=ZAS L*Y"')/B2A D/He J v$ H #v%V+9,/h246<>@B F` ) #'+069C  D   #[ B=V "$)q+7 >BG/ @ ;JT"?$ +1 3s7;9D:E > 4 ! '-1.146;@?BFC =GS :~ !%n*},#03[8:R<:@ F 9% K!%V*V12549X>o@ 7}v 7} 7}r7}z!%),/^159?vC 5 h W&)-/46) >A 4/ \!_&,0.4T6 9;>@v 0  r -r!l"', 35 8E:=@YBD + R"K&)w. 46f7:@BHev *A r*A # +14 D "95 !P$%, 5:;@IA !) Mj/#K&* -g 4w7-8 >? rR!#*/%2;47:<;>&@BVG  jp+  %(+/+57u >P ^  m $&)/ 2x 9;[=@FHe ie+.25:)=:? L!$'+L-36(8; E&G/ h  %', 279 ACPF u  ") *f.2 38;% E8F  ]c %(O,-0 7"%: -e. 7G =BFi    "'')9,M.C 5C9 :<B P< 3"\ )9 /p 7):t<\=gA3  j(!%}(*a/4 ;>>@CB DTVm$jALPINEPUBLICINTERFACES5andAlpineTransactioninterfacesexportedbyoneAlpineserver.Asingleremoteimplementationcansupportconversationswithmultipleclients,eachidentifiedbyitsownConversation.MultipleclientprogramsonthesamemachinecancommunicatewithagivenAlpineserverusingthesameordifferentConversations,dependingonwhethertheyaremutuallycooperativeorsuspicious.CallingRPC.EndConversationcausestheremoteandlocalRPCstoforgetaboutaconversation(i.e.,aboutanassociationbetweenConversationandconversationkey).AclientthatknowsitisfinishedwithaconversationshouldinvokethistoconserveresourcesintheRPCmachinery.3.3.AlpObjectpackageoperationToaccessAlpineviatheAlpObjectinterfaces,thefirststepisalwaystocallAlpInstance.Create.TheonlyrequiredargumentisthenameoftheAlpineinstance(orFileStore)tobeaccessed.ThenameLocal.alpine''referstotheAlpineinstanceonthelocalmachine,ifoneexists.Optionalargumentsarethenameandpasswordofthecaller;ordinarilytheseshouldbedefaulted,inwhichcasethecredentialsofthelogged-inuser(obtainedfromUserCredentials)areused.ThesuccessfulresultofthisoperationisanAlpInstance.Handle,whichrefersbothtoaboundsetofinterfacestothatAlpineinstanceandtoanauthenticatedRPCconversation.Thishandlemayinturnbepassedtoseveraloftheproceduresdescribedbelow,eitherforperformingoperationsorforobtainingother,morespecializedhandles.Theobjectreferencedbythehandleisautomaticallymanagedandwillbereclaimedafterallreferencestoitaregone.Thenextstepisusuallytocreateatransaction.AlpTransaction.CreatetakesanAlpInstance.Handle,createsatransactiononthedesignatedAlpineinstanceandreturnsanAlpTransaction.HandlethatdesignatesboththeAlpineinstanceandthetransaction.TheotheroperationsinAlpTransactionalltakeanAlpTransaction.Handleastheirfirstargument.ThismeansthatthoseoperationsaremembersoftheHandle'scluster'',sotheymaybeinvokedwithobjectnotation;forexample,ifhisaHandlethenthetransactionmaybecommittedby:h.Finish[commit];Alloperationsonfilesrequirefirstthatthefilebeopened.TheproceduresAlpFile.OpenandAlpFile.CreatetakeanAlpTransaction.Handle,alongwithvariousotherarguments,andreturnanAlpFile.HandlethatdesignatestheAlpineinstance,thetransaction,andthefile.TheotheroperationsinAlpFiletakesuchahandleastheirfirstargumentandmaybeinvokedwithobjectnotationasdescribedabove.AlpTransaction.HandlesandAlpFile.HandlesaremanagedautomaticallyinthesensethattheydesignateCedarreclaimableobjects,sonoexplicitfreeingoperationisrequired.However,whensuchanobjectisreclaimedbecausenoreferencestoitexist,butthetransactionoropenfilecorrespondingtoitisstillactive,nochangeoccursinthestateofthattransactionoropenfile(i.e.,itisnotautomaticallyterminatedorclosed).3.4.CallingTheAlpinepublicinterfacesrestrictthemselvestotheprocedurecallsemanticsimposedbyRPC.Inparticular,address-containingargumentsandresultsaredereferencedbyRPC(toasinglelevel)andpassedbyvalue.(ThisiscomplicatedbytheVALUEandRESULTconventions,discussedinsection4.4.)ROPEsandLISTsareflattenedandsentintheirentirety.ExportedvariablesandthetypeREFANYarenotsupported.Procedureargumentsarenotsupportednow,thoughtheymaybeeventually.SIGNALsr g'q!g'"Ug'r%rg'q&Dg'r*:g'q*g'wHDg'r _/ X $|&)a.2458?= G ]. 4 %) /137 ?E [VM (A+W,|0+48B*C Z9 $!=$M&,g 35 WfW#%*i-0H459=~> F V   $G& .2G37:K>?A9Ft To   U%+-03a Q"% / 0 7<:9=C?DhFt PL KWo$ v L &r I@o"W (+-026u8:F H 0?_!I#-%*g/2G 8:<BE F_$&)d,236:@G; D J s 'Q*/T1D 79\=i@VB C ; +&-y @ P$&(48<@ACGr > i1"$O&9 .2 :R=eADF =F 'KI !B'_+/1 8 ?A@Cp ; z b $ +-/4i5 >LD*F 9 'cS  #- 7|m.!,"R )7}:< 5. sk #(R-058F 4- v "$ ,</2 9Y; DF 2 =:"(+026t =&?}EsG/ 0 $',14$9v;U0r<0>?*D G/ /7  , *@= 'j #&)U+.(36 = F ( (,2/48 @CG & i I#)g+ 3 58:=A: G %J$F"R(s+!.05:8K<[ACd # !()`+2# :<?CgF  A +!#(-F3e4:@DxG u #r%#&{*,. 57;$= FH9 2 ipAV!% &) 0268;=>A  g ). 3 :0CE  X$'l+. 6W8Z;=?CF ]er !A#Hq%&~r*9q,-r2 : @AFq Nr N Nq N Nra N~ N"z$<'-3 8;>/qAS NB' NDrG; N  } h #K%,p/47;= qD D rH  TVm$#ALPINEPUBLICINTERFACES6andERRORsworkacrossremoteinterfacesinthenormalway,withonevariation.Inordertobepassedthroughtotheclient,asignalmustbedefinedintheinterfacethatexportstheprocedureraisingthesignal.SpecialmeasureshavebeentakenintheAlpineimplementationtoensurethatasignalwithagivennameisexportedwiththesamevaluefromeveryinterfacethatcanraiseit.ThesignalRPC.CallFailedmayberaisedbyanyremotecall;itindicatesabreakdownincommunicationorinthebindingwiththeremoteAlpineinstance.Thiswillnotbementionedintheinterfacedescriptionsintheremainderofthisdocument.CallFailedindicatesapersistentfailure(thatis,theRPCmachineryhasalreadytriedveryhardtomakethecallsucceed);soingeneralitisnotappropriatefortheclientsimplytoretrythecall.RecoveryathigherlevelsofclientsoftwaremaysucceedifitreestablishesthebindingtothesameoradifferentAlpineinstance,perhapsafterinterventionbythehumanuser.Nearlyallproceduresinthepublicinterfacesaresafe''intheCedarsense.However,theinterfacesdirectlyexportedfromAlpinearenotdeclaredasCEDARDEFINITIONSbecausethisdeclarationisnotyetsupportedbyRPC;soalltheproceduresareinfactUNSAFEatthepresenttimeandmustbecalledfromwithinTRUSTEDorUNCHECKEDblocks.Ontheotherhand,theAlpObjectinterfacesareCEDARDEFINITIONS,andallproceduresdefinedinthem,withtheexceptionofAlpFile.ReadPagesand.WritePages,areSAFE.3.5.AccesscontrolAccesstofilesandotherobjectsiscontrolledbyaccesscontrollists,whichconsistofGrapevineRNamesthatmaybeindividualsorgroups.Clientmembershipinanaccesscontrollistisdeterminedbyfirstcheckingwhethertheclient'sRNameispresentinthelistandthenconsultingGrapevinetodeterminewhethertheclient'sRNameisamemberofanyofthegroupsinthelist.Eachfilehastwoaccesscontrolliststhatcontrolreadingandmodifyingthatfile.TheseaccesscontrollistsarefilepropertiesthatmaybemanipulatedviatheAlpineFileinterface,describedinsection4.AnaccesscontrollistissimplyalistofRNameswhichareordinarilyGrapevineindividualsorgroups.Thereisaspecialpseudo-RNameWorld'',whichincludesanyauthenticatedclientasamember.Theamountofspaceavailableforstoringaccesscontrollistsisfixedforeachfile.Alpineguaranteesthatthereisenoughroomforanaverageoftwomaximum-lengthRNamesperaccesscontrollist,butdoesnotdictatethedistributionofspaceamongthelists.Eachfilehasanownerproperty,whichisasinglename(usuallybutnotnecessarilyanRName).AclientwhoseRNamematchesthefile'sownerproperty(orisamemberoftheowner'screatelistseesection3.6)ispermittedtochangethefile'saccesscontrollists.EachAlpinesystemhasaspecialAlpinewheels''accesscontrollistwhoseRNameispartofthefilesystem'sglobalstate.Membershipinthisgrouppermitsunlimitedaccesstofilesandotherobjects,regardlessoftheiraccesscontrollists;additionally,therearesomeadministrativeanddebuggingfunctionsthatcanbeinvokedonlybyAlpinewheels.Topreventaccidentaluseofthisdangerouscapability,theclient'smembershipintheAlpinewheelsgroupisnotnoticeduntilexplicitlyenabled.WheelmembershipisenabledordisabledbycallingAlpineTransaction.AssertAlpineWheel.3.6.OwnerdatabaseConsumptionofdiskspaceinanAlpineserveriscontrolledonthebasisofinformationinanownerdatabase.Anownerissimplyaname(usuallybutnotnecessarilyanRName)associatedwithafixedsetofinformation:adiskspacequota,presentconsumption,rootfileID(seebelow),andtwoaccesscontrollistsspecifyingwhomaycreatefilesforthatowner(i.e.,allocatediskspaceagainsttheowner'squota)andwhomaychangetheownerinformationitself.Forthepurposeofdiskspaceaccounting,severalvolumesonagivenservermaybegroupedintoar g'q!g'"Ug'r%rg'q&Dg'r*:g'q*g'wHDg'r _/q _/ ^_/r_/_/?M $"%(2,0"3?5 <=AC7E) ]?  "')w+149<BG/ [I!- #%(, 68<?A+E0He Z9 `!%)(,D147C:~ WO " $l(v+HW+Wr.OW3e68>@VG V ` "A$)}.379rEgG/ To !#T%, 3N8: @:DG R (!"q%)<+*/14:<>CEnG Q 3XG5"n$'-z.3168<,ADx Oy _ :b" $$%'6,17=<|? G M K KW0 "K (n*.026:A Ce Ic!&q(8I)I, r4I9F( FaqFaGFarFaqFaFardFa$]')-24; BIqDFaEFa D rDDK %('@+/18|:F C q!CCrCv ? r s@BF 9% V!&(o-f/7146:> @G 7~n!#I$r)+.:/2R68: 5Tx!$',z14;W>XALE 3\K _#"$ +.0m 7< =/COD 1 i O};U!#.(,/ 5P< BD 0  {A * %B)a.1 :=?@F .f!%*-/ 258P;/? F ,  "%k 0&58[68:@D! %M?M!$(- "4\"!&,:0[5!7s;@BkEcG/ !* a !#Z&*/5a9y;3>,@D  1 (i+.1 :W<C  \X b%@'s,~ 25w7;9@ G/ 4k 1l"&'*S/2? 8 =oA  XH$v > r  5n %n)o* 1E3?58: BCvEFE H rHsHY"+'j), 3s5v;' ADF  % al>"' 0+3658:?BE z  "0%*'u*P.169=oBD RG"< ) S3 &w+0i2i37;;B>@@*EHe XTVm$ALPINEPUBLICINTERFACES7singlevolumegroup,whichhasassociatedwithitasingleownerdatabase.Permissiontoallocatespaceonbehalfofanownerappliestoanyvolumeinthegroup.Additionally,whencreatingafile,aclientmayidentifyavolumegroupratherthananindividualvolume,leavingthechoiceofvolumeuptotheserver;thisisdiscussedintheAlpineFilesection.AlsoassociatedwitheachownerisarootfileID,whichisintendedforclientuseinidentifyingadirectoryorotherdatastructureforlocatingallfilesbelongingtothatowner.4.AlpineFileinterfaceTheAlpineFileinterface(andAlpFileintheAlpObjectpackage)includesalloperationsonfiles.ThissectionshouldbereadinconjunctionwithAlpineFile.mesaitself.Beforecallinganyoftheseprocedures,onemustfirststartatransaction,usingoperationsthatwillbepresentedinsection5.4.1.FilesystemorganizationTheprotocoldescribedinsection3bindsaclienttoaspecificAlpineinstance,identifiedbyanRName.EachAlpineinstanceconsistsofalog,usedtoimplementatomictransactions,andsomenumberofvolumes,organizedintovolumegroups.AvolumeisanalogoustoaCedarlogicalvolume'':initsquiescentstateitisaself-containedfilesystem.ThesetofvolumescomposinganAlpineinstancemaychangedynamicallyasvolumesaremountedanddismounted,thoughtherateofchangeisexpectedtobeslow.Afileisasequenceoffixed-sizepagesstoredinasinglevolume.AfileisidentifiedbyaFileID,anditspagesarenumberedconsecutivelyfromzero.Associatedwithafileisafixedsetofpropertiesthatmaybemanipulatedbyseparateoperations.4.2.OpenfilesAclientdesiringtogainaccesstoafilemustfirstOpenit.Openingafileservestwopurposes.First,itdefinesapointatwhichfileaccesscontrolandwhole-filelockingaredone.Second,itassociatesabriefhandle,theOpenFileID,withaconsiderableamountofstatethatisthereafterkeptbytheserverandneednotbesuppliedineachcall.Thatis,anOpenFileIDrepresentsasingleconversation'saccesstoasinglefileunderasingletransaction.OpenrequirestheclienttosupplyaUniversalFile,whichcontainsbothaVolumeIDandaFileID.ThisisbecauseFileIDsarenotuniversallyuniquebutonlyuniquerelativetoaparticularVolumeID.AFileIDconsistsofboththefileidentifieritself,whichispermanentlyunique,andsomelocationinformation,whichistreatedasahintandissubjecttochangeduringthelifetimeofthefile.OpenreturnsaFileIDwhoselocationhintmaydifferfromthehintintheFileIDthatwaspresented.IftheFileIDsdodiffer,theclientisencouragedtoretaintherevisedFileIDinitsowndatastructuressothatsubsequentOpencallsmaybeperformedmoreefficiently.Theentirefileislockedinthemodespecifiedbythelockargument.Ifthefilecannotbelockedinthatmode,OpeneitherwaitsuntilthelockcanbesetorraisesLockFailed[conflict]immediately,dependingonlock.ifConflict.(ThesemanticsofLockModesarediscussedinsection5.2.)sCbE{G/ Z6r7 #o W d!"~#&)'+/1H79\=*?Ah He V!& %L'<**0285u R y r Ou b$&)'/5;H=W D$FJ M G$l[ &)w37<A+D F L& K_7Gq %)o 0257=?uDv H C r E;Z"#s'W(,.Y/49^?' EG CS!Z!E"v#C$`Cr%C&C)+H26 >B@Db B9v B9 aB9rgB9dB9vB9dB9r#aB9$_B9& +,3156L:?EG @ FP %"'v*X,.B3:<A3F > Oy%(m 0M57o:9;@BG =C  :vJ::r:+e]' !U%0)d+",\0W57E9;; ACvD:E:rH: 9   $/'+" 2 5=69:;?]AvCc9 D9 r 7y   v 4* #r 0,!="Y$(*.05569D=B?E /3 a=D(!&) 057s;\@B He - N>v--r--! ).$/3/67 =ACE + ("%Y'')! 0 7y8< E *= E0 'z+"#< ,0-589@CD & h~= $'(+F.[279: @H $s's4 %)-/ 8=^@mDX " h7"%^&+-2L69]>@bBE !$q #'+I-02g49_<=> EG/ }x9 #%)+05%68;> DF  #'; Zh3=#h)+v-pZ-Zr0eZ68_:=ACG  !'#'),).04A_  v  r,  W%'D.17!8=k W(! *\ 1 :+;>{ACz  y!%*$,.t0 8h=@@?B*G AvA\A rAAj #-% ,2v5OA5A r>A?ACF  G-#I%)5e8!<'?EqAQB%rF-G  <DO!z#%*,:-T2[4 ;u@fB K 3 #%(,* 2759<$?ADF   K%(+02n59<>B  TVm$ALPINEPUBLICINTERFACES8onuseofnoLog;itmayrequireanenablingfileproperty.>4.3.FilecreationTheCreateprocedurecreatesandopensanewfile.TheinitialsizeofthefileisspecifiedbyinitialSize;clientsareencouragedtocreatefilesoftherequiredsizeratherthangrowingthempiecemeal.Thespaceischargedagainstownerintheownerdatabase;theclientisrequiredtobeamemberofowner'screateaccesscontrollist,andtheallocationmustnotexceedowner'squota.Notethatallocationisconsumedatthemomentafileiscreated;butwhenafileisdeleted,theallocationisnotcreditedwiththefreedpagesuntiltransactioncommittime.Allfilepropertiesaresettodefaultvalues;theymaybechangedbymeansoftheproceduresdescribedbelow.TheTypepropertyisavestigeofapreviousimplementationandisnolongerused;itwillberemovedfromtheinterfacesinsomefutureversion.4.4.OperationsonopenfilesTheproceduresthataccessthevolatilestateassociatedwithanOpenFileIDarefullydocumentedintheinterface,asaretheDeleteandSetSizeoperations.Whenatransactionterminates,allfilesopenedunderthattransactionareordinarilyclosedautomatically.However,ifthereisacontinuationtransaction(i.e.,continue=TRUEandoutcome=commitinthecalltoAlpineTransaction.Finish)thenthefilesareleftopen.TheReadPagesandWritePagesproceduresaccessafile'sdatainunitsofPageRunssequencesofconsecutivecompletepages.ThePageBufferarguments,whichdesignateblocksofmemoryinthecaller'svirtualaddressspace,deservesomeexplanation.ThetypesVALUEPageBufferandRESULTPageBufferareequivalentfromMesa'spointofview,butaretreateddifferentlybyRPC(thistreatmentisinvokedbythespecialprefixesVALUEandRESULT).AVALUEPageBufferisdereferencedatthetimeofthecall;i.e.,thecontentsofthearraydesignatedbytheDESCRIPTORaresent.ThisisconsistentwithnormalRPCcallsemantics.However,aRESULTPageBufferdesignatesaplacewherearesultistobeputatreturntime.Nodataispassedatcalltime,butablockofdataofthecorrectsizeisreturnedbytheprocedureandstoredinthedesignatedarray.Pagesareordinarilylockedautomaticallyasaside-effectofcallingReadPagesandWritePages,andunlockedbyterminatingthetransaction(seesection5.2fordetails).However,itisoccasionallyusefultolockpagesinadvanceofdoingI/Otothem,inordertobeassuredthatlockingwillbepossible;thismaybeaccomplishedbycallingLockPages.UnlockPagesmaybecalledtoremoveareadlockpriortotheendofthetransaction;itistheclient'sresponsibilitytoensureconsistencybyavoidinganysubsequentupdatesthatdependonthedataformerlyprotectedbythereadlock.UpdateandwritelockscannotberemovedbyUnlockPages;attemptstodosoareignoredwithouterrorindication.4.5.FilepropertiesAssociatedwitheachfileisafixedsetoffileproperties(seeAlpineEnvironment.PropertyandPropertyValuePair)thatareexpectedtobegenerallyuseful:accesscontrollists,bytelength,createtime,stringname,andversion.Filepropertiesarereadandwrittenunderatransaction,justlikefiledata;propertiesmaybeindividuallylockedorbelockedimplicitlybyafilelock.InthecurrentversionofAlpine,allpropertieswiththeexceptionoftheversionaretreatedtogetherwithrespecttolocking.So,forexample,writinganypropertywilllockoutreadsofanypropertyofthesamefilebyanothertransaction.ThebytelengthisaLONGINTEGERassociatedwiththefile.Alpinedoesnotenforceanypropertiesofafile'sbytelength;inparticular,thebytelengthhasnoinherentrelationtothefile'ssize(numberofr g'q!g'"Ug'r%rg'q&Dg'r*:g'q*g'wHDg'r _/ g IM %( v [ Cr Xc""' (r+.158:=N?AGv V rVV5 y $ &(*0d36:?RB UB 7v7UBUBr LUB"$(+/2$57=2>ABMGv Sr aS S' #C ),/gv3S4Sr7fS7S8=@CO Q q 7!&d(,.027\9 @.ADA PL f !& M7 cH$(),L/17T9>?B L)\ !#!')g*0& :<>0@:DH9 J 8 (!%j)v G2 `Sr C| y=@$_' -02 :<@ G B< K IK$ ?5 : !$'n,1/4m ;> Ea >  ' .v1>2[>r6>q8>r;>v>U>?>rC.>D> zAF2 0  \'_ -/.268(<=w?2A/CE` .c h73 :"#')Y,].0s579>@C  , u  *@ 0 & '( /1;5<?L F ( %} "r%8),.:3S9:<6 CG &  "W&L( +-/47w<]?AF %J   %. -h0v2q6r8+=v>R%J>%JrAa%JDdG # .c 6#E +-+1s 8:f?Bf !#)+.(1A49x<-?C$G T @!#%J',15& v  C r  'Q v$<&v()+= r14F  "R$>* .27e:z=BF g 1( #&4)n,F15<6 =@CF  | R!#%*6 0n236H9;>BG  Il#$'8,.c3 8t;@GAG0 q ervaqqr5q "&((,.17]9R;?BLD  Nv N6 Nkr Nq N Nr" N )&,A.1a59;@wC  Z "8%A)s+-3R8V9B+CDG Ab@]!"%+_-/3 ; >ARG/ ?  %D ,Y-3f69*;=@& G > . ])!#9&( 05;@.B CNF^ 8I H?? A#)+k0 5v5B5r5"$&*7 >CG 4'v  1v1%1r#1|q11r%1)-/ 1o68]?< F 0 RNV#" *Z/ 9<>B .] H 1"N#)u.16<>$DE , z^wP!l '*0 8:=jB]H# +l 3!2"$*++-0 ($h"u(U*. 5c9;@t He & 3(!"&y)t+}.N16a;=AgC %D "1l"6 +/d02|59 CQHe !" ,Jv #@'*,.z0681=b D z'n W!$N)3 0J27[9=@bB+Ea  M! "$$%*+.Q 8:? G/ , -2 " +- 5?9!;>e G s5p#eu 5 y Hr S v$%H r,<.3=9!; BDx ? 'N !i%>+%005\7<>CF b $W(e*,r 3n bb {#(A-e1>2> 9<.AR u v= u u r{ u &',S.0z2}7,9;t?%C  @ [!$t(#+13,v8; 9" r=> ?tB;  =TVm$ALPINEPUBLICINTERFACES10Readsandwritesareperformedunderthetransaction.ThetransactionmachineryensuresthatotherclientswillnotseethestateofanyoftheAlpineinstancesinapartially-updated(inconsistent)state;thisisdonebysettinglocksonfilesorpartsoffiles,asdiscussedinsection5.2.Eventuallytheclienteithercommitsorabortsthetransaction.Committingcausesallwritesoccurringunderthetransactiontobemadepermanentlyinthestateofthefilesystemandtobemadevisibletoothertransactions.Abortingcausesallthewritestobeabandoned,andmakesthepermanentstatebeasifthosewriteshadneveroccurred.Atransactioncanalsobeabortedbyaserverorclientcrashorbyadetecteddeadlockamongtransactionsattemptingtolockdatainconflictingways.5.1.TransactionmanagementAtransactionisbegunbyaclientcallingAlpineTransaction.CreateonsomeAlpineinstance.ThisreturnsapermanentlyuniquetransactionIDthatmaybepassedtootheroperations.(ProgrammersshouldnotethattheTransIDisaratherbulkyobject,whichiswhyveryfewprocedurestakeTransIDargumentsdirectly.)ATransIDmaybetreatedasacapability,sinceitcontainsenoughbitsofunpredictableinformationtomakeitextremelydifficulttoforge.ThereforeatransactionissharedamongclientsorprivatetotheinitiatoraccordingtowhetherornottheinitiatorhandstheTransIDtootherclients.AlpineenforcesnorestrictionsonwhomaypresentaparticularTransID.IntheAlpObjectpackage,AlpTransaction.CreatereturnsanewAlpTransaction.HandlereferencinganobjectthatholdstheTransID.ThisHandle,beingaCedarREF,isofcoursevalidonlyonthemachinethatcreatedit.Ifaclientonsomeothermachineneedstoparticipateinthesametransaction,thecallermustextracttheTransIDfromtheobjectandpassittothatotherclient.ItmaythencallAlpTransaction.CreateWithTransID,whichcreatesalocalAlpTransaction.Handleforthesametransaction.TheclientmustalsocallCreateWorkeroneachAlpineinstancethatistoparticipateinthetransactionpriortoissuinganyotherrequeststothatinstance.Thiscallinformstheworkeroftheidentityofthetransaction'scoordinator.DuplicatecallstoCreateWorkerarenotharmful.ItisstandardpracticetocreateatransactionontheAlpineinstancecontainingthedatatobeaccessed,orononesuchinstanceifmultipleserversaretobeaccessed.Toaccomodatethisnormalcase,CreateautomaticallystartsaworkeronthesameAlpineinstanceasthecoordinatorunlessinstructednotto.AclientonaworkstationshouldnotnormallyuseitslocalAlpineinstancetocoordinatetransactionsinvolvingmultipleservers,sinceacrashedcoordinatorcantieupresourcesonotherfilesystems.Itisperfectlyokforaworkstation'sAlpineinstancetocoordinateitsowntransactions,ortoactasaworkerinamultiplefilesystemtransaction,sinceinthesecasestheonlyresourcesthatitcantieupinacrashareitsown.Whentheclienthascompletedperformingthedesiredoperations,itshouldcallFinishtoterminatethetransaction.NormallyitshouldspecifyrequestedOutcome=commit;buttoundoalltheoperationsperformedunderthetransactionitmayspecifyrequestedOutcome=abort.TheactualoutcomemaydifferfromtherequestedoneifFinishhasalreadybeencalledorifthetransactionhasbeenabortedforsomeotherreason(servercrash,lockdeadlock,etc.)Long-runningtransactionsarediscouraged.Atransactionshouldencompasstheminimumnumberofoperationsrequiredtomaintaintheconsistencyofthehigher-levelabstractionrepresentedbythedataaccessedduringthetransaction.Transactionsthatrunforlongperiodsoftimetieupexcessiveresourcesandarelikelytobeabortedspontaneously,therebywastinglargeamountsofwork.Thereisanoptiontoterminateatransactionwithoutlosingthestatethathasbeenestablished(openfilesandlocks).IfFinishiscalledwithcontinue=TRUEandthetransactionfinisheswithoutcome=commit,anewtransactioniscreatedtowhichtheopenfilesandlocksaretransferred.Thisisaconvenientwaytobreakupalongsequenceofoperationsthatdon'tneedtobetreatedtogetherasasingleatomicunit.r 0g'q!9g'!g'r%g'q%g'r)g'q*[g'wG~g'r _/nb _$U& -0 7>RC/E ]&0y8 #;'-}/ 0?: CNF [ Xv,[[r[a"$')v/1.5 Ye wwvSYeYer"Yev$IYe$Yer(GYe* 1 9u=?~Cp W _ c &(*.4/2]49R<=?CG V Z1f!R#')T+@ 25X9;BEG To Mq{! (*-\/M4Y6U7;=PADFiHe Rg9 !? (%),/1 8Dv Oy  r L*L Y%`"2&6j8<&@Fu J. Zv5JJ $ar&J),/!359l @ Hsrl#1'+/1)4.7H9 AD  G4 D,y &M)*0O5*79h B C UA!(D)p 0o16G:?@E~G/ AjVE q"'+.O35t9 =B!G ?  %) =H6+/13B] ; &q8!>&a*+-q/1;0;r1w;2?;35:9u<?AD  9 .."(P,0- 46N8<) C|E 8R "'*T-/15%9F=?C]G 6!#(>)B,a:<>B; 4/cGZ $#&)-y25Q68& >@VB 2 p05!_$?)-!/47T< =@HEeG/ 0  {"$ -o/28 .e\+!K" ),.3p8 ?B|EG ,ol6{%B),-/5h7 >AFH +E 4Q!$9',$1e35Z <@ G )o r++O  '"(`*,/4a9;Q B '  `$v +.028:>A)FH# &  Q!')( /1~4 <_>%?B CD $y K9 $ %)I,/%2C8E;c@jB  " v&'r1?269P=DBE a L %T(,.V/2 8;k>CE  kWP#z >  u 'q) 04;=Db  8\ !\ (*., 3 : BID8F `% s %f(/*,0 469;=C H dU` $).279I $ ',036=8;`> E & ;_v &!g&r%&q' &r*&-2/g 68; v=&>&rB&D7& ~  X!##'),0;2 9=>? F  fsD #&*E-/F125;)<=AFTGTVm$(ALPINEPUBLICINTERFACES11Inthiscase,AlpineTransaction.FinishreturnstheTransIDforthenewtransaction,andtheoldTransIDbecomesinvalid.AlpTransaction.FinishassignsthenewTransIDtotheexistingHandle,sotheHandleremainsvalid.5.2.SemanticsoflocksThisisabrieffunctionaloverviewofAlpinefilelocks;forbackgroundmaterialandfurtherdetail,seeAlpinelockmanagerconcepts''.Alllockingisperformedimplicitly,asaside-effectofreadandwriteoperationsonfilesandotherobjects.Consequently,thereisnopublicinterfacefordealingexplicitlywithlocks;however,mostoperationsprovideoptionalmeansforacertainamountofclientcontroloverlocks.(Localclients,i.e.,oneslocatedonthesamemachineastheAlpineinstance,cancallthelockmanagerdirectlyforthepurposeofsettinghigher-levellogical''locks.)Whenanobjectsuchasafilepageisaccessed,itisfirstlockedinsomemode.Areadaccessmustlocktheobjectinread,update,orwritemode,whileamodifyaccessmustlocktheobjectinupdateorwritemode.Lockinginupdateorwritemodeduringareadaccessissometimesusefulwhentheclientknowsthatitwilllatermodifytheobjectduringthesametransactionandwishestobeassuredthatlockingwillbepossible.Thedistinctionbetweenupdateandwritemodeswillbeexplainedshortly.Oncealockissetonanobjectundersometransaction,itwillpreventcertaintypesofaccessbyanyothertransactionuntilthetransactionholdingthelockhasterminated.Notethatlocksarbitrateaccessonlyamongdifferenttransactions;operationsperformedwithinthetransactionthatsetthelocksproceedunhindered.(Thisistrueevenwheremultipleclientprocesses,conversations,etc.,areinvolved.Inparticular,concurrentcallstoAlpineprocedureswillbeperformedinanarbitraryorderiftheyareallpartofthesametransaction.)TheinteractionbetweenlocksisdefinedbythefunctionCompat[r,e],whererisalockmodebeingrequestedandeisthemodeofanexistinglockonthesameobjectbyanothertransaction;itreturnsTRUEifrmaybesetimmediatelyandFALSEifrmaynotbesetuntilehasbeenremoved.existing:requested:readupdatewritereadTRUETRUEFALSEupdateTRUEFALSEFALSEwriteFALSEFALSEFALSETheinteractionbetweenreadandwritelocksisconventional:multiplereadersoratmostonewriter(butnotboth)cancoexist.Anupdatelockiseffectivelyareadlockatthetimeitissetbutisconvertedautomaticallyintoawritelockatthetimethetransactioniscommitted(whichiswhenanymodificationstothelockedobjectarelogicallyperformed);thusanupdatecanproceedinparallelwithanyongoingreads,butcommittingtheupdatemayrequirewaitinguntilallreadlockshavebeenremoved.Atransactionmayupgradeoneofitsownlocksbyconvertingittoastrongerlock,withrelativestrengthgivenbyread <?FAD  ]"U&)_,[136;,@qBBD [v X r UA=l J" #(h*.1 8>@Ek S ?vo Q ^, "$f% ,<.1$37n >&@6C.E Ow' o> <$*-,2E 8s;@F2 M -~!"',.n2;6: >BRF L( A$Pw !$x)#v.L(/L(r1L(4Q69?DG/ J/M  " H W"$)+>,/3598=i>BF' F^ Iex>"&*+048 ;=jAC6G D pQ"&}*,%/G3[4;?ChE CUI J$)+/G 6i9F=?AF Ahj[ "',/?279;A >@^K#'& .n/2X7L;?P@DF =E r !&) ,. 59}<]?E ; v|;,;r;  %j,&0c2 9@DW 9 f"k(&,' 2 ;>AG 8O  {T '*,35@7=<@B!E>G 6 e 4,| L$ %|'n)/3v4T4,r44,v54,r6F4,7{v;4,r<4,=? AE 2Fv2rN2J9  %7(H*g,0u46; CmDq 0r 0v0r0  q!0"_0r%0v')0r(10+5-/1v40r608;v.aB, ,Pr,,P,,P, g,P g,(,P(,),P),*{,P*{,+B,P+B,+,Po+,,W,P,W,3C,P3C,4A,P4A,4,Pc4,5(,Po5(,5,P5,B+q+(+3C+rB)jq)j()j3C)jrB'q'('3C'r %Gz H!e$(G) 2.7?BE # Ti!G$=% ,9-`0w3l57]:;=:?SAC8 ! Q8 p#% ,.'49n:>sA Q } &?)O+K/279|>qADC  d  !&l+?.0v37:T= .V ov.L.r. "k$b'+-4 457Q8> AyD G :|_#A&i'. 79?CxEv  N^ &6V"7 )+0%28 ;<B CGr 8   ^] M!%(+,1_36:<@`C  {y !'1)-/ 7<?EDTF m \ya v$':*--/.4)8;B&D<F  c !#')m.1 9=?HCG0   %&,/h4,7;=C w  TVm$ALPINEPUBLICINTERFACES12Thewhole-filelockmodesareread,update,andwrite,justasforotherobjects;theselockseffectivelycover''individualoperationswhosemodesarenostrongerthanthewhole-filelock.Whenpagesofafilearetobelockedindividuallyasoperationsareperformed,theentirefileislockedinaweakerintentionmodethatspecifiesthestrongestpagelockexpected;thesemodesareintendRead,intendUpdate,andintendWrite.Forallx,y,Compat[intendx,intendy]=TRUE,butCompat[intendx,y]=Compat[x,y]andCompat[x,intendy]=Compat[x,y].Thisenablesdetectionofpotentialconflictsbetweenpageandfilelocksatthetimethefileislocked.Ifanindividualoperationwouldrequirealockstrongerthantheoneimpliedbyanintention-modefilelock,thefilelockisautomaticallyupgraded;thisupgradecanofcoursebeblockedbyfilelockssetbyothertransactions.Additionally,therearecombinationmodesreadIntendUpdateandreadIntendWrite,whichimmediatelylocktheentirefileinreadmodewithintentiontoperformindividualoperationsrequiringupdateorwritelocks.Compat[readIntendUpdate,readIntendUpdate]=FALSE,becauseitisnotusefulforittobeTRUE(therewouldbeaguaranteeddeadlockatcommittime).MostoperationshaveanoptionallockOptionargument,whichpermitstheclienttospecifythelockmodetobeusedandtheactiontobetakenifaconflictoccurs;thedefaultvaluesoftheseargumentsareappropriateformostapplications.IflockOption.modeistooweakfortheoperation,itisignoredandthedefaultusedinstead.IfthelockcannotimmediatelybesetandlockOption.ifConflict=fail,theoperationimmediatelyraisestheerrorLockFailed[conflict];otherwisetheoperationwaitsuntilthelockcanbeset,raisingLockFailed[timeout]ifatimeoutoccurs.Ifthereisadetecteddeadlockamongtwoormoretransactionsattemptingtoacquirethesamesetoflocks,oneofthetransactionsisautomaticallyaborted,anditsoperationfailswiththeerrorUnknown[transID].6.OtherinterfacesAlpineOwnercontainstheoperationsforaccessingavolumegroup'sownerdatabase,whosepurposewasdescribedinsection3.6.Seetheinterfacesourcefileforcompleteinformation.AlpineVolumecontainsproceduresfordealingwiththesetofvolumesandvolumegroupsaccessibletoanAlpineinstance.Manyaspectsofthisinterfacearespeculative,andimplementationisincompleteatthistime.TheAlpObjectpackageexportsalltheAlpineOwnerandAlpineVolumeoperationsthroughtheAlpTransactioninterface.SincetheseoperationstakeanAlpTransaction.Handleastheirfirstargument,theymaybeinvokedwithobjectnotation.7.AlpineFSinterfaceAlpineFSprovidesasetoffacilitiesverysimilartotheonesprovidedbyCedar'sFSinterface.Inparticular,itiscapableofcreatingFS.OpenFilesandIO.STREAMsthatarecompatiblewiththestandardonesinCedaranduponwhichthegenericFSandIOoperationsmaybeinvoked.ThefilesystemdefinedinAlpineFSdiffersfromtheworkstationfilesystemdefinedinFSinthefollowingimportantways:Fileaccessisalwaysmadedirectlytotheremotefilesystem;thereisnolocalcaching.AlloperationsinvolvingdatatransferresultinexplicitinteractionwithanAlpineserver.TheproceduresforopeningAlpinefilesandperforminggeneralAlpinefilemanipulationaredifferentfromtheonesforworkstationfilesinFS,becauseAlpinefileshavecertainsemanticsthataredifferentfromworkstationfiles.r 0g'q!9g'!g'r%g'q%g'r)g'q*[g'wG~g'r _/h "Z'()-{/1372<+?B ]  1 _$' ).k13 :\ [ g %/ ,. 5t7 ?AEH# YehvYeYerYe #)N+15W8>BG; W M N '+9v-W.Wr/W1W v9Wr:W<3v?Wr@WqBhWC!WrEWGW V vVrVvVr]VvAVrVv VrV"v'Vr(V)v-Vr.KVv50Vr5Vv7Vr7V9-<AG To "&j(*b-/2P3 Q'  %&).24f7 < =? PL Vpj !I'*/2h4"8q:b?ACGr N  L*  %*6:E J . C"d&@)`/C06U < C HmN(#q4H5Hr8nH99H>I?@CKGR G4 B qG4G4rG4 $*,Y1Y D2  v!jD!Dr(fD.27:;=?D:F C .!%'&(^-V2"49F=?IB Aj 3  v"`Aj"Ajr(Aj)3Aj,.\0456f8 ?0@zAF ? K0 =G] "%'v( =G(n=Gr.=G.=G8;`A ; x!!:'*104F7:Z=@LBsE 9"$1')!*H/5:<>~B 8Q c  O"1&/)*-n 56 ?HDG 6~u 3[ y{ r 0 g #B%g+5,F159<@7DL .e p 7 &=*,/35 + # "$A), .V0`27`:>CO *B  ) "G$*, 4c7" A B} ( & & !#7% .1s : AG/ $x  h '*,;<@)C  " 2Mfu  yr 3 #B&d*,//2q8U:d?kA G  y::) '*q,v-r1A2I57i >{AC  .;$c&)M+j 257  i d#(+{- 5b7 G; | p "_%T' ).3U6K9>(DeG;  b TVm$EALPINEPUBLICINTERFACES13Alpinefilesareaccessedunderatransaction,andupdatesbecomepermanentonlywhenthetransactioniscommitted.Transactionsmayabortspontaneously,orcommunicationwiththeAlpineservermaybreakdown;andclientsmustbepreparedforanyoperationtofail.ForthedetailedsemanticsoftheAlpineFSoperations,youshouldconsulttheinterfaceAlpineFS.mesa.ThepresentimplementationofAlpineFS(asofCedar5.1)isincomplete;thefollowingdeficienciesexist:Subdirectories,versions,keeps,links,andcreatedtimesearchesarenotyetimplemented.TheserequireanewAlpineDirectorypackage,whichhasnotyetbeeninstalled.WearepresentlymakinguseofAlpineInterimDirectory,whichprovidesaflatnamespaceperdirectory.Becausetherearenoversions,acalltoStreamOpenwithaccessOptionsthatwouldcauseanewversionofanexistingfiletobecreatedinsteadcausesthatfiletobeoverwritten.However,callingCreateforanexistingfileresultsinanerror.Noneofthegeneralfilemanipulations(Copy,Delete,etc.)areimplemented.Unlessatransactionisprovidedbythecaller,Open,Create,andStreamOpenperformdirectoryaccessunderaseparatetransactionwhichisimmediatelycommitted.ThisistoallowadequateconcurrencyinthefaceofthesimplemindeddirectorylockingdonebyAlpineInterimDirectory.Ofcourse,thismeansnoguaranteesaremadeaboutconsistencybetweenthedirectoryandthefiles.ThisproblemwillberevisitedwhenAlpineDirectoryisinstalled.References[Alpine]Alpinedocumentationiskepton-lineinthe[Indigo]Doc>directory.Inthefilenames,*''standsforanumber;successivereleasesofadocumentareassignedthenexthighernumber.Alpinefileserveroverview'',AlpineOverview.pressAlpinelockmanagerconcepts'',LockConcepts*.bravoFileStoreinterfaceinternals'',FileStoreInternal*.bravo[Lupine,1982]BruceNelsonandAndrewBirrell,Lupineuser'sguideanintroductiontoremoteprocedurecallsinCedar'',[Indigo]Documentation>LupineUsersGuide.press,July1982.[Needham&Schroeder,1978]RogerM.NeedhamandMichaelD.Schroeder,Usingencryptionforauthenticationinlargenetworksofcomputers'',CommunicationsoftheACM,vol.21no.12,December1978.ChangehistoryVersion10;January19,198412:49:44pm.AdddocumentationofAlpineFSinterface;misc.changesrelatedtoCedar5.0.Version9;June7,19835:36pm.ConverttoTiogaformat.Removeallexcerptsfromthepublicinterfaces;theinterfacesthemselvesarenowtheprimarydocumentation.BringRPCdescriptionup-to-date.DocumenttheAlpObjectpackage.Version8;October13,19815:29PM.AddAlpineFile.Close,LockPages,UnlockPages.FinishingatransactionwithcommitAndContinuenowreturnsanewTransIDratherthanpermittingadditionaloperationsundertheoldtransaction.SubstantiallysimplifyinterfacetoRPCruntimemachinery.Version7;September21,19818:38AM.FurtherrefinetoconformwithRPCdesign.Addhighr 0g'q!9g'!g'r%g'q%g'r)g'q*[g'wG~g'r _/j6!# *-38?C)G/ ]  0 ! #'u 02C ;>AE [  n!_'1)n,283 Ye!$+ 386;@C W UCX 5&!(G).026 9<B0 S Q!9 l$F'-,'/}57::< E Oy"&)G+.1w 7O9<;B*G M $6%`'+/J1 KW7a )!w$%% .1S :7=(AzESF IM.( !&^*-F/1>3 :@E) H )${ E|5g $)C.13X CM N!D#e%*.c3F6" >@C Ak  "# + 2578<A ?  O w#8'+Z-D<&>%BEK >  { $*{-258i;?DG 0u Pr Cw#&) 34: @Dc Z~,D J"2')d-`2N79?WBEU 7  \ !$x'*0U :>B}    k!$'2 9 BJHe n '!%*+{.4l8< C f (.,358> K #'L,w02F7;>C:Fi GTVm$ALPINEPUBLICINTERFACES14watermarkmechanism.Deletetheindividualpropertyread/writeprocedures.Documentsemanticsoflocks.ChangeLockModetoLockOption.Changetoread/writeownerentryinsamestyleasfileproperties.Version6;September14,19818:46AM.Changestyleofthismemotomakeitservebetterasclientprogrammer'sdocumentationfortheFileStorepublicinterface;removeinternaldetails(implementationstrategiesandthelike)toaseparatememo,FileStoreinterfaceinternals''.SplittheformerFileStoreinterfaceintofourpieces:AlpineEnvironment,AlpineAccess,AlpineFile,andAlpineTransaction.BringconversationinitiationandauthenticationintoconformitywiththecurrentRPCdesign.Makeafirstcutatspecifyingthesignals.Version5;August25,198112:41PM.Makeinterfacehandle-oriented,sinceRPCrequiresit;seeHandle,Create,Destroy.AHandlecorrespondstoaclienttalkingtoaserver,nottoavolumeoramachine;someprocedurestakeavolume(orvolumegroup)parameter.MaketheidentificationFileStore=log,andintroduceaseparatenotionoflogicaldiskvolumeandvolumegroup.Addno-loggingoptiontoOpen/CreateFile;thistakestheplaceofnoTransaction,sinceithandlestheonesituationinwhichwecanseethatclientswillwanttogiveuprecoverytoreducethesizeofthelog(large-scalereplicationoffiles,wherethehomecopyiskeptloggedandothercopiesareunlogged.)OpenFileID->OpenFileID,AccessListID->AccessList(alistofRNames.)Addsectiononownerdatabase(CreateOwner,...,DestroyOwner),andexpandedfilepropertiessectiontoincludeallpropertieswenowplantosupport.Version4;May29,19815:36PM.Introducednotionoffileowner,whoischarged/creditedforpagesused/releasedinCreate/DeleteFileandSetLength.Version3;May15,198111:02AM.IntroducedtypesOpenFileID,ClientID,AccessListID,....AddednoTransaction.Moredetailonfileopeningandcreation;supportfilecreatewithandwithoutanexternallysuppliedID(usedtobeonlywith.)Length->ByteLengththroughout.List-orientedfilepropertyoperations.Muchmoreworkrequiredonpropertyinterface,includinglockingissues.Version2;March12,198111:22AM.AddedmoredetailtotheFiles''section,includingprocedurestomanipulatefileattributes.MadelockmodesconsistentwithLockDesign0.MademinorchangestoTransactionsection:RegisterWorkertakesarestartID''toallowunilateralabortofworker;FinishTransactionandFinishWorkertakearequiredOutcomethatmaybecommitAndContinueorcommitAndTerminate;expandedcommentsonTransactionsectionoperations.Version1;February25,19813:54PM.Lockstuffmovedout(toLockConcepts0.bravo,LockDesign0.bravo.)Sierra->Alpine.Version0;February19,19813:16PM.InterfacenamechangedfromBFS''.Weareattemptingtoerasethedistinctionbetweentheregularinterfaceandonthewire''.ThevolatilestructuresCoordinator'',Worker'',andFile''havedisappeared.ThetypeLockIDhasbeendefined,followingEdTaft'ssuggestion.UnfinishedbusinessLog/recoveryinterface.Cacheregistration(atwhatlevelshouldthisbedone?)Lockinterface(noconceptualdifficulty,detailscanbedeferredtoimplementationtime.)ContentIDproperty?Interfacestobackupandarchivesystems.Indefinitelydeferredbusinessr 0g'q!9g'!g'r%g'q%g'r)g'q*[g'wG~g'r _/ p  &,W 34 :AG ]l % *e,d 3x7;=AE'G% [ Yd!$H',0149 :>@"CG WS  !$'.K3, 9?E? Vg }X#"$&A+0q 77= CG/ Tnt#(M5 ? F RW !9 &) 25C <2?7AF2 Q sub #9 NKo"8%D)..9*<@ EbG; LK/ (\*1+/i4!5v7GL7Lr:L;L>D@AjFzHe KUT F+@#%=*.y 5>9 ;T C I a 'C!#'*/257;]>i E4 H D "$D -02;7;9<1ACdGg F_ y "(1)._03m5'79 A G D 3LD`#&**.Z0 8 ?Au C tY >!}(,:13K7= FH Ai L %*`,02 9U;}>ACI >90 V#p */ 03Z7;<GR =F l#d& :p!f$ +/ 7>6 GH 9#p v>!A#(+1]6e8<?BG 7{ u9}_ #(-/{ 7 > G% 5 "!'/)5. 4:? 3X0u #(9+/W03$7<B 1  " 1#L' .A1 :I>XBG 0  "&%'-]037B =B$Do .bqz !$&Z148:`G ,Z$& .b2 *?Cq"w&)-176>93; (FH &#&+/5G8=@CB $t  "P'e-m036c:>CN "{ Q!i$ ,/28:>C| !%  u  r  @    } %?') +P 7 %w),R.C35v ?T   |3 u F h gTVm$HALPINEPUBLICINTERFACES15Validationofremotepagecaches(throughahistorydatabasethatiscoordinatedwithfilepageupdates.)Transactionsavepoints?r 0g'q!9g'!g'r%g'q%g'r)g'q*[g'wG~g'r _' uM"D(&).B4 7 8 @cCFH ] [ "&TVm$WAlpineEnvironment.mesaCommondefinitionsforpublicAlpineinterfacesLasteditedby:TaftonApril8,19835:02pmMBrownonJanuary25,19833:21pmKollingonOctober17,19832:11pmDIRECTORYBasicTimeUSING[GMT],FileUSING[nullVolumeID,VolumeID,wordsPerPage],RopeUSING[ROPE],RPCUSING[Conversation,Principal,ShortROPE];AlpineEnvironment:DEFINITIONS=BEGINGeneraldefinitionsString:TYPE=Rope.ROPE;Identificationandauthentication(seeRPC.mesaandLupinedocumentationfordetails)Principal:TYPE=RPC.Principal;--aGrapevineindividualFileStore:TYPE=Principal;--anAlpineinstanceRName:TYPE=RPC.ShortROPE;--anarbitraryGrapevineRNameOwnerName:TYPE=RPC.ShortROPE;--anAlpineowner,notnecessarilyanRNameAccessList:TYPE=LISTOFRName;Conversation:TYPE=RPC.Conversation;FilesystemVolOrVolGroupID:TYPE[SIZE[File.VolumeID]];VolumeID:TYPE=RECORD[VolOrVolGroupID];VolumeGroupID:TYPE=RECORD[VolOrVolGroupID];nullVolumeID:VolumeID=LOOPHOLE[File.nullVolumeID];--theIDofnovolumenullVolumeGroupID:VolumeGroupID=LOOPHOLE[File.nullVolumeID];--theIDofnovolumegroupFileID:TYPE[5];--volume-relativeIDofafilenullRepOfFileID:RECORD[a,b,c,d,e:WORD]=[0,0,0,0,0];--theIDofnofilenullFileID:FileID=LOOPHOLE[nullRepOfFileID];--theIDofnofileUniversalFile:TYPE=RECORD[--globallypermanentlyuniqueidentificationofafilevolumeID:VolumeID,fileID:FileID];nullUniversalFile:UniversalFile=[volumeID:nullVolumeID,fileID:nullFileID];PageNumber:TYPE=LONGINTEGER;--shouldbe[0..maxPagesPerFile]v _, ] Ckm [  Z5h;J X?!N V&l {q Ss QqQQsQqWQEQsQsQ PHqPHPHsPH $9 NqNNsNq_N3NspNN LqZL?LsL  " IqII sIq Hv D s AeqAeHAesAeqnAeBAesAev Ksk Q ! )' 273 q  s= q"   s#S v$Q $ %*+|TVm$o2PageCount:TYPE=LONGINTEGER;PageRun:TYPE=RECORD[firstPage:PageNumber,count:CARDINAL_1];wordsPerPage:CARDINAL=File.wordsPerPage;logWordsPerPage:CARDINAL=8;bytesPerPage:CARDINAL=512;logBytesPerPage:CARDINAL=9;FilepropertiesProperty:TYPE={byteLength,createTime,highWaterMark,modifyAccess,owner,readAccess,stringName,type,version};PropertyValuePair:TYPE=RECORD[SELECTproperty:PropertyFROMbyteLength=>[byteLength:ByteCount],createTime=>[createTime:BasicTime.GMT],highWaterMark=>[highWaterMark:PageCount],modifyAccess=>[modifyAccess:AccessList],owner=>[owner:OwnerName],readAccess=>[readAccess:AccessList],stringName=>[stringName:String],type=>[type:FileType],version=>[version:FileVersion],ENDCASE]_[byteLength[0]];--defaultvaluetomakeLupinehappyByteCount:TYPE=LONGINTEGER;maxStringNameChars:CARDINAL=100;--maxlengthofanystringappearinginapropertyFileType:TYPE=RECORD[CARDINAL];FileVersion:TYPE=LONGINTEGER;FileaccessOpenFileID:TYPE[2];--representsasingleclient'saccesstoasinglefileunderasingletransaction.UniqueonlywithinasingleAlpineinstance.nullOpenFileID:OpenFileID=LOOPHOLE[LONG[0]];--IDofnoopenfileAccessRights:TYPE={readOnly,readWrite};LockMode:TYPE={none,read,update,write,readIntendUpdate,readIntendWrite,intendRead,intendUpdate,intendWrite};LockOption:TYPE=RECORD[mode:LockMode,ifConflict:{wait,fail}];wHDg/s _, q}_,6_,s_,q_,_,_,s"_, ]q^]]s]q]]s'][ - Z5q_Z5)Z5sZ5 V qKVVsV U>q}U>HU>s9U>  S qSSsSs QqQQs}Qbv L s IqIIsIs  '9 1 :? 1H ^ DqDDs_DqDDDs"DqC sC qC TC sAd i "$ ? < !> ' V?s (qR( (s(q(}(s(q(s#1(#( & q&&sP&q5&&&&s"f&v ! s  q8sv !#&+s/1%2Z638[createAccessList:AccessList],modifyAccessList=>[modifyAccessList:AccessList],quota=>[quota:PageCount],rootFile=>[rootFile:UniversalFile],--readOnly--spaceInUse=>[spaceInUse:PageCount],ENDCASE]_[createAccessList[NIL]];--defaultvaluetomakeLupinehappynullRootFile:UniversalFile=[nullVolumeID,nullFileID];OwnerPropertySet:TYPE=PACKEDARRAYOwnerPropertyOFFalseBool;FalseBool:TYPE=BOOLEAN_FALSE;allOwnerProperties:OwnerPropertySet=ALL[TRUE];TransactionsTransID:TYPE[9];--globallypermanentlyuniquecapabilityforatransactionnullTransIDRep:ARRAY[0..SIZE[TransID])OFUNSPECIFIED=[0,0,0,0,0,0,0,0,0];nullTransID:TransID=LOOPHOLE[nullTransIDRep];--IDofnotransactionOutcome:TYPE={abort,commit,unknown};CommitOrAbort:TYPE=Outcome[abort..commit];WorkerState:TYPE={notReady,readOnlyReady,ready};ErrorenumerationsNeededAccess:TYPE={alpineWheel,fileModify,fileRead,handleReadWrite,ownerCreate,ownerEntry,spaceQuota};--whenaccessisdenied,indicatestheaccesscontrollistinwhichclient'smembershipwasrequiredbutnotpresentOperationFailure:TYPE={busy,--serveristoobusytostartanothertransactiondamagedLeaderPage,--filepropertiesaremessedup(probableAlpinebug)duplicateOwner,wHDg/s _,q_,q_,s*_,k [q>[[s[" v*j[*[+-58<>DZ1Z6 r!"K%{ ,$0M368<@$AE1X]!$U'),*a-r 367:q@1CG1V_Qc#;(,/149P:A 1U@  "%(*/1 8t;@1S NI s KS qKSKSsKSt&16" = HqHHs`Hq!EH"Hs&HqF\sF\ q"F\#UF\sDL' C )_ AfU ?a v> s> -! ) q s9A B/7 ;"$?')]-?/478 s-v-m-j]"$&1s+v+5+3&!%(+1-d.q (s(lTVm$AlpineFile.mesaLasteditedby:TaftonMay25,19834:51pmMBrownonJanuary21,198310:39pmKollingonOctober18,19832:01pmDIRECTORYAlpineEnvironment;AlpineFile:DEFINITIONS=BEGINAccessList:TYPE=AlpineEnvironment.AccessList;AccessRights:TYPE=AlpineEnvironment.AccessRights;Conversation:TYPE=AlpineEnvironment.Conversation;FileID:TYPE=AlpineEnvironment.FileID;FileType:TYPE=AlpineEnvironment.FileType;LockOption:TYPE=AlpineEnvironment.LockOption;OpenFileID:TYPE=AlpineEnvironment.OpenFileID;OwnerName:TYPE=AlpineEnvironment.OwnerName;PageCount:TYPE=AlpineEnvironment.PageCount;PageNumber:TYPE=AlpineEnvironment.PageNumber;RecoveryOption:TYPE=AlpineEnvironment.RecoveryOption;ReferencePattern:TYPE=AlpineEnvironment.ReferencePattern;String:TYPE=AlpineEnvironment.String;TransID:TYPE=AlpineEnvironment.TransID;UniversalFile:TYPE=AlpineEnvironment.UniversalFile;VolOrVolGroupID:TYPE=AlpineEnvironment.VolOrVolGroupID;VolumeID:TYPE=AlpineEnvironment.VolumeID;ProceduresthatcreateOpenFileIDsOpen:PROCEDURE[conversation:Conversation,transID:TransID,universalFile:UniversalFile,access:AccessRights_readOnly,lock:LockOption_[intendRead,wait],recoveryOption:RecoveryOption_log,referencePattern:ReferencePattern_random]RETURNS[openFileID:OpenFileID,fileID:FileID];!AccessFailed{fileRead,fileModify},LockFailed,OperationFailed{damagedLeaderPage},PossiblyDamaged,StaticallyInvalid,Unknown{volumeID,fileID,transID};Opensanexistingfiledescribedbyvolumeandfileforaccessundertrans,andreturnsanOpenFileIDthatdesignatestheopenfile.ThereturnedFileIDmaydifferfromtheonethatwaspresentedintheUniversalFile;theclientisencouragedtoretaintherevisedFileIDforallfutureaccessestothefile.Theclientisrequiredtobeamemberoftheaccesscontrollistimpliedbyaccess(readAccessormodifyAccess);andifaccess=readOnly,theclientisrestrictedtoread-onlyoperationsontheOpenFileID.Theentirefileislockedinlock.mode(awaitoraLock.Failedcanresult).lock.ifConflictisalsorememberedandisusedwhenperformingcertainfileactions(e.g.,Delete)whichdonottakeaLockModeasanargument.standardFile:FileType=[LAST[CARDINAL]];Create:PROCEDURE[conversation:Conversation,transID:TransID,volumeID:VolOrVolGroupID,owner:OwnerName,initialSize:PageCount,type:FileType_standardFile,recoveryOption:v _, ]  [W Z5?! X&l {q Vs Tk Q q>Q$Q s^Qq PIs L q$LLsL{ KR qKRvKRs/KR I qIIsDI) HqHHsH F[qRF[ F[sHF[- D q"DDsDy C q8C C sC  Ae qAeMAesAe ? q}?6?s? > q>>s=>" ::s:# 9q9H9s9 7xq7x7xsl7xQ 5 q55so5T 4)qf4)4)s4)" 2qQ2 2s2v -  u +s.+q+++s+ )m.4 =v )h X $* +-c 59= ' ?w%3/1q7 '7's=' & v$r- ' } % ,6"$* 2 6c!#4'7!]#7'*{,.36:=<A| oA !%1'*/4o7_:>1@~C Et !#'}( /157m E '8)-3. 4u6< BD}7 bM$&^)M+,; 36I:CE f v! ',h.3R6;Y?<A!CFAtgs  e@%qBsmqs&&ku vs vq v vs v !u *)/5<    'G*029 :TVm$T2RecoveryOption_log,referencePattern:ReferencePattern_random]RETURNS[openFileID:OpenFileID,universalFile:UniversalFile];!AccessFailed{ownerCreate,spaceQuota},OperationFailed{insufficientSpace,reservedType},StaticallyInvalid,Unknown{owner,transID,volumeID};Createsandopensanewfileundertrans.volumeIDmaybeeitheraspecificVolumeIDoraVolumeGroupID;inthelattercase,theserverwillchooseamongthevolumesofthegroup.TheinitialsizeofthefileisspecifiedbyinitialSize;notethatthisspecifiesthenumberofdatapages,anddoesnotincludeanyfileoverhead(e.g.,leaderpage).Thespaceischargedagainstownerintheownerdatabase;theclientisrequiredtobeamemberofowner'screateaccesscontrollist,andtheallocationmustnotexceedowner'squota.ThefileiscreatedwithaPilotFileTypeoftype,andwithPilotattributesimmutable=FALSEandtemporary=FALSE.Allfilepropertiesaresettodefaultvalues,whichare:byteLength,highWaterMark:0;createTime:now;readAccess:"World";modifyAccess:"Owner"+owner'screateaccesscontrollist;owner:ownerspecifiedincall;stringName:emptystring;version:1.Ifthecallissuccessful,returnsanOpenFileIDwithaccessRights=readWriteandlockOption=[write,fail].ThereturnedUniversalFileuniquelyidentifiesthefilethatwascreated;inparticular,itcontainstheVolumeIDforthevolumeinwhichthefilewasactuallycreated,evenifaVolumeGroupIDwaspresentedinthecall.ProceduresthatdestroyOpenFileIDsNote:forallremainingoperations,Unknown[openFileID]mayberaisedif:1.TheOpenFileIDisnolongerknowntoAlpinebecauseithasbeenclosed(eitherexplicitlyorasaresultofcommittingorabortingthetransaction).2.Thefileitreferstohasbeendeletedbythistransaction,perhapsusingadifferentOpenFileID.Close:PROCEDURE[conversation:Conversation,openFileID:OpenFileID];!Unknown{openFileID,transID};BreakstheassociationbetweenopenFileIDanditsfile.ThenumberofsimultaneousopenfilespermittedononeFileStoreislargebutnotunlimited;clientsareencouragedtoclosefilesthatarenolongerneeded,particularlywhenreferencingmanyfilesunderonetransaction.Notethatclosingafiledoesnotterminatetheenclosingtransactionanddoesnotreleaseanylocksonthefile;nordoesitrestricttheclient'sabilitytolaterre-openthefileunderthesametransaction.Delete:PROCEDURE[conversation:Conversation,openFileID:OpenFileID];!AccessFailed{handleReadWrite},LockFailed,Unknown{openFileID,transID};Firstlockstheentirefileinupdatemode;thendeletesthefile.Thefilemusthavebeenopenedwithaccess=readWrite.TheOpenFileIDismadeinvalidbythisprocedure.Notethat,likealldestructiveupdateactions,thedeletiondoesnotoccuruntilthetransactioniscommitted;however,subsequentattemptstoaccessthefileunderthistransactionwillfailwithUnknown[openFileID].Theowner'sallocationisnotcreditedwiththedeletedpagesuntilcommittime.ProceduresthataccessopenfilestateGetUniversalFile:PROCEDURE[conversation:Conversation,openFileID:OpenFileID]RETURNS[universalFile:UniversalFile];!Unknown{openFileID,transID};GetTransID:PROCEDURE[conversation:Conversation,openFileID:OpenFileID]RETURNS[transID:TransID];!Unknown{openFileID,transID};wHDg/s _, ?w%3/1q7 _,7_,s=_, ]  v[- '  (K2C= Z6`$* XUO#s'7-0u2E67H<BDqV Q!5$|&*-?168Q=u?AeEU@sb""$k +J.H138;A@&ADS1 &,)~-14E79P>\CGQ-'-!#(T)+,238<@E/PJ  U$ (N&<7l &Y'+:-04+ :$ xANBPNvENL x"LLvLLL %w')+04i8L; KT \ "y% -!3) ;ACI7"&,-0 8<@EH~ o!" *-<?+ F+F]6W &, 146i9;;@B D9 "')E-(/t14i9>ABC 2!#e% > C :J !.137}9"_ XK!q%'v+0247;? EG7zq ;#% 5_ e!%'g) 1Q6G9;@q u 3WsC3WqA3W3Ws3W ) 1e v1-` 0  (*,/=268 @C.a[9 $ &n( /E3x5 <>AD,5(N #O& -1w4P8: AER+j["a$* 14-719>@DF)k&* Y#(),136K:T sC  yv -`  xTVm$v3GetAccessRights:PROCEDURE[conversation:Conversation,openFileID:OpenFileID]RETURNS[access:AccessRights];!Unknown{openFileID,transID};GetLockOption:PROCEDURE[conversation:Conversation,openFileID:OpenFileID]RETURNS[lock:LockOption];!Unknown{openFileID,transID};Thismayreturnalockmodestrongerthantheonewithwhichthefilewasoriginallyopenedifoperationshavebeenperformedthatupgradethelock.SuchoperationsmayhavebeenperformedoneitherthisOpenFileIDorsomeotherOpenFileIDreferringtothesamefileunderthesametransaction.SetLockOption:PROCEDURE[conversation:Conversation,openFileID:OpenFileID,lock:LockOption];!LockFailed,StaticallyInvalid,Unknown{openFileID,transID};Thisactuallychangesthefilelock,soitmaywaitorfailaccordingtolock.ifConflict.Filelocksmayonlybeupgradedbythismeans;attemptstodowngradealockareignored.GetRecoveryOption:PROCEDURE[conversation:Conversation,openFileID:OpenFileID]RETURNS[recoveryOption:RecoveryOption];!Unknown{openFileID,transID};GetReferencePattern:PROCEDURE[conversation:Conversation,openFileID:OpenFileID]RETURNS[referencePattern:ReferencePattern];!Unknown{openFileID,transID};SetReferencePattern:PROCEDURE[conversation:Conversation,openFileID:OpenFileID,referencePattern:ReferencePattern];!StaticallyInvalid,Unknown{openFileID,transID};ProceduresthataccesspagesofthefileNote:foroperationsthatreferencethecontentsofafile(dataorproperties),itispossiblethatseveralclientsmaybeaccessingthefileconcurrentlyunderthesametransaction(usingthesameordifferentOpenFileIDs).Alpinemakesnoattempttopreventoradjudicateconflictingaccesstothesamedatainthissituation,excepttoassurethatreadsandwritesofsingleindividualfilepagesandpropertiesareatomicwithrespecttoeachother.PageRun:TYPE=AlpineEnvironment.PageRun;PageBuffer:TYPE=LONGDESCRIPTORFORARRAYOFWORD;VALUEPageBuffer:TYPE=PageBuffer;RESULTPageBuffer:TYPE=PageBuffer;maxPagesPerRun:CARDINAL=LAST[CARDINAL]/AlpineEnvironment.wordsPerPage;--ThisisallthatcanbedescribedwithaDESCRIPTOR(PageBuffer).TherestrictionappliesonlytoReadPagesandWritePages.ReadPages:PROCEDURE[conversation:Conversation,openFileID:OpenFileID,pageRun:PageRun,pageBuffer:RESULTPageBuffer,lock:LockOption_[read,wait]];!OperationFailed{inconsistentDescriptor,nonexistentFilePage},LockFailed,StaticallyInvalid,Unknown{openFileID,transID};ReadsdatafromthepagesdescribedbypageRunofthefileassociatedwithopenFileID,andputsitcontiguouslyintoclientmemoryintheblockdescribedbypageBuffer(whoselengthmustbeconsistentwithpageRun.countorelseOperationFailed[inconsistentDescriptor]israised).IfthewHDg/u _,s_,q_,_,s_, ' 0F 8( q@M_,A!_,s ] v[-` u Yb sVYbqTYbYbs Yb & / 7x q?Yb@qYbsEYb W vV-` Tl!VP%!(A*-036G8;; AEER \"$),E/3 91BDLOv u L sLqLLsL & /^ 7A ?[ KS vI- !-'_ /H7Q#C$&T)D,3-0V6x8AEDF]oI %*,3N47}9u CsCqCeCs vC )L 1 9 qBCBCs B:v@-` u >s>q>*>s!;> * 2 : qB>C>s  #K(*;+o-1B2 9;P<AD + C (+.1 8<>BID )j 6 )%&+m-& 3 :5>C?B4E 'v . #'G)-/p3I 9;?B- &$s "q^""s" !% q!%L!%s!%q!%!%!% $!%'!%,J!%.d!%s2!% ~q~?~s~ q7s q](sq s"q#Fs)|)v@@}A{DE1`2".x#b$?v+a 36 <A[DV18 u s~q|#s4 $ , 4 <C   $ +-L1"vn-&'4 2BPE  !I#%'=S>C{E  TVm$4entirefileisnotalreadylockedinatleastthemodespecifiedbylock,setslocksinthatmodeontheindividualpages,andupgradesthefilelocktothecorrespondingintentionmodeifnecessary.WritePages:PROCEDURE[conversation:Conversation,openFileID:OpenFileID,pageRun:PageRun,pageBuffer:VALUEPageBuffer,lock:LockOption_[write,wait]];!AccessFailed{handleReadWrite},LockFailed,OperationFailed{nonexistentFilePage},StaticallyInvalid,Unknown{openFileID,transID};WritesdatafromclientmemoryintheblockdescribedbypageBuffertothepagesdescribedbypageRunofthefileassociatedwithopenFileID.Iftheentirefileisnotalreadylockedinatleastthemodespecifiedbylock,setslocksinthatmodeontheindividualpages,andupgradesthefilelocktothecorrespondingintentionmodeifnecessary.Thefilemusthavebeenopenedwithaccess=readWrite.LockPages:PROCEDURE[conversation:Conversation,openFileID:OpenFileID,pageRun:PageRun,lock:LockOption_[read,wait]];!LockFailed,StaticallyInvalid,Unknown{openFileID,transID};Explicitlysetslocksonthespecifiedpagesofthefile.UnlockPages:PROCEDURE[conversation:Conversation,openFileID:OpenFileID,pageRun:PageRun];!StaticallyInvalid,Unknown{openFileID,transID};Ifthespecifiedpagesofthefilearelockedinamodenostrongerthanread,thenremovesthoselocks.Itistheclient'sresponsibilitytoassureconsistencyofanysubsequentoperationswhosebehaviordependsonthedatathatwasreadunderthoselocks.Notethatlocksarereference-countedandarenotremoveduntiloneUnlockPageshasbeendoneforeachLockPagesorReadPagespreviouslyperformedonthesamepages.Attemptstoremovenonexistentlocksorlocksstrongerthanreadareignoredwithouterrorindication.Fileintentionlocksthatweresetwhileacquiringthepagelocksarenotreleased.ProceduresthataccesspropertiesofthefileProperty:TYPE=AlpineEnvironment.Property;PropertyValuePair:TYPE=AlpineEnvironment.PropertyValuePair;PropertySet:TYPE=PACKEDARRAYPropertyOFFalseBool;FalseBool:TYPE=BOOLEAN_FALSE;allProperties:PropertySet=ALL[TRUE];ByteCount:TYPE=AlpineEnvironment.ByteCount;FileVersion:TYPE=AlpineEnvironment.FileVersion;ReadProperties:PROCEDURE[conversation:Conversation,openFileID:OpenFileID,desiredProperties:PropertySet_allProperties,lock:LockOption_[read,wait]]RETURNS[properties:LISTOFPropertyValuePair];!LockFailed,StaticallyInvalid,Unknown{openFileID,transID};ReadsthepropertiesspecifiedbydesiredProperties,orderedasinthedeclarationofProperty.Locksthosepropertiesasspecifiedbylock.Currently,allpropertieswiththeexceptionofversionaretreatedtogetherwithrespecttolocking;theversionhasaseparatelock.Notethatreadingtheversionwillpreventanyothertransactionthatupdatesthefilefromcommitting,unlesstheversionlockislaterremoved(byUnlockVersion).WriteProperties:PROCEDURE[conversation:Conversation,openFileID:OpenFileID,properties:LISTOFPropertyValuePair,lock:LockOption_[write,wait]];wHDg/v_,q!#}%"(I*.+35t8;^>@CSF]- er#&(\+V,/G 7=A'B} u [ s[ q[ [ s[ $m - 5 = Yb= &/) 1M27vW- '# + 5V` 'Tkjp]!#(%t).0 79K;?LER.z !&$! +-2/~3N579q>/BtDEQ-2 ^!%t')-/u1 7<>DOFOu e$') /Q24h7:>BMu KRs~KRq{KR#KRs4KR $ , 4 <C Io ~vH- !-'_ /F[ :PC#')V+u C sCqCmCs~C %S . 5 > B9v@- (>W !P#')*.Y0L58<?D3=BG $&M*f 1i3 5 ?p T#%( /a1\ 7:<BD5"k$)T+05239#AD<X  `0 "%/V* < $ .1 8 >D FU@ o>}y*,// 6h8! @jES-) "!#(+),04"8:=?kBFQx )!}#M&)5!7=:>CPJ? s B %(l /479=?v@EN-'5 "2$~'C+.04: ;>0@AFL-uo #%KSs b "&*&+136 I"#$)C,/h05 <&>yCDHwj!\"%K +w.g 58<@ u E sEqEvEsE &\ / 6 vC-` B;^ "$'0+1k39; D#@u >s~>q|>$>s5> ( 0 8 @ q D(7zr |o"$8&( /2V8;G@)AD54R"#'(t*/G2[46L =E@ G4,u 1s1q1T1se1 "; * 2 :>] F 0 qx0 s0  v.b-  %,k#$S'M)@+.-37'9],andisguaranteednottoraiseanyoftheerrorsraisedbyCreateWorker.CreateWorker:PROC[conversation:Conversation,transID:TransID,coordinator:FileStore];!Unknown{coordinator,transID};Callfromclienttoworker.InformsthecalledAlpineinstancethatitistoserverasaworkerunderanexistingtransactiontransIDwhichisbeingcoordinatedbytheAlpineinstanceidentifiedbycoordinator.Thisprocedurereturns(i.e.doesnotraiseanerror)ifftransbecomesactive(preparedtodowork)onthecalledAlpineinstance.Ofcourse,thereisnoguaranteethatthisstatewilllastforanylengthoftime.AssertAlpineWheel:PROC[conversation:Conversation,transID:TransID,enable:BOOL_TRUE];!OperationFailed{regServersUnavailable,notAlpineWheel},Unknown{transID}.Whencalledwithenable=TRUE,causesallsubsequentcallsforthis(conversation,transID)pairtopassallaccesscontrolcheckswithoutfurtherchecking;raisesOperationFailed[notAlpineWheel]ifthecalleridentifiedbyconversationisnotamemberoftheAlpineWheelsgroupforthisserver.Whencalledwithenable=FALSE,causesnormalaccesscontrolcheckingtoresumeforthis(conversation,transID)pair.RequestedOutcome:TYPE=AlpineEnvironment.CommitOrAbort;Outcome:TYPE=AlpineEnvironment.Outcome;Finish:PROC[conversation:Conversation,transID:TransID,requestedOutcome:RequestedOutcome--{abort,commit}--,continue:BOOL_FALSE]RETURNS[outcome:Outcome--{abort,commit,unknown}--,newTrans:TransID];!(none);Callfromclienttocoordinator.Requeststhatthetransactionbefinishedinthespecifiedway.Ifthetransactionhasalreadycommittedoraborted,Finishsimplyreturnstheoutcome.Otherwise,Finishwaitsifnecessarytoassureaknownoutcome(whichmaydifferfromtheonerequested)andreturnsthatoutcome.newTransismeaningfulonlyifrequestedOutcome=commit,continue=TRUE,andoutcome=commit.Unknown:ERROR[what:AlpineEnvironment.UnknownType];OperationFailed:ERROR[why:AlpineEnvironment.OperationFailure];v _, ]  [ Z5h;J X+ q Vs Tk QqQQ sQq PHs L qLLsDL) KQqKQKQslKQQ I qiI"IsIu G.sG.qG.G.sG. c &q2_G.3G.s6G.q7G.8TG.s:G.q;G.T #&N'+.-/j159;] u l@%AZ7w %)+. 57: >r5  !!1'\+.147B95= >B<4(\A ""$a(B,249><>@FC2zC"$Qu 0sF0qD00s0 $ -t280q=0>R0sAH0qB0C0sF0Fd0v.^-&'28 , #x,,v"+,#,'7)2 /35?7 @hE+to}"o'I+15)hG &( 0w14F5{:<9> 'x6 2$'+Kx-0'-'v0'1'5:>C2&C "l(s "q"d"s" !"qi!"#!"s!"u sqKsJ  %+X14 v1s#$q*+Ys.Pq/0s3zq4b56s:m@v Y sYY%Cv- E !&)+ 249;K=CFb- 'Z%',05+9<A {m#$).x259Y<>Aq $&4 -8041<>Clxllvllis qsw uq uq usN u#$ VTVm$2END.CHANGELOGChangedbyMBrownonJanuary21,198310:28pmAddedcreateLocalWorkerparmtoCreate.Renamedtrans->transIDtobeconsistentwithAlpineFile.ChangedbyMBrownonMarch1,19833:29pmMovedAssertAlpineWheelhere,fromAlpineOwner;itnowraisesOperationFailed[notAlpineWheel]insteadofAccessFailed[alpineWheel].wHDg/q _ls_lq \\s Zv $5'v Xa$>*+-/E4`67 >A s VSx"%v T[L ).*-`1 ; SU  #TVm$AlpineOwner.mesaProceduresforownerdatabasemaintenance.Lasteditedby:KollingonMarch8,19834:21pmMBrownonMarch3,19832:45pmTaftonApril2,19831:52pmSomeaspectsofownerdatabasemaintenancearedecentralized,inthatnormalAlpineusersmayperformthem.Theseincludeinspectingindividualownerrecordsandupdatingcertainfieldsofownerrecords(theseupdatesarerestrictedbyaccesscontrolchecksthatareafunctionoftheowner).OtheraspectsofownerdatabasemaintenancearereservedforAlpineadministrators.Theseincludecreatinganddeletingownerrecords,updatingdiskspacequotas,andenumeratingtheentiresetofowners.Onaparticularserver,theseoperationsmayonlybeinvokedbyindividualswhobelongtothatserver'sAlpineWheelsgroup.Sincetheseoperationsarepotentiallydestructive,theymustbeexplicitly"enabled"byacalltoAlpineTransaction.AssertAlpineWheel.DIRECTORYAlpineEnvironment;AlpineOwner:DEFINITIONS=BEGINAccessList:TYPE=AlpineEnvironment.AccessList;--necessary,orlupinebombsout.Conversation:TYPE=AlpineEnvironment.Conversation;OwnerName:TYPE=AlpineEnvironment.OwnerName;PageCount:TYPE=AlpineEnvironment.PageCount;TransID:TYPE=AlpineEnvironment.TransID;VolumeGroupID:TYPE=AlpineEnvironment.VolumeGroupID;WhenaprocedureraisesAccessFailed[alpineWheel]below,thisalwaysmeansthatthe(conversation,transID)pairpassedtotheprocedureneededtobeasserted(byAlpineTransaction.AssertAlpineWheel[enable:TRUE]),butwasnot.ProceduresforbothAlpineusersandAlpineadministrators.OwnerProperty:TYPE=AlpineEnvironment.OwnerProperty;OwnerPropertyValuePair:TYPE=AlpineEnvironment.OwnerPropertyValuePair;OwnerPropertySet:TYPE=AlpineEnvironment.OwnerPropertySet;allOwnerProperties:OwnerPropertySet=AlpineEnvironment.allOwnerProperties;ReadProperties:PROC[conversation:Conversation,transID:TransID,volumeGroupID:VolumeGroupID,owner:OwnerName,desiredProperties:OwnerPropertySet_allOwnerProperties]RETURNS[properties:LISTOFOwnerPropertyValuePair];!LockFailed{timeout},StaticallyInvalid,Unknown{owner,transID,volumeGroupID}.ReadsthepropertiesspecifiedbydesiredProperties,orderedasinthedeclarationofOwnerProperty.WriteProperties:PROC[conversation:Conversation,transID:TransID,volumeGroupID:VolumeGroupID,owner:OwnerName,properties:LISTOFOwnerPropertyValuePair,enforceTotalQuota:BOOL_FALSE];!AccessFailed{alpineWheel,ownerEntry},LockFailed{timeout},OperationFailed{ownerRecordFull,ownerRecordInUse,regServersUnavailable,totalQuotaExceeded},v _, ] z [  Z5+  X Vh;J S Bd %?' 014x9=k@C Q  $(,/[49p<>B PI !&-*-[/06/7: N c %a',/ 3[<@h L &1),1R3 ;>AC KS L 'm*]-X/(4+6 <?CE I}   u# *[, 3M :N=@@B[ H V$q Es C Af qAfAf s Afq ?s s : q::sD:) 9 q9 M9 s9  7y q}7y67ys7y 5q55sl5Q 4* qH4*4*s4*v /3-X # +/2d6:=@ -d0iZ#')+n0 ++x( +(+v+C+++-/h2  &  ^ k$s # q##s#t !q!!s`!!E) qsjO# f#%%u  sqs " +A06  ' $C/;<q 7s 7 q]77\7sv7v- U 's-28\ !,1a347 >? u mswmqtmmsm " +1)7  ' $C q+4+.3s0M q$sqas !bv w- '  (9 /a 5 [&R4+ +TVm$A2StaticallyInvalid,Unknown{owner,transID,volumeGroupID}.Writesthesuppliedproperties,leavingtheothersunchanged.Obtainsawritelockontheownerrecord.(Fornow,WritePropertiesfailsbyraisingOperationFailed[ownerRecordInUse]ifawriteofthequotaisrequestedandanothertransactionisconcurrentlychangingthespaceinusebythegivenowner.Retryingmaysucceed.)Theowner,andmembersoftheowner'sModifyaccesslist,canupdatetheCreateaccesslistpropertyofanownerrecord.Theowner,andmembersoftheowner'sCreateaccesslistcanupdatetherootFilepropertyofanownerrecord.Ifanupdateisrestrictedtothetheseproperties,buttheaccesscontrolchecksfail,thenWritePropertiesraisesAccessFailed[ownerEntry].ThespaceInUsepropertyisreadonly.IfenforceTotalQuota=TRUEandpropertiesincludesquota,thenWritePropertiesraisesOperationFailed[totalQuotaExceeded]ifthetotalofallquotasintheownerdatabase,includingthespecifiedupdate,exceedsthetotalnumberofdiskpagesonthevolumegroup.Onallupdates,certainhigh-levelinvariantsareenforced:owneraccesslistsalwayshaveworld=FALSEandowner=TRUE.AnupdatetoanaccesscontrollistmayraiseOperationFailed[ownerRecordFull].Thesystemguaranteestoreserveenoughspaceforaccesscontrolliststoragesothateachlistcancontaintwomaximum-lengthRNames,butdoesnotcontrolthedivisionofspacebetweenlists.Inordertoaddanelementtoonelistitmaybenecessarytoremoveanelementfromanother.ProceduresforAlpineadministratorsonly.Theseproceduresrequirethat(conversation,transID)beassertedasanAlpineWheel.Create:PROC[conversation:Conversation,transID:TransID,volumeGroupID:VolumeGroupID,owner:OwnerName,properties:LISTOFOwnerPropertyValuePair,enforceTotalQuota:BOOL_FALSE]RETURNS[spaceLeftOnVolumeGroup:PageCount];!AccessFailed{alpineWheel},LockFailed{timeout},OperationFailed{duplicateOwner,ownerDatabaseFull,ownerRecordFull,totalQuotaExceeded},StaticallyInvalid,Unknown{transID,volumeGroupID}.CreatesanewownerinthespecifiedVolumeGroup.Thepropertiesofthenewownerarederivedby(ineffect)settingallpropertiestotheirdefaultvalues,thencallingWritePropertieswiththespecifiedlistofproperties.Destroy:PROC[conversation:Conversation,transID:TransID,volumeGroupID:VolumeGroupID,owner:OwnerName];!AccessFailed{alpineWheel},LockFailed{timeout},OperationFailed{ownerRecordInUse,spaceInUseByThisOwner},StaticallyInvalid,Unknown{owner,transID,volumeGroupID}.DestroysanexistingownerinthespecifiedVolumeGroup.RaisesOperationFailed[spaceInUseByThisOwner]ifanyfilesexistwhosediskspaceischargedagainstowner.ReadNext:PROC[conversation:Conversation,transID:TransID,volumeGroupID:VolumeGroupID,previousOwner:OwnerName,desiredProperties:OwnerPropertySet_allOwnerProperties]RETURNS[owner:OwnerName,properties:LISTOFOwnerPropertyValuePair];!AccessFailed{alpineWheel},LockFailed{timeout},StaticallyInvalid,Unknown{owner,transID,volumeGroupID}.Statelessenumeratorfortheownerdatabase.previousOwner=NILstartsanenumeration,andowner=NILisreturnedattheendofanenumeration.Thiscalllockstheentireownerdatabaseinwritemodetoensureconsistency,whichisthereasonforrestrictingitsusetoAlpineadministrators.ReadDBProperties:PROC[conversation:Conversation,transID:TransID,volumeGroupID:VolumeGroupID]RETURNS[nOwners,nEntriesUsed,nEntries:NAT,totalQuota,totalSpaceInUse,volumeGroupSize:PageCount];wHDg/v_,`$*]j q%']+b 389D<?AC[##&(-7 CDFZ6 %} ,w- 5;p=A[CEaG;XmDV$f !V&,*.148m:?C$U@0 #'*y0148=:AHCS>!#'+-/}35F ;<? Bx QC3 #R&\03 ; DPJ  [NxNNv N#@ )k.25?vL&'\),.t0o46\8<BKS-R ="%*,:/247;Ie` "; (w*048;w?BFxHvHxHRHvHF]OQDR #'&)R3K>AD E z$&A*O.1$57:W=?BLCm !$'){.0]5I6:?CGE$Ag > }!$&,.0249< ~D :u 8Ns8Nq8N8Ns8N c &+1x u sqs i (-3} 0 ' !1 )4@h qO#s[#e + q235s7v- ' ' .b8?D: :#4) 2x45sv76:< Dxv_)"$&L(? 0Y3i59};?CD{ ^ $(* ,U02 9 :=\?u !s!q!!s! $ -H28 z q2 z zs= z# ,q2 z3 zs5 z5 z =   iTVm$3!AccessFailed{alpineWheel},LockFailed{timeout},Unknown{transID,volumeGroupID}.Returnsaggregateinformationabouttheownerdatabase.nOwnersisthenumberofownersinthedatabase,whilenEntriesUsedisthenumberofdatabaseentriesinuse(deletedentriesmayoccupyspace).WhennEntriesUsed=nEntries,anyCreatecallwillraiseOperationFailed[ownerDatabaseFull];acalltoReorganizeDBisrequired(seebelow)ReorganizeDB:PROC[conversation:Conversation,transID:TransID,volumeGroupID:VolumeGroupID,nEntries:NAT];!AccessFailed{alpineWheel},LockFailed{timeout},OperationFailed{insufficientSpace,ownerDatabaseFull},Unknown{transID,volumeGroupID}.Performsacompletereorganizationoftheownerdatabase,lockingitinwritemodeandtherebymakingitunavailableduringthereorganization.Reorganizationiscalledforwhentheownerdatabasebecomesfull(CreateraisesOperationFailed[ownerDatabaseFull]),orwhentheperformanceofownerdatabaseoperationsdegradesduetohashcollisionsordeletions.ThenewownerdatabasefileallowsuptonEntriesowners;ReorganizeDBraisesOperationFailed[ownerDatabaseFull]iftheexistingdatabasecontainsmorethanthismanyowners.ReorganizeDBraisesOperationFailed[insufficientSpace]ifthereisnotenoughscratchspaceonthevolumegrouptoperformthereorganization.ErrorsAccessFailed:ERROR[missingAccess:AlpineEnvironment.NeededAccess];LockFailed:ERROR[why:AlpineEnvironment.LockFailure];OperationFailed:ERROR[why:AlpineEnvironment.OperationFailure];StaticallyInvalid:ERROR;Unknown:ERROR[what:AlpineEnvironment.UnknownType];END.wHDg/v_,- ' ' .b4:]@ $T&*[ Z6fK"l$&^,</ 89;@BTX6<> #(,p0k 8:@bBVw G!@.S/23 <>>CU@u R sRqRKRsJR " *0X64 Q 'qQQsQQvOv- ' ' .b8ZM!'L(  #%6'+|1Z6%7}9#<@BJ = ", 5r6:<@hBHg-!$.<&=AaG2 70! (1-0A15 :< BEUEa "b', 59C{$-)/2q58*;B< %02>579x>0BFo@-I V" ;s 9# q9#`9#s<9#" 6 q6l6sI6 4-q4-q4-sN4-#$ 1q1F1s1 /7q/7/7sw/7q +s+TVm$AlpineVolume.mesaLasteditedbyKollingonMarch9,198311:08amMBrownonMarch1,19834:13pmTaftonApril2,19831:53pmThisisaninteriminterface.Weexpectittoevolveinthedirectionof:controlofvolumegrouplocking,controllingtheonline/offlinestatusofvolumegroups,etc.DIRECTORYAlpineEnvironment;AlpineVolume:DEFINITIONS=BEGINConversation:TYPE=AlpineEnvironment.Conversation;LockOption:TYPE=AlpineEnvironment.LockOption;TransID:TYPE=AlpineEnvironment.TransID;nullTransID:TransID=AlpineEnvironment.nullTransID;VolumeID:TYPE=AlpineEnvironment.VolumeID;VolumeGroupID:TYPE=AlpineEnvironment.VolumeGroupID;nullVolumeGroupID:VolumeGroupID=AlpineEnvironment.nullVolumeGroupID;ProceduresGetNextGroup:PROC[conversation:Conversation,transID:TransID_nullTransID,previousGroup:VolumeGroupID_nullVolumeGroupID,lock:LockOption_[none,wait]]RETURNS[volumeGroupID:VolumeGroupID];!Unknown{volumeGroupID};Statelessenumeratorfortheon-linevolumegroupsofthisAlpineinstance.previousGroup=nullVolumeGroupIDstartsanenumeration,andvolumeGroupID=nullVolumeGroupIDisreturnedattheendofanenumeration.Fornow,thetransIDandlockparmsareignored.Theproposedusageisasfollows:IftransID#nullTransIDandlock.mode#nonethensetsthespecifiedlockonthereturnedvolumegroup.Settingareadlockguaranteesthatthevolumegroupwillremainon-linefortheremainderofthetransaction.Settingawritelockexcludesallotheraccesstothevolumegroupfortheremainderofthetransaction(includingopeningfilesonthevolumegroup);thisrequiresthecallertobeanassertedAlpineWheel.GetGroup:PROC[conversation:Conversation,transID:TransID_nullTransID,volumeGroupID:VolumeGroupID,lock:LockOption_[none,wait]]RETURNS[volumes:LISTOFVolumeID];!Unknown{volumeGroupID};ReturnsthelistofvolumesbelongingtothespecifiedvolumeGroup.LockingisasforGetNextGroup.GetEnclosingGroup:PROC[conversation:Conversation,transID:TransID_nullTransID,volumeID:VolumeID,lock:LockOption_[none,wait]]RETURNS[volumeGroupID:VolumeGroupID];!Unknown{volumeID};ReturnstheVolumeGroupIDofthevolumegroupcontainingthespecifiedvolume.LockingisasforGetNextGroup.Errorsv _, ]  [+ Z6 Xh;J U@ h[ p",#%)),*-249e;?C S  G !!&e+q Qs Ov L qLL sLq KTs H qHHsDH) F^ q"F^F^sF^y DqDDslDQ C N AhqQAh AhsAh ? qH??s? > $m&R$v 9# u 6 s6q66s6 "V + 067 5  "[/3K :<@q 3Ys 3Yiv1-`0  :#(f,.e05O: C.ct! )#+ 57D,,@1bU +#= $'2,/5A9:n<'A&B)m =!#&),u.407)9;i@'Bw{u &4)+R/36^:?uA&<, !%&*C-<248(<6=@'D$w US $ *0247;@C "-WJb u Us Uq U Us U i (-3%4 <  ' "E#'q+,s1q88;s=. v-`_kNr$&;(- 6;=U? u =s=q=X=sW= %- -3e8:v 5 %S&+q./s4 vF-` k !`#(L," 25:?xDF@ TVm$2AccessFailed:ERROR[missingAccess:AlpineEnvironment.NeededAccess];Unknown:ERROR[what:AlpineEnvironment.UnknownType];StaticallyInvalid:ERROR;END.wHDg/s _, q_,`_,s<_," \q\\sw\ Z6qZ6FZ6sZ6q VsVTVm$JAlpInstance.mesaLasteditedby:KollingonAugust2,19835:27pmTaft,June2,198311:16amDIRECTORYAlpineEnvironmentUSING[Conversation,FileStore,LockFailure,NeededAccess,OperationFailure,Principal,UnknownType],AlpineFileRpcControlUSING[InterfaceRecord],AlpineOwnerRpcControlUSING[InterfaceRecord],AlpineTransactionRpcControlUSING[InterfaceRecord],AlpineVolumeRpcControlUSING[InterfaceRecord],RPCUSING[EncryptionKey];AlpInstance:CEDARDEFINITIONS=BEGINFileStore:TYPE=AlpineEnvironment.FileStore;Principal:TYPE=AlpineEnvironment.Principal;EncryptionKey:TYPE=RPC.EncryptionKey;AccessFailed:READONLYERROR[missingAccess:AlpineEnvironment.NeededAccess];LockFailed:READONLYERROR[why:AlpineEnvironment.LockFailure];OperationFailed:READONLYERROR[why:AlpineEnvironment.OperationFailure];StaticallyInvalid:READONLYERROR;Unknown:READONLYERROR[what:AlpineEnvironment.UnknownType];PossiblyDamaged:READONLYSIGNAL;Handle:TYPE=REFObject;Object:TYPE=RECORD[trans:AlpineTransactionRpcControl.InterfaceRecord,file:AlpineFileRpcControl.InterfaceRecord,owner:AlpineOwnerRpcControl.InterfaceRecord,volume:AlpineVolumeRpcControl.InterfaceRecord,otherInterfaces:LISTOFREFANY,conversation:AlpineEnvironment.Conversation,key:RPC.EncryptionKey,fileStore:FileStore];Create:PROCEDURE[fileStore:FileStore,caller:Principal_NIL,key:EncryptionKey_ALL[0]]RETURNS[Handle];!Failed{alpineDownOrCommunications,alpineDown,authenticateFailed,badCallee,grapevineDownOrCommunications,mismatch}.EstablishesanewruntimebindingtotheAlpineinstancespecifiedbyfileStore,andestablishesanRPCConversationwiththeserveronwhichthatinstanceislocated.caller=NILmeanscalleristhelogged-inuserandderivesthekeyfromthepassword.Note:ifacallusingaHandlefailsviaRPC.CallFailed[unbound],thisgenerallymeansthattheserverhascrashedandrestartedsincethehandlewascreated;discardthehandle(andanyhandlesderivedfromit)andcreateanewhandle.Failed:ERROR[why:Failure];Failure:TYPE={alpineDownOrCommunications,alpineDown,authenticateFailed,badCallee,grapevineDownOrCommunications,mismatch};Clienterrorsare:v _, ]  [f9H Z5PXq Ws Vq5VsdVV %{ + 3 =H1Tk Z RqRsRJR QqfQsQQ OtqUOts"Ot"Ot MqMs FM M L%q?L%snL%L% I qII sIq Hs D qiD"DsD C qHC C sC  Ad q AdAds{Adq`Ad4AdsAdAd > q>z>>s X>* 00s,0/1,-%+&*:q'(q(((((s"a(& %C#  u ! s! q! ! s! ~! | $(.q0S! 1;! s2^! 3;! 6I ?qAi! B=! sC! D! q ys yv-"& .l: *$  6"$&+0^57 =p@ FH jf#%)j,<1{27;x=w>Tv@D?G4- !#Q%)+g_L!$&86F8>BE9"D%',O.48:?YBv>ap $ %B(s qtsP& q?s+ 3'> 1 s( v  TVm$(2authenticateFailed:badcallernameorkey.badCallee:badservername.mismatch:forexample,versionincompatibility.Theothererrorsindicateaproblemwithethernetaccess,grapevine,oralpine:alpineDownOrCommunications:can'tcontactalpine;maybecommunicationsorserverdown.alpineDown:alpineserverisdown.grapevineDownOrCommunications:can'tcontactgrapevine;maybecommunicationsorserverdown.END.EditLogInitial:Kolling:February14,19832:45pm:packagetoaidclients,inconjunctionwithAlpTransactionandAlpFile.wHDg/v _,]"&K( ] ] [-U#Z6R3Cx#&+0< 68Y X#'D+135 ?AdEF V  r! U@%)K. 579 CEsSq OvsOvv L(  Hq9v!$(-U.1B57t > G2 RTVm$AlpFile.mesaLasteditedby:KollingonOctober18,19832:41pmTaftonJune2,198311:29amDIRECTORYAlpineEnvironmentUSING[AccessRights,FileID,FileType,LockFailure,LockOption,NeededAccess,OpenFileID,OperationFailure,OwnerName,PageCount,PageRun,PropertyValuePair,RecoveryOption,ReferencePattern,UnknownType,UniversalFile,VolOrVolGroupID],AlpineFileUSING[allProperties,PropertySet,RESULTPageBuffer,standardFile,VALUEPageBuffer],AlpTransactionUSING[Handle];AlpFile:CEDARDEFINITIONS=BEGINAccessRights:TYPE=AlpineEnvironment.AccessRights;allProperties:PropertySet=AlpineFile.allProperties;FileID:TYPE=AlpineEnvironment.FileID;FileType:TYPE=AlpineEnvironment.FileType;LockOption:TYPE=AlpineEnvironment.LockOption;OpenFileID:TYPE=AlpineEnvironment.OpenFileID;OwnerName:TYPE=AlpineEnvironment.OwnerName;PageCount:TYPE=AlpineEnvironment.PageCount;PageRun:TYPE=AlpineEnvironment.PageRun;PropertySet:TYPE=AlpineFile.PropertySet;PropertyValuePair:TYPE=AlpineEnvironment.PropertyValuePair;RecoveryOption:TYPE=AlpineEnvironment.RecoveryOption;ReferencePattern:TYPE=AlpineEnvironment.ReferencePattern;RESULTPageBuffer:TYPE=AlpineFile.RESULTPageBuffer;standardFile:FileType=AlpineFile.standardFile;UniversalFile:TYPE=AlpineEnvironment.UniversalFile;VALUEPageBuffer:TYPE=AlpineFile.VALUEPageBuffer;VolOrVolGroupID:TYPE=AlpineEnvironment.VolOrVolGroupID;AccessFailed:READONLYERROR[missingAccess:AlpineEnvironment.NeededAccess];LockFailed:READONLYERROR[why:AlpineEnvironment.LockFailure];OperationFailed:READONLYERROR[why:AlpineEnvironment.OperationFailure];StaticallyInvalid:READONLYERROR;Unknown:READONLYERROR[what:AlpineEnvironment.UnknownType];PossiblyDamaged:READONLYSIGNAL;Handle:TYPE=REFObject;Object:TYPE=RECORD[trans:AlpTransaction.Handle,openFileID:OpenFileID];InadditiontotheerrorsdocumentedforthecorrespondingAlpineprocedures,alloftheproceduresdefinedinthisinterfacecanalsoerrorRPC.CallFailed[RPC.CallFailure].Open:PROCEDURE[transHandle:AlpTransaction.Handle,universalFile:UniversalFile,access:AccessRights_readOnly,lock:LockOption_[intendRead,wait],recoveryOption:RecoveryOptionv _, ]  [&l { Z5!q Ws VqOV5Vs~VV %*T0 8 1Tj  #. 7G >1R(3 = 1Q Ot qOtsOtNOt  'l4 1M L% qL%sL%L% IqoI:I s Iq Hs D qDvDs/D C d  AbqAbAbscAbH ?qR? ?s? > q">>s>y 00s0# /-q7/-/-s/- - e@% + q++so+T *6q*6?*6s*6 (qf((s(" %? q%?z%?%?s X%?* # q###se##; !q!!!s"j!&?$ Gq Ga G Gs! G qs" qRs# |qV||s|q||sw| qsYq>s,Y  v b  "O$w& /\3 :<>T@ {!D #u ?s. ?q+ ? ?s` ? ? . 7Z @9 D1 'O( 14>  TVm$2_log,referencePattern:ReferencePattern_random]RETURNS[handle:Handle,fileID:FileID];Create:PROCEDURE[transHandle:AlpTransaction.Handle,volumeID:VolOrVolGroupID,owner:OwnerName,initialSize:PageCount,type:FileType_standardFile,recoveryOption:RecoveryOption_log,referencePattern:ReferencePattern_random]RETURNS[handle:Handle,refUniversalFile:REFUniversalFile];Close:PROCEDURE[handle:Handle];Delete:PROCEDURE[handle:Handle];ReadPages:UNSAFEPROCEDURE[handle:Handle,pageRun:PageRun,pageBuffer:RESULTPageBuffer,lock:LockOption_[read,wait]];WritePages:PROCEDURE[handle:Handle,pageRun:PageRun,pageBuffer:VALUEPageBuffer,lock:LockOption_[write,wait]];ReadProperties:PROCEDURE[handle:Handle,desiredProperties:PropertySet_allProperties,lock:LockOption_[read,wait]]RETURNS[properties:LISTOFPropertyValuePair];WriteProperties:PROCEDURE[handle:Handle,properties:LISTOFPropertyValuePair,lock:LockOption_[write,wait]];LockPages:PROCEDURE[handle:Handle,pageRun:PageRun,lock:LockOption_[read,wait]];UnlockPages:PROCEDURE[handle:Handle,pageRun:PageRun];GetAccessRights:PROCEDURE[handle:Handle]RETURNS[access:AccessRights];GetLockOption:PROCEDURE[handle:Handle]RETURNS[lock:LockOption];SetLockOption:PROCEDURE[handle:Handle,lock:LockOption];GetRecoveryOption:PROCEDURE[handle:Handle]RETURNS[recoveryOption:RecoveryOption];GetReferencePattern:PROCEDURE[handle:Handle]RETURNS[referencePattern:ReferencePattern];SetReferencePattern:PROCEDURE[handle:Handle,referencePattern:ReferencePattern];GetSize:PROCEDURE[handle:Handle,lock:LockOption_[read,wait]]RETURNS[size:PageCount];SetSize:PROCEDURE[handle:Handle,size:PageCount,lock:LockOption_[write,wait]];GetUniversalFile:PROCEDURE[handle:Handle]RETURNS[universalFile:UniversalFile];UnlockVersion:PROCEDURE[handle:Handle];IncrementVersion:PROCEDURE[handle:Handle,increment:INT];END.EditLogInitial:Kolling:February14,19835:08pm:packagetoaidclients,inconjunctionwithAlpInstanceandAlpTransaction.wHDg/s _, 5%'Eq,_,-_,s2P_,2_,7<Aru \s\q\\s\~\ /m6sB [ s A "&),- 5 Yb ?w%3/1q7 Yb7YbsBbu =F s=Fq=Fm=Fs=F]=F!]&,u :s:q::s8::#q(:):s.f:.:3P u 8P sV8PqT8P8Ps8P8P"q(.8P)8Ps-8P.8P1 u 5 s5q55sQ55"'+_ u 3Zs3Zq3Ze3Zs3Z U3Z%Uq*3Z+l3Zs0 3Z03Z:u 0s0q0*0s 0!0&q+]0,10s001H0<u .dsN.dqL.d.ds .d .d%+5u +s+q+T+s+D+D#|& .0'3q7+8+s=D+=+@ u )nsx)nqv)n)ns)n )n #E&j -1; 8:s>u &s&q&&sB&&#q(&)&s.p&.& 7|u $x s$xq$xv$xs$xe$x"fu !s~!q|!$!s!!$)L q0A =t|TVm$AlpTransaction.mesaLasteditedbyKollingonJune3,19832:44pmTaftonJune2,198311:22amDIRECTORYAlpineEnvironmentUSING[allOwnerProperties,CommitOrAbort,FileStore,LockFailure,LockOption,NeededAccess,nullVolumeGroupID,OperationFailure,Outcome,OwnerName,OwnerPropertySet,OwnerPropertyValuePair,PageCount,TransID,UnknownType,VolumeID,VolumeGroupID],AlpInstanceUSING[Handle],AlpineTransactionUSING[RequestedOutcome];AlpTransaction:CEDARDEFINITIONS=BEGINallOwnerProperties:OwnerPropertySet=AlpineEnvironment.allOwnerProperties;FileStore:TYPE=AlpineEnvironment.FileStore;LockOption:TYPE=AlpineEnvironment.LockOption;nullVolumeGroupID:VolumeGroupID=AlpineEnvironment.nullVolumeGroupID;Outcome:TYPE=AlpineEnvironment.Outcome;OwnerName:TYPE=AlpineEnvironment.OwnerName;OwnerPropertySet:TYPE=AlpineEnvironment.OwnerPropertySet;OwnerPropertyValuePair:TYPE=AlpineEnvironment.OwnerPropertyValuePair;PageCount:TYPE=AlpineEnvironment.PageCount;RequestedOutcome:TYPE=AlpineTransaction.RequestedOutcome;TransID:TYPE=AlpineEnvironment.TransID;VolumeID:TYPE=AlpineEnvironment.VolumeID;VolumeGroupID:TYPE=AlpineEnvironment.VolumeGroupID;AccessFailed:READONLYERROR[missingAccess:AlpineEnvironment.NeededAccess];LockFailed:READONLYERROR[why:AlpineEnvironment.LockFailure];OperationFailed:READONLYERROR[why:AlpineEnvironment.OperationFailure];StaticallyInvalid:READONLYERROR;Unknown:READONLYERROR[what:AlpineEnvironment.UnknownType];PossiblyDamaged:READONLYSIGNAL;Handle:TYPE=REFObject;Object:TYPE=RECORD[inst:AlpInstance.Handle,transID:TransID];InadditiontotheerrorsdocumentedforthecorrespondingAlpineprocedures,alloftheproceduresdefinedinthisinterfacecanalsoerrorRPC.CallFailed[RPC.CallFailure].Atthemoment,AlpineignoresthetransIDandlockparametersforGetVolumeGroup,GetNextVolumeGroup,andGetEnclosingVolumeGroup.Create:PROCEDURE[instHandle:AlpInstance.Handle,createLocalWorker:BOOLEAN_TRUE]RETURNS[handle:Handle];CreateWithTransID:PROCEDURE[instHandle:AlpInstance.Handle,transID:TransID,createLocalWorker:BOOLEAN_TRUE]RETURNS[handle:Handle];CreateWorker:PROCEDURE[handle:Handle,coordinator:FileStore];Finish:PROCEDURE[handle:Handle,requestedOutcome:RequestedOutcome,continue:BOOLEAN_FALSE]RETURNS[outcome:Outcome];v _, ]  [ Z5!q Ws Vq5VsdVV) 3 :) 1Tk 4 #1<91R &6P =1Q #+ Ou qOusOuOu MqYMsMM KSq KSKS s KSq Is F\f#%% D qiD"DsD C q"C C sC y Ae $m&R$ ?qi?#?s? > q>M>s> !!s,!!+V0v   "O$w& /\3 :<>T@ {!D #8:=B Yz~ %\'2@p u 6s6q66s6 y-%q9l6:%6s?6qA6A6sDI6q s lu sqs  (|5(: mqEmmsimqm ms#"mq$ m$ms*m/xu  soqls"'< / u vs vq' v vs\ v v"/ ;qA vB vsG vq s q W s m TVm$V2AssertAlpineWheel:PROCEDURE[handle:Handle,enable:BOOLEAN];GetVolumeGroup:PROCEDURE[handle:Handle,volumeGroupID:VolumeGroupID,lock:LockOption_[none,wait]]RETURNS[volumes:LISTOFVolumeID];GetNextVolumeGroup:PROCEDURE[handle:Handle,previousGroup:VolumeGroupID_nullVolumeGroupID,lock:LockOption_[none,wait]]RETURNS[volumeGroupID:VolumeGroupID];GetEnclosingVolumeGroup:PROCEDURE[handle:Handle,volumeID:VolumeID,lock:LockOption_[none,wait]]RETURNS[volumeGroupID:VolumeGroupID];CreateOwner:PROCEDURE[handle:Handle,volumeGroupID:VolumeGroupID,owner:OwnerName,properties:LISTOFOwnerPropertyValuePair,enforceTotalQuota:BOOLEAN_FALSE]RETURNS[spaceLeftOnVolumeGroup:PageCount];DestroyOwner:PROCEDURE[handle:Handle,volumeGroupID:VolumeGroupID,owner:OwnerName];ReadNextOwner:PROCEDURE[handle:Handle,volumeGroupID:VolumeGroupID,previousOwner:OwnerName_NIL,desiredProperties:OwnerPropertySet_allOwnerProperties]RETURNS[owner:OwnerName,properties:LISTOFOwnerPropertyValuePair];ReadOwnerProperties:PROCEDURE[handle:Handle,volumeGroupID:VolumeGroupID,owner:OwnerName,desiredProperties:OwnerPropertySet_allOwnerProperties]RETURNS[properties:LISTOFOwnerPropertyValuePair];WriteOwnerProperties:PROCEDURE[handle:Handle,volumeGroupID:VolumeGroupID,owner:OwnerName,overCommitQuotasIfNeeded:BOOLEAN_FALSE,properties:LISTOFOwnerPropertyValuePair];ReadOwnerDBProperties:PROCEDURE[handle:Handle,volumeGroupID:VolumeGroupID]RETURNS[nOwners,nEntriesUsed,nEntries:NAT,totalQuota,totalSpaceInUse,volumeGroupSize:PageCount];ReorganizeOwnerDB:PROCEDURE[handle:Handle,volumeGroupID:VolumeGroupID,nEntries:NAT];END.EditLogInitial:Kolling:February14,19833:56pm:packagetoaidclients,inconjunctionwithAlpInstanceandAlpFile.wHDg/u _,sF_,qD_,_,sx_,_,$*q._,/_,s4_,4_,u \ st\qr\\s\ \$ )A 4? ?h [ 6cq#[ [ s"[ # [ q([ )[ +[ s.[ u XsaXq_XXs!X!X&,/ 6/ A V{ $&%*Sq.V.Vs3V3V U@u Rs8Rq6RRs$jR$R)/6 =>@R Q qwQKQsQbQ &_u N sNqNzNsNjN!k& 1 < L s qcLLcLs }L0Mq CqCCsCC#/Q0q=0C>CsBCCC Ah s qcAhAhcAhs }Ahu >s>q>>s!1>!>&+ 6 A =F s+4,q9=F9=Fs>=F>=F qE=FF=F ;s;u 9#sc9#q`9#9#s!9#!9#&,0 7- BW 7| sq&7|'j7|s,7|q.b7|/7|s27|27| q97|:7|<7|s 5u 3Zs3Zq3Z3Zs#83Z#3Z(- 8 q 1s11 q&1'1s)X1*51 1]; 0 u -s-q-7-s -!&-&'+_ 6\ Ak-q +sr++q )ns)nv &  "q9v!$(-U.1B57t >A !)tTVm$ AlpineFS.mesaInterfacefortheAlpineclassofCedarFileSystemandtheAlpineFSclassofIO.STREAM.LastEditedby:Taft,December5,19832:04pmThisfilesystemdiffersfromtheworkstationfilesystemdefinedinFSinthefollowingimportantways:Fileaccessisalwaysmadedirectlytotheremotefilesystem;thereisnolocalcaching.AlloperationsinvolvingdatatransferresultinexplicitinteractionwithanAlpineserver.TheproceduresforopeningAlpinefilesandperforminggeneralAlpinefilemanipulationaredifferentfromtheonesforworkstationfilesinFS,becauseAlpinefileshavecertainsemanticsthataredifferentfromworkstationfiles.However,thegenericFSoperationsonopenfiles(Read,Write,etc.)alsooperateonAlpinefiles.ThesameistrueofAlpinefilestreams.Alpinefilesareaccessedunderatransaction,andupdatesbecomepermanentonlywhenthetransactioniscommitted.Transactionsmayabortspontaneously,orcommunicationwiththeAlpineservermaybreakdown;andclientsmustbepreparedforanyoperationtofail.DIRECTORYAlpFileUSING[allProperties,Handle,LockOption,PropertySet,PropertyValuePair,ReferencePattern,RecoveryOption],AlpTransactionUSING[Handle],BasicTimeUSING[GMT,nullGMT],FSUSING[AccessOptions,ByteCount,defaultStreamBufferParms,ErrorDesc,ErrorGroup,ExtendFileProc,InfoProc,InitialPosition,Lock,NameProc,OpenFile,StreamBufferParms],IOUSING[STREAM],RopeUSING[ROPE];AlpineFS:CEDARDEFINITIONS=BEGINROPE:TYPE=Rope.ROPE;ErrorhandlingThispackageusestheextensibleerrorreportingmechanismdefinedinFS.mesa.Specifically,allerrorsarisingfromproceduresdefinedinAlpineFSandfromgenericFSoperationsonFS.OpenFilesreturnedfromAlpineFScauseFS.Errortoberaised.Thegroupargument,whichdescribesthegeneralclassoferror,isoneofthestandardonesdefinedinFS.ErrorGroup.However,thecodeargument,whichdescribestheerrorinmoredetail,isoneoftheonesdocumentedbelow.ThenamesofthesecodesarethesameastheonesinFSwhereverthatmakessense;buttherearemanynewonesaswell.AsinFS,thecodeargumentofErrorisanATOM.TheprintnameoftheatomisalwaysthesameasthenameofoneoftheelementsoftheenumeratedtypeErrorCode(below).However,externalclientsneveractuallyseetheErrorCodes,onlytheATOMs;theinclusionoftheErrorCodedefinitioninthisinterfaceisstrictlyfordocumentation.(Itispossiblethatnewcodevalueswillbeinventedbytheimplementationbutnotreflectedinthisinterface.Clientsshouldalwaysbepreparedtohandleerrorsingroupsenvironmentanduserevenwhentheexactcodeisnotrecognized.)Error:ERROR[error:ErrorDesc]=FS.Error;p ^ r [P!$)l,#.479q;[AC L K  m%-'X -/3f6K:>AD K x~b $'  Hp]()Q %(Z-p29i<@5B F @ Z ;' )+ 5!8$:k>BE ES0, W"%5+_- q Bs@]q@]@]sb@] %B -F 5B>a= q==s=;fq;f;fs;f9qA9&9s9i %6J =: B8W$_-1b8B6p4q*44st4q4v4s443!q3!3!s 3!qp3!D3!s3!3! /q/d/// sO/q , )5s)5q )5)5s~)5cq)5)5s)5p $?]r  hq ]!'//4?5; CE HX f%(K+0s2 9L;O C  jT!!%v()2r,o3 7.=-?DG  {n F%'h 2h8v;p< r>E R?k- #Q%'u* 269>?CjG;  Kw #'+.y24U8 ;>>? 0  l6r="#q%0&V0r(0)0,0O4 58\;=jADRG  W"b X" *Z-u4Z9?EJ   #'q%&~r)%)*-O3O5,7> EF :y2 "$&,/ v27:2:r5:9<?DG/  BS" (-416 7=?mCG vs  r! v  r "%(+-S/ y v- x+  v  ! .TVm$R2Forsomereasonthecompilerdoesnotacceptthisdeclaration.YoumustwriteFS.Error,notAlpineFS.Error.ErrorDesc:TYPE=FS.ErrorDesc;--RECORD[group:ErrorGroup,code:ATOM,explanation:ROPE]_[ok,NIL,NIL];ErrorGroup:TYPE=FS.ErrorGroup;--{ok,bug,environment,lock,client,user};ErrorCode:PRIVATETYPE={BugsThesearenotdocumentedbecausetheyarenotintendedtobeinterpretedbyclients.Thecodeandexplanationmaybeusefultoahumandebugger,however.ClienterrorsbadByteCount,--triedtosetbytecountbeyondendoffileornegative.invalidOpenFile,--FS.OpenFileisclosed.notImplemented,--calledaprocedurethatisnotprovidedforthisFS.OpenFile.unknownPage,--triedtoreadorwriteapagethatisbeyondendofthefileortosetthepagecounttoanillegalvalue.unwritableProperty,--attemptedtowritethetypeorversionproperty.wrongLock,--operationrequiredfiletobeopenwithaccess=$writeandonly$readwasspecified.(Note:thishasnothingtodowiththeAlpineLockOption,whichisupgradedautomatically.)EnvironmenterrorsaccessDenied,--callerhasinsufficientpermissiontoperformrequestedoperation.badCredentials,--callernotloggedinproperly.circularLink,--creatingthislinkwouldcompleteacircularity.danglingLink,--referentoflinkdoesnotexist.lockConflict,--LockOption.ifConflict=$failandalockcannotimmediatelybesetbecauseaconflictinglockisalreadysetbyanothertransaction.lockTimeout,--lockcannotbesetevenafterwaitingalongtime,perhapsduetoundetecteddeadlock.other,--unspecifiedproblemdetectedbyserver.quotaExceeded,--attempttocreateorextendfilewouldexceedowner'squota.regServersUnavailable,--accesscheckfailedduetoGrapevineunavailability.remoteCallFailed,--communicationwithserverhasbrokendown.serverBusy,--serveristoobusytostartanothertransaction.serverInaccessible,--failedtoestablishcommunicationwithserver.transAborted,--transactioncreatedbythiscallwentaway.Itisnotusefultoattemptanyfurtheroperationsunderthesametransaction.volumeFull,--servervolumefull.LockerrorsThedistinctionbetweenenvironmentandlockerrorshasbeendeemednottobeuseful,particularlyintheAlpinecontext.Errorsthatmightfallinthisgroupinsteadappearintheenvironmentgroup.UsererrorscantUpdateTiogaFile,--triedtoopenafilestreamtowriteonaTioga-formatfile.fileAlreadyExists,--attemptedtocreateafilethatalreadyexists.illegalName,--filename,directoryname,orpatternhasillegalsyntaxorcharacters,oristoolong.noKeeps,--triedtosetthekeeponaserverthatdoesnotimplementkeeps.ownerNotFound,--ownernotregisteredontheAlpineserver.patternNotAllowed,--namecontaineda"*"andproceduredoesn'tallowpatterns.wHDg/v_,U # %),B 36~9=(CF]s Z6 qZ6Z6sZ6e v!|Z6!Z6x"Z6#Z6v(SZ6- 4x8QZ69Z6v;Z6Z6vGZ61Xx`X:BEL #%D&y*1KS sI vI I/!$(-/1M35ZsHvHH $ %vsF\vF\UF\R 3!h'*e+.4358X sD vXDD"$X'(,.0Y47{9;k=?xAC0E|SC !sAfvsAfAf$%)+k.Q0 4s? v?#? $Z&(S*#-a0] 9V;>BS>  `"%o*a,-0327 ?lCOSCS P !N%'i* s vOM.! Z n &8(+/2+5T: <>(? ' k%),0y247!:?CE dJsv"%#'(=*.0357 ?Nsv#2$(*,Z/,3sm vmm%){+4/2M6Y:CGPFuaxPFxPFvPF&PF"6$&~*.04 p KOr H7\!)%e' )6/r146@;>BE FY N G&O)H-u0y24;j@BE  D  d"$(-M138|9 B;D8 C  h3!W#%p ,06;?H@B @   !c ,-. 56;C= >!Q!&+ 2F47^<B /@ G - J*@b!% , -j2S45)8L9>hE+G/ + Uws q!="$(d,.- 4G6 >@Mp &r # @s!I#*-/ 8!; ADG !5C|< %(8 .0259z ?C0G Ks qseJvGW %{(+s qNs ] q]]sr]qW]+]s]qsqR s"}v#Z#$&*-/s2N3 s (n)v0$ 0 17#:?;?Be  I"(i*. 4 <sE'c(v,L,-04S sqs q"#Dv&;'+4-.3N6:=5 s m TVm$4Open:PROCEDURE[name:ROPE,wantedCreatedTime:BasicTime.GMT_BasicTime.nullGMT,access:Lock_$read,lock:AlpFile.LockOption_[$none,$wait],options:FileOptions_[],wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL]RETURNS[OpenFile];!environment:FS.Error[$accessDenied,$badCredentials,$danglingLink,$lockConflict,$lockTimeout,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted];!user:FS.Error[$illegalName,$noKeeps,$ownerNotFound,$patternNotAllowed,$unknownCreatedTime,$unknownFile,$unknownServer];OpensanexistingAlpinefileidentifiedbyname,wDir,andwantedCreatedTime.TheaccessparametertranslatestoanAlpFile.AccessRights($read=>$readOnly,$write=>$readWrite).ThelockparameteriswhatactuallycontrolsAlpinelocking.Ifitisdefaulted,alockiscomputedfromtheaccessparameter($read=>[$read,wait],$write=>[$write,wait]).Thevalueoflock.ifConflictalsodeterminesthedispositionoflockconflictsthatoccurduringanysubsequentoperationontheOpenFile.SeetheAlpinedocumentationfordetailsonlocking.IftransHandle#NIL,thefileisopenedunderthespecifiedtransaction.IftransHandle=NIL,anewtransactioniscreatedwhosecoordinatoristheserverbeingaccessed.Theclientisrequiredtobeamemberoftheaccesscontrollistimpliedbyaccess(readAccessormodifyAccess);and,ifaccess=read,theclientisrestrictedtoread-onlyoperationsontheOpenFile.Create:PROCEDURE[name:ROPE,pages:INT_10,keep:CARDINAL_0,options:FileOptions_[],wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL]RETURNS[OpenFile];!environment:FS.Error[$accessDenied,$badCredentials,$lockConflict,$lockTimeout,$quotaExceeded,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted,$volumeFull];!user:FS.Error[$fileAlreadyExists,$illegalName,$noKeeps,$ownerNotFound,$patternNotAllowed,$unknownServer];CreatesandopensanewAlpinefileidentifiedbynameandwDir.Iftheversionnumberismissing,itdefaultsto!H+1.Locksthefilein$writemodewithaccess=$write.Setsthefile'sinitialsizetopages.Ifkeep#0,thefile'skeepissettothespecifiedvalue.Ifkeep=0,thekeepissettothatofthe!Hversionifoneexistsandtothedefaultintheownerdatabaseifnot.Aspartofkeepprocessing,oldversionsofthefilearedeletedasnecessary.IftransHandle#NIL,thefileiscreatedunderthespecifiedtransaction.IftransHandle=NIL,anewtransactioniscreatedwhosecoordinatoristheserverbeingaccessed.Thespaceforthefileischargedagainsttheownerwhosenameappearsintherootdirectorypartofthefilename.Theclientisrequiredtobeamemberoftheowner'screateaccesscontrollist,andtheallocationmustnotexceedtheowner'squota.OtherAlpinefilepropertiesaresettodefaultvalues.OpenOrCreate:PROCEDURE[name:ROPE,pages:INT_10,keep:CARDINAL_0,options:FileOptions_[],wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL]RETURNS[OpenFile];!environment:FS.Error[$accessDenied,$badCredentials,$danglingLink,$lockConflict,$lockTimeout,$quotaExceeded,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted,$volumeFull];!user:FS.Error[$illegalName,$noKeeps,$ownerNotFound,$patternNotAllowed,$unknownServer];CallsOpenwiththecorrespondingly-namedarguments,access:$write,andallothersdefaulted.IfFS.Error[$unknownFile]israised,callsCreatewiththecorrespondingly-namedarguments.wHDg/u _,s._,q+_,_,s_,q_,T_,s_, n_,-r 79k1]5#W/1l6J:@ G1[q[[sk[q[[s[[ (6vq8[8[s:[q:[;[sA[ vZ5- U&70f 9 X &E1 9VU>- '32"SI &kQ4'7 %'+/T1>jA-PF; J+/2j 9Q=`? N%#) -_245h6 <>+A%BLky#%*-14k9@=o@2CKO~ !4# *&+.46:>As IO!$1( 1379G x,GGvFG#Go!/%)+1C 8:" xBGCGvDGEGFX  " )+E-1s5D0$&(,138:_>m EC o $'*, 139 @AAau >s>q>>s>q;>>s M>!)>q%m>%>s'>)+q/>0]>s6M>79g> FIG124"h2zUO!# )+/U157F9>&C 0il $')q+/&25 ? ADE/+s-7Q!e# %U*.0558;M<>@qCCDG3+vZe!&/'*!.1!4%5{87:==>A *4)B2#c% ( x,((vF(#(o!/%)+1c 8:C xB(C(vD(E(&  " )+E-1s5%<q9!&\(,04>9':=?E#%! &B')*0138<@Ej!  U$ &l+B/]3@79 @BfDy F`u  sqcstq""s%!%q*B*s,._0q4g52s;"<><1N Hq N!Ns$Nq&N&Ns(N(N 13?qANBNsC%Nq1s< v- U&70f 9 W " 0<'  # - '32"`-)u(` /B380:<@ F4#x&*-06>!  KTVm$5OperationsonopenfilesFollowingarethegenericoperationsdefinedinFSthatarealsoapplicabletoanFS.OpenFilecreatedbyAlpineFS.ThesemanticsarethesameasthosedocumentedinFSexceptasnoted.GetClass:PROC[file:OpenFile]RETURNS[ATOM];!client:FS.Error[$invalidOpenFile,$notImplemented];Alwaysreturns$AlpineFS.SameFile:PROC[file1,file2:OpenFile]RETURNS[BOOLEAN];!client:FS.Error[$invalidOpenFile,$notImplemented];TwoFS.OpenFilesobtainedfromanAlpineFSprocedurearethesameiftheyrefertothesameAlpFile.UniversalFile.GetName:PROC[file:OpenFile]RETURNS[fullFName,attachedTo:ROPE];!client:FS.Error[$invalidOpenFile,$notImplemented];IffullFNameisalinkthenattachedToisthefullFNameoftheactualfilereachedbyindirectingthroughlinkstoasmanylevelsasnecessary;otherwiseattachedToisNIL.GetInfo:PROC[file:OpenFile]RETURNS[keep:CARDINAL,pages,bytes:INT,created:BasicTime.GMT,lock:Lock];!client:FS.Error[$invalidOpenFile,$notImplemented];!environment:FS.Error[$lockConflict,$lockTimeout,$remoteCallFailed,$transAborted];SinceAlpinelocksaremorecomplicatedthanFSlocks,itisnotusefultotrytodescribetheAlpinelockasanFSlock;instead,theaccessargumenttoOpenisreturned.NotethatingeneralGetInfomustaccessthefile(i.e.,communicatewiththeAlpineserver)inordertoobtainsomeofthisinformation.SetPageCount:PROC[file:OpenFile,pages:INT];!client:FS.Error[$invalidOpenFile,$notImplemented,$unknownPage,$wrongLock];!environment:FS.Error[$lockConflict,$lockTimeout,$quotaExceeded,$remoteCallFailed,$transAborted,$volumeFull];SetByteCountAndCreatedTime:PROC[file:OpenFile,bytes:INT_-1,created:BasicTime.GMT_BasicTime.nullGMT];!client:FS.Error[$badByteCount,$invalidOpenFile,$notImplemented,$wrongLock];!environment:FS.Error[$lockConflict,$lockTimeout,$remoteCallFailed,$transAborted];Read:UNSAFEPROC[file:OpenFile,from,nPages:INT,to:LONGPOINTER];!client:FS.Error[$invalidOpenFile,$notImplemented,$unknownPage];!environment:FS.Error[$lockConflict,$lockTimeout,$remoteCallFailed,$transAborted];Write:PROC[file:OpenFile,to,nPages:INT,from:LONGPOINTER];!client:FS.Error[$invalidOpenFile,$notImplemented,$unknownPage,$wrongLock];!environment:FS.Error[$lockConflict,$lockTimeout,$remoteCallFailed,$transAborted];Close:PROC[file:OpenFile];!client:FS.Error[$invalidOpenFile,$notImplemented];!environment:FS.Error[$lockConflict,$lockTimeout,$remoteCallFailed,$transAborted];Ifoption.finishTransOnClosewasTRUEintheprocedurethatreturnedtheFS.OpenFile,Closecommitsthetransaction;asaside-effect,alllocksassociatedwiththefilearereleased.Otherwise,thetransactionisnotterminatedandthelocksremaininforce;itistheclient'sresponsibilitytowHDg/p ^ fr [V0 &'*,/N2, 8:< D Y sK 3#%_( 0249:y VvTVxRV VvV=xV UVv%Vx%V&Vv)hV)VU -V#SaL y PvPxPBPv9Px#P$Pv)Px*hC7C3-$w&*02|67=@@Ce5 "M$' /259o=?pBD3K y 0 v0x0;0v10m"x&0'N0v(0)R0.-V#. 8 -W- U% .8+  y (avW(axU(a (av#(a&@,wx0Z(a0(av2(a4]6c; E &%-V"-8 #j- U% .:y v x  * v "M%x+ + v- - x0 0 3 v9 9 t-V#. - U% .:y ~vd~xb~~v~Mx$~%!~v&~'~x+J~, ~/~v4I~4~-V#. 8 /- U% .:y vCxAv, 9-V#- U% .: x"R # v% ')028G: B B4  ')- 3X6T8:=HB  - ' "%P'+/1L5#6z7:2> F TVm$#6dealwiththetransaction.IfanFS.ErrorisraisedfromClose,theOpenFileisneverthelessclosed,thoughitispossiblethatnotallcleanupactionsweresuccessfullycarriedout.FollowingarespecialoperationsapplicabletoanFS.OpenFilecreatedbyAlpineFS.GetFileOptions:PROCEDURE[file:OpenFile]RETURNS[options:FileOptions];!client:FS.Error[$invalidOpenFile,$notImplemented];ReturnstheFileOptionscurrentlyineffectforthisOpenFile.SetFileOptions:PROCEDURE[file:OpenFile,options:FileOptions];!client:FS.Error[$invalidOpenFile,$notImplemented];!environment:FS.Error[$remoteCallFailed,$transAborted];ChangestheFileOptionsineffectforthisOpenFile,exceptthattheupdateCreateTimeandrecoveryOptioncannotbechangedfromthevaluesusedatOpentime(attemptstodosoareignored).GetLockOption:PROCEDURE[file:OpenFile]RETURNS[lock:AlpFile.LockOption];!client:FS.Error[$invalidOpenFile,$notImplemented];!environment:FS.Error[$remoteCallFailed,$transAborted];ReturnstheLockOptioncurrentlyineffectforthisOpenFile.Thismayreturnalockmodestrongerthantheonewithwhichthefilewasoriginallyopenedifoperationshavebeenperformedthatupgradethelock.SetLockOption:PROCEDURE[file:OpenFile,lock:AlpFile.LockOption];!client:FS.Error[$invalidOpenFile,$notImplemented];!environment:FS.Error[$lockConflict,$lockTimeout,$remoteCallFailed,$transAborted];ChangestheLockOptionineffectforthisOpenFile.Thisactuallychangesthefilelock,soitmaywaitorfailaccordingtolock.ifConflict.Filelocksmayonlybeupgradedbythismeans;attemptstodowngradealockareignored.ReadProperties:PROCEDURE[file:OpenFile,desiredProperties:AlpFile.PropertySet_AlpFile.allProperties]RETURNS[properties:LISTOFAlpFile.PropertyValuePair];!client:FS.Error[$invalidOpenFile,$notImplemented];!environment:FS.Error[$lockConflict,$lockTimeout,$remoteCallFailed,$transAborted];ReadsthepropertiesspecifiedbydesiredProperties,orderedasinthedeclarationofAlpineEnvironment.Property.SeetheAlpinedocumentationforcompleteinformation.WriteProperties:PROCEDURE[file:OpenFile,properties:LISTOFAlpFile.PropertyValuePair];!client:FS.Error[$invalidOpenFile,$notImplemented,$unwritableProperty,$wrongLock];!environment:FS.Error[$lockConflict,$lockTimeout,$regServersUnavailable,$remoteCallFailed,$transAborted];Writesthesuppliedproperties.SeetheAlpinedocumentationforcompleteinformation.WritingthepropertiescreateTime,owner,andstringNamebythismeansisnotrecommendedbecauseitmaysubverttheoperationofAlpineFSorAlpineDirectory.Abort:PROCEDURE[file:OpenFile];!client:FS.Error[$invalidOpenFile,$notImplemented];!environment:FS.Error[$remoteCallFailed];PerformsthesameactionsasClose,exceptthetransactionisabortedratherthancommitted.ThiseffectivelyundoesallupdatestothisOpenFile(aswellastoanyotherOpenFileaccessedunderthesametransaction.)wHDg/v_, ^!'),0:4G6@9BCHu E sVEqTEEs E!Rq'E(Es-E1vC-V#B1- U(@k "$W'*",268=>:A3>="%B'*7 0A46! <?B=:!u 9 s9q99s9!'+v8A-V#6- U% .:4 g "$'p-05:=6?BDE3J&)-"034:<?"C1Avpu .R s.Rq.R.Rs.R!'2?#1,q^, 2,s%j, q,,-w,/,s1,v+-V#)[- U% .:'\ !,1a347 >&  g"%J) 24:q u "sw"qt""s-"!s' q."/"1"s3"v!-V#.;n k- U% .=j q#%T) 24:| B&G4t  Z #O *,m/3.46 ?mDdEg#r%+u |sZ|qW||s|V v-V#,- U###(%*q 1k27;> E % "&$*,/1V259>DM 5-  TVm$7GetAlpFileHandle:PROCEDURE[file:OpenFile]RETURNS[handle:AlpFile.Handle];!client:FS.Error[$invalidOpenFile,$notImplemented];ReturnstheAlpFile.HandleforthisOpenFile.Thisenablesthecallertoinvokelower-levelAlpFileandotheroperationsnotdirectlyavailablethroughAlpineFS.Thisfacilityisintendedforuseonlybyknowledgableclients,asindiscriminateusemaysubverttheoperationofAlpineFSorAlpineDirectory.FilestreamsTheseproceduresreturnahandleforthe$AlpineFSclassofIO.STREAM.TheoperationsthatmaybeinvokedonsuchahandleareallthegenericstreamoperationsinIOplussomeadditionalonesuniquetoAlpineFS;allaredescribedbelow.STREAM:TYPE=IO.STREAM;AccessOptions:TYPE=FS.AccessOptions;--{read,create,append,write}ByteCount:TYPE=FS.ByteCount;StreamBufferParms:TYPE=FS.StreamBufferParms;--RECORD[vmPagesPerBuffer:INT[1..128],nBuffers:INT[1..4]]defaultStreamBufferParms:StreamBufferParms=FS.defaultStreamBufferParms;--[16,2]StreamOptions:TYPE=RECORD[Thefirstthreehavethesamesemanticsasthecorrespondingly-namedoptionsinFS.tiogaRead:BOOLEAN_TRUE,--ifaccessOptions=$readandfileisinTiogaformat,readonlyplaintextportionofthefile(ignore"looks"andnodeswiththecommentproperty).IfaccessOptions#$readandfileisinTiogaformat,raiseFS.Error[$cantUpdateTiogaFile].truncatePagesOnClose:BOOLEAN_TRUE,--theIO.Closecallcausesextrapagesofthefiletobefreed.closeFSOpenFileOnClose:BOOLEAN_TRUE,--theIO.ClosecallperformsFS.CloseontheunderlyingFS.OpenFile.TheremainingoperationsarespecializedtoAlpineFSstreams.commitAndReopenTransOnFlush:BOOLEAN_TRUE,--eachIO.Flushcall"checkpoints"thetransactionbeingusedbythestream.finishTransOnClose:BOOLEAN_TRUE,--theIO.Closecallcausesthetransactiontobecommittedoraborted,accordingtotheabortparametertoIO.Close.abortTransOnFinalize:BOOLEAN_TRUE--ifthestreamisabandoned(finalizedwithoutIO.Closehavingbeencalled)andfinishTransOnClose=TRUE,thisoptiondetermineshowthetransactionistobefinished.Ordinarilyonewantsabandonedtransactionstobeaborted,butfordebuggingitmaybeusefultocommitthemanyway.];ExtendFileProc:TYPE=FS.ExtendFileProc;--PROC[ByteCount]RETURNS[ByteCount]StreamOpen:PROCEDURE[name:ROPE,accessOptions:AccessOptions_$read,streamOptions:StreamOptions_[],keep:CARDINAL_1,createByteCount:ByteCount_2560,streamBufferParms:StreamBufferParms_defaultStreamBufferParms,extendFileProc:ExtendFileProc_NIL,wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL]RETURNS[STREAM];wHDg/u _,s_,q_,r_,s_,"q)J_,*_,s/U_,4v]-V#[k !#),1379L= DMZ6 "(T-c36;T<B+DRX  "[ +-n0^47J=A>DVp Q Hr N &nP!$+.d05q2%N2Nr6N7N: ADG L2<r+w %* 0247;7 AD KS H8q HsHqH~Hs7Hq HHsH D qDSDs Dv&D' D( ,0h5_s Af q\AfAfsAf >q>W>s>v,>->x.>.>v3r>x?>@%>vB?>1Es4+ q4+4+s?4+q4+4+s!4+v"4+#N4+$L%25o79/:>CkFoS2!/"%'s,137l:h<By S0% '*+n-05S/5s-qc--s$-q&-&-s)@-v*-*-+-361:a=ACDEGS+#s*>q h*>!!*>s&*>q(*>(*>s+E*>v,"*>,*>-/586=CES(  &/  &(R.]s%Hq%^%H&%Hs+%Hq-%H-%Hs0;%Hv1%H1%H25;~> FS# L #%(%s!q!!s#!q$!%U!s'!v(!)!*,g2"48;4 B.CS R#)+-1`79_sq+s$Oq%&v)+,Y.34o;. AS m#'*x78Cv:;>"BI S\,x "q#%'Q, 3<59@X GS#P!(I),.`2O38<%s  q4sv'(@x)>)v, x45Vv: u o sqoqooos(oq o!os#o$o - 78< 1 #q"#\s)L*,f7C>)?1 *,C<1 y q{ yc ys y c yq$e y%8 ys' yq) y*o ys+ y,o y 4CqD yE{ ysF yq1 s< q ? sj   *TVm$8!client:FS.Error[$badByteCount];!environment:FS.Error[$accessDenied,$badCredentials,$danglingLink,$lockConflict,$lockTimeout,$quotaExceeded,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted,$volumeFull];!user:FS.Error[$cantUpdateTiogaFile,$fileAlreadyExists,$illegalName,$ownerNotFound,$patternNotAllowed,$unknownFile,$unknownServer];SimilartoFS.StreamOpen;consultitfordocumentation.Additionally,iftransHandle#NIL,thefileisopenedunderthespecifiedtransaction.IftransHandle=NIL,anewtransactioniscreatedwhosecoordinatoristheserverbeingaccessed.NotalloptionsofAlpineFS.OpenareaccessibleviaStreamOpen(e.g.,someoftheFileOptions);ifyouneedtosetsometonon-defaultvalues,callOpendirectlyfollowedbyStreamFromOpenFile.TheFileOptionsusedare[updateCreateTime:TRUE,referencePattern:$sequential,recoveryOption:$log,finishTransOnClose:streamOptions.finishTransOnClose].TheLockOptionusedis[$read,$wait]ifaccessOptions=$readand[$write,$wait]otherwise.InitialPosition:TYPE=FS.InitialPosition;--{start,end}StreamFromOpenFile:PROCEDURE[openFile:OpenFile,accessRights:Lock_$read,initialPosition:InitialPosition_$start,streamOptions:StreamOptions_[],streamBufferParms:StreamBufferParms_defaultStreamBufferParms,extendFileProc:ExtendFileProc_NIL]RETURNS[STREAM];!client:FS.Error[$notImplemented,$wrongLock];!environment:FS.Error[$lockConflict,$lockTimeout,$remoteCallFailed,$transAborted];!user:FS.Error[$cantUpdateTiogaFile];SimilartoFS.StreamFromOpenFile;consultitfordocumentation.Additionally,changestheFileOptions.finishTransOnClosefortheOpenFiletothecorrespondingvalueinstreamOptions.OpenFileFromStream:PROCEDURE[self:STREAM]RETURNS[OpenFile];!IO.Error[$NotImplementedForThisStream];IdenticaltoFS.OpenFileFromStream.StreamFromOpenStream:PROCEDURE[self:STREAM]RETURNS[STREAM];!client:FS.Error[$notImplemented];IdenticaltoFS.StreamFromOpenStream.NotethatthismodifiesthesemanticsofClose:theunderlyingfileisclosed(andtransactionfinishedifappropriate)onlywhenbothstreamshavebeenclosed.ErrorFromStream:PROCEDURE[self:STREAM]RETURNS[ErrorDesc];!IO.Error[$NotImplementedForThisStream];IdenticaltoFS.ErrorFromStream.FollowingarethegenericoperationsdefinedinIOthatarealsoapplicabletoaSTREAMcreatedbyAlpineFS.ThesemanticsarethesameasthosedocumentedinIOexceptasnoted.GetChar:PROC[self:STREAM]RETURNS[CHAR];!IO.EndOfStream,IO.Error[$StreamClosed,$Failure];CharsAvail:PROC[self:STREAM,wait:BOOL]RETURNS[INT];!IO.Error[$StreamClosed];EndOf:PROC[self:STREAM]RETURNS[BOOL];!IO.Error[$StreamClosed];wHDg/v_,-V]- U&70f 9 [ " 0<' Z6 # X-& 1 : Vh $U? #$' 0o 8k9 xBQU?C-U?vDlU?EHU?S5+F" *+ x4$S5Sv6?S7S8P; BCzQ p!%@PHm "$ +-7 5 8\;=j? GNxFYh $(+/,39C;L Ux*nL+'Lv-L.mL8 KR(">0@ I^<*f- 15 s F\qKF\F\sF\v%F\&pF\'m+u C sC qC C s!C (B. 7:<@B1Ae *G 35:61?X0:} D:qE?F?sG?q1>s<>q>?>sj>>v) u 2s2q22s!2q%2%2s)2q*2+2s02 v0-'/1^u +s+q++s#+q'+'+s++q,+-+s2+q3"+3+s7+8P+v*:-V(^&*H-/57M=h? C:& KM j 'c,g- 5T8P;>C%D u !s!q!E!sV!q"!#\!s'!q(o!)C!s.z! v M-'^r * !t&({*-0>37 9;q="*=*rB*G xP8!#c' .0268y 3v3x33v3x33v3x33v$3x%O3&3v(3) 3-')l y < v<x}<6<v-<x<:<v\< 8<x#<$c<v&<x'<(<v-<x.><.<v0O<0<-y Ev Ex E Ev Ex E Ev Ex Ex Ev# Ex$ E$ Ev'X E' E - TVm$9PutChar:PROC[self:STREAM,char:CHAR];!IO.Error[$NotImplementedForThisStream,$StreamClosed,$Failure];Flush:PROC[self:STREAM];!IO.Error[$NotImplementedForThisStream,$StreamClosed,$Failure];IfstreamOptions.commitAndReopenTransOnFlush,thetransactionischeckpointed(i.e.,committedandcontinued).Reset:PROC[self:STREAM];!IO.Error[$StreamClosed,$Failure];Close:PROC[self:STREAM,abort:BOOL_FALSE];!IO.Error[$StreamClosed,$Failure];IfstreamOptions.closeFSOpenFileOnClose=TRUEthenalsoclosestheunderlyingFS.OpenFile.IfstreamOptions.finishTransOnClose,closingthefileinturneithercommitsthetransactionifabort=FALSEorabortsitifabort=TRUE.Nochangeismadeinthestateofthetransactionifthefileisnotclosed.IfanFS.ErrorisraisedfromClose,thestreamandunderlyingOpenFileareneverthelessclosed,thoughitispossiblethatnotallcleanupactionsweresuccessfullycarriedout.GetIndex:PROC[self:STREAM]RETURNS[INT];!IO.Error[$StreamClosed];SetIndex:PROC[self:STREAM,index:INT];!IO.EndOfStream,IO.Error[$StreamClosed,$Failure,$BadIndex];GetLength:PROC[self:STREAM]RETURNS[INT];!IO.Error[$StreamClosed];SetLength:PROC[self:STREAM,length:INT];!IO.Error[$StreamClosed,$Failure,$BadIndex];GeneralfilemanipulationTheseproceduresaresimilar,butnotidentical,tothecorrespondingly-namedproceduresinFS.EachtakesatransHandleargument.IftransHandle#NIL,theoperationisperformedunderthespecifiedtransaction.IftransHandle=NIL,anewtransactioniscreatedatthebeginningoftheoperationandfinishedattheend.Thiswillnotbementionedinthedescriptionsoftheindividualprocedures.FileInfo:PROCEDURE[name:ROPE,wantedCreatedTime:BasicTime.GMT_BasicTime.nullGMT,wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL]RETURNS[fullFName,attachedTo:ROPE,keep:CARDINAL,bytes:INT,created:BasicTime.GMT];!environment:FS.Error[$accessDenied,$badCredentials,$danglingLink,$lockConflict,$lockTimeout,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted];!user:FS.Error[$illegalName,$ownerNotFound,$patternNotAllowed,$unknownCreatedTime,$unknownFile,$unknownServer];ThefullFNameincludingversionpartisreturnedasfullFName.Thefile'skeepisreturnediftheserverimplementskeeps;zeroisreturnedotherwise.IffullFNameisalinkthenattachedToisthefullFNameoftheactualfilereachedbyindirectingthroughlinksasmanytimesasisnecessary;otherwiseattachedToisNIL.wHDg/y _*v_*x_*_*v_*x_*_*v_*_*x"J_*#_*v%_*&_*]-&( 2 y Z4vCZ4xAZ4Z4vZ4xMZ4Z4v Z4Z4X-&( 2 V*,. 57_ ?uByU> y QvNQxLQQvQxXQ Qv+QQPG-r y LvCLxALLvLxMLLvLLx L!Lv$Lx&.L&Lv)L*MLKQ-r I%x(I)WIv,EI/O258> > G0H!$(*-9.15:=A D:F[xHF[F[v}F[5Dx$XF[%F[v'{F[(WF[*/604758);]=?M FFD-Q9,$&^*I-138>: AC 5 !"$D)C,.y0t5m:=) D^Aey >v>x>L>vB>x>P>vq>xd> />v%c>x%>&M>v'>(P>>hv - U&70f 9 c &E1 9- +8:m H"%o&,9- 57;>7?EFW  "\'  wd %'J), 0248;6@-B  E :!#^ )/ 6x8$ 9 v:? TVm$10InfoProc:TYPE=FS.InfoProc;--PROC[fullFName,attachedTo:ROPE,created:BasicTime.GMT,bytes:INT,keep:CARDINAL]RETURNS[continue:BOOLEAN];EnumerateForInfo:PROCEDURE[pattern:ROPE,proc:InfoProc,wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL];!environment:FS.Error[$badCredentials,$lockConflict,$lockTimeout,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted];!user:FS.Error[$illegalName,$ownerNotFound,$unknownFile,$unknownServer];ProciscalledforeachFNameselectedbythepattern.Returningcontinue=FALSEstopstheenumeration.ThefullFName,attachedTo,created,bytes,andkeepvaluesarereturnedasinFileInfo.IfanyFS.Errors(except$remoteCallFailedor$transAborted)areencounteredwhiletryingtoreadthefileproperties,theyaresuppressedandbytesisreportedas-1.NameProc:TYPE=FS.NameProc;--PROC[fullFName:ROPE]RETURNS[continue:BOOLEAN];EnumerateForNames:PROCEDURE[pattern:ROPE,proc:NameProc,wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL];!environment:FS.Error[$badCredentials,$lockConflict,$lockTimeout,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted];!user:FS.Error[$illegalName,$ownerNotFound,$unknownFile,$unknownServer];Becauseonlynamesareprovidedtoproc,thefilesdonotactuallyneedtobeopened.Consequently,thisenumerationcangosubstantiallyfasterthanthepreviousone;alsotherearefeweropportunitiesforlockconflicts.Delete:PROCEDURE[name:ROPE,wantedCreatedTime:BasicTime.GMT_BasicTime.nullGMT,wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL];!environment:FS.Error[$accessDenied,$badCredentials,$danglingLink,$lockConflict,$lockTimeout,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted];!user:FS.Error[$illegalName,$ownerNotFound,$patternNotAllowed,$unknownCreatedTime,$unknownFile,$unknownServer];Ifnameisnotalink,deletesthefileidentifiedbynameandwantedCreatedTime.Iftheversionpartisomitteditdefaultsto!L.Theclientmustbeamemberofthemodifyaccesscontrollistforthefile.Ifnameisalinkthensimplydeletesthelink;thefileisnotaffected.Copy:PROCEDURE[from,to:ROPE,wantedCreatedTime:BasicTime.GMT_BasicTime.nullGMT,wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL]RETURNS[toFName:ROPE];!environment:FS.Error[$accessDenied,$badCredentials,$danglingLink,$lockConflict,$lockTimeout,$quotaExceeded,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted,$volumeFull];!user:FS.Error[$illegalName,$ownerNotFound,$patternNotAllowed,$unknownCreatedTime,$unknownFile,$unknownServer];CopiesthecontentsofthefileidentifiedbyfromandwantedCreatedTimetothefileidentifiedbyto.AlsocopiesthebyteLengthandcreateTime;otherfilepropertiesaresettodefaultvaluesasdescribedunderCreate.Theversionpartofthetofilenamedefaultsto!H+1(i.e.,anewfile);butifitisspecifiedexplicitlyandcorrespondstoanexistingfilethenthefileisoverwritten.Theclientmustbeamemberofthecreateaccesscontrollistfortheownerdesignatedinthetofilename,andtheallocationmustnotexceedtheowner'squota.Rename:PROCEDURE[from,to:ROPE,wantedCreatedTime:BasicTime.GMT_BasicTime.nullGMT,wG~g/u _,s2_,q0_,_,s_, v_, /_,x!-_,!_,v$_, ,j x3_,4_,v7_,7_,= 1]x]]v%]]x]w]v"]x#]$]v)] x0]0]v5]65]u Z6sZ6qZ6Z6sZ6q%=Z6&Z6s(OZ6)+Z6,2q6Z67Z6s:jZ6q;Z6Z6>Z6 1X q"X#Xs$#X$XvV- U'5 / 8U@q "5.S- + 4QJ %').53x;Q<7Qv?QCPI  (7-9036:=2BDINt#.0 9< CLv{ "%' .}1 45;:<u IsGIqDIIsI v!I"[Ix#YI$Iv'I x.I/Iv1Ix2I3Iv8I x?*I?IvDIE@Iu F]sF]qF]5F]s!FF]q&F]'F]s)F]*F].n5q9F]:cF]s=%F]q>F]?F]s@F]1D m(q*TD+HCl"##'$)p,I..058:w@mB*?&W["j%-(,(-/,4G586<@EL( U&@$S&),4./2Xu #s#q##s#q##s!#!#. q5t#6b#s8#:>1!q3!!s!qU!=!s`!=! &y4q6`!7I!s8l!q9S!:'!s?_!q1 RsB R Rv- U&70f 9  " 0<' \ # - +8: fs  O &1( +I-:;=@L F-F !U# +g.1< 7h9;=tAF7$'h) +X,/Q279=@B0DpC\ #B *,3.&3558:=5> E!%).025;94 ?AlCE]! !Q#(*h/>u s q j s{ q s" # 0 q77 8& s:t < TVm$;11wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL]RETURNS[toFName:ROPE];!environment:FS.Error[$accessDenied,$badCredentials,$danglingLink,$lockConflict,$lockTimeout,$quotaExceeded,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted,$volumeFull];!user:FS.Error[$illegalName,$ownerNotFound,$patternNotAllowed,$unknownCreatedTime,$unknownFile,$unknownServer];SemanticsareidenticaltoCopywiththesameargumentsfollowedbyDeleteofthefromfile;butifthefromandtofilenamesdesignatethesameserver,theoperationisperformedmuchmoreefficiently.(Iffromisalinkandtodesignatesthesameserver,theactionactuallyperformedisthatalinkiscreatedfromthetonametothereferentofthelinkandthenthefromnameisdeleted.)SetKeep:PROCEDURE[name:ROPE,keep:CARDINAL_1,wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL];!environment:FS.Error[$accessDenied,$badCredentials,$danglingLink,$lockConflict,$lockTimeout,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted];!user:FS.Error[$illegalName,$noKeeps,$ownerNotFound,$patternNotAllowed,$unknownCreatedTime,$unknownFile,$unknownServer];Theversionnumberpart,ifpresent,isignored.Setsthefile'skeeptothespecifiedvalue.Thendeletesanyfilesthatbecomeobsoleteasaresultofthenewkeep;anyerrorsthatoccurasaresultofattemptingtodothisaresuppressed.Settingthekeepto0leavesthekeepunchanged,butdoesthekeepprocessinganyway.CreateLink:PROCEDURE[name:ROPE,referent:ROPE,wDir:ROPE_NIL,transHandle:AlpTransaction.Handle_NIL]RETURNS[fullFName,referentName:ROPE];!environment:FS.Error[$accessDenied,$badCredentials,$circularLink,$lockConflict,$lockTimeout,$regServersUnavailable,$remoteCallFailed,$serverBusy,$serverInaccessible,$transAborted];!user:FS.Error[$illegalName,$ownerNotFound,$patternNotAllowed,$unknownServer];Createsalinkfromnametoreferent;i.e.,establishthemappingname->referentinthedirectory.Subsequently,whenevernameislookedupinthedirectory,thelinkwillbefollowedtoasmanylevelsasnecessaryuntilanactualfileisreached;andthatfilewillbetheoneaccessed.Theserverpartsofnameandreferentmustbethesame.Theversionpartofnamedefaultsto!H+1.Iftheversionpartofreferentisaversionvariableorisabsent,theversiontobeusedwillberedeterminedeachtimethelinkisfollowed.ThereturnedfullFNameisthecanonicalfullFNamecorrespondingtoname.ThereturnedreferentNameislikewisethecanonicalfullFNamecorrespondingtoreferentexceptthattheversionpartmaybeavaraibleorabsentaccordingtowhatwassuppliedinreferent.NocheckismadebyCreateLinktoensurethatthereferentofthelinkdesignatesanexistingfile.Ifasubsequentoperationisperformedonthelinkandthereferentcannotbefoundatthattime,FS.Error[$danglingLink]willberaised.END.wG~g/s1_,q3_,_,s_,qU_,=_,s`_,=_, &y4q6`_,7I_,s8l_,q9S_,:'_,s?__,q1]sB]]v[- U&70f 9 Z6 " 0<' X # V- +8:U@ SH!u$q&*'057<=@CAFQ7e ^ &g(,0W28:@_D PJ iqO "$g *-047 ;@3FN# !W"&(E*/103|6L8;>FAE(Lu IsIqIIsIqEIIs!VI"2Iq%I&Is,I.E/q3I4Is7iIq8I9Is;I;I 1H q"H#Hs$#H$HvF^- U&70f 9 D &E1 9CAh- '32"?I &k>fK}#%9*g-W/2679?fCH M%o'((],-026t9 <?CkE$:< !#k *]/ 1W46-7b;N=@ 9#CG >u 5 s5q5O5s`5q5 5s# 5#5q)5*c5s,5-}5q152S5s55q6575s8595 14- q"4-#4-s$#4-q% 4-%4-s+4- 2 q<4-<4-s?)4-?4-v2- U&70f 9A 0 &E1 9/7-- +8:+$2{$'z,/A48c:? @B *A f< "L&(*>, 2~47:0;ALBD(:0fY#i%'),/<24b68;=&Y$(C*,^0 27x:R;?D%K!m %z&(,13~49u;@UACF# !-#%i+-309;c=C! P!$* 239;PA_C U z"V%('t, .1349;?E*W/1 "C#(&*-D2?36.8 ?dAWFg_o of&*(*j-:/2)7$;=aA0BE "yq isi NTVm$T TIMESROMAN TIMESROMAN HELVETICA TIMESROMAN TIMESROMANLOGOLAUREL TIMESROMAN TIMESROMAN TIMESROMANY  s- {9 [F S _ ~lz d5^ E Y `Z ?( ;"m (X*19eAH Q [ Ne q { ,  $   j/26z&Thursday, January 19, 1984 1:11 pm PST