xref: /plan9/sys/src/cmd/touch.c (revision 84cb942240af4800dbdc464335ca92b2f5a6c727)
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