text: #include <u.h>
  #include <libc.h>
  
  int touch(int, char *);
  ulong now;
  int tflag;
  
  void
  usage(void)
  {
  	fprint(2, "usage: touch [-c] [-t time] files\n");
  	exits("usage");
  }
  
  void
  main(int argc, char **argv)
  {
  	int nocreate = 0;
  	int status = 0;
  
  	now = time(0);
  	ARGBEGIN{
  	case 't':
  		tflag = 1;
  		now = strtoul(EARGF(usage()), 0, 0);
  		break;
  	case 'c':
  		nocreate = 1;
  		break;
  	default:	
  		usage();
  	}ARGEND
  
  	if(!*argv)
  		usage();
  	while(*argv)
  		status += touch(nocreate, *argv++);
  	if(status)
  		exits("touch");
  	exits(0);
  }
  
  int
  touch(int nocreate, char *name)
  {
  	Dir stbuff;
  	int fd;
  
  	nulldir(&stbuff);
  	stbuff.mtime = now;
  	if(dirwstat(name, &stbuff) >= 0)
  		return 0;
  	if(nocreate){
  		fprint(2, "touch: %s: cannot wstat: %r\n", name);
  		return 1;
  	}
  	if((fd = create(name, OREAD, 0666)) < 0) {
  		fprint(2, "touch: %s: cannot create: %r\n", name);
  		return 1;
  	}
  	if(tflag && dirfwstat(fd, &stbuff) < 0){
  		fprint(2, "touch: %s: cannot wstat: %r\n", name);
  		close(fd);
  		return 1;
  	}
  	close(fd);
  	return 0;
  }
  