13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier int touch(int, char *); 5*9a747e4fSDavid du Colombier ulong now; 6*9a747e4fSDavid du Colombier 7*9a747e4fSDavid du Colombier void 8*9a747e4fSDavid du Colombier usage(void) 9*9a747e4fSDavid du Colombier { 10*9a747e4fSDavid du Colombier fprint(2, "usage: touch [-c] [-t time] files\n"); 11*9a747e4fSDavid du Colombier exits("usage"); 12*9a747e4fSDavid du Colombier } 133e12c5d1SDavid du Colombier 143e12c5d1SDavid du Colombier void 153e12c5d1SDavid du Colombier main(int argc, char **argv) 163e12c5d1SDavid du Colombier { 17*9a747e4fSDavid du Colombier int nocreate = 0; 183e12c5d1SDavid du Colombier int status = 0; 193e12c5d1SDavid du Colombier 20*9a747e4fSDavid du Colombier now = time(0); 213e12c5d1SDavid du Colombier ARGBEGIN{ 22*9a747e4fSDavid du Colombier case 't': 23*9a747e4fSDavid du Colombier now = strtoul(EARGF(usage()), 0, 0); 24*9a747e4fSDavid du Colombier break; 25*9a747e4fSDavid du Colombier case 'c': 26*9a747e4fSDavid du Colombier nocreate = 1; 27*9a747e4fSDavid du Colombier break; 28*9a747e4fSDavid du Colombier default: 29*9a747e4fSDavid du Colombier usage(); 303e12c5d1SDavid du Colombier }ARGEND 31*9a747e4fSDavid du Colombier 32*9a747e4fSDavid du Colombier if(!*argv) 33*9a747e4fSDavid du Colombier usage(); 343e12c5d1SDavid du Colombier while(*argv) 35*9a747e4fSDavid du Colombier status += touch(nocreate, *argv++); 363e12c5d1SDavid du Colombier if(status) 373e12c5d1SDavid du Colombier exits("touch"); 383e12c5d1SDavid du Colombier exits(0); 393e12c5d1SDavid du Colombier } 403e12c5d1SDavid du Colombier 41*9a747e4fSDavid du Colombier touch(int nocreate, char *name) 423e12c5d1SDavid du Colombier { 433e12c5d1SDavid du Colombier Dir stbuff; 443e12c5d1SDavid du Colombier int fd; 453e12c5d1SDavid du Colombier 46*9a747e4fSDavid du Colombier nulldir(&stbuff); 47*9a747e4fSDavid du Colombier stbuff.mtime = now; 48*9a747e4fSDavid du Colombier if(dirwstat(name, &stbuff) >= 0) 49*9a747e4fSDavid du Colombier return 0; 50*9a747e4fSDavid du Colombier if(nocreate){ 51*9a747e4fSDavid du Colombier fprint(2, "touch: %s: cannot wstat: %r\n", name); 523e12c5d1SDavid du Colombier return 1; 533e12c5d1SDavid du Colombier } 54*9a747e4fSDavid du Colombier if ((fd = create(name, OREAD, 0666)) < 0) { 55219b2ee8SDavid du Colombier fprint(2, "touch: %s: cannot create: %r\n", name); 563e12c5d1SDavid du Colombier return 1; 573e12c5d1SDavid du Colombier } 58*9a747e4fSDavid du Colombier dirfwstat(fd, &stbuff); 593e12c5d1SDavid du Colombier close(fd); 603e12c5d1SDavid du Colombier return 0; 613e12c5d1SDavid du Colombier } 62