1*37da2899SCharles.Forsythimplement Bind; 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.ForsythBind: module 9*37da2899SCharles.Forsyth{ 10*37da2899SCharles.Forsyth init: fn(ctxt: ref Draw->Context, args: list of string); 11*37da2899SCharles.Forsyth}; 12*37da2899SCharles.Forsyth 13*37da2899SCharles.Forsythstderr: ref Sys->FD; 14*37da2899SCharles.Forsyth 15*37da2899SCharles.Forsythusage() 16*37da2899SCharles.Forsyth{ 17*37da2899SCharles.Forsyth sys->fprint(stderr, "usage: bind [-a|-b|-c|-ac|-bc] [-q] source target\n"); 18*37da2899SCharles.Forsyth raise "fail:usage"; 19*37da2899SCharles.Forsyth} 20*37da2899SCharles.Forsyth 21*37da2899SCharles.Forsythinit(nil: ref Draw->Context, args: list of string) 22*37da2899SCharles.Forsyth{ 23*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 24*37da2899SCharles.Forsyth 25*37da2899SCharles.Forsyth stderr = sys->fildes(2); 26*37da2899SCharles.Forsyth flags := 0; 27*37da2899SCharles.Forsyth qflag := 0; 28*37da2899SCharles.Forsyth if(args != nil) 29*37da2899SCharles.Forsyth args = tl args; 30*37da2899SCharles.Forsyth while(args != nil && (a := hd args) != "" && a[0] == '-'){ 31*37da2899SCharles.Forsyth args = tl args; 32*37da2899SCharles.Forsyth if(a == "--") 33*37da2899SCharles.Forsyth break; 34*37da2899SCharles.Forsyth for(o := 1; o < len a; o++) 35*37da2899SCharles.Forsyth case a[o] { 36*37da2899SCharles.Forsyth 'a' => 37*37da2899SCharles.Forsyth flags |= Sys->MAFTER; 38*37da2899SCharles.Forsyth 'b' => 39*37da2899SCharles.Forsyth flags |= Sys->MBEFORE; 40*37da2899SCharles.Forsyth 'c' => 41*37da2899SCharles.Forsyth flags |= Sys->MCREATE; 42*37da2899SCharles.Forsyth 'q' => 43*37da2899SCharles.Forsyth qflag = 1; 44*37da2899SCharles.Forsyth * => 45*37da2899SCharles.Forsyth usage(); 46*37da2899SCharles.Forsyth } 47*37da2899SCharles.Forsyth } 48*37da2899SCharles.Forsyth if(len args != 2 || flags&Sys->MAFTER && flags&Sys->MBEFORE) 49*37da2899SCharles.Forsyth usage(); 50*37da2899SCharles.Forsyth 51*37da2899SCharles.Forsyth f1 := hd args; 52*37da2899SCharles.Forsyth f2 := hd tl args; 53*37da2899SCharles.Forsyth if(sys->bind(f1, f2, flags) < 0){ 54*37da2899SCharles.Forsyth if(qflag) 55*37da2899SCharles.Forsyth exit; 56*37da2899SCharles.Forsyth # try to improve the error message 57*37da2899SCharles.Forsyth err := sys->sprint("%r"); 58*37da2899SCharles.Forsyth if(sys->stat(f1).t0 < 0) 59*37da2899SCharles.Forsyth sys->fprint(stderr, "bind: %s: %r\n", f1); 60*37da2899SCharles.Forsyth else if(sys->stat(f2).t0 < 0) 61*37da2899SCharles.Forsyth sys->fprint(stderr, "bind: %s: %r\n", f2); 62*37da2899SCharles.Forsyth else 63*37da2899SCharles.Forsyth sys->fprint(stderr, "bind: cannot bind %s onto %s: %s\n", f1, f2, err); 64*37da2899SCharles.Forsyth raise "fail:bind"; 65*37da2899SCharles.Forsyth } 66*37da2899SCharles.Forsyth} 67