xref: /plan9/sys/src/cmd/touch.c (revision 84cb942240af4800dbdc464335ca92b2f5a6c727)
1 #include <u.h>
2 #include <libc.h>
3 
4 int touch(int, char *);
5 ulong now;
6 
7 void
usage(void)8 usage(void)
9 {
10 	fprint(2, "usage: touch [-c] [-t time] files\n");
11 	exits("usage");
12 }
13 
14 void
main(int argc,char ** argv)15 main(int argc, char **argv)
16 {
17 	char *t, *s;
18 	int nocreate = 0;
19 	int status = 0;
20 
21 	now = time(0);
22 	ARGBEGIN{
23 	case 't':
24 		t = EARGF(usage());
25 		now = strtoul(t, &s, 0);
26 		if(s == t || *s != '\0')
27 			usage();
28 		break;
29 	case 'c':
30 		nocreate = 1;
31 		break;
32 	default:
33 		usage();
34 	}ARGEND
35 
36 	if(!*argv)
37 		usage();
38 	while(*argv)
39 		status += touch(nocreate, *argv++);
40 	if(status)
41 		exits("touch");
42 	exits(0);
43 }
44 
touch(int nocreate,char * name)45 touch(int nocreate, char *name)
46 {
47 	Dir stbuff;
48 	int fd;
49 
50 	nulldir(&stbuff);
51 	stbuff.mtime = now;
52 	if(dirwstat(name, &stbuff) >= 0)
53 		return 0;
54 	if(nocreate){
55 		fprint(2, "touch: %s: cannot wstat: %r\n", name);
56 		return 1;
57 	}
58 	if((fd = create(name, OREAD|OEXCL, 0666)) < 0){
59 		fprint(2, "touch: %s: cannot create: %r\n", name);
60 		return 1;
61 	}
62 	dirfwstat(fd, &stbuff);
63 	close(fd);
64 	return 0;
65 }
66