1implement Cd; 2 3include "sys.m"; 4 sys: Sys; 5 6include "draw.m"; 7 8Cd: module 9{ 10 init: fn(ctxt: ref Draw->Context, argv: list of string); 11}; 12 13stderr: ref Sys->FD; 14 15init(nil: ref Draw->Context, argv: list of string) 16{ 17 sys = load Sys Sys->PATH; 18 19 stderr = sys->fildes(2); 20 21 argv = tl argv; 22 if(argv == nil) 23 argv = "/usr/"+user() :: nil; 24 25 if(tl argv != nil) { 26 sys->fprint(stderr, "Usage: cd [directory]\n"); 27 raise "fail:usage"; 28 } 29 30 if(sys->chdir(hd argv) < 0) { 31 sys->fprint(stderr, "cd: %s: %r\n", hd argv); 32 raise "fail:failed"; 33 } 34} 35 36user(): string 37{ 38 fd := sys->open("/dev/user", sys->OREAD); 39 if(fd == nil) 40 return "inferno"; 41 42 buf := array[Sys->NAMEMAX] of byte; 43 n := sys->read(fd, buf, len buf); 44 if(n <= 0) 45 return "inferno"; 46 47 return string buf[0:n]; 48} 49