2 * This file was automatically generated by make-map from Mono.Posix.dll.
9 using System.Runtime.InteropServices;
10 using Mono.Unix.Native;
12 namespace Mono.Unix.Native {
14 [CLSCompliant (false)]
15 public sealed /* static */ partial class NativeConvert
18 // Non-generated exports
21 // convert from octal representation.
22 public static FilePermissions FromOctalPermissionString (string value)
24 uint n = Convert.ToUInt32 (value, 8);
25 return ToFilePermissions (n);
28 public static string ToOctalPermissionString (FilePermissions value)
30 string s = Convert.ToString ((int) (value & ~FilePermissions.S_IFMT), 8);
31 return new string ('0', 4-s.Length) + s;
34 public static FilePermissions FromUnixPermissionString (string value)
37 throw new ArgumentNullException ("value");
38 if (value.Length != 9 && value.Length != 10)
39 throw new ArgumentException ("value", "must contain 9 or 10 characters");
42 FilePermissions perms = new FilePermissions ();
44 if (value.Length == 10) {
45 perms |= GetUnixPermissionDevice (value [i]);
49 perms |= GetUnixPermissionGroup (
50 value [i++], FilePermissions.S_IRUSR,
51 value [i++], FilePermissions.S_IWUSR,
52 value [i++], FilePermissions.S_IXUSR,
53 's', 'S', FilePermissions.S_ISUID);
55 perms |= GetUnixPermissionGroup (
56 value [i++], FilePermissions.S_IRGRP,
57 value [i++], FilePermissions.S_IWGRP,
58 value [i++], FilePermissions.S_IXGRP,
59 's', 'S', FilePermissions.S_ISGID);
61 perms |= GetUnixPermissionGroup (
62 value [i++], FilePermissions.S_IROTH,
63 value [i++], FilePermissions.S_IWOTH,
64 value [i++], FilePermissions.S_IXOTH,
65 't', 'T', FilePermissions.S_ISVTX);
70 private static FilePermissions GetUnixPermissionDevice (char value)
73 case 'd': return FilePermissions.S_IFDIR;
74 case 'c': return FilePermissions.S_IFCHR;
75 case 'b': return FilePermissions.S_IFBLK;
76 case '-': return FilePermissions.S_IFREG;
77 case 'p': return FilePermissions.S_IFIFO;
78 case 'l': return FilePermissions.S_IFLNK;
79 case 's': return FilePermissions.S_IFSOCK;
81 throw new ArgumentException ("value", "invalid device specification: " +
85 private static FilePermissions GetUnixPermissionGroup (
86 char read, FilePermissions readb,
87 char write, FilePermissions writeb,
88 char exec, FilePermissions execb,
89 char xboth, char xbitonly, FilePermissions xbit)
91 FilePermissions perms = new FilePermissions ();
98 else if (exec == xbitonly)
100 else if (exec == xboth)
101 perms |= (execb | xbit);
105 // Create ls(1) drwxrwxrwx permissions display
106 public static string ToUnixPermissionString (FilePermissions value)
108 char [] access = new char[] {
110 '-', '-', '-', // owner
111 '-', '-', '-', // group
112 '-', '-', '-', // other
114 bool have_device = true;
115 switch (value & FilePermissions.S_IFMT) {
116 case FilePermissions.S_IFDIR: access [0] = 'd'; break;
117 case FilePermissions.S_IFCHR: access [0] = 'c'; break;
118 case FilePermissions.S_IFBLK: access [0] = 'b'; break;
119 case FilePermissions.S_IFREG: access [0] = '-'; break;
120 case FilePermissions.S_IFIFO: access [0] = 'p'; break;
121 case FilePermissions.S_IFLNK: access [0] = 'l'; break;
122 case FilePermissions.S_IFSOCK: access [0] = 's'; break;
123 default: have_device = false; break;
125 SetUnixPermissionGroup (value, access, 1,
126 FilePermissions.S_IRUSR, FilePermissions.S_IWUSR, FilePermissions.S_IXUSR,
127 's', 'S', FilePermissions.S_ISUID);
128 SetUnixPermissionGroup (value, access, 4,
129 FilePermissions.S_IRGRP, FilePermissions.S_IWGRP, FilePermissions.S_IXGRP,
130 's', 'S', FilePermissions.S_ISGID);
131 SetUnixPermissionGroup (value, access, 7,
132 FilePermissions.S_IROTH, FilePermissions.S_IWOTH, FilePermissions.S_IXOTH,
133 't', 'T', FilePermissions.S_ISVTX);
135 ? new string (access)
136 : new string (access, 1, 9);
139 private static void SetUnixPermissionGroup (FilePermissions value,
140 char[] access, int index,
141 FilePermissions read, FilePermissions write, FilePermissions exec,
142 char both, char setonly, FilePermissions setxbit)
144 if (UnixFileSystemInfo.IsSet (value, read))
145 access [index] = 'r';
146 if (UnixFileSystemInfo.IsSet (value, write))
147 access [index+1] = 'w';
148 access [index+2] = GetSymbolicMode (value, exec, both, setonly, setxbit);
151 // Implement the GNU ls(1) permissions spec; see `info coreutils ls`,
152 // section 10.1.2, the `-l' argument information.
153 private static char GetSymbolicMode (FilePermissions value,
154 FilePermissions xbit, char both, char setonly, FilePermissions setxbit)
156 bool is_x = UnixFileSystemInfo.IsSet (value, xbit);
157 bool is_sx = UnixFileSystemInfo.IsSet (value, setxbit);
168 public static readonly DateTime LocalUnixEpoch =
169 new DateTime (1970, 1, 1);
170 public static readonly TimeSpan LocalUtcOffset =
171 TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.UtcNow);
173 public static DateTime ToDateTime (long time)
175 return FromTimeT (time);
178 public static long FromDateTime (DateTime time)
180 return ToTimeT (time);
183 public static DateTime FromTimeT (long time)
185 DateTime r = LocalUnixEpoch.AddSeconds ((double) time +
186 LocalUtcOffset.TotalSeconds);
190 public static long ToTimeT (DateTime time)
192 TimeSpan unixTime = time.Subtract (LocalUnixEpoch) - LocalUtcOffset;
193 return (long) unixTime.TotalSeconds;
196 public static OpenFlags ToOpenFlags (FileMode mode, FileAccess access)
200 case FileMode.CreateNew:
201 flags = OpenFlags.O_CREAT | OpenFlags.O_EXCL;
203 case FileMode.Create:
204 flags = OpenFlags.O_CREAT | OpenFlags.O_TRUNC;
209 case FileMode.OpenOrCreate:
210 flags = OpenFlags.O_CREAT;
212 case FileMode.Truncate:
213 flags = OpenFlags.O_TRUNC;
215 case FileMode.Append:
216 flags = OpenFlags.O_APPEND;
219 throw new ArgumentException (Locale.GetText ("Unsupported mode value"), "mode");
222 // Is O_LARGEFILE supported?
224 if (TryFromOpenFlags (OpenFlags.O_LARGEFILE, out _v))
225 flags |= OpenFlags.O_LARGEFILE;
228 case FileAccess.Read:
229 flags |= OpenFlags.O_RDONLY;
231 case FileAccess.Write:
232 flags |= OpenFlags.O_WRONLY;
234 case FileAccess.ReadWrite:
235 flags |= OpenFlags.O_RDWR;
238 throw new ArgumentOutOfRangeException (Locale.GetText ("Unsupported access value"), "access");
244 public static string ToFopenMode (FileAccess access)
247 case FileAccess.Read: return "rb";
248 case FileAccess.Write: return "wb";
249 case FileAccess.ReadWrite: return "r+b";
250 default: throw new ArgumentOutOfRangeException ("access");
254 public static string ToFopenMode (FileMode mode)
257 case FileMode.CreateNew: case FileMode.Create: return "w+b";
258 case FileMode.Open: case FileMode.OpenOrCreate: return "r+b";
259 case FileMode.Truncate: return "w+b";
260 case FileMode.Append: return "a+b";
261 default: throw new ArgumentOutOfRangeException ("mode");
265 private static readonly string[][] fopen_modes = new string[][]{
266 // Read Write ReadWrite
267 /* FileMode.CreateNew: */ new string[]{"Can't Read+Create", "wb", "w+b"},
268 /* FileMode.Create: */ new string[]{"Can't Read+Create", "wb", "w+b"},
269 /* FileMode.Open: */ new string[]{"rb", "wb", "r+b"},
270 /* FileMode.OpenOrCreate: */ new string[]{"rb", "wb", "r+b"},
271 /* FileMode.Truncate: */ new string[]{"Cannot Truncate and Read","wb", "w+b"},
272 /* FileMode.Append: */ new string[]{"Cannot Append and Read", "ab", "a+b"},
275 public static string ToFopenMode (FileMode mode, FileAccess access)
277 int fm = -1, fa = -1;
279 case FileMode.CreateNew: fm = 0; break;
280 case FileMode.Create: fm = 1; break;
281 case FileMode.Open: fm = 2; break;
282 case FileMode.OpenOrCreate: fm = 3; break;
283 case FileMode.Truncate: fm = 4; break;
284 case FileMode.Append: fm = 5; break;
287 case FileAccess.Read: fa = 0; break;
288 case FileAccess.Write: fa = 1; break;
289 case FileAccess.ReadWrite: fa = 2; break;
293 throw new ArgumentOutOfRangeException ("mode");
295 throw new ArgumentOutOfRangeException ("access");
297 string fopen_mode = fopen_modes [fm][fa];
298 if (fopen_mode [0] != 'r' && fopen_mode [0] != 'w' && fopen_mode [0] != 'a')
299 throw new ArgumentException (fopen_mode);
303 [DllImport (LIB, EntryPoint="Mono_Posix_FromStatvfs")]
304 private static extern int FromStatvfs (ref Statvfs source, IntPtr destination);
306 public static bool TryCopy (ref Statvfs source, IntPtr destination)
308 return FromStatvfs (ref source, destination) == 0;
311 [DllImport (LIB, EntryPoint="Mono_Posix_ToStatvfs")]
312 private static extern int ToStatvfs (IntPtr source, out Statvfs destination);
314 public static bool TryCopy (IntPtr source, out Statvfs destination)
316 return ToStatvfs (source, out destination) == 0;