Just call nfs_fetch_fattr3 if called via fstat. * nfs.cc (nfs_fetch_fattr3): New function to fetch NFS fattr3 info from file handle. * nfs.h (nfs_fetch_fattr3): Declare. * path.cc (symlink_info::check): Simplify NFS case. Just call nfs_fetch_fattr3.
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* nfs.cc
 | 
						|
 | 
						|
   Copyright 2008, 2010 Red Hat, Inc.
 | 
						|
 | 
						|
This software is a copyrighted work licensed under the terms of the
 | 
						|
Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
 | 
						|
details. */
 | 
						|
 | 
						|
#include "winsup.h"
 | 
						|
#include "sys/fcntl.h"
 | 
						|
#include "nfs.h"
 | 
						|
#include "ntdll.h"
 | 
						|
 | 
						|
struct nfs_aol_ffei_t nfs_aol_ffei = { 0, 0, sizeof (NFS_ACT_ON_LINK) - 1, 0,
 | 
						|
				       NFS_ACT_ON_LINK };
 | 
						|
 | 
						|
uint32_t nfs_type_mapping[] = { 0, S_IFREG, S_IFDIR, S_IFBLK,
 | 
						|
				S_IFCHR, S_IFLNK, S_IFSOCK, S_IFIFO };
 | 
						|
 | 
						|
NTSTATUS
 | 
						|
nfs_fetch_fattr3 (HANDLE h, fattr3 *fattr_buf)
 | 
						|
{
 | 
						|
  struct {
 | 
						|
    FILE_FULL_EA_INFORMATION ffei;
 | 
						|
    char buf[sizeof (NFS_V3_ATTR) + sizeof (fattr3)];
 | 
						|
  } ffei_buf;
 | 
						|
  struct {
 | 
						|
     FILE_GET_EA_INFORMATION fgei;
 | 
						|
     char buf[sizeof (NFS_V3_ATTR)];
 | 
						|
  } fgei_buf;
 | 
						|
  NTSTATUS status;
 | 
						|
  IO_STATUS_BLOCK io;
 | 
						|
 | 
						|
  fgei_buf.fgei.NextEntryOffset = 0;
 | 
						|
  fgei_buf.fgei.EaNameLength = sizeof (NFS_V3_ATTR) - 1;
 | 
						|
  stpcpy (fgei_buf.fgei.EaName, NFS_V3_ATTR);
 | 
						|
  status = NtQueryEaFile (h, &io, &ffei_buf.ffei, sizeof ffei_buf, TRUE,
 | 
						|
			  &fgei_buf.fgei, sizeof fgei_buf, NULL, TRUE);
 | 
						|
  if (NT_SUCCESS (status))
 | 
						|
    {
 | 
						|
      fattr3 *nfs_attr = (fattr3 *) (ffei_buf.ffei.EaName
 | 
						|
				     + ffei_buf.ffei.EaNameLength + 1);
 | 
						|
      if (fattr_buf)
 | 
						|
	memcpy (fattr_buf, nfs_attr, sizeof (fattr3));
 | 
						|
    }
 | 
						|
  return status;
 | 
						|
}
 |