singrdk/base/Applications/NameSpace/AtomicTestDSP/DirectoryService.sg

213 lines
7.0 KiB
Plaintext

////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: Directory.sg
//
// Note:
//
using System;
using System.Threading;
using Microsoft.Singularity;
using Microsoft.Singularity.Channels;
using Microsoft.SingSharp;
using Microsoft.SingSharp.Runtime;
using Microsoft.Singularity.Directory;
using Microsoft.Singularity.Security;
[assembly: ApplicationPublisherAttribute("singularity.microsoft.com")]
[assembly: AssertPrivilegeAttribute("$register-privilege.localhost")]
namespace Microsoft.Application.DSP
{
public class NameServiceDSP
{
private static DirNode rootDir;
private static string mountPoint;
private static int Register(string! name, [Claims]ServiceProviderContract.Imp! imp)
{
// acquire namespace endpoint
DirectoryServiceContract.Imp epNS = DirectoryService.NewClientEndpoint();
mountPoint = name;
try {
epNS.SendRegister(Bitter.FromString2(name),imp);
switch receive {
case epNS.AckRegister():
break;
case epNS.NakRegister(reject, error):
DebugStub.Break();
delete reject;
return -1;
break;
case epNS.ChannelClosed():
DebugStub.Break();
return -1;
break;
case epNS.NakRegisterReparse(char[]! in ExHeap path,
char[]! in ExHeap rest,
bool linkFound,
ServiceProviderContract.Imp:Start! reject) :
DebugStub.Break();
delete reject;
delete path;
delete rest;
return -1;
break;
case unsatisfiable:
Tracing.Log(Tracing.Debug,"unable to register NakConnect with Nameservice\n");
DebugStub.Break();
return -1;
}
}
finally {
delete epNS;
}
return 0;
}
private static int Deregister(string! name)
{
// acquire namespace endpoint
DirectoryServiceContract.Imp epNS = DirectoryService.NewClientEndpoint();
mountPoint = name;
try {
epNS.SendDeregister(Bitter.FromString2(name));
switch receive {
case epNS.AckDeregister(service):
delete service;
break;
case epNS.NakDeregister(error):
DebugStub.Break();
break;
case epNS.ChannelClosed():
DebugStub.Break();
break;
case unsatisfiable:
Tracing.Log(Tracing.Debug,"unable to register NakConnect with Nameservice\n");
DebugStub.Break();
return -1;
}
}
finally {
delete epNS;
}
return 0;
}
public static void Initialize()
{
IAclPolicy _policy = new PathPolicyEngine();
InstallAcls(_policy);
AclCore _core = new AclCore(null, new DirAclCoreSupport());
_core.Disable = true;
rootDir = new DirNode("/", _core, _policy);
}
// in the fullness of time, we should read the server configuration
// from a reified manifest including config information
// for now, we will just add a rule to allow **any** access
private static void InstallAcls(IAclPolicy! policy)
{
/*
// read the rules section from the config
XmlNode node = config.GetChild(PolicyListXmlTag);
if (node == null) {
return;
}
foreach (XmlNode! rule in node.Children) {
if (rule.Name != "rule") {
continue;
}
string! resource = (!)rule.GetAttribute("resource", "");
if (resource.Equals("")) {
continue;
}
string! aclstr = (!)rule.GetAttribute("acl", "");
if (aclstr.Equals("")) {
continue;
}
policy.AddRule(resource, aclstr);
}
*/
policy.AddRule("/", "{/groups/anyall}");
}
public static void Finalize()
{
Deregister(mountPoint);
}
public static void tell(string name)
{
Console.WriteLine("{0}: <registration path>", name);
}
public static int Main(string[]! args)
{
int status;
Initialize();
if (args.Length < 2) {
tell(args[0]);
return -1;
}
ServiceProviderContract.Imp! imp;
ServiceProviderContract.Exp! s;
ServiceProviderContract.NewChannel(out imp, out s);
status = Register((!)args[1], imp);
if (status != 0) {
delete s;
return status;
}
try {
for (bool run = true; run;) {
switch receive {
// Listen for new connections
case s.Connect(ServiceContract.Exp:Start! candidate):
DirectoryServiceContract.Exp:Start exp = candidate as DirectoryServiceContract.Exp:Start!;
if (exp != null) {
s.SendAckConnect();
DirectoryServiceWorker.Create(rootDir,exp);
}
else s.SendNackConnect(candidate);
break;
case s.ChannelClosed() :
run = false;
Console.WriteLine("Channel Closed. DSP shutting down");
break;
case unsatisfiable:
run = false;
Console.WriteLine("Unsatisfiable. DSP shutting down");
break;
}
}
}
finally {
}
delete s;
Console.WriteLine(" last line of DSP... process should terminate");
return 0;
}
}
}