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