Blob


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