ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /appl/cmd/touch.b/
implement Touch;
include "sys.m";
sys: Sys;
include "draw.m";
include "daytime.m";
daytime: Daytime;
include "arg.m";
stderr: ref Sys->FD;
Touch: module
{
init: fn(ctxt: ref Draw->Context, argl: list of string);
};
init(nil: ref Draw->Context, args: list of string)
{
sys = load Sys Sys->PATH;
stderr = sys->fildes(2);
force := 1;
status := 0;
daytime = load Daytime Daytime->PATH;
if(daytime == nil)
cantload(Daytime->PATH);
arg := load Arg Arg->PATH;
if(arg == nil)
cantload(Arg->PATH);
arg->init(args);
arg->setusage("touch [-c] [-t time] file ...");
now := daytime->now();
while((c := arg->opt()) != 0)
case c {
't' => now = int arg->earg();
'c' => force = 0;
* => arg->usage();
}
args = arg->argv();
if(args == nil)
arg->usage();
arg = nil;
for(; args != nil; args = tl args)
status += touch(force, hd args, now);
if(status)
raise "fail:touch";
}
cantload(s: string)
{
sys->fprint(stderr, "touch: can't load %s: %r\n", s);
raise "fail:load";
}
touch(force: int, name: string, now: int): int
{
dir := sys->nulldir;
dir.mtime = now;
(rc, nil) := sys->stat(name);
if(rc >= 0){
if(sys->wstat(name, dir) >= 0)
return 0;
force = 0; # we don't want to create it: it's there, we just can't wstat it
}
if(force == 0) {
sys->fprint(stderr, "touch: %s: cannot change time: %r\n", name);
return 1;
}
if((fd := sys->create(name, Sys->OREAD|Sys->OEXCL, 8r666)) == nil) {
sys->fprint(stderr, "touch: %s: cannot create: %r\n", name);
return 1;
}
sys->fwstat(fd, dir);
return 0;
}