Merge pull request #1909 from esdrubal/reflection
[mono.git] / mcs / class / Mono.Posix / Mono.Unix / UnixFileSystemInfo.cs
index b48638fcf7b15e7371041d9b26e7a9479a56ed5f..149f79b84ed966bff1e74d466dd82a066acfd8e8 100644 (file)
@@ -108,18 +108,6 @@ namespace Mono.Unix {
                        get {AssertValid (); return Convert.ToInt64 (stat.st_ino);}
                }
 
-               [CLSCompliant (false)]
-               [Obsolete ("Use Protection.")]
-               public FilePermissions Mode {
-                       get {AssertValid (); return (FilePermissions) stat.st_mode;}
-               }
-
-               [CLSCompliant (false)]
-               [Obsolete ("Use FileAccessPermissions.")]
-               public FilePermissions Permissions {
-                       get {AssertValid (); return (FilePermissions) stat.st_mode & ~FilePermissions.S_IFMT;}
-               }
-
                [CLSCompliant (false)]
                public Native.FilePermissions Protection {
                        get {AssertValid (); return (Native.FilePermissions) stat.st_mode;}
@@ -132,8 +120,7 @@ namespace Mono.Unix {
                public FileTypes FileType {
                        get {
                                AssertValid ();
-                               int type = (int) stat.st_mode;
-                               return (FileTypes) (type & (int) AllFileTypes);
+                               return (FileTypes) (stat.st_mode & Native.FilePermissions.S_IFMT);
                        }
                        // no set as chmod(2) won't accept changing the file type.
                }
@@ -205,7 +192,7 @@ namespace Mono.Unix {
                }
 
                public DateTime LastAccessTime {
-                       get {AssertValid (); return Native.NativeConvert.ToDateTime (stat.st_atime);}
+                       get {AssertValid (); return Native.NativeConvert.ToDateTime (stat.st_atime, stat.st_atime_nsec);}
                }
 
                public DateTime LastAccessTimeUtc {
@@ -213,7 +200,7 @@ namespace Mono.Unix {
                }
 
                public DateTime LastWriteTime {
-                       get {AssertValid (); return Native.NativeConvert.ToDateTime (stat.st_mtime);}
+                       get {AssertValid (); return Native.NativeConvert.ToDateTime (stat.st_mtime, stat.st_mtime_nsec);}
                }
 
                public DateTime LastWriteTimeUtc {
@@ -221,7 +208,7 @@ namespace Mono.Unix {
                }
 
                public DateTime LastStatusChangeTime {
-                       get {AssertValid (); return Native.NativeConvert.ToDateTime (stat.st_ctime);}
+                       get {AssertValid (); return Native.NativeConvert.ToDateTime (stat.st_ctime, stat.st_ctime_nsec);}
                }
 
                public DateTime LastStatusChangeTimeUtc {
@@ -229,75 +216,55 @@ namespace Mono.Unix {
                }
 
                public bool IsDirectory {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFDIR);}
+                       get {AssertValid (); return IsFileType (stat.st_mode, Native.FilePermissions.S_IFDIR);}
                }
 
                public bool IsCharacterDevice {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFCHR);}
+                       get {AssertValid (); return IsFileType (stat.st_mode, Native.FilePermissions.S_IFCHR);}
                }
 
                public bool IsBlockDevice {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFBLK);}
-               }
-
-               [Obsolete ("Use IsRegularFile")]
-               public bool IsFile {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFREG);}
+                       get {AssertValid (); return IsFileType (stat.st_mode, Native.FilePermissions.S_IFBLK);}
                }
 
                public bool IsRegularFile {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFREG);}
-               }
-
-               [Obsolete ("Use IsFifo")]
-               [CLSCompliant (false)]
-               public bool IsFIFO {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFIFO);}
+                       get {AssertValid (); return IsFileType (stat.st_mode, Native.FilePermissions.S_IFREG);}
                }
 
                public bool IsFifo {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFIFO);}
+                       get {AssertValid (); return IsFileType (stat.st_mode, Native.FilePermissions.S_IFIFO);}
                }
 
                public bool IsSymbolicLink {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFLNK);}
+                       get {AssertValid (); return IsFileType (stat.st_mode, Native.FilePermissions.S_IFLNK);}
                }
 
                public bool IsSocket {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_IFSOCK);}
+                       get {AssertValid (); return IsFileType (stat.st_mode, Native.FilePermissions.S_IFSOCK);}
                }
 
                public bool IsSetUser {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_ISUID);}
+                       get {AssertValid (); return IsSet (stat.st_mode, Native.FilePermissions.S_ISUID);}
                }
 
                public bool IsSetGroup {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_ISGID);}
+                       get {AssertValid (); return IsSet (stat.st_mode, Native.FilePermissions.S_ISGID);}
                }
 
                public bool IsSticky {
-                       get {AssertValid (); return IsType (stat.st_mode, Native.FilePermissions.S_ISVTX);}
+                       get {AssertValid (); return IsSet (stat.st_mode, Native.FilePermissions.S_ISVTX);}
                }
 
