xref: /inferno-os/appl/lib/dbsrv.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement DBserver;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsyth	sys: Sys;
5*37da2899SCharles.Forsyth
6*37da2899SCharles.Forsythinclude "draw.m";
7*37da2899SCharles.Forsyth
8*37da2899SCharles.Forsythinclude "keyring.m";
9*37da2899SCharles.Forsyth
10*37da2899SCharles.Forsythinclude "security.m";
11*37da2899SCharles.Forsyth
12*37da2899SCharles.Forsythinclude "db.m";              # For now.
13*37da2899SCharles.Forsyth
14*37da2899SCharles.Forsythstderr: ref Sys->FD;
15*37da2899SCharles.Forsyth
16*37da2899SCharles.ForsythDBserver : module
17*37da2899SCharles.Forsyth{
18*37da2899SCharles.Forsyth	init:   fn(ctxt: ref Draw->Context, argv: list of string);
19*37da2899SCharles.Forsyth};
20*37da2899SCharles.Forsyth
21*37da2899SCharles.Forsyth# argv is a list of Inferno supported algorithms from Security->Auth
22*37da2899SCharles.Forsyth
23*37da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string)
24*37da2899SCharles.Forsyth{
25*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
26*37da2899SCharles.Forsyth	stdin := sys->fildes(0);
27*37da2899SCharles.Forsyth	stderr = sys->fildes(2);
28*37da2899SCharles.Forsyth	if(argv != nil)
29*37da2899SCharles.Forsyth		argv = tl argv;
30*37da2899SCharles.Forsyth	if(argv == nil)
31*37da2899SCharles.Forsyth		err("no algorithm list");
32*37da2899SCharles.Forsyth
33*37da2899SCharles.Forsyth	kr := load Keyring Keyring->PATH;
34*37da2899SCharles.Forsyth	if(nil == kr)
35*37da2899SCharles.Forsyth		err(sys->sprint("can't load Keyring: %r"));
36*37da2899SCharles.Forsyth
37*37da2899SCharles.Forsyth	auth := load Auth Auth->PATH;
38*37da2899SCharles.Forsyth	if(auth == nil)
39*37da2899SCharles.Forsyth		err(sys->sprint("can't load Auth: %r"));
40*37da2899SCharles.Forsyth
41*37da2899SCharles.Forsyth	error := auth->init();
42*37da2899SCharles.Forsyth	if(error != nil)
43*37da2899SCharles.Forsyth		err(sys->sprint("Auth init failed: %s", error));
44*37da2899SCharles.Forsyth
45*37da2899SCharles.Forsyth	ai := kr->readauthinfo("/usr/"+user()+"/keyring/default");
46*37da2899SCharles.Forsyth
47*37da2899SCharles.Forsyth	(client_fd, info_or_err) := auth->server(argv, ai, stdin, 1);
48*37da2899SCharles.Forsyth	if(client_fd == nil)
49*37da2899SCharles.Forsyth		err(sys->sprint("can't authenticate client: %s", info_or_err));
50*37da2899SCharles.Forsyth
51*37da2899SCharles.Forsyth	auth = nil;
52*37da2899SCharles.Forsyth	kr = nil;
53*37da2899SCharles.Forsyth
54*37da2899SCharles.Forsyth	sys->pctl(Sys->FORKNS|Sys->NEWPGRP, nil);
55*37da2899SCharles.Forsyth
56*37da2899SCharles.Forsyth	# run the infdb database program in the host system using /cmd
57*37da2899SCharles.Forsyth
58*37da2899SCharles.Forsyth	cmdfd := sys->open("/cmd/clone", sys->ORDWR);
59*37da2899SCharles.Forsyth	if (cmdfd == nil)
60*37da2899SCharles.Forsyth		err(sys->sprint("can't open /cmd/clone: %r"));
61*37da2899SCharles.Forsyth
62*37da2899SCharles.Forsyth	buf := array [20] of byte;
63*37da2899SCharles.Forsyth	n := sys->read(cmdfd, buf, len buf);
64*37da2899SCharles.Forsyth	if(n <= 0)
65*37da2899SCharles.Forsyth		err(sys->sprint("can't read /cmd/clone: %r"));
66*37da2899SCharles.Forsyth	cmddir := string buf[0:n];
67*37da2899SCharles.Forsyth
68*37da2899SCharles.Forsyth	if (sys->fprint(cmdfd, "exec infdb") <= 0)
69*37da2899SCharles.Forsyth		err(sys->sprint("can't start infdb via /cmd/clone: %r"));
70*37da2899SCharles.Forsyth
71*37da2899SCharles.Forsyth	datafile := "/cmd/" + cmddir + "/data";
72*37da2899SCharles.Forsyth	infdb_fd := sys->open(datafile, Sys->ORDWR);
73*37da2899SCharles.Forsyth	if (infdb_fd == nil)
74*37da2899SCharles.Forsyth		err(sys->sprint("can't open %s: %r", datafile));
75*37da2899SCharles.Forsyth
76*37da2899SCharles.Forsyth	spawn dbxfer(infdb_fd, client_fd, "client");
77*37da2899SCharles.Forsyth
78*37da2899SCharles.Forsyth	dbxfer(client_fd, infdb_fd, "infdb");
79*37da2899SCharles.Forsyth	sys->fprint(infdb_fd, "X1          0   0 \n");
80*37da2899SCharles.Forsyth}
81*37da2899SCharles.Forsyth
82*37da2899SCharles.Forsythdbxfer(source, sink: ref Sys->FD, tag: string)
83*37da2899SCharles.Forsyth{
84*37da2899SCharles.Forsyth	buf := array [Sys->ATOMICIO] of byte;
85*37da2899SCharles.Forsyth	while((nr := sys->read(source, buf, len buf)) > 0)
86*37da2899SCharles.Forsyth		if(sys->write(sink, buf, nr) != nr){
87*37da2899SCharles.Forsyth			sys->fprint(stderr, "dbsrv: write to %s failed: %r\n", tag);
88*37da2899SCharles.Forsyth			shutdown();
89*37da2899SCharles.Forsyth		}
90*37da2899SCharles.Forsyth	if(nr < 0){
91*37da2899SCharles.Forsyth		sys->fprint(stderr, "dbsrv: reading data for %s: %r\n", tag);
92*37da2899SCharles.Forsyth		shutdown();
93*37da2899SCharles.Forsyth	}
94*37da2899SCharles.Forsyth}
95*37da2899SCharles.Forsyth
96*37da2899SCharles.Forsythshutdown()
97*37da2899SCharles.Forsyth{
98*37da2899SCharles.Forsyth	pid := sys->pctl(0, nil);
99*37da2899SCharles.Forsyth	fd := sys->open("#p/"+string pid+"/ctl", Sys->OWRITE);
100*37da2899SCharles.Forsyth	if(fd == nil || sys->fprint(fd, "killgrp") < 0)
101*37da2899SCharles.Forsyth		err(sys->sprint("can't kill group %d: %r", pid));
102*37da2899SCharles.Forsyth}
103*37da2899SCharles.Forsyth
104*37da2899SCharles.Forsytherr(s: string)
105*37da2899SCharles.Forsyth{
106*37da2899SCharles.Forsyth	sys->fprint(stderr, "dbsrv: %s\n", s);
107*37da2899SCharles.Forsyth	raise "fail:error";
108*37da2899SCharles.Forsyth}
109*37da2899SCharles.Forsyth
110*37da2899SCharles.Forsythuser(): string
111*37da2899SCharles.Forsyth{
112*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
113*37da2899SCharles.Forsyth
114*37da2899SCharles.Forsyth	fd := sys->open("/dev/user", sys->OREAD);
115*37da2899SCharles.Forsyth	if(fd == nil)
116*37da2899SCharles.Forsyth		return "";
117*37da2899SCharles.Forsyth
118*37da2899SCharles.Forsyth	buf := array[Sys->NAMEMAX] of byte;
119*37da2899SCharles.Forsyth	n := sys->read(fd, buf, len buf);
120*37da2899SCharles.Forsyth	if(n < 0)
121*37da2899SCharles.Forsyth		return "";
122*37da2899SCharles.Forsyth
123*37da2899SCharles.Forsyth	return string buf[0:n];
124*37da2899SCharles.Forsyth}
125