13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier
43e12c5d1SDavid du Colombier int touch(int, char *);
59a747e4fSDavid du Colombier ulong now;
69a747e4fSDavid du Colombier
79a747e4fSDavid du Colombier void
usage(void)89a747e4fSDavid du Colombier usage(void)
99a747e4fSDavid du Colombier {
109a747e4fSDavid du Colombier fprint(2, "usage: touch [-c] [-t time] files\n");
119a747e4fSDavid du Colombier exits("usage");
129a747e4fSDavid du Colombier }
133e12c5d1SDavid du Colombier
143e12c5d1SDavid du Colombier void
main(int argc,char ** argv)153e12c5d1SDavid du Colombier main(int argc, char **argv)
163e12c5d1SDavid du Colombier {
17*84cb9422SDavid du Colombier char *t, *s;
189a747e4fSDavid du Colombier int nocreate = 0;
193e12c5d1SDavid du Colombier int status = 0;
203e12c5d1SDavid du Colombier
219a747e4fSDavid du Colombier now = time(0);
223e12c5d1SDavid du Colombier ARGBEGIN{
239a747e4fSDavid du Colombier case 't':
24*84cb9422SDavid du Colombier t = EARGF(usage());
25*84cb9422SDavid du Colombier now = strtoul(t, &s, 0);
26*84cb9422SDavid du Colombier if(s == t || *s != '\0')
27*84cb9422SDavid du Colombier usage();
289a747e4fSDavid du Colombier break;
299a747e4fSDavid du Colombier case 'c':
309a747e4fSDavid du Colombier nocreate = 1;
319a747e4fSDavid du Colombier break;
329a747e4fSDavid du Colombier default:
339a747e4fSDavid du Colombier usage();
343e12c5d1SDavid du Colombier }ARGEND
359a747e4fSDavid du Colombier
369a747e4fSDavid du Colombier if(!*argv)
379a747e4fSDavid du Colombier usage();
383e12c5d1SDavid du Colombier while(*argv)
399a747e4fSDavid du Colombier status += touch(nocreate, *argv++);
403e12c5d1SDavid du Colombier if(status)
413e12c5d1SDavid du Colombier exits("touch");
423e12c5d1SDavid du Colombier exits(0);
433e12c5d1SDavid du Colombier }
443e12c5d1SDavid du Colombier
touch(int nocreate,char * name)459a747e4fSDavid du Colombier touch(int nocreate, char *name)
463e12c5d1SDavid du Colombier {
473e12c5d1SDavid du Colombier Dir stbuff;
483e12c5d1SDavid du Colombier int fd;
493e12c5d1SDavid du Colombier
509a747e4fSDavid du Colombier nulldir(&stbuff);
519a747e4fSDavid du Colombier stbuff.mtime = now;
529a747e4fSDavid du Colombier if(dirwstat(name, &stbuff) >= 0)
539a747e4fSDavid du Colombier return 0;
549a747e4fSDavid du Colombier if(nocreate){
559a747e4fSDavid du Colombier fprint(2, "touch: %s: cannot wstat: %r\n", name);
563e12c5d1SDavid du Colombier return 1;
573e12c5d1SDavid du Colombier }
5815174232SDavid du Colombier if((fd = create(name, OREAD|OEXCL, 0666)) < 0){
59219b2ee8SDavid du Colombier fprint(2, "touch: %s: cannot create: %r\n", name);
603e12c5d1SDavid du Colombier return 1;
613e12c5d1SDavid du Colombier }
629a747e4fSDavid du Colombier dirfwstat(fd, &stbuff);
633e12c5d1SDavid du Colombier close(fd);
643e12c5d1SDavid du Colombier return 0;
653e12c5d1SDavid du Colombier }
66