xref: /inferno-os/appl/cmd/bind.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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