touch.c (1017B)
1 #include <u.h> 2 #include <libc.h> 3 4 int touch(int, char *); 5 ulong now; 6 int tflag; 7 8 void 9 usage(void) 10 { 11 fprint(2, "usage: touch [-c] [-t time] files\n"); 12 exits("usage"); 13 } 14 15 void 16 main(int argc, char **argv) 17 { 18 int nocreate = 0; 19 int status = 0; 20 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 33 34 if(!*argv) 35 usage(); 36 while(*argv) 37 status += touch(nocreate, *argv++); 38 if(status) 39 exits("touch"); 40 exits(0); 41 } 42 43 int 44 touch(int nocreate, char *name) 45 { 46 Dir stbuff; 47 int fd; 48 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 }