diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /appl/cmd/bind.b | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'appl/cmd/bind.b')
| -rw-r--r-- | appl/cmd/bind.b | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/appl/cmd/bind.b b/appl/cmd/bind.b new file mode 100644 index 00000000..fa6c734b --- /dev/null +++ b/appl/cmd/bind.b @@ -0,0 +1,66 @@ +implement Bind; + +include "sys.m"; + sys: Sys; + +include "draw.m"; + +Bind: module +{ + init: fn(ctxt: ref Draw->Context, args: list of string); +}; + +stderr: ref Sys->FD; + +usage() +{ + sys->fprint(stderr, "usage: bind [-a|-b|-c|-ac|-bc] [-q] source target\n"); + raise "fail:usage"; +} + +init(nil: ref Draw->Context, args: list of string) +{ + sys = load Sys Sys->PATH; + + stderr = sys->fildes(2); + flags := 0; + qflag := 0; + if(args != nil) + args = tl args; + while(args != nil && (a := hd args) != "" && a[0] == '-'){ + args = tl args; + if(a == "--") + break; + for(o := 1; o < len a; o++) + case a[o] { + 'a' => + flags |= Sys->MAFTER; + 'b' => + flags |= Sys->MBEFORE; + 'c' => + flags |= Sys->MCREATE; + 'q' => + qflag = 1; + * => + usage(); + } + } + if(len args != 2 || flags&Sys->MAFTER && flags&Sys->MBEFORE) + usage(); + + f1 := hd args; + f2 := hd tl args; + if(sys->bind(f1, f2, flags) < 0){ + if(qflag) + exit; + # try to improve the error message + err := sys->sprint("%r"); + if(sys->stat(f1).t0 < 0) + sys->fprint(stderr, "bind: %s: %r\n", f1); + else if(sys->stat(f2).t0 < 0) + sys->fprint(stderr, "bind: %s: %r\n", f2); + else + sys->fprint(stderr, "bind: cannot bind %s onto %s: %s\n", f1, f2, err); + raise "fail:bind"; + } +} |
