
#include "stat.h"
#include "errno.h"
int no_creat = 0;

main(argc,argv)
int argc;
char *argv[];
{
  char *path;
  int i =1;

  if (argc == 1) usage();
  while ( i < argc ) {
	if (argv[i][0] == '-') { 
	        if (argv[i][1] == 'f') {
	                i+=1; 
	        } else if (argv[i][1] == 'c') { 
	                no_creat = 1;
	                i+=1; 
	        } else { 
	                usage();
	        }
	} else { 
	        path=argv[i];
	        i+=1; 
	        if (doit(path) > 0)  {
			std_err("touch: cannot touch ");
			std_err(path);
			std_err("\n");
		}
	}
  }
  exit(0);
}


doit(name)
char *name;
{
  int fd;
  long *t, tim;
  struct stat buf;
  unsigned short tmp;
  long tvp[2];
  extern long time();
 
  if (!access(name,0)) {  /* change date if possible */
	stat(name, &buf);
	tmp = (buf.st_mode & S_IFREG);   
	if (tmp != S_IFREG) return(1);

	tim = time(0L);
	tvp[0] = tim;
	tvp[1] = tim;
	if (!utime(name,tvp))  
		return(0);
	else
		return(1);

  } else {
  	/* file does not exist */
	if (no_creat == 1) 
		return(0);
	else if ( (fd = creat(name, 0777)) < 0) {
	        return(1);
	} else { 
		close(fd);
		return(0);
	}
  }
}


usage() 
{
  std_err("Usage: touch [-c] file...\n");
  exit(1);
}

std_err(s)
{ prints("%s",s);
}
