xref: /plan9/sys/src/cmd/touch.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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