Blame


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