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