1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
4 bc7cb1a1 2003-11-23 devnull int touch(int, char *);
5 bc7cb1a1 2003-11-23 devnull ulong now;
8 bc7cb1a1 2003-11-23 devnull usage(void)
10 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: touch [-c] [-t time] files\n");
11 bc7cb1a1 2003-11-23 devnull exits("usage");
15 bc7cb1a1 2003-11-23 devnull main(int argc, char **argv)
17 bc7cb1a1 2003-11-23 devnull int nocreate = 0;
18 bc7cb1a1 2003-11-23 devnull int status = 0;
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);
25 bc7cb1a1 2003-11-23 devnull case 'c':
26 bc7cb1a1 2003-11-23 devnull nocreate = 1;
32 bc7cb1a1 2003-11-23 devnull if(!*argv)
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);
42 bc7cb1a1 2003-11-23 devnull touch(int nocreate, char *name)
44 bc7cb1a1 2003-11-23 devnull Dir stbuff;
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;
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;
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;