2 // Mono.Unix/UnixFileSystemInfo.cs
5 // Jonathan Pryor (jonpryor@vt.edu)
7 // (C) 2004 Jonathan Pryor
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
36 public abstract class UnixFileSystemInfo
40 private bool valid = false;
42 protected UnixFileSystemInfo (string path)
48 internal UnixFileSystemInfo (String path, Stat stat)
55 protected string Path {
60 private void AssertValid ()
64 throw new InvalidOperationException ("Path doesn't exist!");
69 int r = Syscall.access (path, AccessMode.F_OK);
77 get {AssertValid (); return stat.st_dev;}
81 get {AssertValid (); return stat.st_ino;}
84 public FilePermissions Mode {
85 get {AssertValid (); return stat.st_mode;}
88 public FilePermissions Permissions {
89 get {AssertValid (); return stat.st_mode & ~FilePermissions.S_IFMT;}
92 public FilePermissions FileType {
93 get {AssertValid (); return stat.st_mode & FilePermissions.S_IFMT;}
96 public ulong LinkCount {
97 get {AssertValid (); return (ulong) stat.st_nlink;}
100 public uint OwnerUser {
101 get {AssertValid (); return stat.st_uid;}
104 public uint OwnerGroup {
105 get {AssertValid (); return stat.st_gid;}
108 public ulong DeviceType {
109 get {AssertValid (); return stat.st_rdev;}
113 get {AssertValid (); return (long) stat.st_size;}
116 public long BlockSize {
117 get {AssertValid (); return (long) stat.st_blksize;}
120 public long BlocksAllocated {
121 get {AssertValid (); return (long) stat.st_blocks;}
124 public DateTime LastAccessTime {
125 get {AssertValid (); return UnixConvert.ToDateTime (stat.st_atime);}
128 public DateTime LastAccessTimeUtc {
129 get {return LastAccessTime.ToUniversalTime ();}
132 public DateTime LastWriteTime {
133 get {AssertValid (); return UnixConvert.ToDateTime (stat.st_mtime);}
136 public DateTime LastWriteTimeUtc {
137 get {return LastWriteTime.ToUniversalTime ();}
140 public DateTime LastStatusChangeTime {
141 get {AssertValid (); return UnixConvert.ToDateTime (stat.st_ctime);}
144 public DateTime LastStatusChangeTimeUtc {
145 get {return LastStatusChangeTime.ToUniversalTime ();}
148 public bool IsDirectory {
149 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_IFDIR);}
152 public bool IsCharacterDevice {
153 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_IFCHR);}
156 public bool IsBlockDevice {
157 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_IFBLK);}
161 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_IFREG);}
165 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_IFIFO);}
168 public bool IsSymbolicLink {
169 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_IFLNK);}
172 public bool IsSocket {
173 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_IFSOCK);}
176 public bool IsSetUser {
177 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_ISUID);}
180 public bool IsSetGroup {
181 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_ISGID);}
184 public bool IsSticky {
185 get {AssertValid (); return IsType (stat.st_mode, FilePermissions.S_ISVTX);}
188 internal static bool IsType (FilePermissions mode, FilePermissions type)
190 return (mode & type) == type;
193 public bool CanAccess (AccessMode mode)
195 int r = Syscall.access (path, mode);
199 public abstract void Delete ();
201 public long GetConfigurationValue (PathConf name)
203 Syscall.SetLastError ((Error) 0);
204 long r = Syscall.pathconf (Path, name);
205 if (r == -1 && Syscall.GetLastError() != (Error) 0)
206 UnixMarshal.ThrowExceptionForLastError ();
210 // TODO: Should ReadLink be in UnixSymbolicLinkInfo?
211 public string ReadLink ()
213 string r = TryReadLink ();
215 UnixMarshal.ThrowExceptionForLastError ();
219 public string TryReadLink ()
221 // Who came up with readlink(2)? There doesn't seem to be a way to
222 // properly handle it.
223 StringBuilder sb = new StringBuilder (512);
224 int r = Syscall.readlink (path, sb);
227 return sb.ToString().Substring (0, r);
230 public new void Refresh ()
235 internal void Refresh (bool force)
239 int r = Syscall.stat (path, out this.stat);
243 public void SetLength (long length)
247 r = Syscall.truncate (path, length);
248 } while (UnixMarshal.ShouldRetrySyscall (r));
249 UnixMarshal.ThrowExceptionForLastErrorIf (r);
252 public void SetPermissions (FilePermissions perms)
254 int r = Syscall.chmod (path, perms);
255 UnixMarshal.ThrowExceptionForLastErrorIf (r);
258 public virtual void SetOwner (uint owner, uint group)
260 int r = Syscall.chown (path, owner, group);
261 UnixMarshal.ThrowExceptionForLastErrorIf (r);
264 public void SetOwner (string owner)
266 Passwd pw = Syscall.getpwnam (owner);
268 throw new ArgumentException (Locale.GetText ("invalid username"), "owner");
269 uint uid = pw.pw_uid;
270 uint gid = pw.pw_gid;
274 public void SetOwner (string owner, string group)
276 uint uid = UnixUser.GetUserId (owner);
277 uint gid = UnixGroup.GetGroupId (group);
282 public override string ToString ()
287 internal static UnixFileSystemInfo Create (string path)
289 Stat stat = UnixFile.GetFileStatus (path);
290 if (IsType (stat.st_mode, FilePermissions.S_IFDIR))
291 return new UnixDirectoryInfo (path, stat);
292 else if (IsType (stat.st_mode, FilePermissions.S_IFLNK))
293 return new UnixSymbolicLinkInfo (path, stat);
294 return new UnixFileInfo (path, stat);