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.IsType (value, read))
145 access [index] = 'r';
146 if (UnixFileSystemInfo.IsType (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.IsType (value, xbit);
157 bool is_sx = UnixFileSystemInfo.IsType (value, setxbit);
168 public static readonly DateTime LocalUnixEpoch =
169 new DateTime (1970, 1, 1).ToLocalTime();
171 public static DateTime ToDateTime (long time)
173 return FromTimeT (time);
176 public static long FromDateTime (DateTime time)
178 return ToTimeT (time);
181 public static DateTime FromTimeT (long time)
183 DateTime r = LocalUnixEpoch.AddSeconds (time);
187 public static long ToTimeT (DateTime time)
189 return (long) time.Subtract (LocalUnixEpoch).TotalSeconds;
192 public static OpenFlags ToOpenFlags (FileMode mode, FileAccess access)
196 case FileMode.CreateNew:
197 flags = OpenFlags.O_CREAT | OpenFlags.O_EXCL;
199 case FileMode.Create:
200 flags = OpenFlags.O_CREAT | OpenFlags.O_TRUNC;
205 case FileMode.OpenOrCreate:
206 flags = OpenFlags.O_CREAT;
208 case FileMode.Truncate:
209 flags = OpenFlags.O_TRUNC;
211 case FileMode.Append:
212 flags = OpenFlags.O_APPEND;
215 throw new ArgumentException (Locale.GetText ("Unsupported mode value"), "mode");
218 // Is O_LARGEFILE supported?
220 if (TryFromOpenFlags (OpenFlags.O_LARGEFILE, out _v))
221 flags |= OpenFlags.O_LARGEFILE;
224 case FileAccess.Read:
225 flags |= OpenFlags.O_RDONLY;
227 case FileAccess.Write:
228 flags |= OpenFlags.O_WRONLY;
230 case FileAccess.ReadWrite:
231 flags |= OpenFlags.O_RDWR;
234 throw new ArgumentOutOfRangeException (Locale.GetText ("Unsupported access value"), "access");
240 public static string ToFopenMode (FileAccess access)
243 case FileAccess.Read: return "rb";
244 case FileAccess.Write: return "wb";
245 case FileAccess.ReadWrite: return "r+b";
246 default: throw new ArgumentOutOfRangeException ("access");
250 public static string ToFopenMode (FileMode mode)
253 case FileMode.CreateNew: case FileMode.Create: return "w+b";
254 case FileMode.Open: case FileMode.OpenOrCreate: return "r+b";
255 case FileMode.Truncate: return "w+b";
256 case FileMode.Append: return "a+b";
257 default: throw new ArgumentOutOfRangeException ("mode");
261 private static readonly string[][] fopen_modes = new string[][]{
262 // Read Write ReadWrite
263 /* FileMode.CreateNew: */ new string[]{"Can't Read+Create", "wb", "w+b"},
264 /* FileMode.Create: */ new string[]{"Can't Read+Create", "wb", "w+b"},
265 /* FileMode.Open: */ new string[]{"rb", "wb", "r+b"},
266 /* FileMode.OpenOrCreate: */ new string[]{"rb", "wb", "r+b"},
267 /* FileMode.Truncate: */ new string[]{"Cannot Truncate and Read","wb", "w+b"},
268 /* FileMode.Append: */ new string[]{"Cannot Append and Read", "ab", "a+b"},
271 public static string ToFopenMode (FileMode mode, FileAccess access)
273 int fm = -1, fa = -1;
275 case FileMode.CreateNew: fm = 0; break;
276 case FileMode.Create: fm = 1; break;
277 case FileMode.Open: fm = 2; break;
278 case FileMode.OpenOrCreate: fm = 3; break;
279 case FileMode.Truncate: fm = 4; break;
280 case FileMode.Append: fm = 5; break;
283 case FileAccess.Read: fa = 0; break;
284 case FileAccess.Write: fa = 1; break;
285 case FileAccess.ReadWrite: fa = 2; break;
289 throw new ArgumentOutOfRangeException ("mode");
291 throw new ArgumentOutOfRangeException ("access");
293 string fopen_mode = fopen_modes [fm][fa];
294 if (fopen_mode [0] != 'r' && fopen_mode [0] != 'w' && fopen_mode [0] != 'a')
295 throw new ArgumentException (fopen_mode);