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î ìï[rî1ï[î¶qî(îï[rî3Cï[î8pî:­qî ìïW=rî1ïW=îðî_îîIqî(îïW=sî3CïW=î6]qî ìïSarî1ïSaî¶îñ î!î&\qî(îïSa rî3CïSasî7ÔïSaî8ÒïSatî{ïKÐqî ìïAíî ôsî¬ïAíð3qî ìï@Fsî¬ï@Fð*qî ìï>žî Vî¯sî¬ï>žîþî*îgî­î%Gqî ìï<#sî¬ï<#î´î îs î!ìî&, î,\î.î0uî5î7pîî@ñ îGáî ìï8Ô î[î� î�î% î,î7½î>î@­îErî ®ï4±îcîãîºî’îSî¬î î!Rî&î*Ëî-¢î.ëî1Iî3! î:î?öîCQîEæî ìï3 îî]î_îtî Oî#î&Sî)Pî-ûî4`î7Ö î?9îAîC¥îH#î ìï1b uî ìï.î y rî ®ï*ÄîÜî)î.î¢î î$¯ î*îî.î0,î4Æî9wîî> î¼ î#î&8î'Úî*-î.9î12î4@î6ëî9>î=Jî?§îDoîGî ìï'uî œîªîùî?î$Žî*5î0 î1Äî5O î;{î>€î@sîFhîHeî ìï%Îî ÅîËîL îî Eî"œî'‰î*.î.? î6î:šî?îAÔîDî ìï$'î$îËîNî]î ®ï!«îûî{îÞîSîMî!î"$î& î(¯î+åî-�î4lî8â î@\îB]îE´îHeî ìï î óî –îÙî±î î ¬î#Ûî%Rî'�î(åî,òî.âî1ºî3âî8î=}î@Î î ìï] îvî8îîî.îðî e î'kî)$î-’î2Oî4–î7î9î;„î@cîDèîF î ìïµî ­îòîî[îðîâî!îî#çî)•î,Uî0äî4Sî7î;î@©îB_îGËî ìïîîtî±îšî ®ï“î¤ îÂî î]îkî!�î$�î&�î*Æî,sî.Xî2Òî7*î:8î?�îCÉîF‹î ìïëî ‹îêî÷îÓîî³îÝî%®î'rî*wî-’uî ìïœî y rî ®ïMî‰îq î$îdî ‹î$î*î,žî.Qî2™î4Ûî9éî<ÆîAîGRî ìï¦ vî×ï¦îžï¦rî½ï¦înï¦î"%î%Yî*ë î4­î7Fî:î>â îEhîG/î ìï þîoî�îh îŽî!zî#«î(F î/ðî2¦î8ñî;†î=·îB‰îCÓî ìï W îùîÚî7 îËî Îî"ºî(Oî.î1 î6öî;Ýî=fî@eîEüÿÛTVm$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'î"Uïg'rî%rïg'qî&Dïg'rî*:ïg'qî*¾ïg'wîHDïg'rî ìï_'î3 îùîî~î!Ãî#‹î'.î(öî+f î2{î4…î7Lî9¯î>³îAdîGáî ìï]î tî3îêî–î„î îÙî"9î&s î,�î.5î0•î ®ï[î©îöîxî]îî Cî$ î+=î.î18î2ßî58î9jî<Ëî?îApîDšî ìïY]î‰îžîCî÷îÓî¤î$ î)9î,Îî0Çî4Rî7¼ î>î@_îDî ìïWµî AîºîRî1îîî!]î$£ î*Hî+ßî.Âî1Æî4 î;Üî=~îB}îDî ìïVîÇî‰îñîx î«î!â î(Ðî+‘î-H î39î8Wî=(îA·îF]î ìïTgî š îîÒîDî ®ïQëî•î6î­î(îaîTî!Óî$üî'kî+Eî.î2î4uî;(î@ÑîBXîCÓî ìïPDî Äî ÿî‹ î!2î%î(î)õvî,0ïPDî,ËïPDrî/»ïPDî5Ôî7'î:£î=Ûî?pîA¬ î ìïNœî ªî îÈî;îøîSî ç î)_î/@î8Áî<Ôî>‡î@|îBá î ìïLõîØîî#îÙî®î"fî&Vî,™î2Æî6Øî;î<óîA© îG;î ìïKNî©îWîÌî,îœîOî!î#hî'Iî+Ï î2Q î;6î=• îE î ìïI¦ îòî!î¶îpîúî– î%Ùî*Öî-Âî1Rî6 î8H î@) î ìïGÿî ¥îî9îòîRîØ î ®ïE„î·î¨î@îÞî9îœî †î%­î(î-éî2î8Ïî:xî=wî?îEîG/î ìïCÜîœ îgî ‚î&(î+¸î-ªî3Ôî6î;Jî=< îE`îGžî ìïB5î}îIîèîîkî!î#Nî(! î.Úî1èî3ä î; îC[î ìï@Žî ‰î~îšî'qîï@Žî¶ï@ŽrîWï@Žî †î"iî&áî)”î,^î2„î8î9zî>‚î@²îDî ìï>æî ¬î9î˜ î�î"# î(Mî* î00î3Jî5F î;8 îBvî ìï;—î �îÓ rî ®ï8Hî-îàîZî|î#}î&®î+î/È î6vî9{ î?Ò îFØî ìï6 îlîUîOî¸ î%pî(Öî-%î/Úî5 î=–î@W î ìï4ùîŽî²î‘ î¤ î&Ðî+«î/Zî1Ôî3%î5ìî8áî< îA^îCuîG“î ìï3Rî�î:îKî1î!â î(î)Þî-5î/Èî2êî5Oî;î>Iî@˜ î ìï1ªî °î¤î[î¯î$ îýî ®ï// îLî.îóîuî! î(0î+Jî8Mî;tîAîE¢î ìï-ˆ îVî,îêî!î|î Iî#î$öî(¨î*€î,þ î3žî7¿ î>¬îAîD î ìï+à îæî|îÄ îÖîŒîéî#³î%_î(£î,Ðî14î3‘î6Öî8mî;¦î==î ìï*9îMîžîÎî‘î+Qî-ûî:î¶îB&îE�î ìï(’î cî„î�îHî$Œî'±î)'î.hî1Wqî3ï(’î3ºï(’rî7‡ï(’î8šï(’qî;]ï(’î<ï(’rî?nï(’î@‚ï(’îC§îFî ìï&êî Úî¶î^ î0î›î$›î1áî4ÆîCºîG/î ìï%Cî iîkî/îÉîuî î íî$‚ î+÷î-°î0î ®ï"È î‰îî î!¾î#Çî&· î.î4î9Sî< îARîDšî ìï! î £îVî³îj îÇî"gî$ î%Jî(Èî*åî,žî/ î ®ï¥î<î¸ î$•î&[î(zî+® î3žî6 î:¨î>ÍîAéîCòîGàî ìïþî Äî îPîuî…î[ î">î#éî$ùî)‡î+¬î-ƒî2uî5�î8 î=–îBá î ìïVî )îfî ®ïÛ îeîî^î¸î íî&Úî+î-‘î1ïî5$î8Æî=%î@ÒîFEîGàî ìï3î÷î!îáîÏî8îð î$Ûî*î-Dî.òî1àî5• î ®ï¸ îûî  î"dî$· î,òî/¿î2‹î8hî=<îC.îE£îGÖî ìïîZîî1î7îaî ®ï•îbîœî(îßî î$!î&‰î(Ðqî*’ï•î+1ï•rî.þï•î0ï•qî2Ðï•î3Šï•rî6âï•î7ôï•î:Ëî=4îCÀîFTî ìïîî Tîî®îÔîÅîÊ î#¸î%°î( î/Þî5ìî8H î?­îBUîFÁî ìï Gî û îœ î¸î-î#…î'Èî)—î, î2Ðî59î9î<î>|îC¨vîEï GîEÏï GrîG/ï Gî ìï Ÿîîb îí î- î)î+Šî-tî1pî5Ûî8vî=î@îBdîFû ¥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'î"Uïg'rî%rïg'qî&Dïg'rî*:ïg'qî*¾ïg'wîHDïg'vî ìï_,î �îä rî ®ï[ÝîIî î~î"è î(þî*£î/oî1 î6„î;}î>òîA1 î ìïZ6î Sî²î”î îDîòî"Àî&î*Kî.î11î5Hî9Vî<| î ®ïW» îzî î&î"{î$åî+/î,…î18î3jî4¿î9Öî>‡îDYîGËî ìïVîqîêî„îå î Eî#aî&¾î)vî,õî0î2î4bî:lî<&îA¶ î ìïTlî ¥ î ®ïQñ î�îîžî"H î)#î*ýî7|î=Þî@jîFÁî ìïPIî~î³î¬ î³îqî¦î$8î&�î'¶î+î/+î3Dî9yî<Áî?+ îF2î ìïN¢î ‚î; î… îÔî"³î%Hî'Èî,.î-xî1¼î3Iî5‡î9 î?è î ìïLûî ¸îî{ î)î )î!Ø î*_î- î ®ïJ€îÈîî� î#Ïî&`î(Ñ î/�î2nî5òî7Æî;Úî=î?ŽîCÍîEî ìïHØî )î Sî™î² îŠîêî!«î$ î+_î.î0uî4ûvî ìïE‰î �îŒrî ®ïB:îpîPî7î t î( î."î4Áî6Lî;Ãî?_îCiîGÖî ìï@“ î îîÄî5î!¹î$¥î'Zî,²î.  î7î8Çî<8î>'qî@ï@“î@µï@“rîEcï@“îGžî ìï>ìîkî&îÖî~îÏî�î!ó î*Øî.î/ªî4Ïî7€î=î@” îG;î ìï=Dî�îbîøî·î( î#0î&qî(0î-5î/y î5ˆî8Pî;½î@wîBAîFØî ìï;�î Hîœuî ìï8Nî yîÎrî ®ï4ÿîgîƒ î�î-î"uî$Gî(¯î,�î.Òî4.î7¹î9úî=ôîCî ìï3Xî ìîNî>îü î"s î*î,(î.Üî3Íî6—î;%î>Rvî@Äï3XîA·ï3XîEwî ìï1°rî?ï1°î(îŽ î"Oî$nî'Í î/ î4âî7M î>ÏîAìîC½î ìï0 î½ î)îîÍî$Üî&�î*—î,?î/>î3[î5î7]î;cî<Éî@¤îB¤îDþî ìï.b îÏî}îAîÈ î%4î(Oî*®î ®ï+çî•î+î¶îQî-î - î'�î)³î*ìî.B î5»î8‚î;Îî=ŒîB±îE®î ìï*?î œî îóî3î‘î­ î#¸î%ìî)aî+Ãî.´î0Cî3­î5•î7ëî<Ÿî@3 î ìï(˜î X îîˆî•îHî!Iî#êî&Jî)Çî+uî-#î/ƒî4*î ®ï&îüî#îÄîëîãî"1î%î&¸î*°î,úî1j î7î<¶îA€îC§î ìï$uî ùî°îÆîTîšîî"­ î)8î-Nî.Ãî2(î5�î9Úî?àîCÊîGàî ìï"Îî Yîì î]î½îˆî Cî"¯î$>î'î)cî-î/‡î68 î<Èî>Æ îGÖî ìï!'îî<îìî"î‡îõ î¿î$lî%¼î(¹î*£î/Zî3î7î9î=Œî@^ îGáî ìïî ? î[îoî î#]î% î*Jî.Âî0!î3ßî7Éî<²î>iî@™îBëî ìïØ î ®ï]î6îôîNîÿîeî  î%¤î(bî,åî/Ú î7¸î9mî>î?£îB‚îGáî ìï¶î S î˜îÀî4î 8î!ùî&ßî(•î,áî.¢î1 î8 î>ŸîDÛî ìïî xîôîÙî¥ îûî{î"î'ãî,—î1kî3Qî8à î>oî@ïîEjîG/î ìïgî>îîuîdî �î%_î*“î-¿î0F î6Úî<î?:îB î ìïÀî £î!î7vî ìïqî �rî ®ï"î(îÖî„î î8vîlï"îðï"î? rî'«ï"î)Rî*iî5Ãî;Vî>îîA;îEåî ìï z îÓî�î¤î5î"dî(¹î+�î/& î9‰îNotethateachremoteinterfacemustbeimportedinthisway;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'î"Uïg'rî%rïg'qî&Dïg'rî*:ïg'qî*¾ïg'wîHDïg'rî ®ï_/îyîq îCîfî!Î î(Þî*€î-î/½î3½î8ýî<7î>ŠîB=îG/î ìï]ˆ î^îÍî î!:î$Àî'Øî2!î3âî9cî;$îA`îCÓî ìï[à îîåîÐî×î“î%Pî(£î*iî.ûî2nî7½ î>‚î@ îDðîFÁî ìïZ9î •îŒî© îìî!æî$‘ î+¶î1¨î5}î9~î;ºî ìïX’ î ®ïVîNî€î�îŸî$¶î+fî-Bî/J î6÷î<ÊîA]îE?î ìïToîœîqîíîîxîIî mî" î'nî-1î/`î1î4- î>� îE-îGžî ìïRÈîµîVî@îlî&)î(€ î0%î2ÀîA{îG/î ìïQ îªîÉî|îÖî™î#î' î,h î3”î8Ñî:yî<"î=F îD%îFî ìïOyîmvîïOyrî�ïOy î vî,ïOyrîïOyî�îöî$£î(kî+)î1î>-î@ìîCSîH#î ìïMÒî �îßîëî%[î'Wî)ú î0<î4�î9ýî=ZîAS î ìïL*î�îYîæîÜîæî"€î'¿î)îî/Bî2îA îD/îHeî ìïJƒ îîÍî†îvîüî$ î ®ïHîîÒîòî‰î î#vî%Vî+9î,×î/hî2¨î4´î6áî<¢î>@îB¶ î ìïF`î «î)î—îÉ î#î'“î+§î0üî6³î9îC î ìïD¹î šîËî„îä îÚ î#[ î ®ïB=îVîªîÜîýî î"Øî$ðî)qî+íî7¸ î>¯îBÙîG/î ìï@–î ;îúîªî“îJîTî"?î$¦ î+”î1 î3sî7;î9ûîD:îEÏî ìï>ïî ¯îèî4î”îÌî•î ¥î!à î'îî-1î.ßî14î6Ïî;@î?°îBFîCêî ìï=Gîêî˜î÷îS î ®ï:Ìî~îž î¨î!íî%nî*}î,#î0¸î3[î8¡î:Rî<:î@¸ îF®î ìï9%î Òîî£î·îKî»îî½î!î%Vî*Vî1î2ëî54î9Xî>oî@¹ î ìï7}vî àï7}î Çï7}rîþï7}î†îzîîôî!›î% î)î,¯î/^î1Šî5…î9î?vîC§î ìï5Ö îºîhîî©î Wî&î)Éî-î/²î4Èî6) î>îAŠ î ìï4/î Ä î£î\î»î!_î&¡î,0î.Üî4Tî6 î9î;³î>·î@¨vî ìï0ßî � î£ rî ®ï-�îîrîçî!lî" î'àî,ÿ î3¬î5 î8Eî:Ãî=ºî@YîBîD»î ìï+é î²îßîRîÉî"Kî&Ãî)wî. î4ýî6fî7åî:Ðî@öîB·îHevî ìï*A rîŸï*Aî¯îîî Ôî#¡ î+Žî1¬î4 î¦îDî ìï"Ðî9î5 î!Pî$Žî%Üî,à î5ßî:î;áî@IîA– î ìï!)î €îMîöîæîjî‚î/î�î#Kî&î* î-g î4wî7-î8� î>©î?Ñî ìï�îrîîRî!øî#äî*î/%î2;î4×î7¿î:Ôî<;î>&î@ïîBVîGàî ìïÚî jîpîšî+ î« î%¤î(¿î+î/+î5Ýî7u î>Pî ®ï^ î îîm î$¿î&·î)î/ î2x î9ÿî;[î=·î@‹îF°îHeî ìï·îÖî›îiîîîeî+‹î.ôî2“î5�î:)î=:î?Ü î ìïî¶îÒîäîLî!±î$Ãî'ìî+Lî-î3Ðî6(î8âî;Ó îE&îG/î ìïh î¿îµîÅ îìî%Èî'äî,Š î2Ôî7¼î9 îA‚îCPîF·î ìïÁîuî— îúî î"Áî) î*fî.§î2 î3Áî8¾î;% îE8îFíî ìï î¥î]îcîÂîÏî§îý î%ðî(Oî,î-Èî0ùî ®ïžî7îÔîîîî½î"œî%: î-eî.ï î7G î=ÆîBÙîFiî ìï÷î  îÕ îÄî"'î'Òî)9î,Mî.C î5Cî9 î:±î<ôîBª î ìï Pî< îšî3îÄî"\ î)9 î/p î7)î:tî<\î=gîA3 î ìï ¨î ŠîŽîÒîjî(î¥îôî!¶î%}î( î*aî/îî4¨ î;>î>‚î@CîB¶ 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'î"Uïg'rî%rïg'qî&Dïg'rî*:ïg'qî*¾ïg'wîHDïg'rî ìï_/î ÂîX î¡î$|î&—î)aî.î2‰î45î8?î= îGî ìï]ˆî. îâî4î äî%·î) î/‹î1½î3Îî7 î?òîEÏî ìï[àîúîûîVîÎîMîÓ î(Aî+Wî,|î0+î4¬î8³î²îB*îCéî ìïZ9 î$îéîïî!=î$Mî& î,g î3»î5 î ®ïW¾îfîWî#�î%Ñî*iî-î0Hî4î5¹î9«î=~î>˜ îF�î ìïVî Æî¯ îŒîó î$Gî&÷ î.èî2Gî3Ìî7„î:Kî>‡î?ÕîA9îFtî ìïToî  îî‹îî¦î Uî%úî+÷î-¥î0î3a î ®ïQóîî¸îî­îÀî"œî%Û î/ î0´ î7<î:9î=Cî?…îDhîFtî ìïPLî KîWîîoî$îÒ vî ìïLýî �îäî&rî ®ïI®îÇîÇî@îoîÂî"W î(Ìî+î-éî0¿î2î6uî8î:“îF·î ìïHî 0îëî?îÕî_î!Iî#-î%·î*gî/ßî2G î8Ýî:¶î<ÑîBÍîEÏî ìïF_îîñî§îî›î$ðî&ýî)dî,±î2•î3ýî6°î:Ãî@†îG;î ìïD¸î Jî î¿î»îsîÑî þ î'Qî*Ùî/Tî1D î7¯î9\î=iî@VîB´ î ìïCî ¥îîîî;î ¢î+&î-yî ®ï@•î• îüî×îŸîPî$Šî&î(î4Áî8ßî<Äî@îAÎîCîGrî ìï>íî ž îÂîiî1î°î÷î"¨î$Oî&9 î.²î2 î:Rî=eîAåîDãîFŠî ìï=Fî Ïî'îÈîKî÷îI î!Bî'_î+·î/–î1Å î8ê î?ŠîA@îCpî ìï;Ÿî åîz îbîÆî  î$» î+�î-î/áî4iî5× î>LîD*îFãî ìï9÷î Ýî'îcîS îÕîƒî Úî#-î ®ï7|î‚î�îmîÕîƒî.î!,î"R î)¡î7}î:öî<ãî ìï5Õî¼î. îsîÂîk î#ƒî(Rî-èî0éî5åî8îFÁî ìï4- îvî°î î�îÚî"�î$ì î,<î/î2® î9Yî; îD¨îF–î ìï2†î àî=îïî:î"î(šî+¸î0î2Òî6t î=&î?}îEsîG/î ìï0ßî¨ îÆîŠî™î�î�î$Îî'èî,î1èî4$î9õvî;Uï0ßrî<–ï0ßî>î?*îD îG/î ìï/7 îèîìîÜî¸î ®ï,¼î ®ï*@î= î'îjî”î ™î#®î&¹î)Uî+ûî.(î3›î6° î=ó îFØî ìï(™ îƒîÒîî(î,2î/¢î4¿î8³ î@îCîGžî ìï&ò î¢îi îðîIî#Èî)gî+¿ î3 î5½î8î:Ðî=¡îA: îGáî ìï%JîìîÜîî$î¢îFî„î"Rî(sî+!î.î0î5:î8Kî<[îAÀîCdî ìï#£î ®ï!(îÕîÖî)`î+ýî2# î:ßî<×î?€îCgîFî ìï€îêîø îAî +î!åî#àî(ªî-Fî3eî4Æî:£î@ÍîDxîGžî ìïÙîîuîÂîæîî î#rî%#î&{î*î,‰î.ë î5éî7¯î;$î=� îFˆîH9î ìï2î iîîpîˆîAî—îVî!Çî% î&Óî)³ î0Àî2•î6î8“î;²î=î>–îA î ìïŠ îÕî‘îˆîgî¿ î)•î. î3› î:ºî0îCÊîEÛî ìï�î à îXîøî$­î'lî+Ãî. î6Wî8Zî;¾î=íî?îCîFØî ìïöî]îeîrîîˆ î!Aî#Hqî%³ïöî&~ïörî*9ïöqî,üïöî-Ðïörî2ïö î: î@îAÙîF�qî ìï Nrî ýï Nîï Nqîæï NîŸï Nrîaï Nî~ï Nîæî¶î‚î"zî$<î'—î-î3 î8ïî;»î>/qîASï NîB'ï NîDrîG;ï Nî ìï §î } îhîî Üî#Kî%Üî,pî/çî4·î7ãî;î= qîDï §îD¹ï §rîH†ï § Á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'î"Uïg'rî%rïg'qî&Dïg'rî*:ïg'qî*¾ïg'wîHDïg'rî ìï_/qî ¥ï_/î ^ï_/rî¶ï_/îÀï_/î?îMîö î$"î%Ñî(2î,ñî0"î3?î5ì î<î=ÑîA‡îC7îE)î ìï]ˆî?î î„î·îüîî †î"’î'®î)wî+òî1³î4œî9Œî<îB¤îG/î ìï[àîIî!î-îŽî î#Þî%¦î(î,¿ î6¸î8€î<ÿî?çîA+îE0îHeî ìïZ9î  î`îÌî‡î¢îî!î%)î(�î,Dî1êî4¸î7Cî:~î ®ïW¾îõîO îšî" î$lî(Ývî+HïW¾î+øïW¾rî.OïW¾î3eî6Øî8�î>½î@VîGáî ìïV î¹î˜î`îÛî î"Aî$»î)}î.î3Üî7î9×îrîEgîG/î ìïToî‰ îî½îî!£î#Tî%íî,© î3Nî8÷î: î@:îDŒîGËî ìïRÈî Œî(î!îÖîêî"qî%Àî)<î+*î/î1¾î4‰î:Óî<×î>ÅîCØîEnîGî ìïQ î3îXîŸîGîŸî5î"nî$µî'î-zî.úî31î6ãî8„î<,îAŒîDxî ìïOyî _î Ç îÈî:îbî"î ”î$$î%úî'6î,îî1†î7=î<|î?Ê îG“î ìïMÒî Kîôî ®ïKWî0î îîÀîî"K î(nî*ºî.àî0‡î2ßî6ðî:ßîA îCe î ìïI¯îØîŠîçîcî­î!î&“qî(8ïI¯î)ïI¯î,« rî4ÁïI¯î9ÙîîF(î ìïFaqîŽïFaîGïFarîÙïFaqîúïFaîßïFarîdïFaî$]î'î)Õî-Ñî2î4Áî; îBIqîDùïFaîEÄïFaî ìïD¹ rî‡ïD¹îÎïD¹îðîK î½î%(î'@î+�î/î1Üî8|î: îFØî ìïC îÎqî!ïCîÀïCrîïCvî ìï?Ãî �îÝrî ®ïsî@ÅîBF î ìï9%î îîåîVîØî!˜î&àî(oî-fî/7î1ºî4î6õî:> î@úîGàî ìï7~înî¼îî¸î!Ýî#Iî$rî)àî+™î.:î/óî2Rî6Ùî8‡î:æî ®ï5îTîðî˜îxî¸î!žî$“î'”î,zî1¢î4Œî;Wî>XîALîE�î ìï3\î”îKî”îó î_î#î"î$ î+æî.î0m î7< î=/îCOîDòî ìï1´î iî ­î«îOî}îÚî;îUî!„î#.î(Çî,Æî/ î5Pî< îBüîD±î ìï0 î þî{îµîA î* î%Bî)aî.Õî1† î:î=èî?¦î@áîF·î ìï.fîîìîÀî™îôî!£î%Ïî* î-€î/ î2¦î5î8Pî;/î?Ó îFÁî ìï,¾î €î÷îíî¡îéîåî ïî"´î%k î0&î5Úî8[îî6¼î8…î:ôî@îD!î ìï%Mî‰î?îªîöî¥îMî!¬î$òî(ÿî-²î ®ï"Òî4îÍî\îåî"î!±î&ûî,:î0[î5!î7sî;´î@ìîBkîEcîG/î ìï!*î aîÄîòî† î!¡î#Zî&î*î/î5aî9yî;3î>,î@ïîDšî ìïƒ î1îÎîùîëî‚î ¢ î(iî+×î.î1‡ î:Wî<óîC‘î ìïÜî Æî\îXî¥îÊîÑî bî%@î'sî,~ î2öî5wî7;î9èî@‹ îG/î ìï4îk î1îÁîîlî"Éî&®î'üî*Sî/î2? î8 î=oîA¬ î ìï�î Xî„îHî·î²îð$vî ìï>î �îÞîärî ®ïï î5îâîÄînîî ôî%nî)oî*Ï î1Eî3?î5“î8ãî:� îBîC±vîE•ïïîFEïïî ìïHî rî…ïHîsïHîÚîî™îîYî"+î'jî)þî,† î3sî5vî;' îA§îDÔîFî ìï¡î %î û îîaîlî>î"•î'… î0+î36î5¼î8î:êî?åîB¹îE�î ìïùî¬îz îþîî î"0î%*î'uî*Pî.Šî1¥î6²î9­î=oîBîD…î ìï RîGîþîîî¯îî"< î)Æî ®ï ×îSî¬îéîœî„î3 î&wî+î0iî2iî3�î7;î;Bî>@î@*îE“îHeÿ 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.)sîCbîE{îG/î ìïZ6îrîîî‰î7î– î#oî ®ïW»îê îdîŒîÊî!î"~î#µî&°î)'î+´î/Ïî1Hî7î9\î=*î?¬îAh îHeî ìïVî¾î‚î!î&îãî î%Lî'<î**î0Šî28î5uî ìïRÄî y îrî ®ïOuî¥ î�îbî²î$Ûî&¨î)'î/êî5Åî;Hî=W îD$îFJî ìïMÍî Gî$îàîîlî[ î&î)wî3áî7Õî<…îA+îD îFî ìïL& îKî÷î_î7îGîq î%Åî)o î0î2ëî5–î7‡î=Çî?uîDvî ìïH×î �îCî— rî ®ïEˆî©î;î‰îZî"î#sî'Wî(¤î,‡î.Yî/¦î4´î9^î?' îEîGžî ìïCàîSî±î!îZî!Eî"èvî#ýïCàî$`ïCàrî%ÁïCàî&ˆïCàî)¯î+Hî2î6 î>Bî@åîDbî ìïB9vî ÆïB9î aïB9rîgïB9îdïB9îÐvîÉïB9îdïB9î‹rî#aïB9î$_ïB9î& î+î,¤î31î5î6Lî:…î?±îEåîG´î ìï@’î îFî¦îîP î %î"™î'vî*Xî,î.Bî3ºî:©î<£îA3îF‹î ìï>êîœ îOîîyîÔî%®î(m î0Mî5î7oî:9î;úî@©îBîGàî ìï=Cî Ýî ®ï:ÇvîJï:Çî¹ï:Çrî¯ï:Çî+îeî]î' î!Uî%0î)dî+"î,\î0Wî5©î7Eî9¿î;; îA€îCŒvîDÆï:ÇîE£ï:ÇrîH²ï:Çî ìï9 î ¼î¯î’îþî¯ î$/î'¯î+" î2 î5=î6î9î:…î;Çî?]îA’vîCcï9 îDï9 rî ìï7yî ºî¾î¯ îžî™î ò vî ìï4*î �î#rî ®ï0Úî,îÞîî§î�î�î!=î"Yî$´î(î*Ùî.–î05î5Ìî6èî9Dî=Bî?àîEðî ìï/3î aî=î†îDîûî(î°î!Ýî&®î)… î0î5î7sî;\î@¨îB îHeî ìï-Œî Nî>vî®ï-ŒîÁï-Œrî·ï-Œî¤ï-ŒîÏî! î)î.$î/íî3/î6î7Š î=ÛîAîCîE‚î ìï+äî ­îî“îŽî(îàîî"î%Yî''î)! î0í î7yî8­î<¢ îE�î ìï*=î šî Äî¯îîîEî0 î ®ï'ÁîzîÉî+îíî�î"î#< î,î0-î5’î8Ðî9üî@ØîC‘îD¼î ìï&î îhî„î~îÍî= î$'î(Êî+Fî.[î2þî7×î9�î:¥ î@ÖîHî ìï$sî¿îî'î»îsî4 î%î)‹î-ñî/´ î8î=^î@mîDXî ìï"Ë îïîîªîhî7î�î"†î%^î&êî+´î-ƒî2Lî6Ýî9]î>‰î@bîBâîEÄî ìï!$î®îçîqî®îóî æî#ùî'Óî+Iî-·î0ªî2gî4Öî9_î<=î>÷ îEžîG/î ìï}îìîóîîxî9î¥ î#úî%©î)–î+öî0©î5%î6Ôî8¯î;´î>º îDüîFÁî ìïÕ îîàîïîóîäî#¨î'; î ®ïZî�îhîÌî3î”î=î—î#hî)î+vî-pïZî-ÓïZrî0eïZî6âî8_î:¹î=îA•îC€îGáî ìï³î îî•îÌî•î!'î#Òî'î)íî,)î.‘î0 î4«îA_ î ìï î±vî·ï îï rî,ï î„ï îîWî%‹î'Dî.Äî1î7!î8Ïî=kî ®ï�îWîŠîî’î(î!’ î*\ î1‚ î:+î;ûî>{îAîCzî ìïéîƒ îyîïîî!²î%Ïî*$î,î.tî0 î8hî=@î@?îB*îG“î ìïAvî×ïAî\ïA rî§ïAîïAîÑîjî ¬î#-î%ñ î,«î2vî5OïAî5ÔïA rî>ïAî?€ïAîCñîFÁî ìïš îîÉîGî-îóî#Iî%Ãî)Éî5eî8!î<'î?EqîAQïšîB%ïšrîF-ïšîG“ïšî ìïóî <îDîOîçî�î!zî#¨î%øî*�î,:î-Tî2[î4µ î;uî@fîB¿ î ìï Kî 3î¿îŸî îºî#£î%µî(,î*– î27î5î9˜î<$î?ÏîAÁîDýîF‹î ìï ¤î ÞîîÈî îîKîþî%Àî(î+¿î0®î2nî5Äî9×î<íî>ïî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'î"Uïg'rî%rïg'qî&Dïg'rî*:ïg'qî*¾ïg'wîHDïg'rî ìï_/î òîgî îóîIîMîî î% î( vî ìï[àî �îCrî ®ïX�îÂîcî"îåî"Ùî' î(rî+œî.™î1®î5Õî8½î:²î=Nî?óîA›îG“vî ìïVé rîÍïVéî»ïVéîðî5 îyî î$ î&êî(“î*äî0dî3î6þî:î?RîBË î ìïUBî ßî°î7îvî7ïUBîçïUBrî LïUBî"î$�î(Ùî+úî/©î2$î5ÿî7†î=2î>ûîAîBMîGÖvî ìïSšrî aïSšî ºïSšîÅîÊîÚî�î'î áî#C î)…î,ðî/gvî3ñïSšî4¡ïSšrî7fïSšî7¿ïSšî8Êî=î@îCO î ìïQóî qî î¾î7î¾îîƒî!î&dî(þî,Ìî.î0’î2î7\î9Õ î@.îA²îDAî ìïPLî îfîúîÅî î!î&î ®ïMÐî7î× î…îîcîHî$(î)î,Lî/‡î1¯î7Tî9‡î>î?ñîBˆ î ìïL)îî�î\îèî †î!ôî#!î'«î)gî*“î0& î:î<Âî>0î@:îD€îH9î ìïJ‚î —îˆî8îŸîþ î (î!Öî%jî)Žvî ìïG2î � î`îSî‘rî ®ïCãî| îyî=î@î–î$_î'† î-èî0ùî2ß î:—î<àî@ îGáî ìïB<î K îIî÷îKîªîîÇî$‘ î ®ï?Àî5îÏ î: î!±î$î'nî,½î1/î4m î;Ùî>œ îEaî ìï> î£îÅîîˆîàî÷ î'Ý î.Ævî1Àï>î2[ï>rî6³ï>qî8ï>rî;±ï>vî>Uï>î?ï>rîC.ï>îD�ï>î ìïzîA…îF2î ìï0 î ƒ îî\î’î'_ î-øî/.î2Îî6òî8(î<î=wî?2îA/îC¼îE`î ìï.cî hîÉîÍî7îœî3î½î :î"ºî#âî'¡î)Yî,]î.î0sî5î7®î9î>³î@®îC î ìï,¼î £îÇîuîÔ î¤î ®ï*@î„îÙ î0î— î& î'»î(æ î/€î1;î5¡î<“î?L îFØî ìï(™îØîÍ î%î} î"rî%8î)Îî,î.:î3Sî9�î:Ñî<6 îCÏîGàî ìï&ñî øîÖî—î÷îÃî·î –î"Wî&Lî( î+Ôî-–î/™î4–î7wî<]î?îAîFíî ìï%Jî úîõ î‰î�îþ î%. î-hî0vî2qî6rî8+î=vî>Rï%Jî>×ï%JrîAaï%JîDdîGàî ìï#£î .îÈîcî¥ îýî6î„îÆî#E î+šî-+î1s î8ˆî:fî?ãîBf î ìï!ûîîÎî¶î»îîî#½î)Ñî+Êî.(î1Aî4�î9xî<-î?©îC$îGžî ìï Tîœî˜ î@îÑî!î#†î%Jî'�î,¨î1´î5& vî ìïî �îC rî ®ï¶ îÄî'î îQîî vî$<î& vî(¡ï¶î)ï¶î+= rî1°ï¶î4ÅîFØî ìïî×î¡îðî ¨î"Rî$>î* î.®î2·î7eî:zî=†îBîFî ìïgî âîîñî1î( î#Àî&4î)nî,Fî1î5<î6† î=úî@»îC‡îFî ìïÀ î|î™î£ îRî!Ðî#®î%·î*6 î0nî2‚î3Åî6Hî9±î;šî>îBõîGÖî ìïîÒîÊ îIîlîÓî#î$Ñî'8î,î.cî3 î8tî;—î@GîAþîG0î ìïqî eîrvîaïqîïqrî5ïqî î"óî&(î(Úî,´î.©î1†î7]î9Rî;íî?§îBLîD„î ìïÊ î ®ï Nvî†ï Nî6ï Nîkrî‰ï Nîõqîï NîØï Nîõrî"ºï N î)&î,Aî.¡î1aî5çî9î;�î@wîC î ìï §î žî Àîÿîî³îZ îàî"8î%Aî)sî+áî-àî3Rî8Vî9ýîƒîB+îC«îDéîGÖî ìïAbîßî­î@îî]îÆî!€î"©î%ïî+_î-²î/¹î3ü î; î>„îARîG/î ìï?ºî îïîéî£î¢ î ¢î%D î,Yî-Óî3fî6¼î9*î;ðî=¸î@& îGˆî ìï>î .î ]îçîšîþî)îîî!†î#9î&…î(é î0óî5 î;Ïî@.îB“ î ìï¥îCNîF^î ìï8Iî ¥î³îîHî†î?î?î Aî#’î)½î+kî0î ®ï5Îvî½ï5ÎîBï5ÎîÄrî ï5Îî�îòî“î"Êî$»î&‹î*î7ø î>ôîC²îGî ìï4'îÖîv îîî§îîÜî ®ï1¬vîŠï1¬î%ï1¬rî#ï1¬îàîî|îëqîï1¬îÓï1¬îórî%»ï1¬î)îî-›î/ î1oî6 î8]î?< îFÁî ìï0î RîNîÍîVî#îãîÛî"± î*Zî/› î9î<Üî>ˆîB“ î ìï.]î îþî—îáîHî 1î"Nî#™î)uî.ùî1òî6Ûî<—î>$îDîEæî ìï,¶îÒî îzî^îwîPî!l î'øî*Ûî0 î8üî:àî=jîB]îH#î ìï+î¾îlî î3î!2î"áî$Òî*+î+Ùî-î0î î ®ï(“îî$îÃîhî"uî(Uî*î.± î5cî9î;´î@t îHeî ìï&ì îëî»î3î�î¼î(î!Ìî"øî&yî)tî+}î.Nî1—î6aî;ÿî=¯îAgîCî ìï%Dî ®ï"Éî1îšîlîî"6 î+Üî/dî0Äî2|î5 î9Ø îCQîHeî ìï!"î ,îJîvîûîèî î#@î'’î*î,¦î.zî0�î6î81î=b îDƒî ìïzîòî'î¡îÜînî Wî!Óî$Nî)3 î0Jî2Úî7[î9Öî=Ýî@bîB+îEaî ìïÓî »î´îíîMîî! î"Íî$$î%�î*î+Æî.Q î8î:Äî? îG/î ìï,î ¸î-î2î�îîÍ î"œ î+¶î-† î5?î9!î;äî>e îGàî ìï„îsîÒîšî5îpî#euî ìï5î y î¨îHrî ®ïçîçîSîÖîî“î ïvî$Øïçî%Hïç rî,<ïçî.ñî3=î9!î;¿ îBØîDxî ìï?î îÕî'îN î¢î!iî%>î+%î00î5\î7ƒî<�î>³îC¾îF·î ìï˜îbîî —î$Wî(eî*î,r î3n î ®ïîbîbîùî§îÖî {î#åî(Aî-eî1>î2> î9Šî<.îAR î ìï uî îËvî=ï uîØï u rî{ï uîÊî« î&î'¤î,Sî.¹î0zî2}î7,î9³î;tî?%îC½î ìï Îî çî@î¶ îî[î!î$tî(#î+ºî1…î3,vî8;ï Îî9"ï Îrî=>ï Îî?tîB;  =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î 0ïg'qî!9ïg'î!òïg'rî%ïg'qî%àïg'rî)×ïg'qî*[ïg'wîG~ïg'rî ®ï_/îÄînîbî©î _î$Uî&§ î-íî0¸ î7¦î>RîC/îEðî ìï]ˆî&îÆî0îyîÎîôî¢î8î æî#;î'¶î-}î/ î0?î:æ îCNîFíî ìï[àî XîÊîÆvî,ï[àî�ï[àrîªï[àî°îžîaî"Êî$‚î'Èî)vî/€î1.î5Ëî ®ïYe îwîÇîwvîSïYeîîïYerî"–ïYevî$IïYeî$úïYerî(GïYeî*— î1Ú î9uî=žî?~îCpî ìïW¾î ÷î_ îcîîîÛ î&Üî(“î*úî.4î/õî2]î4Îî9Rî<î=Èî?ÁîC‰îGàî ìïVî ‡ îZî1îfî!Rî#¬î'ªî)Tî+@ î2¥î5Xî9Œî;çîBÈîEõîGáî ìïToî Mîíîïî§îqî{î! î(î*�î-\î/Mî4Yî6Uî7î;Œî=PîAîD¥îFiîHeî ìïRÈîgî9î¿ î!? î(%î)Ôî,Ìî/Ñî1 î8Dvî ìïOyî � îò rî ®ïL*îL îYî×îî%î`î"2î&©î6jî8‚î<&î@¾îFuî ìïJƒîÒî. îZvî5ïJƒî¥ïJƒ î$arî&ÆïJƒî)Çî,þî/!î3¹î5›î9l î@¤ î ìïHÛîsî™îrîÝîlîãîî#1î'î+™î/³î1)î4.î7Hî9ô îAîD î ìïG4îš î ®ïD¹î,î¡î—îyîî¨îà î&Mî)²î*úî0Oî5*î7½î9h îB î ìïCî �îUî®îîAîóî!àî(Dî)p î0oî1Þî6Gî:Ðî?î@ÞîE~îG/î ìïAjîîVîþîEîî qî"Êî'úî+öî.Oî3Ìî5tî9 î=¢îB!îG‰î ìï?à îèîîîòîöîÊîô î%)î ®ï=Hî„îêî”î6î+î/Öî1î3üîB] î ìï; î ÈîÌî†î&îqî8î!>î&aî*î+-qî/1ï; î0ï; rî1wï; î2?ï; î3–î5:î9uî<Èî?ÎîA¿îD î ìï9ùî ¹î‚î.î¯îØî—îœî.î"Ìî(Pî,0î-Ý î4¡î6Nî8­î<) îC|îEÚî ìï8Rî ÕîÓî´î¹î¡î"‚î'î*Tî-Ïî/¦î1Öî5%î9Fî=ßî?×îC]îGî ìï6ªð!îöî#Þî(>î)Bî,aî:•î<¬î>åîB; î ®ï4/îcîîGîòîZ î$#î&î)î-yî2¥î5Qî6šî8& î>Êî@VîB“ î ìï2ˆî pî0îÒî„î5îŸî!_î$?î)õî-!î/½î4äî7Tî< î=×î@HîEeîG/î ìï0à îÄ î{îÇî"Öî$„ î-oî/Ãî28î ®ï.eî\îÿîÒî+îî!Kî"¬ î)ßî,î.³î3pî8õ î?åîB|îE¸îGžî ìï,¾îµîoîlîî6î{îÒî%Bî)Éî,î-¹î/ î5hî7† î>ýîA•îFHî ìï+îE î¬î4îQîìî!æî$9î'ªî,$î1eî3î5Z î<­î@Ä îGî ìï)oî ëî rî+î+îO î±î 'î"–î(`î*Îî,¢î/âî4aî9©î;Q îB î ìï'Èî î™î˜î î`î$v î+ëî.Œî0�î2Åî8Ùî:õî>ªîA)îF–îH#î ìï& îŸî�îÜî îQî!Ùî')î(Ú î/¡î1~î4„ î<_î>%î?ÖîB îC¼îDèî ìï$yî Ÿî ÍîKî¹î9 î ’î$ î%¼î)Iî,Áî/%î2Cî8Eî;îcî@jîBá î ìïî¡î”îå îÒîî" vî&›ïî'ïrî1?ïî2Ÿïî6‡î9Pî=DîBÏîEÄî ìïaî Lî¤îÞîƒîÝîî ‡î%Tî(©î,šî.Vî/°î2 î8ýî;kî>ÁîCÆîEüî ìï¹î ‹îåîkîWîPî#zî ®ï> î… îîu î'qî) î0î4Ÿî;’î=ÿîDbî ìï—î ˜ î8î»î\î î!\ î(‚î*.î,€ î3ý î:ì îBIîD8îFŠî ìïïî`îËî% îs î%fî(/î*Àî,÷î0 î4åî6˜î9¸î;®î=»îC‘î ìïHî £î÷î¶îdîUî` î$¤î)¥î.šî2î7�î9Iî ®ïÍîŸîúîÚî$îÂîÜî õ î'áî,Üî0Íî3î6=î8ûî;`î>¬ îE£î ìï&î ¯î;î_î¶îÏîîÜvî Ìï&î!gï&rî%Àï&qî' ï&rî*¥ï&î-2î/g î68î; vî=ýï&î>­ï&rîBÖï&îD7ï&î ìï ~î î îîˆîXîî!#î#Šî'î)øî,¶î0;î2• î9ðî=î>„î?´ îF·î ìï ×î •îfîsî˜î­î�îD î#íî&¶î*Eî-�î/Fî12î5Êî;)î<Òî=÷îAÝîFTGTVm$(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 î<�î?FîA£îD î ìï]ˆî”îŠî"Uî&óî)_î,[î1ìî3§î6î;,î@qîBBîD¯î ìï[àîvî ìïX‘î �îôî˜rî ®ïUAîÍî=îlîà îJî" î#Ýî(hî*×î.Òî1 î8¥î>î@¾îEkî ìïSšî ?îvîoî î ®ïQî îèî^î, î"­î$fî%™ î,<î.î1$î3æî7n î>&î@6îC.îEðî ìïOwî' îoî>îðî <î$½î*¨î-,î2E î8sî;Ôî@îF2î ìïMÏ î¦î¾î-î~î!Çî"ýî'‘î,¨î.nî2;î6úî: î>îBRîFûî ìïL(î Aî$îPîÔîwî î!ôî$xî)#vî.îïL(î/‰ïL(rî1¡ïL(î4Qî6Öî9ôî?³îDÍîG/î ìïJ�î/îèîM îØ î"’î ®ïHîÉî¼îØî î¾îëîWî"¡î$î)åî+>î,­î/‰î3ñî5¢î98î=iî>ùîBîF'î ìïF^î çîIîeîîŠîxî>î"¾î&ïî*¦î+Òî0’î4¢î8 î;î=jîA…îC6îGËî ìïD¶î pî¥îî¸îQîî"¡î&}î*õî,%î/Gî3[î4Îî;�î?¬îChîEÏî ìïCîUîIîÅî–îâîÅî Jî$‰î)î+¤î/G î6iî9Fî=Æî?šîA±îFÁî ìïAhî¿îjî[îôîÍ î"†î'õî,ˆî/?î2½î7î9Âî;³îAóî ®ï>ìî@î^îKî«î¼î·î›î¨î#Ÿî'& î.nî/¸î2Xî7Lî;Çî?Pî@ýîDþîFîî ìï=Eî œ î©îîr î!î&›î) î,î.œ î5öî9}î<]î?ëîE�î ìï;�î þvî|ï;�î,ï;�rîÒï;� îÄ î%jî,&î0cî2» î9¯îŠî@âîDWî ìï9ö îäî¹îfî‹îî"kî(&î,' î2¾ î;Õî>ùîA�îGÀî ìï8O î‡ î{î˜îTî ç î'üî*´î,²î3„î5@î7=î<ðî@²îB!îE>îGŸî ìï6§î Ðî‰îèîe î ®ï4,î| îLî±î$î †î%|î'nî)Ãî/3vî4Tï4,rî4Øï4,vî5«ï4,rî6Fï4,î7{vî;‰ï4,rî<ˆï4,î=êî? îAøîEÄî ìï2„îFvîï2„rîNï2„îÒîJî9î î î%7î(Hî*gî,ßî0uî4§î6»î;ß îCmîDÜqî ìï0Ýrî œï0Ývîýï0Ýrîï0Ýî îúî îîqî!¦ï0Ýî"_ï0Ýrî%Èï0Ývî')ï0Ýrî(1ï0Ýî+5î-ªî/›î1¸vî4ÿï0Ýrî6ï0Ýî8“î;ðvî˜ï.aîBï,º î˜ï,Pþ„rî˜ï,ºîï,Pþ¥îï,ºîÁï,Pþ¥îÁï,ºî gï,PþÇî gï,ºî(îï,PþÇî(îï,ºî)´ï,PþÇî)´ï,ºî*{ï,PþÇî*{ï,ºî+Bï,Pþ¥î+Bï,ºî+èï,Pþoî+èï,ºî,Wï,Pþ¥î,Wï,ºî3Cï,Pþþî3Cï,ºî4Aï,Pþ„î4Aï,ºî4Åï,Pþcî4Åï,ºî5(ï,Pþoî5(ï,ºî5—ï,Pþ¥î5—ï,ºîBï+qî˜ï+î(îï+î3Cï+rîBï)jqî˜ï)jî(îï)jî3Cï)jrîBï'Ãqî˜ï'Ãî(îï'Ãî3Cï'Ãrî ®ï%Gîz îHî«î¹î!eî$Öî(Gî)§ î2.î7œîî?�îBíîE�î ìï#Ÿî ãîTîîŽîiî¸î!Gî$=î%¥ î,9î-`î0wî3lî5î7]î:î;Ñî=:î?SîAÐîC8î ìï!ø îQîî8î¨î“îî pî#ˆî%Ú î,Èî.'î4ôî9nî:Ìî>sîA î ìï Qî ¦îî�î¥îî} î&?î)Oî+Kî/éî2€î7Ãî9|î>qîA—îDCî ìï©î ãîd î­î îŸî!£î&lî+?î.†î0vî3‘î7î:Tî=±î ®ï.îV îovî�ï.îLï.rîÍï.î •î"kî$bî'‚î+î-4 î4î5‡î7Qî8˜î> îAyîD°î ìï†îGî îî:î|îî_î#Aî&iî'âî.´ î7Œî9×î?¶îCxîEvî ìïßî Nî^î î&îÏî6îVî"7 î)€î+‡î0%î2¼î8 î;î<ëîB îCÿîGrî ìï8î èî‡ î ®ï¼î î^îÄî]î îMî!­î%šî(î+î,ùî1_î3î6¡î:Ðî<”î@`îC î ìïî ªîî{î„îy îî!Õî'1î)•î-…î/ó î7Üî<áî?EîDTîFî ìïmî \îyîñîaîä î vî$î':î*¨î--î/.î4)î8ªî;ëîB&îD<îF¬î ìïÆî ‘îîc îÅîùîµî!‹î#Ìî'î)mî.ÿî1º î9=î?HîCèîG0î ìïî ©î§îÛî î ìî%î&ßî,Íî/hî4,î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î 0ïg'qî!9ïg'î!òïg'rî%ïg'qî%àïg'rî)×ïg'qî*[ïg'wîG~ïg'rî ®ï_/îh î¶î’îÏîî"Zî'(î)Âî-{î/ÿî1�î3°î72î<+î?—îB÷ î ìï]ˆî î„ î1î _î$ºî' î)î.kî1‘î3ñ î:\î ®ï[ îáîÈî�îâîgî×î¡î ­î%/ î,àî.ª î5tî7ã î?îA–îEžîH#î ìïYeî†îhîÆvî­ïYeîïYerî“ïYeî �î# î)Nî+áî1Üî5Wî8…î>ïîB­îG;î ìïW¾ îM îùîN î'ïî+9vî-ÆïW¾î.�ïW¾rî/‹ïW¾î1ïW¾ vî9òïW¾rî:¹ïW¾î<3vî?ÿïW¾rî@¤ïW¾qîBhïW¾îC!ïW¾rîE”ïW¾îGïW¾î ìïV vîÙïVrî ïVvî·ïVrî]ïVvîAïVrîïVvî ïVrîÅïVîèî"Úvî'ûïVrî(ÂïVî)Úvî-¥ïVrî.KïVvî50ïVrî5÷ïVvî7ïVrî7´ïVî9-î<ƒîA§îGÖî ìïToî¨îî…îÌî ƒî"ìî&jî(î*bî-‡î/çî2Pî3¼î ®ïQôî'î î‰îªî Ðî%�î&²î)¢î.òî2î4fî7 î< î=ÿî?ç î ìïPLî Vî§îîpîjîÖ î!Iî'âî*„î/Ýî2hî4"î8qî:bî?�îA‹îCõîGrî ìïN¥î èî‡ î ®ïL* î¤îÞîã î%‚î*�î6¬î:îE�î ìïJ‚ îÊîÉî.î î�îCî"dî&@î)`î/Cî0øî6U î<Ý îC‘î ìïHÛîmîî‹îNî(#qî4ÐïHÛî5ŠïHÛrî8nïHÛî99ïHÛî>Iî?Žî@èîCKîGRî ìïG4î Bî ñqîáïG4îšïG4rî‘ïG4î”îÂî³îÝ î$ïî*Áî,Yî1Yî ®ïD¹î2 îÜîî vî!jïD¹î!ÍïD¹rî(fïD¹î.äî2îî7ßî:;î=÷î?¢îD:îF–î ìïCî ÐîŒî‹îÕîšîî.îëî!éî%·î'&î(^î-Vî2"î4�î9Fî=‚î?IîBáî ìïAjî 3 î‡î¸î î êvî"`ïAjî"ÃïAjrî(ÛïAjî)3ïAjî,üî.\î0¹î45î6fî8º î?0î@zîAÙîFØî ìï?Ãî Kîôî0î ®ï=Gî]îêîî¹ î ¾î"Üî%'vî( ï=Gî(nï=Grî.‡ï=Gî.Þï=Gî8Óî;`îA· î ìï; î âîxî!î!:î'›î*1î0’î4Fî7Äî:Zî=Šî@LîBsîEî ìï9ùîîÝîîî"²î$1î'¸î)!î*Hî/Áî5�î:î<½î>~îB î ìï8Q îûîÓîÛîcî î Oî"1î&/î)î*æî-n î5î6¬ î?HîDÔîG´î ìï6ªîîîî~îðuî ìï3[î yî{ rî ®ï0 îîgî­ î#Bî%gî+5î,Fî1î5Ýî9ñî<Ýî@7îDLî ìï.eî ˜îÂîpî î¡î7î —î&=î*Œî,õî/3î5 î ®ï+é îÓî# î"î$Aî)î, î.Vî0`î2î7`î:î>ÛîCO î ìï*Bî £î ›î)î×îÖî †î"Gî$ñî*Ÿî,û î4cî7" îA îB} î ìï(›î …î&î ®ï&îºî“î î!î#7î%Ë î.‡î1s î:à îAÃîG/î ìï$x îž î§îhî ý î'¶î*»î,·î;î<Öî@)îC î ìï"Ñî üîîðî2îMîfuî ìï‚î yî€rî ®ï3îôî–îÒîîÍ î#Bî&dî*üî,½î//î2qî8Uî:dî?kîA° îGÀî ìï‹ îyîÏî:î:îòî) î'Ðî*‡qî,vï‹î-ï‹rî1Aï‹î2Iï‹î5î7i î>{îA•îCôî ìïäî îÊîâî™î.î;î›î$cî&–î)Mî+j î2î5î7 î ®ïiî•î î—î§îdî#§î(î+{î-é î5bî7Úî‡ îG;î ìï |îšî îpî¨îî î"_î%Tî' î)�î.Çî3Uî6Kî9™î>(îDeîG;î ìï Õî’îù î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î 0ïg'qî!9ïg'î!òïg'rî%ïg'qî%àïg'rî)×ïg'qî*[ïg'wîG~ïg'rî ®ï_/î…îÅîjî6î!Šî# î*¬î-µî3î8†î?½îC)îG/î ìï]ˆ îËî î0 î! î#òî'u î0œî2C î;Ùî>×îAîE‚î ìï[àî ðîÆî îÁîînî!_î'1î)nî,î28î3çî ®ïYeîñîéî¸î…î!Öî$Îî+š î38î6‡î;›î@òîCéî ìïW¾ î ®ïUCî…îX î5îíî&!î(Gî)ÿî.î0Ëî26 î9Àî<îB0 î ìïSœî ®ïQ!î9îî lî$Fî'-î,'î/}î5î7•î::î<³ îE�î ìïOyî¼îíîâîî"¶î&Ëî)Gî+Ãî.î1w î7Oî9àî<;îB*îGî ìïMÒî ¥î™î§î$6î%`î'Õî+”î/Jî1¿ î ®ïKWîîÀî7îaî )î!wî$%î%÷ î.î1S î:7î=(îAzîESîF¡î ìïI°î¤îMî.î(î‚î îî!»î&^î*ˆî-Fî/ î1>î3 î:¯î@ÔîE)î ìïHî )îî$î�îÝî‹î{î ®ïE�î|î5î”îgîÑ î$½î)Cî.î1î3X î ®ïCîMîœ î½îNî!Dî#eî%éî*î.cî3Fî6" î>@îC½î ìïAkî Öî¶î¼îñ îÊî"µî#ý î+² î2Áî5¸î7î8Œî<îAÌ î ìï?Ãî ˆî Öî¨îOî� îwî#8î'ùî+Zî-Dî<&î>%îB»îEKî ìï>î  îî’î{î† î$ãî*{î-î2ÿî5àî8iî;Øî?îDÉîGžî ìï0uî ìïPîàrî ®ïî±îýîîCîwî#þî&¹î) î3î4½î:ß î@íîDcî ìïZî~î,îDî ®ïßîÞî¨îî¾îîJî"2î'šî)dî-`î2Nî7×î9ãî?WîBÙîEUî ìï7 îûîÆ î\ î!¸î$xî'çî*³î0U î:î>´îB} î ìï� îóî¸îî »î ®ïîÀîkîµîïî´î!¿î$Àî'×î2£ î9Æ îBJîHeî ìïn î'î‚î!Üî%î*î+{î.¨î4lî8¹î< îC î ìï Æ îšîœîüîf î ¹ î(ßî.,î3Òî5€î8Üî> î ®ï Kî×îšî•îçî Úî#þî'Lî,wî0ƒî2Fî7Þî;î>î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î 0ïg'qî!9ïg'î!òïg'rî%ïg'qî%àïg'rî)×ïg'qî*[ïg'wîG~ïg'rî ìï_/î Äîp îî‘î î&¤î,W î34 î:«îAˆîGÖî ìï]ˆîîlî·î¶ î% î*eî,d î3xî7öî;Úî=ÙîA¦îE'îG%î ìï[à î ®ïYdîâî¯îµîî!î$Hî'¡î,Ëî0î1óî4´î9 î:Ùî>­î@"îCÊîGáî ìïW½îS î¹ î!Çî$«î'²î.Kî3, î9òî?‚îE?î ìïVîg î}îXîÚî#"î$ôî&Aî+½î0q î77î= îCÅîG/î ìïTnîî²îúîtî#î(Mî5™ î? îFØî ìïRÇî£îW î!9 î&ÿî)Ÿ î2�î5C î<2î?7îAîF2î ìïQ î“îsî�îuîÊîb î Ùî#9î ®ïN¤îÌî„îKî’îoî"8î%Dî).î.Þî9*î<¦î@ îEbîG;î ìïLüîKî/îÚî�î ” î(\î*1î+‚î/iî4!î5övî7GïLüî7ËïLürî:¥ïLüî;¨ïLüî>Dî@îAjîFzîHeî ìïKUîÕîT îFî+î@î#î%=î*î.y î5>î9 î;T îC�î ìïI®î Ãîaî î'îCî�î!Úî#…î'Ðî*±î/Œî25î7î;]î>i îE4î ìïHî �î®îDî·î î"•î$D î-ˆî0ïî2;î7;î9�î<1îAÁîCdîGgî ìïF_î yîÎî�îãî�îîîžî �î"¡î(1î)áî._î0Àî3mî5'î7ˆî9Ý îA îGÖî ìïD¸î 3îLî­î„î×îDî`î#Ñî&Šî**î.Zî0® î8 î?ÆîAu î ìïC îtîY î>îî�î!}î(èî,:î1î3Kî7¯î=� îFñîH²î ìïAi îëî¢îãîL î%Äî*`î,î0îî2Þ î9Uî;}î>�îA›îCIî ®ï>íîÙîžîåî9î0î Vî#p î*™î/ î0Úî3Zî7öî;î<”îGRî ìï=Fî · îlîî#dî& î ®ï:Êîçîºîîpîƒî!fî$Å î+üî/µ î7óî>6 îGîH³î ìï9#îp îºîvî>î!Aî#§î(ðî+¤î1]î6eî8Ëî<Êî?âîB–îGžî ìï7{ îuî9î”î}î_î ƒî#Ñî(¨î-™î/{ î7 î>Í îG%î ìï5Ôî‡ îŒî�î"î!Ÿî'/î)5î.Ð î4Îî:âî?µî ®ï3Xî¢î0îuî’îî ºî#Óî(9î+¬î/Wî0åî3$î7Àî<”îBˆ î ìï1±î ½ îî“ î"î 1î#Lî'É î.Aî1 î:Iî>XîB’îGàî ìï0 îóî› î"î&%î'àî-]î0Çî3î7B î=óîB$îDoî ìï.bîqîz î!”î$ßî&Zî1©î4Éî8î:`îGËî ìï,»îîZî$çî&í î.bî2ÿ î ®ï*?îCîqîïî¬î"wî&î)‰î-†î17î6>î93î;Ûî ìï(—îFîHîöî ®ï&îÕî•î¥îõîäî#î&î+ôî/Æî5Gî8Áî=¦î@CîB¨ î ìï$tî ýîÝîŸ î¼îŽî"Pî'eî-mî0ˆî3¡î6cî:Ýî>îCN î ìï"Íî{ îQîî!iî$Ä î,Ñî/½î2áî8î:Ÿî>îC|î ìï!%î îô uî ìïÕ îÎrî ®ï† î@ î ®ï îÜ îî î}î Ãî%?î'áî)Ñî ®ïŽî+îÐîP î7 î%wî)Çî,Rî.Cî3Çî5v î?Tî ®ïîžî ®ï– îùî§î|î3î üuî ìï F îîhÿ gTVm$HALPINEPUBLICINTERFACES15Validationofremotepagecaches(throughahistorydatabasethatiscoordinatedwithfilepageupdates.)Transactionsavepoints?rî 0ïg'qî!9ïg'î!òïg'rî%ïg'qî%àïg'rî)×ïg'qî*[ïg'wîG~ïg'rî ®ï_' îŒîuîMîÄî"Dî(&î)€î.Bî4 î7 î8¨ î@cîC¯îFHî ìï]î ®ï[ î"î&ÿˆ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î ìï_,î ìï]„î¹ îCîkîmî ¿ î ìï[Ýî îöî ýïZ5îøîëîhîõî;îJî ýïXŽî¤î—î¼îùî?î!Nî ýïVæîÓîÆîéî&îlî {qî ìïS—sî ýïQðqîªïQðî�ïQðsîôïQðqîWïQðîEïQðsîïQðîsïQðî ýïPHqîÕïPHîºïPHsîïPH îî$9 î ýïN¡qî²ïN¡î˜ïN¡sîüïN¡qî_ïN¡î3ïN¡sîpïN¡îÓïN¡î ýïLùqîZïLùî?ïLùsî£ïLù îº î"ä î ìïIªqî¸ïIªî�ïIª sî×ïIªqî ýïHvî ìïD´îú sî ýïAeqî�ïAeîHïAesîïAeîæqînïAeîBïAesîïAevî ìïKsîïkîîïÃî•î ýïîQ îØî!½ î)' î2­î73 î ýï Í 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}];wîHDïg/sî ýï_, qî}ï_,î6ï_,sîïï_,qîÔï_,î�ï_,îÄï_,sî"ï_,î ýï]„qî^ï]„îï]„sîÐï]„qîµï]„î‰ï]„sî'ï]„îï[Ý î- îïZ5qî_ïZ5î)ïZ5sîïZ5î§î ýïVæ qîKïVæîïVæsîïVæîìî ýïU>qî}ïU>îHïU>sî9ïU>î î ýïS— qîÓïS—îžïS—sîŽïS—îsî ýïQïqîÂïQïî�ïQïsî}ïQïîbvî ìïLøî ® sî ýïI©qîïI©îÕïI©sî�ïI©îs îÅ î'9 î1‘ î:’î? î1ïH îöî^î ýïD³qîíïD³î¦ïD³sî_ïD³qîDïD³îïD³sî"¶ïD³qîïC sîáïC îõqî›ïC îTïC sîïAd îiîþ î"$ îï?¼ î<îÑ î!Êîï> îî´î'� îïVî?‹sî ýï(’qîRï(’î ï(’sîÄï(’qî©ï(’î}ï(’sî—ï(’qîúï(’sî#1ï(’î#”ï(’î ýï&ê qîßï&êî˜ï&êsîPï&êqî5ï&êîïï&êî&ï&êsî"fï&êvî ìï!óî ®sî ýï¤ qî8ï¤îñï¤sîªï¤vîï¤î—ï¤î• î!Úî#î&çî+sî/�î1%î2Zî63î8‡î[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,wîHDïg/sî ýï_,qî¸ï_,îqï_,sî*ï_,îîkî ýï[Ýqî>ï[Ýî÷ï[Ýsî¯ï[Ýî”î"¾ vî*jï[Ýî*ãï[Ýî+áî-î5ñî8Äî<†î>ÒîDZî1ïZ6îÔ îî¾îrî!î"Kî%{ î,$î0Mî3î6 î8ìî<›î@$îAÝîE¿î1ïXŽîî·îìî¹î]î!©î$Uî'Àî),î*aî-r î3²î6„î7Üî:qî@1îCæîG¨î1ïVçî_îîQîcî#;î(£î,Ëî/�î1�î4­î9Pî:¼îA î1ïU@îÉîœ î î"Ìî%î(úî*Ÿî/¬î1ø î8tî;Ýî@œî1ïS˜ î ìïN¢îI sî ýïKS qîïKSî×ïKSsî�ïKSîtî&©î1èî6" î=à î ýïHqîîïHî¨ïHsî`ïHqî!EïHî"ïHsî&¸ïHqîïF\sîáïF\îõ qî"œïF\î#UïF\sîïDµîLîáî'ê îïC îîœî)_ îïAfîî—îU îï?¾îaîö îvîï> sîäï> î-î! î)ç qîï sîï9îA îBï/7 î;î±î"†î$?î'î)]î-?î/´î4•î78 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î^ïQðqî ýïPIsî ýïLú qî$ïLúîÞïLúsî–ïLúî{î ýïKR qî½ïKRîvïKRsî/ïKRîî ýïIª qîÒïIªî‹ïIªsîDïIªî)î ýïHqîñïHî«ïHsîçïHîÌî ýïF[qîRïF[î ïF[sîHïF[î-î ýïD´ qî"ïD´îÛïD´sî”ïD´îyî ýïC qî8ïC îñïC sîªïC î�î ýïAe qî”ïAeîMïAesîïAeîêî ýï?½ qî}ï?½î6ï?½sîïï?½îÔî ýï> qîÌï>î…ï>sî=ï>î"î ýïï:Çî÷ï:Çsî¯ï:Çî”ð#î ýï9qî�ï9îHï9sîï9îæî ýï7xqîúï7xî³ï7xsîlï7xîQî ýï5Ð qîþï5Ðî·ï5Ðsîoï5ÐîTî ýï4)qîfï4)îï4)sî×ï4)î¼ð"î ýï2�qîQï2�î ï2�sîÂï2�î§vî ìï-‹ îÓî¤îž uî ýï+sî.ï+qî+ï+îÓï+sîäï+ î ¹ î)mî.òî4Î î=v î ýï)hî„ îËîXî ¸î$* î+Öî-c î5‰î9=î ýï'Á î?îÌîwî%3î/úî1‡qî7 ï'Áî7ßï'Ásî=ï'Á î ýï& îî�vîï$rî- î' î} î% î,‡î6îáï"Ëîî$î*± î2 î6cîï!#î4î'î7î‹î!]î#7î'Øî*{î,Ïî.÷î3î6Ôî:˜î=<îAÓîáï| îoîA î¦î!òî%1î'Ýî* î/ÿî4oî7_î:ôî>1î@~îC îEÝîáïÔîÎîtîÀ î!‚î#Îî'}î(é î/ÿî1¤î5Šî7Öîm îEÂîáïÞ îîÁîî'8î)„î-3î.Ÿ î4uî6î< îBŠîD}îáï7 îï�îÒî¢îöîbî§îMî$°î&^î)Mî+î,; î3»î6Iî:ÓîC£îEîáïè îfî îvî†î! î'çî,hî.¼î3Rî6¤î;Yî?<îA!îC„îF‹îáïAî»îtîgsî ýïò îeî@î%qî‰ïòîBïòsîmïòqîÑïòsî&ïòî&kïòuî ýï vsîéï vqîçï vîŽï vsîŸï v î!u î*)î/­î5‰î<�î ýï Ïî¤ î îè î'Gî*Ðî0¬î29 î:š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};wîHDïg/sî ýï_, î?îÌîwî%3î/úî1‡qî7 ï_,î7ßï_,sî=ï_, î ýï]… î î¿vîï[Ýî- î' î  î(Kî2Cî=® îáïZ6î`î’î$•î* îïXŽîïî“îUîŠîOî£î#sî'7î-…î0uî2Eî6î7Hî<îB¸îDqîáïVç î«îQî�î!5î$|î&Èî*ªî-?î1›î6î8Qî=uî?îAeîE“îáïU@îÑîsîîbî¶î"î"‘î$k î+Jî.Hî1î3²î8õî;Aî@&îAÊîDÐîáïS˜î…î‰îìî˜î1î …î&,î)~î-€î1‚î4Eî7äî9Pî>\îCîGîáïQñî-î'î-îªîöî!¥î#î(Tî)ùî+Éî,ýî2î3¼î8’î<Œî@™îE/îáïPJî…îÑ î îUî¹î$ î(öîïN¢îÒî&î’î<î7îlî ¿î&Yî'üî+:î-Ýî0Ùî4+ î:$ xîA ïN¢îBPïN¢vîEÕïN¢îáïLû xî"ïLûîÓïLûvîÓïLûî¯ïLûîøîL î%wî'Ëî)ßî+ƒî0î4iî8Lî; îáïKT î\î î"yî%Í î-!î3) î;ëîA©îCŽîáïI¬îÛîéîî7î"ªî&¤î,î-¹î0È î8…î<�î@ÉîE×îïHîœîèî~îê îoî!î"ú î*‡î-ƒî<‡î?+ îF+îáïF]îî6îùîW î& î, î1Éî4î6iî9;î;Üî@ÿîB¥ îáïD¶î9î�îÙî‹î ³î"ÿî'Ÿî)Eî-(î/tî1Èî4iî9�î>„îA—îBíîáïC î2îÒî!¿î#eî%±î ìï> îÓî¤îC î ýï:ÉîÊîòîìîJ î!î.Òî1Âî3‘î7}îï9"î›î_ îìîXîKî!qî%Ñî'vî+Èî0¾î2î4Œî7µî;·î?ÿ îEÒîG‹îáï7zîîÎîq î‚î;î#—î%ã îï5Óî›î_î³î îÀîeîÛî!î%Œî'gî)ÿ î1Qî6Gî9Þî;î@q uî ýï3WsîCï3WqîAï3Wîéï3Wsîúï3W î Ï î)ƒ î1e vîï1°î-î` î“îï0î îí îËî æ î(î*´î,�î/=î2î6åî8ˆ î@•îCÔîáï.aîÚîÍî[î9î ¥î$ î&nî(Ñ î/Eî3xî5Ì î<âî>‡îAÙîD±îáï,ºî5î(îNî î#Oî&Ñ î-Éî1wî4Pî8î:­ îAþîERîáï+îjîŸîóî÷î[î"aî$­î*� î1‰î4-î71î9”î>î@žîDîFîáï)kî¯î&î*î‚î îYî#äî(î)­î,Ôî1«î3÷î6Kî:îTï sîCŒï î ýï 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).IfthewîHDïg/uî ýï_,sîï_,qîï_,î¬ï_,sî½ï_, î'’ î0F î8( qî@Mï_,îA!ï_,sî ýï]…îç vîï[Ýî-î` î“uî ýïYb sîVïYbqîTïYbîûïYbsî ïYb î&â î/• î7x qî?�ïYbî@qïYbsîE¨ïYbî ýïW» vîïVî-î` î“îïTlîîî!îVîPîæî%!î(Aî*�î-î0î3úî6Gî8›î;; îAEîEÏîáïRÄ î\îƒî¬î"î$×î)øî,Eî/–î3 î9‡î1îBîDLîáïOv uî ýïLú sîïLúqîïLúîÄïLúsîÕïLú î&« î/^ î7A î?[î ýïKS vîïI¬î- î®î!-î'_ î/’îïHîî7îQî�îñî#Cî$üî&Tî)Dî,3î-ìî0Vî6xî8îAEîDîáïF]îÑîÍî�îoîIî âî%ƒî*îî,“î3Nî4ƒî7}î9Ðuî ýïCâsîÀïCâqî¾ïCâîeïCâsî vïCâ î)L î1ÿ î9â qîBïCâîBÛïCâsî ýïB:î—vîï@“î-î` î“uî ýï>sî…ï>qîƒï>î*ï>sî!;ï> î* î2Ä î:§ qîBËï>îCŸï>sî ýïî ÿî#Kî(—î*;î+oî-Ãî1Bî2û î9øî;Pî<¼îA»îD�î Ðï+îîóîÃî£îïî C î(î+Óî.î1‰ î8‚î<“î>ßîBIîDî Ðï)j î³îî6î )î%î&µî+mî-& î3• î:5î>Cî?èîB4îEžî Ðï'Ãîvî îòî.îÓî ìî#¾î'Gî)êî-Íî/pî3I î9�î;Õî?ŠîB- î Ðï&î$î�î‰îî¬îÓsî ýï"Íqî^ï"Íîï"ÍsîÐï"Íîµî ýï!% qî“ï!%îLï!%sîï!%qîéï!%î¢ï!%îÚï!% î$¶ï!%î'¤ï!%î,Jï!%î.dï!%sî2ï!%î ýï~qî†ï~î?ï~sîøï~îÝ î ýïÖqî7ïÖîñïÖsî©ïÖîŽ î ýï‡qî]ï‡î(ï‡sîï‡qîþï‡î ·ï‡sî"âï‡qî#Fï‡sî)|ï‡î)àï‡vî@ï‡î@}ï‡îA{îD‹îEöî1ïàîî‘î`î2î".xî#bïàî$?ïàvî+aïà î3Àî6ƒ î<àîA[îDVî1ï8îî¹ uî ýï½sî~ï½qî|ï½î#ï½sî4ï½ î$ î,½ î4  î<ºîCî ýï îˆî ¡î$ î+¿î-Lî1"vîïnî-î&î'Žî4ì î2îBPîEœîáï Ñ îî î!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]];wîHDïg/vîáï_,î±îîqîÕî’î!×î#}î%"î(Iî*•î.+î3šî5tî8Æî;^î>Üî@�îCSîFéîáï]…î- îeîrîî#¼î&î(\î+Vî,ûî/G î7àî=‘îA'îB} uî ýï[ sîáï[ qîßï[ î†ï[ sî—ï[ î$m î- î5 î=î ýïYbî= îÈî&/î)¢ î1Mî2Úî7vîïWºî- î'î#‹ î+ î5îáïVî`î’ î'ÅîïTkîjîpî®î]î!‚î#(î%tî)î.ðî0Ê î7§î9Kî;˜î?LîEîáïRÄîŠî.îzîÎ î!&î$! î+¤î-2î/~î3Nî5¢î7î9qî>/îBtîDîE¾îáïQî-îÃî2î î^î!öî%tî'î)ìî-‚î/uî1Á î7ùî<î>©îDOîFœîáïOuîÛî€îÌ îeî$î'¬î) î/Qî2î4hî7´î:Ûî>îBŽîáïMÎuî ýïKRsî~ïKRqî{ïKRî#ïKRsî4ïKR î$ î,½ î4  î<¹îCî ýïI«îo îî¨î~vîïHî- î®î!-î'_ î/’îïF[ î:îÒîPîCî�î#þî'³î)Vî+¢uî ýïCà sîÈïCàqîÅïCàîmïCàsî~ïCà î%S î. î5ê î>î ýïB9vîï@‘î-î­îß î(îï>éîœîèîWî î¯îüî!Pî#¤î'èî)Žî*Ãî.Yî0Lî5ˆî8¨î<î?îD3îáï=Bî·îGî²îþîŠ î$¨î&Mî*f î1iî3 î5¦ îî?¥îáï·îïîp î›îTî#Ãî%�î(ï î/aî1\ î7‡î:ƒî<ÏîBÝîD�îáïî5îµîñîìî"kî$î)Tî+¡î05î2«î3àî9#î³îA™îD<îáïXŽ î îýî`î0î ½î"—î%/îïVçî*î‰îÕ î< î$‰ î.ãî1‡ î8Ë î>öîD îFßîáïU@ îoî>î}îyî*î,/î/� î6hî8! î@jîE�îáïS˜î-îÜî¬îøî)î "î!Ûî#î(+î)Îî,î0î4"î8¸î:÷î=î?kîB›îFíîáïQñîåîxî îÝî)î!}î#Mî&‹î)‡î5!î7=î:›î>•îC¬îáïPJîóî?î îsî B î%Èî(l î/Âî4Úî7«î9øî=¦î?vî@«îEÅîáïN¢î-î'î5îËî î"2î$~î'Cî+¶î.î0åî4„î: î;äî>0î@…îAðîFþîáïLûî-îuîoîîî Äî#î%ÕîïKSîœîîs îbîî §î"ôî&öî*&î+Ëî1Œî3Øî6� îáïI¬ð"î#”î$ÿî)Cî,–î/hî0¾î5ú î<&î>yîCîDàîáïHîwîîîjîòî!\î"ÿî%K î+wî.g î5Íî8ôî<î@ª uî ýïEŠ sîÐïEŠqîÎïEŠîvïEŠsî‡ïEŠ î&\ î/ î6ò vîïCâî-î` î“îïB;î^î“î—î‘ î Ýî"ðî$äî'0î+Äî1kî3³î9ýî;ð îD#îáï@“îÜuî ýï>sî~ï>qî|ï>î$ï>sî5ï> î( î0¾ î8  î@º qî ýï�îD(îáï7zî…î¹îrî§ î|îoî"î$8î&›î(ç î/àî2Vî8¯î;Gî@)îAÎîDîáï5Óî4îîRîèîŽî"#î'î(tî*×î/Gî2[î4î6L î=Eî@ îG¢îáï4,îîæuî ýï1°sî¯ï1°qî­ï1°îTï1°sîeï1° î"; î*î î2Ñ î:ëî>] îF î ýï0 îÓqîxï0 sî„ï0 î vîï.bî- î®îà î%îï,ºîîkîœî–îÈî#î$Sî'Mî)@î+Œî.-î3Ôî7'î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î ìï_,î ìï]„î îöî ýï[Ýî¤î—îüî‰îÎîÝî ýïZ5îøîëîhîõî;îJî ýïXŽîÓîÆî+î¸îþî qî ìïVsî ýïTkî ìïQïqîÛïQïîÁïQï sîûïQïqî ýïPHsî ýïLù qîÒïLùî‹ïLùsîDïLùî)î ýïKQqîúïKQî³ïKQsîlïKQîQî ýïI© qîiïI©î"ïI©sîÚïI©î¿uî ýïG.sîéïG.qîçïG.îŽïG.sîŽïG. îc î&qî2_ïG.î3ïG.sî6ïG.qî7›ïG.î8TïG.sî:ÇïG.qî;®ïG.î<‚ïG.sîAºïG.î ýïE‡vîïCßî-î&îïB8îîEîôî˜ î!î%ýî'2î)÷ î1Hî3pî7Sî9Ÿî=€îAÒîGîáï@�î†îVî¢ î%î³î)Óî,kî.î1î4îáï>éîTîðî”îÿ î#ëî&Nî'óî+.î-Çî/jî1¶î5—î9ƒî;] uî ýïlî@%îAZîáï7wî°î£î³ î ­î%Çî)ªî+î.· î5úî7Ôî: î>rîáï5Ð îÃî� î!î!1î'\î+óî.Ÿî1¤î4î7Bî95î= î>ÐîB<îáï4(îºî·î\îAî "î"î$aî(Bî,”î2°î4¶î9>î<ªî>î@îFCîáï2�îzî®îCîÏî÷î�î"®î$Quî ýï0sîFï0qîDï0îëï0sîëï0 î$À î-tî2ùî8ºï0qî=™ï0î>Rï0sîAHï0qîBÕï0îCŽï0sîFï0îFdï0vîï.^î-î&î'¯î2Ÿî8Ñ îï,·î îëîæî#xîï,·îÁï,·vî"+ï,·î#ï,·î'7î)2 î/ýî3î5?î7Ø î@hîEüîáï+î†îtîoî}îî"oî'Iî+Éî1íî5¬îáï)hî¥îûîGî ü î&Þî(¸ î0wî1âî4Fî5{î:•î<9î>… îáï'Áî¸îßîxî6î 2î$î'î+Kxî-0ï'Áî-àï'Ávî0àï'Áî1½ï'Áî5íî:Žî>œîC2îáï&î†îîCîÜ î"lî(sî ýï"Êqî«ï"Êîdï"Êsîï"Êîî ýï!"qîiï!"î#ï!"sîÛï!"îÀuî ýï§sî¥ï§qî£ï§îKï§sîJï§ î î%Óî+Xî14î ýïvî1ïî«ïî·sî#¤ïî$�ïqî* ïî+Yïsî.Pïqî/Üïî0–ïsî3zïqî4bïî56ïsî:mïî@åvî ýïYî‚î© sî¤ïYî€ïYî%Cvîï±î-îï îîEîôî˜ î!î&ºî)Œî+Ø î2Ñî4¡î9¥î;Kî=—îCîFîáïbî- î'îœîZî%äî'�î,Êî0ñî5+î9Ãî<îAÅ îáï»îî{îÒîÈîmî#†î$»î)î.xî2Õî5Åî9Yî<—î>ãîAq îáïî…îîîî¤î$Èî&4 î-8î04î1Šî<²î>—îC¾îáïlxîÆïlîïlvîéïlîÆïlîiîÇî¬sî ýïñqîâïñî›ïñsîwïñî±î ýï uqî¸ï uîqï usîNï uî#ð$ÿ VTVm$2END.CHANGELOGChangedbyMBrownonJanuary21,198310:28pmAddedcreateLocalWorkerparmtoCreate.Renamedtrans->transIDtobeconsistentwithAlpineFile.ChangedbyMBrownonMarch1,19833:29pmMovedAssertAlpineWheelhere,fromAlpineOwner;itnowraisesOperationFailed[notAlpineWheel]insteadofAccessFailed[alpineWheel].wîHDïg/qî ýï_lsî…ï_lqî ìï\ñî…ï\ñsî ìïZvî¾î¹îî…î±î ïî$5î'ôvî ìïXÎîîáîaîî$>î*+î-—î/Eî4`î6î7Ô î>îA sî ìïVSî¾î¹îî…îëîxî"¾î%Ìvî ìïT¬î[îùîLî Š î).î*†î-`î1 î;î ¿ïSîUîø îò #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Žî¤î—îüî‰îÎîÝî ýïVæîøîëîhîõî;îJî ìïS—î ®îBîåîßîd î%?î'“ î0î1¦î4xî9î=kî@ÓîCÃî ¿ïQðîýîàîŒ îÞ î$î(î,¸î/[î4ðî9pî<ùî>�îB–î ¿ïPIî£î…îÙ î¯î‰î!—î&-î*‰î-[î/¯î0äî6/î7Óî:î ìïN¡î Ðîcîîî† î%aî'µî,âî/ î3[î<†î@hî ¿ïLúîðî“î£î�î �î&1î)î,³î1Rî3ö î;¸î>îAÔîCèî ¿ïKSî•îëî îLî†î ñ î'mî*]î-Xî/(î4+î6 î<Âî?›îCíîE’î ¿ïI«î} î î½î uî#à î*[î,¯ î3M î:Nî=@î@‹îB[ î ¿ïHî îçîî±îVð$qî ìïE‰sî ýïCáî ìïAf qîíïAfîÒïAf sî ïAfqî ýï?¾sî ýï sî ýï:È qîÒï:Èî‹ï:ÈsîDï:Èî)î ýï9 qî”ï9 îMï9 sîï9 îêî ýï7y qî}ï7yî6ï7ysîïï7yîÔî ýï5Ñqîúï5Ñî³ï5Ñsîlï5ÑîQî ýï4* qîHï4*îï4*sî¹ï4*îžvî ýï/3îøî-îXî î# î+©î/Ëî2dî6½î:æî=¸î@ î Ðï-Œîdî0îiîîZî#…î'úî)Ÿî+nî0†î Ðï+åð+xî( ï+åî(Ùï+åvî+Cï+åî+±ï+åî-î/hî2 î ìï&î îÓîúî î^îÇî kî$½sî ýï#Ÿ qîï#Ÿî×ï#Ÿsî�ï#Ÿîtî ýï!÷qîîï!÷î¨ï!÷sî`ï!÷î!Eð)î ýï¨qîùï¨î²ï¨sîjï¨îOð#î ýïîfî#èî%Íð%uî ýï† sîï†qîï†î¹ï†sî¸ï† î"Ž î+Aî0Æî6¢ î ýïÞ î'îÎ î$Cî/ƒî;î<’qî ýï7sî ï7 qî]ï7îï7î\ï7sîvï7vîï�î- îU îôî'sî-¥î2¨î8îïèîî\ îˆî÷î!Ñî,Žî1aî3î4Àî7 î>î?¥ uî ýïmsîwïmqîtïmîïmsîïm î"ñ î+¤î1)î7 î ýïÆ î'îÎ î$C qî+4ïÆî+íïÆî.3ïÆsî0MïÆî ýïqî$ïîÝïsîÔïqîaïîïsî ÿïî!bïvîï wî- î' îë î(9 î/a î5ÿîáï Ïî[î&Rî4+ +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];wîHDïg/vîáï_,î`î’î$•î*îï]„îjî¶îî î qî%î']î+b î3î8î9Dî<¢î?œîA�îCÛîáï[Ýîáîðî#î#Øî&Æî(¡î-î7 îC†îDÜîFîáïZ6î…îÑî“îÿîêî Žî%} î,wî-â î5£î;pî=¼îA[îCîEaîG;îáïXŽîmîDîÌî¼îïVçîÒî$îÇîfî î!Vî&,î*Ýî.ëî1‚î4î8mî:¹î?îC$îáïU@î0îÓîÆîÀî Àî#ƒî'Õî*yî0î1»î4î8Þî=:îAHîC‡îáïS˜î>î‹î¢îðî!”î#‡î'�î+üî-Šî/}î3Ûî5F î;î<Áî? îBx îáïQñîCî�î�î3î �î#Rî&\î0î3Ñ î;Ë îDÉîáïPJ î î[îÇîËîïN¢îœîxîõïN¢î®ïN¢vî œïN¢î#@ î)kî.›î2¶î5Àî?vîáïLûîÚî&î'\î)¨î,Ñî.tî0oî4¶î6\î8¨î<¡îBîáïKSî-îœîRî =î"‰î%²î*—î,:î/î2Òî4Åî7î;²îïI¬îeî`î™î î"; î(wî*Ëî0¬î4¦î8³î;wî?ÐîB÷îF«xîáïHvîïHîºî³xî™ïHîRïHvî»ïHîïF]îOî¬îQîDîRî èî#'î&î)Rî3Kî>ñîA´îáïD¶ î îEîÂî zî$î&Aî*Oî.åî1$î5Íî7†î:Wî=î?¾îBLîáïCîm îÞî!±î$î'î){î.î0]î5Iî6ìî:‹î?§îCGîE$îáïAgî†îîî î°î>î }î!Õî$Åî&•î,‹î.0î2Ïî4Âî9¿î<ýî ìï~îDî ¿ï:Éî×î�îƒîÕuî ýï8Nsîéï8Nqîçï8NîŽï8NsîŽï8N îc î&î+œî1x îˆuî ýïØsîîïØqîìïØî”ïØsî“ïØ îi î(î-¡î3} î ýï0 î' î!1 î)¦î4æî@hî ýï‰qîOï‰î#ï‰sî[ï‰î#e î+Ú qî2Ëï‰î3„ï‰î5Ëï‰sî7äï‰vîïáî- î' î › î'à î.bî8áî?îDîáï:îï’î¡ îÆîîî:î#4î)– î2²xî4—ï’î5sï’vî76ï’î:Øî<Ë îDåîáïëîÛxîÀïëîœïëvî_ïëîËî)îÎî"î$¨î&Lî(? î0Yî3iî5ÿî9}î;Éî?™îC“îáïDî‡îåî{î î^ î$ºî(�î* î,Uî0œî2Ä î9 î:üî=\î?îáïœuî ýï!sîï!qîï!î¿ï!sî¿ï! î$” î-Hî2Ìî8¨ î ýï z qî2ï zîï zsî=ï zî#É î,ªqî2œï zî3…ï zsî5ï zî5îï 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.wîHDïg/vîï_,î- î' î › î'à î.bî4”î:·îï]…îî@ î ’î$Tî& î*šîï[Ý îïZ6î®îîfîKîîî"lî$î&^î,<î/Æ î8î9€î;Ìî@±îBTîáïX�î6îÜî<î>î “î#ƒî(î,pî0k î8ºî:Ÿî@bîBûîáïVçîwî îGî!@î.Sî/ˆî2î3 î<Òî>>îC�îáïU@uî ýïRÅ sî¥ïRÅqî£ïRÅîKïRÅsîJïRÅ î" î*Óî0Xî64 î ýïQ î'qîïQîïQsîŽïQîñïQvîïOvî- î' î › î'à î.bî8ZîáïMÏî§î!Úî'üîïL(î×î î« î#“î%6î'‚î+|î1Zî6%î7}î9#î<�î@îB»îáïJ€îÅî î=î „î"Ðî, î5rî6Þî:¿î<çî@hîB´îáïHÙîgî·î-î!î$Âî.»î<&î=ßîAaîáïG2 î“î7î0î!¶ î(1î-µî0Aî1æî5 î:ìî<¥ îB’îEUîáïEŠîÛîaîµîÌî ½î"bî'Íî,Å î5Õî9”îáïCãî{îÑîî$-î)³î/î2qî5‘î8*î;ØîáïB< îñî±î%©î0èî2>î5©î7î9xî>0îBÐîFoîáï@”î-îÎî¤îIî Vî"¢î ìï;žsî ýï9# qî¦ï9#î`ï9#sî<ï9#î"øî ýï6¨ qî³ï6¨îlï6¨sîIï6¨îî ýï4-qî¸ï4-îqï4-sîNï4-î#ð$î ýï1²qî�ï1²îFï1²sîžï1²î ýï/7qîâï/7î›ï/7sîwï/7î±qî ýï+é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î¤î—îüî‰îÎîÝî ýïX�îøîëîhîõî;îJî ìïU@î üîhî[î îpîðî",î#„î%)î),î*Òî-î2²î4Ïî9eî;î?©îCî ¿ïS™ îŠîÖ îGî !î!Åî&eî+qî ìïQsî ýïOvî ìïLû qî�ïLûîƒïLû sî½ïLûqî ýïKTsî ýïH qîÒïHî‹ïHsîDïHî)î ýïF^ qî"ïF^îÛïF^sî”ïF^îyî ýïD¶qîúïD¶î³ïD¶sîlïD¶îQî ýïC îNîÒî·î ýïAhqîQïAhî ïAhsîÂïAhî§î ýï?À qîHï?Àîï?Àsî¹ï?Àîžî ýï>îœ î$mî&Rð$vî ìï9# uî ýï6¨ sîÜï6¨qîÙï6¨î�ï6¨sî�ï6¨ î"V î+ î0Žî6î7Ÿ î ýï5 îý î Îî"[î/Øî3K î:öî<ƒî@±qî ýï3Ysî ï3Yîivîï1²î-î`îï0 î¡ îÆîîî:î#Æî(fî,Áî.eî0ýî5Oî:æ îCÉîáï.cîtîî! î)#î+Ç î5µî7šîD,îáï,¼î@îäî1î¿îbîU îï+î¤î×î#î=îáî Úî$Þî'2î,äî/¨î5Aî9î:nî<'îA&îB´îáï)mîÆ î™î=î! î#…î&Òî)Ýî,uî.Áî40î7)î9î;iî@Çîáï'Æî”îBîwî{îu î&4î)î+Rî/òî3Éî6^î:éî?uîA�îáï&î<îàî, î!î%°î&äî*Cî-<î2­î4¨î8(î<6î=Ûî@'îDÇîáï$wî îUî°îSî  î$™ î*õî0î2Þî4Òî7î;¾î@‡îC îáï"Ðî-îâî‡îWîJîb uî ýï Usîîï Uqîìï Uî”ï Usî“ï U îi î(î-¡î3%î4² î<á î ýï® î'î™ î"Eî#Ñî'ÿqî+¿ï®î,“ï®sî1Êï®qî8ï®î8Íï®î;ï®sî=.ï® vîïî-î`îï_îîkîªîNîrî$–î&;î(‡î-ö î6Žî;êî=Uî?îáï¸ uî ýï=sî²ï=qî°ï=îXï=sîWï= î%- î-àî3eî8éî:v î ýï•îî5î¨ î%Sî&àî+qî.Íï•î/¡ï•sî4Ùï•î ýïîvîïFî-î` îïŸîîk î¼î!`î#¬î(Lî," î2Åî5î:€î?xîDÔîF@îáïøî î ìï ÿÜTVm$2AccessFailed:ERROR[missingAccess:AlpineEnvironment.NeededAccess];Unknown:ERROR[what:AlpineEnvironment.UnknownType];StaticallyInvalid:ERROR;END.wîHDïg/sî ýï_, qî¦ï_,î`ï_,sî<ï_,î"øî ýï\±qîâï\±î›ï\±sîwï\±î±î ýïZ6qî�ïZ6îFïZ6sîžïZ6qî ýïVçsî…ïVçÿ�TVm$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î ìï_,î ìï]„î îöî ýï[ÝîÓîÆîfîóî9îHî ýïZ5îPî†îîXîqî ìïWºsî ýïVqî5ïVsîdïVîÇïV î%{ î+Å î3ß î=Hî1ïTk îZ î ýïRÃqî¸ïRÃsîçïRÃîJïRÃî ýïQqîfïQsî•ïQîøïQî ýïOtqîUïOtsî"„ïOtî"çïOtî ýïMÍqîïMÍsî FïMÍî ©ïMÍî ýïL%qî?ïL%sînïL%îÑïL%î ìïIª qîïIªîÑïIªî� sî¡ïIªqî ýïHsî ýïD³ qîiïD³î"ïD³sîÚïD³î¿î ýïC qîHïC îïC sîºïC îŸî ýïAd qî ïAdîÃïAdsî{ïAdqî`ïAdî4ïAdsî§ïAdîþïAd î ýï> qî¦ï>îzï>îÂï>sî Xï>î*î ýïï0Øîï0Øsî,ï0Øîï/1îïð,îï-‰îñð%îï+âîµð&îï*:îqð'îï(’qîîï(’î§ï(’îíï(’îï(’îÒï(’sî"aï(’îï&ë î�îï%Cîîï#œ î uî ýï! sîéï! qîçï! îŽï! sîï! î~ï! î| î$Æî(ôî.Æqî0Sï! î1;ï! sî2^ï! î3;ï! î6I î?ÜqîAiï! îB=ï! sîC¯ï! îDï! qî ýïysî ïyvîïÑî-ð"î&¥ î.lî: îáï*î$ îïƒ îî6îûîî"Üî$�î&Íî+î0^î5Íî7§ î=pî@ îF®îáïÛîH îjîfî²î#”î%‡î)jî,<î1{î2æî7Ýî;’xî=wïÛî>TïÛvî@ïÛîD?îGôîáï4î-î îñî”î!î#Qî%Ýî)î+gîïŒî_îµîêî€îîLî!î$î&8î6Fî8Þî>¨îBÐîE¢îáïåîÃî9îî¼î"Dî%¤î'ðî,Oî.ïî4î8¯î:ûî?YîBvîáï>îÄîaîŸîpî î$ î%Bî(sî ýïÂqîºïÂîtïÂsîPïÂî&î ýï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.wîHDïg/vî ï_,î]îòî"§î&Kî(î ï]… î]îòîÔî ï[Ýî-îUîî#œîïZ6îÒîRî3îCîxî#¥î&¡î+Öî0< î6 î8Yî ïX�î#îî'Dî+þî1î3ðî5À î?«îAdîEFî ïVç îŒî�î rî!Þî ïU@î%õî)Kî. î5î7ÿî9Î îCºîEsîòïS™qî ýïOvsî…ïOvvî ìïL(î çî ýïHÙîžîqî9îvî!¼î$Êî(î-Uî.úî1Bî5Îî7t î>½î ÐïG2 îRîõÿÝTVm$¸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î ìïW¹sî ýïVqîOïVî5ïVsî~ïVîâïV î%€î*Tî0‡ î8¡ î1ïTj îš î#´î.Ò î7G î>¦î1ïRÃîÿî(™î3¸ î=€ î1ïQî ýïOt qî¼ïOtsîëïOtîNïOt î” î'lî4… î1ïMÌî ýïL% qîŠïL%sî¹ïL%îïL%î ìïI©qîoïI©î:ïI©îê sî ïI©qî ýïHsî ýïD² qî½ïD²îvïD²sî/ïD²îî ýïC îd îåîÊî ýïAbqîñïAbî«ïAbsîcïAbîHî ýï?»qîRï?»î ï?»sîÄï?»î©î ýï> qî"ï>îÛï>sî”ï>îyî ýïï0Õî÷ï0Õsî¯ï0Õî”ð#î ýï/-qî7ï/-îñï/-sî©ï/-îŽî ýï-… îeî@î%î ýï+Þ qîþï+Þî·ï+Þsîoï+ÞîTî ýï*6qî†ï*6î?ï*6sîøï*6îÝî ýï(Žqîfï(Žîï(Žsî×ï(Žî¼ð"î ýï%? qî¦ï%?îzï%?îÂï%?sî Xï%?î*î ýï#— qî³ï#—î‡ï#—îÏï#—sîeï#—î#;î ýï!ïqî¸ï!ïîŒï!ïîÔï!ïsî"jï!ïî&?ð$î ýï Gqî�ï Gîaï Gî©ï Gsî!ºï Gî ýïŸqîâïŸî¶ïŸîþïŸsî“ïŸî"Íî ýïøqîïøîRïøîšïøsî#ïøî ýï|qîVï|îï|sîÈï|qî­ï|î�ï|sîwï|î ýïqîèïî¡ïsîYïqî>ïîïsî,ïîïYîïîï± îñ vî ýïbî Ûîîºîîç î"Oî$wî&à î/\î3® î:µî<°î>Tî@  î Ðïºî{î!îºîDîÒî Ÿî#ûuî ýï ?sî.ï ?qî+ï ?îÓï ?sî`ï ?îÃï ? î î.² î7Z î@9î ýï ˜ îDîÑî1î£ î'Oî(Ü î1î4¶î>í ÿ 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.wîHDïg/sî ýï_,î Šî5îñî%¸î'Eqî,Éï_,î-�ï_,sî2Pï_,î2³ï_,î7´î<ìîAruî ýï\±sîéï\±qîçï\±îŽï\±sîï\±î~ï\± î »î/mî6sîBºî ýï[ îs îA î" î&)î,î-’ î5Øî ýïYb î?îÌîwî%3î/úî1‡qî7 ïYbî7ßïYbsî<’ïYbî<õïYbîAõî ýïW»qî¡ïW»îuïW»sîkïW»uî ýïU@sîCïU@qîAïU@îéïU@sîuïU@îØïU@îÙuî ýïRÅsîÞïRÅqîÛïRÅîƒïRÅsîïRÅîsïRÅîsuî ýïPJsî~ïPJqî|ïPJîaïPJî˜sîÍïPJî 0ïPJî%0î*hî0¾î6þ î ýïN£îî‰ î$4î%Áî)—uî ýïL( sîáïL(qîßïL(î†ïL(sîïL(îvïL(î vî%®î,î2E î9Ïî ýïJ€îo îî¨îáuî ýïH sîïHqîïHî¹ïHsîEïHî¨ïHî"©î'áî3 î:¡î<. îDtî ýïF^ î©î6î qîËïF^îŸïF^sî"RïF^î"µïF^ qî)¦ïF^î*_ïF^î,¦ïF^sî.¿ïF^uî ýïCãsîwïCãqîtïCãîïCãsî¨ïCãî ïCãî# î(D qî/4ïCãî/îïCãî24ïCãsî4NïCãî@î ýïB< î©î6îouî ýï?Ásî~ï?Áqî{ï?Áî#ï?Ásî°ï?Áîï?Áî î%Kî+¡î1áî5S î<ÿî>ŒîBbuî ýï=F sîÈï=FqîÅï=Fîmï=Fsîúï=Fî]ï=Fî!]î&•î,ëuî ýï:Ësîï:Ëqîï:Ëî¬ï:Ësî8ï:Ëîœï:Ëî#œqî(ßï:Ëî)³ï:Ësî.fï:Ëî.Éï:Ëî3P uî ýï8P sîVï8PqîTï8Pîûï8Psîˆï8Pîëï8Pî"ëqî(.ï8Pî)ï8Psî-¶ï8Pî.ï8Pî1‹ uî ýï5Õ sîï5Õqîï5ÕîÄï5ÕsîQï5Õî´ï5Õî"´î'ìî+_ uî ýï3ZsîÀï3Zqî¾ï3Zîeï3Zsîòï3Zî Uï3Zî%Uqî*˜ï3Zî+lï3Zsî0 ï3Zî0ƒï3Zî:¹uî ýï0ßsî…ï0ßqîƒï0ßî*ï0ßsî ·ï0ßî!ï0ßî&qî+]ï0ßî,1ï0ßsî0åï0ßî1Hï0ßî<uî ýï.dsîNï.dqîLï.dîóï.dsî €ï.dî ãï.dî%ãî+î5×uî ýï+ésî¯ï+éqî­ï+éîTï+ésîáï+éîDï+éîDî#|î&ï î.šî0'î3ýqî7¼ï+éî8�ï+ésî=Dï+éî=§ï+éî@Ì uî ýï)nsîxï)nqîvï)nîï)nsîªï)nî ï)nî î#Eî&j î-Éî1; î8çî:sî>¬uî ýï&ósîï&óqîï&óî¶ï&ósîBï&óî¥ï&óî#¦qî(éï&óî)½ï&ósî.pï&óî.Óï&ó î7|uî ýï$x sîÐï$xqîÎï$xîvï$xsîï$xîeï$xî"fuî ýï!ýsî~ï!ýqî|ï!ýî$ï!ýsî°ï!ýîï!ýî$î)L qî0<ï!ýî0¦ï!ýsî2Hï!ýî2«ï!ýqî ýï‚sî…ï‚vî ìï3î çî ýïäîžîqî9îvî!¼î$Êî(î-Uî.úî1Bî5Îî7t î>½îA¹ î Ðï=î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î ìïWºsî ýïVqî5ïVsîdïVîÇïVî) î3ß î:) î1ïTk î4 î#žî1î<9î1ïRÄ î¦î&€î6P î=¯î1ïQ îøî#+î ýïOu qî„ïOusî³ïOuîïOuî ýïMÎqîYïMÎsîˆïMÎîëïMÎî ìïKSqî ïKSî×ïKSî‡ sî §ïKSqî ýïI«sî ýïF\îfî#èî%Íð%î ýïD´ qîiïD´î"ïD´sîÚïD´î¿î ýïC qî"ïC îÛïC sî”ïC îyî ýïAeîœ î$mî&Rð$î ýï?¾qîiï?¾î#ï?¾sîÛï?¾îÀî ýï> qî”ï>îMï>sîï>îêî ýïï!÷îï!÷sî,ï!÷î�ï!÷îªî+Vî0Ûvî ýï¨î Ûîîºîîç î"Oî$wî&à î/\î3® î:µî<°î>Tî@  î Ðïî{î!îºîDîÒî Ÿî#ûî8ßî:Òî=îB î ÐïYîzîÆîáî„î~ î%\î'„î2‡î@pî Ðï²uî ýï6sîéï6qîçï6îŽï6sîŸï6 î yî-%qî9lï6î:%ï6sî?‘ï6qîAï6îA×ï6sîDIï6qî ýï�sî ï�îluî ýïsîìïqîêïî’ïsî ¢ï î(|î5(î:¬î ýïmqîEïmîþïmsîiïmqîöïmî ¯ïmsî#"ïmqî$ ïmî$Ýïmsî*ïmî/xuî ýïñ sîoïñqîlïñîïñsî¡ïñîïñî"î'< î/ uî ýï vsî¥ï vqî'ï vîÏï vsî\ï vî¿ï vî¿î"÷î/ î;¬qîAÌï vîB…ï vsîGðï 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.wîHDïg/uî ýï_,sîFï_,qîDï_,îëï_,sîxï_,îÛï_,î$Ûî*qî.òï_,î/«ï_,sî4’ï_,î4õï_,uî ýï\± sîtï\±qîrï\±îï\±sî¦ï\±î ï\±î$ î)A î4? î?hî ýï[ î©î6îcqî#ï[ î÷ï[ sî"ªï[ î# ï[ qî(ôï[ î)­ï[ î+ôï[ sî.ï[ uî ýïX�sîaïX�qî_ïX�îïX�sî!“ïX�î!÷ïX�î&÷î,/ î6/ îAî ýïVçî{îí î$˜î&%î*Sqî.ïVçî.æïVçsî3šïVçî3ýïVç î ýïU@uî ýïRÅsî8ïRÅqî6ïRÅîÝïRÅsî$jïRÅî$ÍïRÅî)Îî/î6 î=>î@–ïRÅ î ýïQî Šî¸qîwïQîKïQsîÿïQîbïQ î&_uî ýïN£ sîÕïN£qîÓïN£îzïN£sîïN£îjïN£î!kî&¢ î1  î<Éî ýïLû îs qîcïLûîïLûîcïLûsî }ïLûî0MqîÏ î ýïCîqî§ïCî�ïCsî³ïCî�ïCî#Ïî/Qî0Þqî=0ïCî>ïCsîB·ïCîCïCî ýïAh îs qîcïAhîïAhîcïAhsî }ïAhuî ýï>ísîÿï>íqîýï>íî¥ï>ísî!1ï>íî!”ï>íî&•î+Í î6Ê îAôî ýï=F îsî²î+4î,Áqî9ï=Fî9çï=Fsî>›ï=Fî>þï=F qîEîï=FîF¨ï=Fî ýï;žsîï;žuî ýï9#sîcï9#qî`ï9#îï9#sî!”ï9#î!øï9#î&øî,0 î7- îBWî ýï7| îsqî&±ï7|î'jï7|sî,Õï7|qî.bï7|î/ï7|sî2ï7|î2Ýï7| qî9Íï7|î:†ï7|î<Íï7|sî ýï5Õuî ýï3Zsîï3Zqîï3Zî«ï3Zsî#8ï3Zî#›ï3Zî(›î-Ó î8Ñ qî ýï1²sî…ï1²îèï1²î î ñqî&ãï1²î'Ìï1²sî)Xï1²î*5ï1² î1]î;âî ýï0 uî ýï-�sî‘ï-�qî�ï-�î7ï-�sî Ãï-�î!&ï-�î&'î+_ î6\ îAkï-�qî ýï+ésîrï+éîÕï+éqî ýï)nsî…ï)nvî ìï&î çî ýï"Ðîžîqî9îvî!¼î$Êî(î-Uî.úî1Bî5Îî7t î>½îA¹ î Ðï!)îtÿ’TVm$ 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î,#î.ƒî4·î7çî9 qî;�ï[¦î·îAŽîCéî ìïLÄî K î¬îéîî mî%-î'X î-ýî/ûî3fî6Kî:´î>äîAáîD¥î ìïKî òîxî½î•îî~îbî î$¡î' î ìïH¡îpî]î¯î(î)îQ î%¤î(Zî-pî2„î9iî<�î@5îB“ î ìïFúî @ îZ î;î'î ® î)Úî+† î5!î8$î:kî>ÙîBÍîE¹î ìïESî0îèî,î”î…î Wî"”î%5î+_î- qî ýïBsîï@]qîï@]îþï@]sîbï@]î î%B î-F î5îBï>µîaîï= qîµï=î›ï=sîÿï=îï;fqî¼ï;fî¡ï;fsîï;fî¬îï9¿qîAï9¿î&ï9¿sî‹ï9¿îi î%§î6J î=: îBï8îWî$_î-Œî1bî8‚îBï6pîï4Éqî*ï4Éîï4Ésîtï4Éqî×ï4Éîvï4Ésî¡ï4Éîï4Éîï3!qîÃï3!î©ï3!sî ï3!qîpï3!îDï3!sî�ï3!îäï3!î ìï/Òqîšï/Òîdï/Òî/ï/Ò sîOï/Òqî ýï,„î ýï)5sîï)5qî ï)5îÅï)5sî~ï)5îcqîëï)5î¿ï)5sîüï)5pî ìï$?î]rî ìï ðî îhîqîá î]î!ßî'ìî//î4?î5ýî;ç îC™îE™î ìïHîXî» î¿î¼îfî%—î(Kî+®î0sî2¢ î9Lî;O îCôî ìï¡î jî¶î‚îTîî!!î%’vî(�ï¡î)2ï¡rî,oï¡î3 î7.î=-î?¤îDŽîGÖî ìïúî ðî–î{înîîÜî Fî%€î'h î2hî8×vî;pïúî< ïúrî>ÅïúîE�î ìïRîÚî?î·îkîî-î Ÿî#Qî%î'uî*« î2Šî6ôî9Òî>î?ÛîCjîG;î ìï«î KîÉîwîÖîî´îçî Ùî#§î'àî+øî.yî2î4Uî8 î;î>>î?ìî ìï0î î ÏîlîÝî6îrî=î"î#€qî%‚ï0î&Vï0rî(ýï0î)ëï0î,Õî0Oî4 î5ëî8\î;ìî=jîAàîDRîGáî ìï‰î Wî"îæîžîbîÍî”î Xî"à î*Zî-uî4Zî9½î?ýîEJî ìïáî ÚîîŒî îêî#'qî%«ïáî&~ïárî)%ïáî)©ïáî*Ëî-Oî3Oî5,î7¯î>­ îEîFíî ìï:îÏîyî2î­ î"©î$×î&€î,î/ vî27ï:î2Òï:rî5�ï:î9ûî<äî?îDöîG/î ìï“ îÆîBî²îSîüî"™ î(‘î-4î1«î6 î7÷î=Äî?mîCïîGáî ìï ëvîsï ëî ï ë 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.wîHDïg/vîï_,î¤îîUî¡î î# î%„î)ªî,B î3�î6~î9Êî=(îCFîáï]…sî ýïZ6 qîïZ6îÇïZ6sî€ïZ6îe vî!|ïZ6î!õïZ6xî"óïZ6î#¾ïZ6vî(SïZ6î- î4½xî8QïZ6î9ïZ6vî;ÂïZ6î<ŸïZ6 xîDsïZ6îE>ïZ6vîG–ïZ6î1ïXŽîžxî`ïXŽî<ïXŽvîzïXŽxîWïXŽî3ïXŽvîrïXŽîàïXŽsî ýïU@ qî"ïU@îÛïU@sî“ïU@îx vî#£ïU@î$ïU@î%î(î+ î3î6pî:xsî ýïQñ qîPïQñî÷ïQñî°îsî¥ïQñvîïPIî ïN¢îîVî¹ î !î%î( î*]î,Àî2+î3Ðî5  î<`î>:îBÅîE‰îòïLúî– îñîáî±î# î%Dî&yî*üî1îïKSî sîïI« vî‘ïI«î ïI«îî/îÔî!çî$Íî(ˆî-î/ªî1Mî3¢î5ZsîïHvî¢ïHîïHî î$ î%vsîïF\vîÛïF\îUïF\îRî 3î!hî'“î*eî+Ñî.4î3—î5¿î8X sîïDµ vîXïDµîÑïDµîÏîöî›î"Ÿî$Xî'¶î(ëî,î.íî0Yî4íî7{î9î;kî=¿î?xîAîC0îE|îSïC îî³î¦î!²sîïAfvîsïAfîíïAfîêî$î%Áî)î+kî.Qî0 î4žsîï?¾ vî©ï?¾î#ï?¾î îî$Zî&®î(Sî*#î-aî0] î9Vî;úî>õîBªîSï> îî `î"ùî%oî*aî,î-ëî0æî32î7„ î?lîCOîSïÞîCÅîSï PîÓ î!Nî%î'iî*Ó sîï© vîÖï©îOï©îMî.î!Ïîïî˜î ïZîã înî‰ î&8î(Ûî+Õî/¶î2+î5Tî: î<ƒî>(î?øîòï² î'îÍîî kî%“î)Ìî,žî0yî2ãî4‰î7!î:øî?ŽîCóîE™îòï î¡îïdîJsîï¼vî‡ï¼îï¼îþî"%î#Êî'î(=î*‘î.ðî0”î3óî5æî7 î?NsîïvîŠïîî#2î$×î(Ñî*î,Zî/,î3ésîïm vîïmî”ïmî’îæîãî%î){î+4î/×î2Mî6Yî:­îêîCúîG™îáïPFîuîaxî­ïPFîxïPFvîïPFî&ïPFî"6î$Ùî&~î*î.“î0ßî4ï pî ìïKOîrî ìïHî„î¹î7îî\î´î!)î%eî' î)6î/rî1½î4î6@î;Þî>îB²îE‚î ìïFYî ÄîÓîÅîNîÂî Gî&Oî)Hî-uî0yî2î4†î;jî@¯îB‰îE î ìïD±î ú î îdîîÄî"Üî$î(ñî-Mî1î3Òî8|î9è îB;îD8î ìïC î Äî²î„îhîÓî3î!Wî#î%p î,î0ûî6î;Ëî?Hî@öîB¤î ìï@Žî Äî÷ îþ î«î!c î,-î.� î5î6½î;Cî=¬î ìï>î!îQîÇî­î×î!úî&£î+û î2Fî4þî7^î<µîBˆ î ìï/î@® îG“î ìï-ˆî Jî*îâî@îbîóî î!Øî%‹ î, î-jî2Sî4î5)î8Lî9¶î>hîE+îG/î ìï+àî Uîwîs îîqî!=î"ìî$šî(dî,.î-Ü î4Gî6Ý î>î@Mpî ìï&êîŠrî ìï#šî ÷ îî@îsîî!Iî#²î* î-Úî/œ î8!î; îA¹îD‘îGžî ìï!óî5îCî|î®î<î˜î�î öî%Çî(8 î.íî0£î2Þî5ßî9z î?ùîC0îGàî ìï KîšîŠîÝîsî ýïüqîôïüî­ïüsîeïüîJvîGïüîÀïüî¾îWî Âî%{î(¹î+sî ýï¬qî•ï¬îNï¬sîï¬îë î ýï] qîï]îºï]sîrï]qîWï]î+ï]sîÊï]îïµqîïµîÏïµsîÅïµqîRïµî ïµsî"}ïµvî#Zïµî#Óïµî$Ñî&äî*Þî-Îî/sî2Nî3¤ sîï îÊî(nî)ûvî0$ï î0žï î1›î7#î:?î;ãî?ñîBïe î›î Iî"âî(iî*÷î. î4Þ î<�sîï½îEî'cî(ðvî,Lï½î,Åï½î-Ãî0î4S sîïqîÚïî“ïsî þïqî"‹ïî#Dïvî&;ïî'²î+4î-ˆî.ôî3Nî6î:éî=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.wîHDïg/uî ýï_,sî.ï_,qî+ï_,îÓï_,sîäï_,qî€ï_,îTï_,sî‘ï_,î nï_,î-r î7Þî9kî1ï]…î¸î5îÂîåî#Wî/àî1lî6Jî:¯î@ îG’î1ï[ÝîÓqîÕï[Ýî©ï[Ýsîkï[Ýqîøï[Ýîàï[Ýsîï[Ýîàï[Ý î(î6vqî8ï[Ýî8ëï[Ýsî:ï[Ýqî:öï[Ýî;Êï[ÝsîAï[Ý vîïZ5î- îUî&7î0f î9Ô îáïXŽ î¼î&Eî1Õ î9™îáïVæîïU>î-î‹î Åî'3î2"îáïS–îI î&kîïQîî4î'î7î‰îÝ î%¿î'™î+•î/Tî1øî>jîA-îáïPFî; îJîïîâî+§î/Ôî2j î9Qî=`î?õ îïNžîÒîËî%î‘îÚî#óî) î-_î2ƒî4î5hî6Ô î<öî>+îA%îB�îáïL÷îîkîyîÓî#î%–î*î-Çî1Õî4kî9@î=oî@2îC¼îáïKOî²î~ î!4î#€ î*&î+Êî.Ãî4î6èî:“î>ÛîAs îáïI¨îØîËîîOî!åî$1î(ƒ î1’î3ºî7ôî9èîïGÿîœ xî,ïGÿîïGÿvîFïGÿî#ïGÿîoîÃî!/î%¹î)ˆî+Ôî1C î8”î:" xîB²ïGÿîCŽïGÿvîDÍïGÿîE©ïGÿîáïFXî¦ î î î¶î"® î)Ùî+Eî-‘î1sî5îïD°îÒî�îìî0îÔî¤îÙî$óî&—î(ãî,ñî1‡î3Æî8…î:_î>m îEÂîáïC îîîo î$¶î'î*±î, î1òî3—î9Œ î@îAûîáïAauî ýï>sîéï>qîçï>îŽï>sîŸï>qî;ï>îï>sî Mï>î!)ï>qî%mï>î%×ï>sî'ýï>î)Šî+Çqî/’ï>î0]ï>sî6Mï>î7Úî9gî>¿ îFIîGÖî1ïî2¬îáï4"îhîï2zîïî“îUîŠîOî!¡î#õ î)×î+±î/Uî1ùî5¸î7Fî9’î>&îC îáï0Òîîiîlîî Ãî$Ñî'î)qî+î/&î2¼î5¸ î? îAùîDEîáï/+îÑîsîîï-ƒîœî7îƒî´îåîQî!eî# î%Uî*Äî.§î05î5Ðî8î;Mî<¹î>Ìî@qîCCîDçîG3îáï+ÛîvîÌîZîîÀîeî!±î&/î'Õî*!î.î1!î4%î5{î87î:=î=î>ºîAë îáï*4î)îBîæî2î†îÚî#cî% îï(‹îœ xî,ï(‹îï(‹vîFï(‹î#ï(‹îoîÃî!/î%Ùî)¨î+ôî1c î8µî:C xîBÒï(‹îC¯ï(‹vîDíï(‹îEÊï(‹îáï&äî¦ î î î¶î"® î)Ùî+Eî-‘î1sî5îï%<îÒîqî˜îåî9î¤î!±î&\î(¨î,¢î0šî4>î9'î:Íî=î?óîE�îáï#”î…îÑî%î!îäî“î ÿî&Bî'çî)·î*ìî0î1ªî3öî8Ìî<Æî@ÔîEjîáï!íî…îÑ î îUî¹î$ î&lî+Bî/]î3@î7’î9ç î@îBfîDyîáï Fî`uî ýïõ sî¾ïõqî¼ïõîcïõsîtïõqî"ïõî"äïõsî%!ïõî%þïõqî*Bïõî*¬ïõsî,Òïõî._î0œqî4gïõî52ïõsî;"ïõî<¯î><î1ïN î»îHîêqî ìïNî!ÀïNsî$‚ïNqî&ïNî&÷ïNsî(ïNî(÷ïN î13î?�qîAïNîBïNsîC%ïNqî1ï§sî<ï§ vîïþî- îUî&7î0f î9Ô îáïW î¼î" î0—î<' îáï¯îÀ î#Ó îïî-î‹î Åî'3î2"îáï`îï·î‹î-î)îuî(` î/Bî3Éî80î:Óî<Îî@Ó îFöîáïîÈî4î#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'sresponsibilitytowîHDïg/pî ìï^õ îfîÆîÀrî ìï[¦îîäîVî0 î ðî&î'Ãî*î,èî/Nî2, î8Ìî:�î<� îDÅî ìïYÿî èîsîKî€îÔî 3î#±î%_î(þ î0×î2…î4¸î9î:¶yî ýïV°vîTïV°xîRïV°î ïV°vîïV°î=xîŠïV°î UïV°vî%‰ïV°xî%÷ïV°î&ÂïV°vî)hïV°î)ÖïV°îïU î-îVî#ÑîïSaîµîL yî ýïPvî‹ïPxî‰ïPîBïPvî9ïPîî�xî#ÏïPî$™ïPvî)ÎïPxî*<ïPî*þïPvî/ãïPî0QïPîïNkî-îVî#ÑîïLÄî î‡îùî"7î$*î*5î0`î2´î5î8jî9Àî<²î?ãîAˆîCÔîáïKyî ýïGÍvî¡ïGÍxîŸïGÍîXïGÍvîOïGÍîŠxîØïGÍî £ïGÍvî%×ïGÍ î-d xî4ÞïGÍî5©ïGÍvî8ïGÍî8oïGÍîïF&î-îVî#ÑîïDîœîdîÏîîÔîß î%ßî'Jî)–î, î0âî2†î4Òî8âî;6î@-îB îáïB×îñîEîêî£îRî!ñî#ª î*î0 î7xî8pïB×î9LïB×vî:‹ïB×yî ýï?ˆvî—ï?ˆxî•ï?ˆîNï?ˆvîEï?ˆî€xîÎï?ˆî™ï?ˆvî$Íï?ˆxî(åï?ˆî)°ï?ˆvî/ï?ˆî/åï?ˆî3òxî7Ôï?ˆî8Pï?ˆvî9æï?ˆî:Âï?ˆî Ðï=á î_îÒîï<:î-îVî#Ñîï:’î- îUî%´ î.�î:îï8ëîÆîî–îêîT î&·î)×î,î/êî1Bî2®î5î9î:¥î<Ãî>hîC‰îáï7Cî3î-îæîÙîî‰î$wî&Äî*Ñî0×î2|î6î7‰î=@î@“îCeîáï5œî¢î§îóî î"Mî$¡î'¥ î/Öî2Ñî5î9oî=Êî?pîBùîDžîáï3õîKîîî‡ yî ýï0¦ vî„ï0¦xî‚ï0¦î;ï0¦vî1ï0¦îmî"¤xî&Òï0¦î'Nï0¦vî(äï0¦î)Rï0¦îï.þî-îVî#Ñî.Ç î8Ž îï-Wî- îUî%´ î.�î8àîáï+° îô yî ýï(avîWï(axîUï(aî ï(avî#ï(aî&@î,wxî0Zï(aî0Öï(avî2ðï(aî4]î6cî;‡ îE¾î Ðï&¹îï%î-îVî"àî-¬î8¢ îï#jî- îUî%´ î.�î:yî ýï vîï xîÿï îÛï î*ï vîÚï îî"Mî%ãxî+ï î+‚ï vî-ï î-ôï xî0ï î0Õï î3Ýï vî9ï î9ï îïtî-îVî#Ñî.Ç îïÍî- îUî%´ î.�î:yî ýï~vîdï~xîbï~îï~vîï~îMî…î‚xî$¥ï~î%!ï~vî&·ï~î'“ï~xî+Jï~î, ï~î/ï~vî4Iï~î4·ï~îïÖî-îVî#Ñî.Ç î8Ž îï/î- îUî%´ î.�î:yî ýïàvîCïàxîAïàîúïàvîðïàî, îï9î-îVî#Ñîï‘î- îUî%´ î.�î:îï êîœî²xî"Rï êî# ï êvî%ùï êî'Ÿî)ëî0î2èî8Gî:“ îBÛîáï Bî4î€ îóî¬î á î'ˆî)ƒî- î3Xî6Tî8 î:ôî=HîB îáï ›î- î'î’îö î"­î%Pî'�î+î/¦î1Lî5#î6zî7æî: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.)wîHDïg/vîáï_,îÄîÀî î^îìî!ßî'¥î)î,üî0:î4Gî6“î•î@9îBîCØîáïHÑuî ýïE� sîVïE�qîTïE�îûïE�sî ïE�î!Rqî'ÓïE�î(§ïE�sî-ßïE�î1´vîïCÙî-îVî#ÑîïB1î- îUî(•îï@ˆîîk îûî"²î$Wî'úî*"î,ºî2òî6î8òî=î>:îA3îáï>áîî=î‰îîî"öî%Bî'–î*7 î0Aî4Êî6! î<œî?ÃîBìîáï=:î³îÕî!uî ýï9ê sîï9êqîï9êîÄï9êsîÕï9êî!î'‘î+vîï8Aî-îVî#Ñîï6™î- îUî%´ î.�î:îï4ñî‹îØ îgî î"°î$Øî'pî-¨î0·î5Ðî:êî=6î?‹îBÜîD•îEíîáï3JîÑîŠîóîîºî&âî)¤î-"î0î3î4Þî:°î<Šî?"îCÄîáï1¢î†îAîvîpîÄuî ýï.R sîï.Rqîï.Rî¹ï.RsîÊï.Rî!î'†î2Åî?#î1ï,«qî^ï,«î 2ï,«sî%jï,« qî,¾ï,«î-wï,«î/½ï,«sî1×ï,«vîï+î-îVî#Ñîï)[î- îUî%´ î.�î:îï'²îî\ îˆî÷î!Ñî,Žî1aî3î4Àî7 î>îáï& î gî"þî%Jî)œ î2ªî4Òî:q uî ýï"»sîwï"»qîtï"»îï"»sî-ï"»î!sî'é qî.Ùï"»î/“ï"»î1Ùï"»sî3óï"»vîï!î-îVî#Ñî.Çî;n îïkî- îUî%´ î.�î=îáïÃîïîjî¶îî î qî#î%Tî)¦ î2µî4Ýî:| îB&îG4îáït î îZî ¬î#O î*“î,mî/î3.î4šî6þ î?mîDdîE¼îáïÌî�îÍîÄîgî#rî%+uî ýï|sîZï|qîWï|îÿï|sîï|îV vîïÔî-îVî#Ñîï,î- îUîï„î×î#î�î#îÜî#éî(%î*q î1kî2Öî7¬î;±î>Ñ îE³îáïÜ î%î¥î î �î"&î$¿î*žî,Ðî/�î1Vî2ûî5”î9î>ôî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];wîHDïg/uî ýï_,sîÌï_,qîÊï_,îrï_,sîƒï_,î"Èqî)Jï_,î*ï_,sî/Uï_,î4¹vîï]…î-îVî#Ñîï[Ýîîk îÞî!î#žî)Õî,åî1¦î3òî7§î9Lî=Ÿ îDMîáïZ6î…î î�îäî"¯î(Tî-cî3Æî6Öî;Tî<¿îB+îDRîáïXŽîÝî· îî ¢î"[ î+î-nî0^î4þî7Jî=Aî>äîDïîáïVçpî ìïQñî Hrî ìïN¢î î&înî°îPî!¥î$î+î.dî05qî2%ïN¢î2ÄïN¢rî6ïïN¢î7ãïN¢î:Ô îA›îD‚îGžî ìïLûî2î<îrî î+îƒîwî Ûî%¨î* î0Ïî2�î4¡î7Ÿî;7 îA²îDæî ìïKSî šîHî8î‹î¶qî ýïHsîÇïHqîÅïHî~ïHsî7ïHîqî ïHîªïHsîÕïHî ýïDµ qî™ïDµîSïDµsî ïDµîðvî&’ïDµî' ïDµî( î,î0hî5_sî ýïAf qî\ïAfîïAfsîÎïAfî³ î ýï>qîžï>îWï>sîï>îôvî,›ï>î-ï>xî.ï>î.Ýï>vî3rï>xî?©ï>î@%ï>vîB?ï>î1ïEsîï4+ qîï4+îÔï4+sî?ï4+qîÌï4+î†ï4+sî!øï4+vî"Õï4+î#Nï4+î$Lî%¢î2Ëî5oî7Ãî9/î:Õî>µîCkîFoîSï2ƒî½îƒî!/î"Òî%î'sî,î1î3ªî7lî:hî<´îBy îSï0Üîáî% î'®î*î+nî-î0ôî5ªîSï/5sîï-�qîcï-�îï-�sî$ˆï-�qî&ï-�î&Îï-�sî)@ï-�vî*ï-�î*–ï-�î+”î-àî3›î61î:aî=ìîA îCDîE�îGäîSï+æî#sîï*>qî hï*>î!!ï*>sî&�ï*>qî(ï*>î(Óï*>sî+Eï*>vî,"ï*>î,›ï*>î-™î/åî5 î86î=ÇîC�îE€îSï(— îý îï&ïîÒî/ îªîþ î&­î(Rî.]sîï%Hqî%^ï%Hî&ï%Hsî+ƒï%Hqî-ï%Hî-Éï%Hsî0;ï%Hvî1ï%Hî1‘ï%Hî2�î5¶î;~î> îFÄîSï#¡ îLî îî#ÿî%Ùî(%sîï!ùqîëï!ùî¤ï!ùsî#ï!ùqî$œï!ùî%Uï!ùsî'Èï!ùvî(¤ï!ùî)ï!ùî*î,gî2"î4¸î8èî;4 îB.îCÒîSï RîÝî–î#Äî)åî+Šî-Öî1`î7ºî9_sîïªqî+ïªîäïªsî$Oïªqî%Üïªî&•ïªvî)Œïªî+î,Yî.¥î3î4oî;. îAîSïîî mî#•î'ðî*“xî7Šïî8Cïvî:­ïî;‰ïî>"îBI îSï\î,îx î"qî#Ýî%‚î'Qî,® î3<î5Êî9™î@X îGÖîSï´î#îPî²î!Ùî(Iî) î,�î.`î2Oî3ôî8Ãî<%sîï î ýï¾qî4ï¾îíï¾sî¥ï¾îŠvî'Çï¾î(@ï¾xî)>ï¾î)÷ï¾vî,íï¾ xî4‹ï¾î5Vï¾vî:Šï¾ uî ýïo sîqïoqîoïoîïosî(ïoqî Äïoî!˜ïosî#Õïoî$±ïo î-ë î7î8›î<¾ î1ïÈ î–î#îÆqî"‘ïÈî#\ïÈsî)LïÈî*Ùî,fî7Cî>)î?µî1ï îŽî*¶î,Cî<æî1ï y îîqî{ï yîcï ysî†ï yî cï yqî$eï yî%8ï ysî'úï yqî)‡ï yî*oï ysî+’ï yî,oï y î4«îCqîD’ï yîE{ï ysîFžï yqî1ï Òsî<ï ÒqîŸï Òî?ï Òsîjï ÒîÍï Ò *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];wîHDïg/vîï_,î-îVîï]„î- îUî&7î0f î9Ô îáï[Ý î¼î" î0—î<' îáïZ6îÀ î#Ó îïXŽî-î‹î& î1„ î: îáïVæîh î$‰îïU?îãîˆ îæî#‰î$àî' î0o î8kî9 xîBQïU?îC-ïU?vîDlïU?îEHïU?îáïS—î5î¡î+îúîFî"µ î*î+• xî4$ïS—î5ïS—vî6?ïS—î7ïS—î8Pî; îBîCzîáïQðîÙ îîpî½î!žî%@îïPHîÇîÂîmî î"‘î$å î+î-7 î5 î8\î;Æî=jî?¶ îGõîáïN¡îxî¡îFîYîÃîh î$Žî(ôî+Šî/,î3öî9Cî;îáïLúî¥ îñîîUxî*nïLúî+'ïLúvî-‘ïLúî.mïLúî8ý îáïKRî¯îî(“ð"î>0î@ó îáïI«îòî^îØîæî<î*fî- î1Þî5ì sî ýïF\qîKïF\îïF\sî½ïF\î¢vî%öïF\î&pïF\î'mî+”uî ýïC sîéïC qîçïC îŽïC sî!ŸïC î(Bî.¸ î7î:’î<î@Bî1ïAeîî’î « î*G î3­î5:î6Üî1ï?¾îXîåî0ˆî:} îD:qîEÇï?¾îF¯ï?¾sîGÒï?¾qî1ï>sî<ï>qîŸï>î?ï>sîjï>îÍï>vîï) uî ýï2�sîéï2�qîçï2�îŽï2�sî!Ÿï2�qî%ï2�î%¦ï2�sî)Ñï2�qî*¸ï2�î+Œï2�sî0Äï2� vîï0Ùî-ð'îï/1î¹î^uî ýï+âsîäï+âqîâï+âîŠï+âsî#›ï+âqî'ï+âî'¡ï+âsî+Ìï+âqî,³ï+âî-‡ï+âsî2¿ï+âqî3"ï+âî3Áï+âsî7ìï+âî8Pï+âvîï*:î-îVîï(“î¹î^î&ôî*Hî-î/²î5î7Mî=hî? îC:îáï&ë î‹îßîKîMî j î'cî,gî-¾ î5Tî8Pî;Òî>äîCÇîáï%Dî uî ýï!õsî ï!õqîžï!õîEï!õsîVï!õqî"½ï!õî#\ï!õsî'‡ï!õqî(oï!õî)Cï!õsî.zï!õ vîï Mî-ð'îï¥î¹î^rî ìï*î™îî¥îš î!tî&¡î({î*Äî-¾î0>î37 î9ñî;Ìqî="ï*î=Áï*rîB�ï*îG“î ìï‚îxîPî…îØî8î!µî#cî' î.Üî0Šî2¦î6öî8¤yî ýï3vîï3xîï3îÊï3vîÀï3xîï3îÍï3vîïï3xîâï3î¬ï3vî$àï3xî%Oï3î&ï3vî(�ï3î) ï3îï‹î-î'î)l yî ýï< vîï<xî}ï<î6ï<vî-ï<xî‰ï<î:ï<vî\ï<î 8ï<xî#¡ï<î$cï<vî&ßï<xî'Ñï<î(œï<vî-Ðï<xî.>ï<î.ºï<vî0Oï<î0½ï<îï”î-yî ýï EvîÞï ExîÜï Eî•ï EvîŒï Exîèï Eî™ï Evî»ï Exî­ï Eîxï 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.wîHDïg/yî ýï_*vîï_*xîï_*î¾ï_*vîµï_*xîï_*îÂï_*vîäï_*îÀï_*xî"Jï_*î#ï_*vî%™ï_*î&ï_*îï]ƒî-ð&î(ì î2Œ yî ýïZ4vîCïZ4xîAïZ4îúïZ4vîñïZ4xîMïZ4îþïZ4vî ïZ4îŽïZ4îïXŒî-ð&î(ì î2Œ îïVåîœð*î,­î.ù î5óî7_ î?uîByîáïU>î… yî ýïQïvîNïQïxîLïQïîïQïvîüïQïxîXïQïî ïQïvî+ïQïî™ïQïîïPGî-îr yî ýïLøvîCïLøxîAïLøîúïLøvîðïLøxîMïLøîþïLøvîïLøîüïLøxî ÿïLøî!ÂïLøvî$ÁïLøxî&.ïLøî&ßïLøvî)ßïLøî*MïLøîïKQî-îr îïI©îœð%xî(�ïI©î)WïI©vî,EïI©î/Oî2î5òî8> î>è îG0îáïHð!î$î(™î*åî-9î.ßî1Óî5¢î:õî=A îD:îáïF[xîHïF[îøïF[vî}ïF[î5îDî›îòxî$XïF[î%ïF[vî'{ïF[î(WïF[î* î/6î0¡î47î5Ýî8)î;]î=î?M îFFîáïD³î-î�îíîQî«î9î,î$òî&^î*Iî-‡î1”î3àî8>î:â îA‹îáïC î5 î›îöî!�î"Ùî$Dî)Cî,î.yî0tî5mî:î=) îD^îáïAeyî ýï>vî•ï>xî“ï>îLï>vîBï>xîŸï>îPï>vîqï>xîdï>î /ï>vî%cï>xî%Ñï>î&Mï>vî'âï>î(Pï>îïï²î>hï²vîï î- îUî&7î0f î9Ô îáïc î¼î&Eî1Õ î9™îáï¼îïî-î‹î Åî+´î8:îáïm îîïÆîÒîHîîî"•î%oî&Úî,9î-ò î5î7Ôî;î>7î?¢îEîFWîáïîà îÓîî ðî"\î'» îï wîœîdîÏîîÔîß î%ßî'Jî)–î, î0âî2†î4Òî8âî;6î@-îB îáï ÏîñîEîþî­î :î!óî#^ î)Îî/¸ î6¸xî8$ï Ïî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,wîG~ïg/uî ýï_,sî2ï_,qî0ï_,îéï_,sî¢ï_,î‡ vî¶ï_,î /ï_,xî!-ï_,î!æï_,vî$Üï_, î,j xî3ãï_,î4®ï_,vî7ï_,î7ãï_,î= î1ï]…xîï]…î�ï]…vî%ï]…îï]…xî¬ï]…îwï]…vî"Ïï]…xî#Áï]…î$Œï]…vî)Àï]… xî0ï]…î0âï]…vî5Çï]…î65ï]…uî ýïZ6sîìïZ6qîêïZ6î‘ïZ6sî¢ïZ6qî%=ïZ6î&ïZ6sî(OïZ6î)+ïZ6î,Êî2Òqî6ÔïZ6î7¨ïZ6sî:jïZ6qî;öïZ6î<ßïZ6sî>ïZ6î>ßïZ6 î1ïXŽî Šqî"ïXŽî#ïXŽsî$#ïXŽî$†ïXŽvîïVçî- îUî'5 î/ã î8¾îáïU@îq î"5î.îïS˜î-î‹î Åî+´ î4ÕîïQñîJîµî–î¾îåî »î%³î'�î)Ùî.Ôî53xî;‡ïQñî<7ïQñvî?»ïQñîCîáïPI îüî¿ î Þ î(7î-9î0ûî3žî6Ðî:Þî=2îB�îDIîáïN¢îtîîšîäî#šî.Òî0‹ î9¿î< îC’îáïLûîÑîvî{îÇî î"žî%�î'ä î.}î1 î4Šî5öî;:î<óuî ýïI¬sîGïI¬qîDïI¬îýïI¬sî¶ïI¬î› vî!âïI¬î"[ïI¬xî#YïI¬î$ïI¬vî'ïI¬ xî.·ïI¬î/‚ïI¬vî1ÚïI¬xî2ÌïI¬î3—ïI¬vî8ËïI¬ xî?*ïI¬î?íïI¬vîDÒïI¬îE@ïI¬uî ýïF]sî�ïF]qî�ïF]î5ïF]sî!FïF]qî&áïF]î'µïF]sî)òïF]î*ÏïF]î.nî5Žqî9�ïF]î:cïF]sî=%ïF]qî>²ïF]î?šïF]sî@½ïF]î1ïDµ îmî(Çqî*TïDµî+<ïDµsî,_ïDµî,ÃïDµvîïCî- îUî'5 î/ã î8¾îáïAgîq î"5î.îï?¿î-î‹î Åî+´ î4Õîï>îHîCîlîÀî"#î#Èî'$î)pî,Iî..î0‘î5ªî8Òî:wîßî@mîB¹îáï*?î»î&îîWî[îÿî"jî%-î(Üî,(î-÷î/,î4Gî5êî86î<¨î@¶îELîáï(—î îUîï&ðîœî@î¬îáî±î»îöî$Sî&Ÿî)èî,4î.‰î/ôî2Xuî ýï#¡sîï#¡qîÿï#¡î§ï#¡sî¸ï#¡îÚqîï#¡îÖï#¡sî!ï#¡î!ïï#¡î.ô qî5tï#¡î6bï#¡sî8±ï#¡î:>î1ï!úqî3ï!úîï!úsîÈï!úqîUï!úî=ï!úsî`ï!úî=ï!ú î&yî4Óqî6`ï!úî7Iï!úsî8lï!úqî9Sï!úî:'ï!úsî?_ï!úqî1ï RsîBï Rî¥ï Rvîï«î- îUî&7î0f î9Ô îáï î¼î" î0—î<' îáï\îÀ î#Ó îï´î-î‹î Åî+´î8:îáï îîïfîsî¿î î¯îûî O î&1î( î+Iî-ìî:î;«î=÷î@L îF-îáï¾îÞîøîúîF î!Uî#ù î+gî.èî1< î7hî9¼î;Ïî=tîAóîFîáïî³î‚î7îúî$�î'hî) î+Xî,ýî/Qî2õî7øî9�î=÷î@ûîB0îDõîáïpîCî™îñî\îË î Ÿî#B î*Žî,3î.&î35î5Šî8”î:àî=5î>  îEðîáïÈî�îÜî«îàîûîžî!êî%äî)òî.ˆî0Çî2ïî5;î94 î?ÆîAlîC¸îE]îáï!îÝî�îÍ îî!Qî#µî(î*hî/>uî ýï ÒsîÅï ÒqîÂï Òîjï Òsî{ï Òî�qîÅï Òî ™ï Òsî"Öï Òî#³ï Òî0· qî77ï Òî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.wîG~ïg/sî1ï_,qî3ï_,îï_,sîÈï_,qîUï_,î=ï_,sî`ï_,î=ï_, î&yî4Óqî6`ï_,î7Iï_,sî8lï_,qî9Sï_,î:'ï_,sî?_ï_,qî1ï]…sîBï]…î¥ï]…vîï[Ýî- îUî&7î0f î9Ô îáïZ6 î¼î" î0—î<' îáïX�îÀ î#Ó îïVçî-î‹î Åî+´î8:îáïU@ îîïS™î�îÕîHîíî!uî$qî&½î*'î0±î5ýî7Øî<î=·î@îCAîFîáïQñî7îƒîÁîeî î^î †î&gî(´î,î0Wî2£î8šî:î@_îD îáïPJ îiîqî®îîOî î"Âî$g î*Íî-î0ƒî4½î7 î;î@3îFŒîáïN£î³îèî¸î#îÎî î!Wî"üî& î(Eî*‘î/Œî10î3|î6Lî8ïî;úî>FîA„îE(îáïLûuî ýïI­sîòïI­qîðïI­î˜ïI­sî©ïI­qîEïI­îïI­sî!VïI­î"2ïI­qî%ýïI­î&ÈïI­sî,¸ïI­î.Eî/Òqî3ÔïI­î4¨ïI­sî7iïI­qî8öïI­î9ßïI­sî;ïI­î;ÞïI­ î1ïHî Šqî"ïHî#ïHsî$#ïHî$†ïHvîïF^î- îUî&7î0f î9Ô îáïD· î¼î&Eî1Õ î9™îáïCîïAhî-î‹î Åî'3î2"îáï?ÁîI î&kîï>îÒîfîKî}îÓî#Íî%9î*gî-Wî/¤î2Ôî6î7ªî9÷î?fîCHîáïî×î¯î�î Mî%oî'(î(]î,î-¸î0î2Êî6tî9 î<îî?¿îCkîE$îáï:Ëî™î< îõîšîî!î#k î*]î/ î1Wî4ˆî6-î7bî;Nî=šî@Ì îáï9#îCîGî“îÅ î >uî ýï5Õ sîªï5Õqî¨ï5ÕîOï5Õsî`ï5Õqîüï5Õî Ðï5Õsî# ï5Õî#êï5Õqî)�ï5Õî*cï5Õsî, ï5Õî-}ï5Õqî1ï5Õî2Sï5Õsî5ï5Õqî6¡ï5Õî7Šï5Õsî8­ï5Õî9‰ï5Õ î1ï4-î Šqî"ï4-î#ï4-sî$#ï4-qî% ï4-î%Þï4-sî+ï4- î2Û qî<ï4-î<ìï4-sî?)ï4-î?Œï4-vîï2†î- îUî&7î0f î9A îáï0ß î¼î&Eî1Õ î9™îáï/7îï-�î-î‹î Åî+´î8:îï+éîïî$îôî2îÖî{î$ïî'zî,õî/Aî4¿î8cî:î? î@²îBþ îáï*A îfî<î àî"Lî&§î(˜î*>î,Š î2~î4Êî7šî:0î;ÿîALîBñîDªîáï(šî�î:î0îfîYî#iî%½î')î,™î/<î2î4bî6øî8Çî;î=¡îï&óîÒî³îîµîYîüî$÷î(Cî*î,^î0 î2äî7xî:Rî;õî?™îDœîáï%Kî“î!îmîîÜî î%zî&æî(î,¯î1Åî3~î4êî9uî;Áî@UîAúîCÊîFÚîáï#¤î± î²îÙîáî!-î#ýî%iî+î-Ñî30î9÷î;cî=¯îC½îáï!ýî· îPîõî!ñî$´î* î2‚î3îî9î;PîA_îCÕîáï U îzîîî"Vî%(î'tî, î.âî1Óî3¢î4×î9íî;¦î?ØîEúîáï®î*îËîî¨îïîWî/î›î1î î"Cî#èî(&î*øî-Dî2?î3âî6.î8þ î?dîAWîFgîáï_îoî¤ îoîfîÒî&*î(î*jî-:î/Ýî2)î7$î;‘î=aîA0îBÕîE§îáï¸îî ©î"yqî ýïisî…ïiÿ NTVm$T ÿ TIMESROMANþŸÿ TIMESROMANþæÿ HELVETICAþŸÿ TIMESROMANþŸÿ TIMESROMANþŸÿLOGOü´ÿLAURELþŸÿ TIMESROMANþŸÿ TIMESROMANþæÿ TIMESROMANþYØ « † s- {9 [F ÒS _ ~l³z î‡ Ð“ œ ¦d§Ò®Ÿ´5»¾Á^É ÍÔ EÝ Yç `òZô ?ýèÿ( ;"úm é(X*1€9eA©H Q �[ Ne Óq Þ{ ,„ ¼Ž $— í¡ Ú­ „·j/º2¸œ6õzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ&Thursday, January 19, 1984 1:11 pm PST