-               [Obsolete ("Use IsType(Native.FilePermissions, Native.FilePermissions)", true)]
-               internal static bool IsType (FilePermissions mode, FilePermissions type)
+               internal static bool IsFileType (Native.FilePermissions mode, Native.FilePermissions type)
                {
-                       return (mode & type) == type;
+                       return (mode & Native.FilePermissions.S_IFMT) == type;
                }
 
-               internal static bool IsType (Native.FilePermissions mode, Native.FilePermissions type)
+               internal static bool IsSet (Native.FilePermissions mode, Native.FilePermissions type)
                {
                        return (mode & type) == type;
                }
 
-               [CLSCompliant (false)]
-               [Obsolete ("Use CanAccess (Mono.Unix.Native.AccessModes)", true)]
-               public bool CanAccess (AccessMode mode)
-               {
-                       int r = Syscall.access (FullPath, mode);
-                       return r == 0;
-               }
-
                [CLSCompliant (false)]
                public bool CanAccess (Native.AccessModes mode)
                {
@@ -309,7 +276,7 @@ namespace Mono.Unix {
                {
                        int r = Native.Syscall.link (FullName, path);
                        UnixMarshal.ThrowExceptionForLastErrorIf (r);
-                       return Create (path);
+                       return GetFileSystemEntry (path);
                }
 
                public UnixSymbolicLinkInfo CreateSymbolicLink (string path)
@@ -321,16 +288,6 @@ namespace Mono.Unix {
 
                public abstract void Delete ();
 
-               [CLSCompliant (false)]
-               [Obsolete ("Use GetConfigurationValue (Mono.Unix.Native.PathconfName)", true)]
-               public long GetConfigurationValue (PathConf name)
-               {
-                       long r = Syscall.pathconf (FullPath, name);
-                       if (r == -1 && Syscall.GetLastError() != (Error) 0)
-                               UnixMarshal.ThrowExceptionForLastError ();
-                       return r;
-               }
-
                [CLSCompliant (false)]
                public long GetConfigurationValue (Native.PathconfName name)
                {
@@ -366,22 +323,6 @@ namespace Mono.Unix {
                        UnixMarshal.ThrowExceptionForLastErrorIf (r);
                }
 
-               [CLSCompliant (false)]
-               [Obsolete ("Use Protection setter", true)]
-               public void SetPermissions (FilePermissions perms)
-               {
-                       int r = Syscall.chmod (FullPath, perms);
-                       UnixMarshal.ThrowExceptionForLastErrorIf (r);
-               }
-
-               [CLSCompliant (false)]
-               [Obsolete ("Use SetOwner (long, long)", true)]
-               public virtual void SetOwner (uint owner, uint group)
-               {
-                       int r = Syscall.chown (FullPath, owner, group);
-                       UnixMarshal.ThrowExceptionForLastErrorIf (r);
-               }
-
                public virtual void SetOwner (long owner, long group)
                {
                        uint _owner = Convert.ToUInt32 (owner);
@@ -445,17 +386,41 @@ namespace Mono.Unix {
                        return stat;
                }
 
-               internal static UnixFileSystemInfo Create (string path)
+               public static UnixFileSystemInfo GetFileSystemEntry (string path)
+               {
+                       UnixFileSystemInfo info;
+                       if (TryGetFileSystemEntry (path, out info))
+                               return info;
+
+                       UnixMarshal.ThrowExceptionForLastError ();
+
+                       // Throw DirectoryNotFoundException because lstat(2) probably failed
+                       // because of ENOTDIR (e.g. "/path/to/file/wtf"), so
+                       // DirectoryNotFoundException is what would have been thrown anyway.
+                       throw new DirectoryNotFoundException ("UnixMarshal.ThrowExceptionForLastError didn't throw?!");
+               }
+
+               public static bool TryGetFileSystemEntry (string path, out UnixFileSystemInfo entry)
                {
                        Native.Stat stat;
                        int r = Native.Syscall.lstat (path, out stat);
-                       UnixMarshal.ThrowExceptionForLastErrorIf (r);
+                       if (r == -1) {
+                               if (Native.Stdlib.GetLastError() == Native.Errno.ENOENT) {
+                                       entry = new UnixFileInfo (path);
+                                       return true;
+                               }
+                               entry = null;
+                               return false;
+                       }
+
+                       if (IsFileType (stat.st_mode, Native.FilePermissions.S_IFDIR))
+                               entry = new UnixDirectoryInfo (path, stat);
+                       else if (IsFileType (stat.st_mode, Native.FilePermissions.S_IFLNK))
+                               entry = new UnixSymbolicLinkInfo (path, stat);
+                       else
+                               entry = new UnixFileInfo (path, stat);
 
-                       if (IsType (stat.st_mode, Native.FilePermissions.S_IFDIR))
-                               return new UnixDirectoryInfo (path, stat);
-                       else if (IsType (stat.st_mode, Native.FilePermissions.S_IFLNK))
-                               return new UnixSymbolicLinkInfo (path, stat);
-                       return new UnixFileInfo (path, stat);
+                       return true;
                }
        }
 }