Blob
1 #include <u.h>2 #include <libc.h>4 int touch(int, char *);5 ulong now;6 int tflag;8 void9 usage(void)10 {11 fprint(2, "usage: touch [-c] [-t time] files\n");12 exits("usage");13 }15 void16 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 }ARGEND34 if(!*argv)35 usage();36 while(*argv)37 status += touch(nocreate, *argv++);38 if(status)39 exits("touch");40 exits(0);41 }43 int44 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, OREAD, 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 }