xref: /plan9/sys/src/cmd/touch.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier int touch(int, char *);
5*9a747e4fSDavid du Colombier ulong now;
6*9a747e4fSDavid du Colombier 
7*9a747e4fSDavid du Colombier void
8*9a747e4fSDavid du Colombier usage(void)
9*9a747e4fSDavid du Colombier {
10*9a747e4fSDavid du Colombier 	fprint(2, "usage: touch [-c] [-t time] files\n");
11*9a747e4fSDavid du Colombier 	exits("usage");
12*9a747e4fSDavid du Colombier }
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier void
153e12c5d1SDavid du Colombier main(int argc, char **argv)
163e12c5d1SDavid du Colombier {
17*9a747e4fSDavid du Colombier 	int nocreate = 0;
183e12c5d1SDavid du Colombier 	int status = 0;
193e12c5d1SDavid du Colombier 
20*9a747e4fSDavid du Colombier 	now = time(0);
213e12c5d1SDavid du Colombier 	ARGBEGIN{
22*9a747e4fSDavid du Colombier 	case 't':
23*9a747e4fSDavid du Colombier 		now = strtoul(EARGF(usage()), 0, 0);
24*9a747e4fSDavid du Colombier 		break;
25*9a747e4fSDavid du Colombier 	case 'c':
26*9a747e4fSDavid du Colombier 		nocreate = 1;
27*9a747e4fSDavid du Colombier 		break;
28*9a747e4fSDavid du Colombier 	default:
29*9a747e4fSDavid du Colombier 		usage();
303e12c5d1SDavid du Colombier 	}ARGEND
31*9a747e4fSDavid du Colombier 
32*9a747e4fSDavid du Colombier 	if(!*argv)
33*9a747e4fSDavid du Colombier 		usage();
343e12c5d1SDavid du Colombier 	while(*argv)
35*9a747e4fSDavid du Colombier 		status += touch(nocreate, *argv++);
363e12c5d1SDavid du Colombier 	if(status)
373e12c5d1SDavid du Colombier 		exits("touch");
383e12c5d1SDavid du Colombier 	exits(0);
393e12c5d1SDavid du Colombier }
403e12c5d1SDavid du Colombier 
41*9a747e4fSDavid du Colombier touch(int nocreate, char *name)
423e12c5d1SDavid du Colombier {
433e12c5d1SDavid du Colombier 	Dir stbuff;
443e12c5d1SDavid du Colombier 	int fd;
453e12c5d1SDavid du Colombier 
46*9a747e4fSDavid du Colombier 	nulldir(&stbuff);
47*9a747e4fSDavid du Colombier 	stbuff.mtime = now;
48*9a747e4fSDavid du Colombier 	if(dirwstat(name, &stbuff) >= 0)
49*9a747e4fSDavid du Colombier 		return 0;
50*9a747e4fSDavid du Colombier 	if(nocreate){
51*9a747e4fSDavid du Colombier 		fprint(2, "touch: %s: cannot wstat: %r\n", name);
523e12c5d1SDavid du Colombier 		return 1;
533e12c5d1SDavid du Colombier 	}
54*9a747e4fSDavid du Colombier 	if ((fd = create(name, OREAD, 0666)) < 0) {
55219b2ee8SDavid du Colombier 		fprint(2, "touch: %s: cannot create: %r\n", name);
563e12c5d1SDavid du Colombier 		return 1;
573e12c5d1SDavid du Colombier 	}
58*9a747e4fSDavid du Colombier 	dirfwstat(fd, &stbuff);
593e12c5d1SDavid du Colombier 	close(fd);
603e12c5d1SDavid du Colombier 	return 0;
613e12c5d1SDavid du Colombier }
62