}
Dir_MTime (gn)    GNode         *gn;	      /* the file whose modification time is			       * desired */{    char          *fullName;  /* the full pathname of name */    struct stat	  stb;	      /* buffer for finding the mod time */    Hash_Entry	  *entry;    Boolean 	  exists;    if (gn->type & OP_ARCHV) {	return Arch_MTime (gn);    } else if (gn->path == (char *)NULL) {	fullName = Dir_FindFile (gn->name, dirSearchPath);    } else {	fullName = gn->path;    }    if (fullName == (char *)NULL) {	fullName = estrdup(gn->name);    }    entry = Hash_FindEntry(&mtimes, fullName);    if (entry != (Hash_Entry *)NULL) {	/*	 * Only do this once -- the second time folks are checking to	 * see if the file was actually updated, so we need to actually go	 * to the file system.	 */	if (DEBUG(DIR)) {	    printf("Using cached time %s for %s\n",		    Targ_FmtTime((time_t)(long)Hash_GetValue(entry)), fullName);	}	stb.st_mtime = (time_t)(long)Hash_GetValue(entry);	Hash_DeleteEntry(&mtimes, entry);	exists = TRUE;    } else if (stat (fullName, &stb) == 0) {    	/* XXX forces make to differentiate between the epoch and	 * non-existent files by kludging the timestamp slightly. */    	if (stb.st_mtime == OUT_OF_DATE)		stb.st_mtime++;	exists = TRUE;    } else {	if (gn->type & OP_MEMBER) {	    if (fullName != gn->path)		free(fullName);	    return Arch_MemMTime (gn);	} else {	    stb.st_mtime = OUT_OF_DATE;	    exists = FALSE;	}    }    if (fullName && gn->path == (char *)NULL) {	gn->path = fullName;    }    gn->mtime = stb.st_mtime;    return exists;}