grab_stat(stb, mtime);
ts_set_from_stat(stb, mtime);
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 */    struct file_stamp		  *entry;    unsigned int  slot;    TIMESTAMP	  mtime;    if (gn->type & OP_ARCHV)	return Arch_MTime(gn);    if (gn->path == NULL) {	fullName = Dir_FindFile(gn->name, &dirSearchPath);	if (fullName == NULL)	    fullName = estrdup(gn->name);    } else	fullName = gn->path;    slot = ohash_qlookup(&mtimes, fullName);    entry = ohash_find(&mtimes, slot);    if (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(entry->mtime), fullName);	mtime = entry->mtime;	free(entry);	ohash_remove(&mtimes, slot);    } else if (stat(fullName, &stb) == 0)	grab_stat(stb, mtime);    else {	if (gn->type & OP_MEMBER) {	    if (fullName != gn->path)		free(fullName);	    return Arch_MemMTime(gn);	} else	    set_out_of_date(mtime);    }    if (fullName && gn->path == NULL)	gn->path = fullName;    gn->mtime = mtime;    return gn->mtime;}