printf ("touch %s\n", gn->name);
(void) fprintf(stdout, "touch %s\n", gn->name); (void) fflush(stdout);
Job_Touch (gn, silent)    GNode         *gn;	      	/* the node of the file to touch */    Boolean 	  silent;   	/* TRUE if should not print messages */{    int		  streamID;   	/* ID of stream opened to do the touch */    struct timeval times[2];	/* Times for utimes() call */    if (gn->type & (OP_JOIN|OP_USE|OP_EXEC|OP_OPTIONAL)) {	/*	 * .JOIN, .USE, .ZEROTIME and .OPTIONAL targets are "virtual" targets	 * and, as such, shouldn't really be created.	 */	return;    }        if (!silent) {	printf ("touch %s\n", gn->name);    }    if (noExecute) {	return;    }    if (gn->type & OP_ARCHV) {	Arch_Touch (gn);    } else if (gn->type & OP_LIB) {	Arch_TouchLib (gn);    } else {	char	*file = gn->path ? gn->path : gn->name;	times[0].tv_sec = times[1].tv_sec = now;	times[0].tv_usec = times[1].tv_usec = 0;	if (utimes(file, times) < 0){	    streamID = open (file, O_RDWR | O_CREAT, 0666);	    if (streamID >= 0) {		char	c;		/*		 * Read and write a byte to the file to change the		 * modification time, then close the file.		 */		if (read(streamID, &c, 1) == 1) {		    lseek(streamID, (off_t) 0, SEEK_SET);		    write(streamID, &c, 1);		}				(void)close (streamID);	    } else		printf("*** couldn't touch %s: %s", file, strerror(errno));	}    }}