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