13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier 43e12c5d1SDavid du Colombier int touch(int, char *); 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier void 73e12c5d1SDavid du Colombier main(int argc, char **argv) 83e12c5d1SDavid du Colombier { 93e12c5d1SDavid du Colombier int force = 1; 103e12c5d1SDavid du Colombier int status = 0; 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier ARGBEGIN{ 133e12c5d1SDavid du Colombier case 'c': force = 0; break; 143e12c5d1SDavid du Colombier default: goto usage; break; 153e12c5d1SDavid du Colombier }ARGEND 163e12c5d1SDavid du Colombier if(!*argv){ 173e12c5d1SDavid du Colombier usage: 183e12c5d1SDavid du Colombier fprint(2, "usage: touch [-c] files\n"); 193e12c5d1SDavid du Colombier exits("usage"); 203e12c5d1SDavid du Colombier } 213e12c5d1SDavid du Colombier while(*argv) 223e12c5d1SDavid du Colombier status += touch(force, *argv++); 233e12c5d1SDavid du Colombier if(status) 243e12c5d1SDavid du Colombier exits("touch"); 253e12c5d1SDavid du Colombier exits(0); 263e12c5d1SDavid du Colombier } 273e12c5d1SDavid du Colombier 283e12c5d1SDavid du Colombier touch(int force, char *name) 293e12c5d1SDavid du Colombier { 303e12c5d1SDavid du Colombier Dir stbuff; 313e12c5d1SDavid du Colombier char junk[1]; 323e12c5d1SDavid du Colombier int fd; 333e12c5d1SDavid du Colombier 343e12c5d1SDavid du Colombier stbuff.length = 0; 353e12c5d1SDavid du Colombier stbuff.mode = 0666; 363e12c5d1SDavid du Colombier if (dirstat(name, &stbuff) < 0 && force == 0) { 37*219b2ee8SDavid du Colombier fprint(2, "touch: %s: cannot stat: %r\n", name); 383e12c5d1SDavid du Colombier return 1; 393e12c5d1SDavid du Colombier } 403e12c5d1SDavid du Colombier if (stbuff.length == 0) { 413e12c5d1SDavid du Colombier if ((fd = create(name, 0, stbuff.mode)) < 0) { 42*219b2ee8SDavid du Colombier fprint(2, "touch: %s: cannot create: %r\n", name); 433e12c5d1SDavid du Colombier return 1; 443e12c5d1SDavid du Colombier } 453e12c5d1SDavid du Colombier close(fd); 463e12c5d1SDavid du Colombier return 0; 473e12c5d1SDavid du Colombier } 483e12c5d1SDavid du Colombier if ((fd = open(name, ORDWR)) < 0) { 49*219b2ee8SDavid du Colombier fprint(2, "touch: %s: cannot open: %r\n", name); 503e12c5d1SDavid du Colombier return 1; 513e12c5d1SDavid du Colombier } 523e12c5d1SDavid du Colombier if(read(fd, junk, 1) < 1) { 53*219b2ee8SDavid du Colombier fprint(2, "touch: %s: read error: %r\n", name); 543e12c5d1SDavid du Colombier close(fd); 553e12c5d1SDavid du Colombier return 1; 563e12c5d1SDavid du Colombier } 573e12c5d1SDavid du Colombier seek(fd, 0L, 0); 583e12c5d1SDavid du Colombier if(write(fd, junk, 1) < 1 ) { 59*219b2ee8SDavid du Colombier fprint(2, "touch: %s: write error: %r\n", name); 603e12c5d1SDavid du Colombier close(fd); 613e12c5d1SDavid du Colombier return 1; 623e12c5d1SDavid du Colombier } 633e12c5d1SDavid du Colombier close(fd); 643e12c5d1SDavid du Colombier return 0; 653e12c5d1SDavid du Colombier } 66