1 /*---------------------------------------------------------------------
9 XXXX XX XX XXX XXXXXXX XXXX
13 Copyright (c) 2001 Intel Corporation. All Rights Reserved.
15 CREATED: August 22, 2001
16 OWNER: Scott D Smith, Joel Marcey
18 ---------------------------------------------------------------------*/
21 using System.Runtime.InteropServices;
24 using System.Collections;
25 using System.Reflection;
26 using System.Runtime.CompilerServices;
31 /// Class that implements IOperatingSystem, providing the requested functionality through calls into APIs available in Linux
35 private Hashtable _environment = null;
37 //----------------------------------
39 //----------------------------------
40 private const int EOF = -1; // TODO: Linux: Is this true?
43 // For StdInputStream and StdOutputStream
45 private IntPtr Stdout;
46 private IntPtr Stderr;
48 //----------------------------------
50 //----------------------------------
52 //----------------------------------
54 //----------------------------------
57 Stdin=GetStdHandle(0);
58 Stdout=GetStdHandle(1);
59 Stderr=GetStdHandle(2);
63 //-------------------------------------------------
64 // Environment Services
65 //-------------------------------------------------
67 public string NewLineSequence
75 public char DirectorySeparator
83 public char AltDirectorySeparator
91 public char VolumeSeparator
99 public char PathSeparator
107 public char[] InvalidPathChars
111 return new char[] { '\0' };
115 public char[] DirVolSeparatorChars
119 return new char[] { this.DirectorySeparator, this.AltDirectorySeparator, this.VolumeSeparator};
122 public char ExtensionCharacter
130 public string GetEnvironmentVariable(string eVar)
132 return EnvironmentVariables[eVar].ToString();
135 public IDictionary EnvironmentVariables
139 if (_environment == null) {
140 IntPtr pp = _getEnviron(); // pointer to an array of char*
141 _environment = new Hashtable();
143 if (pp != IntPtr.Zero) {
146 char[] delimiter = { '=' };
150 p = Marshal.ReadIntPtr(pp);
151 if (p != IntPtr.Zero)
153 string str = Marshal.PtrToStringAuto(p);
154 string[] ar = str.Split(delimiter, 2);
158 _environment.Add(ar[0], "");
161 _environment.Add(ar[0], ar[1]);
164 //System.Diagnostics/.Debug.Assert(false); // this shouldn't happen
179 public string CommandLine
183 string path = Path.Combine(Path.Combine("/proc", _getPid().ToString()), "cmdline");
184 StreamReader stream = File.OpenText(path);
185 string res = stream.ReadToEnd();
191 public string MachineName
195 return GetEnvironmentVariable("HOSTNAME");
199 public OperatingSystem OSVersion
207 // System.Path services
209 public string ChangeExtension(string path, string extension)
211 //System.Diagnostics/.Debug.WriteLine("Linux:ChangeExtension(System.String, System.String): Stub Method");
215 public string GetExtension(string path)
217 //System.Diagnostics/.Debug.WriteLine("Linux:GetExtension(System.String): Stub Method");
221 public string GetFileName(string path)
223 //System.Diagnostics/.Debug.WriteLine("Linux:GetFileName(System.String): Stub Method");
227 public string GetFileNameWithoutExtension(string path)
229 //System.Diagnostics/.Debug.WriteLine("Linux:GetFileNameWithoutExtension(System.String): Stub Method");
233 public string GetFullPath(string path)
235 //System.Diagnostics/.Debug.WriteLine("Linux:GetFullPath(System.String): Stub Method");
239 public string GetPathRoot(string path)
241 //System.Diagnostics/.Debug.WriteLine("Linux:GetPathRoot(System.String): Stub Method");
246 public string GetTempFileName()
248 //System.Diagnostics/.Debug.WriteLine("Linux:GetTempFileName(): Stub Method");
252 public string GetTempPath()
254 //System.Diagnostics/.Debug.WriteLine("Linux:GetTempPath(): Stub Method");
258 public bool HasExtension(string path)
260 //System.Diagnostics/.Debug.WriteLine("Linux:HasExtension(System.String): Stub Method");
264 public bool IsPathRooted(string path)
266 //System.Diagnostics/.Debug.WriteLine("Linux:IsPathRooted(System.String): Stub Method");
272 // System.Directory services
274 public void DeleteDirectory(string path, bool recursive)
276 //System.Diagnostics/.Debug.WriteLine("Linux:DeleteDirectory(System.String, System.Boolean): Stub Method");
279 public bool ExistsDirectory(string path)
281 //System.Diagnostics/.Debug.WriteLine("Linux:ExistsDirectory(System.String): Stub Method");
285 public DateTime GetCreationTimeDirectory(string path)
287 //System.Diagnostics/.Debug.WriteLine("Linux:GetCreationTimeDirectory(System.String): Stub Method");
288 return new DateTime(0);
291 [System.Runtime.CompilerServices.MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
292 public extern string GetCurrentDirectory();
294 public string[] GetDirectories(string path, string searchPattern)
296 //System.Diagnostics/.Debug.WriteLine("Linux:GetDirectories(System.String,System.String): Stub Method");
300 public string[] GetFiles(string path, string searchPattern)
302 //System.Diagnostics/.Debug.WriteLine("Linux:GetFiles(System.String, System.String): Stub Method");
306 public string[] GetFileSystemEntries(string path, string searchPattern)
308 //System.Diagnostics/.Debug.WriteLine("Linux:GetFileSystemEntries(System.String, System.String): Stub Method");
312 public DateTime GetLastAccessTimeDirectory(string path)
314 //System.Diagnostics/.Debug.WriteLine("Linux:GetLastAccessTimeDirectory(System.String): Stub Method");
315 return new DateTime(0);
318 public DateTime GetLastWriteTimeDirectory(string path)
320 //System.Diagnostics/.Debug.WriteLine("Linux:GetLastWriteTimeDirectory(System.String): Stub Method");
321 return new DateTime(0);
324 public void MoveDirectory(string sourceDirName, string destDirName)
326 //System.Diagnostics/.Debug.WriteLine("Linux:MoveDirectory(System.String, System.String): Stub Method");
329 public void SetCreationTimeDirectory(string path, DateTime creationTime)
331 //System.Diagnostics/.Debug.WriteLine("Linux:SetCreationTimeDirectory(System.String, System.DateTime): Stub Method");
334 public void SetCurrentDirectory(string path)
336 //System.Diagnostics/.Debug.WriteLine("Linux:SetCurrentDirectory(System.String): Stub Method");
339 public void SetLastAccessTimeDirectory(string path, DateTime lastAccessTime)
341 //System.Diagnostics/.Debug.WriteLine("Linux:SetLastAccessTimeDirectory(System.String, System.DateTime): Stub Method");
344 public void SetLastWriteTimeDirectory(string path, DateTime lastWriteTime)
346 //System.Diagnostics/.Debug.WriteLine("Linux:SetLastWriteTimeDirectory(System.String, System.DateTime): Stub Method");
349 //-----------------------------------
351 //-----------------------------------
353 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
354 private extern IntPtr GetStdHandle(int fd);
356 public IntPtr StdinHandle {
362 public IntPtr StdoutHandle {
368 public IntPtr StderrHandle {
375 // For StdInputStream
376 public int ReadStdInput(byte[] buffer, int offset, int count)
378 return ReadFile(StdinHandle, buffer, offset, count);
381 // For StdOutputStream
382 public void FlushStdOutput(byte[] byteBuf)
384 FlushFile(StdoutHandle, byteBuf);
387 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
388 public extern int ReadFile(IntPtr handle, byte[] buffer, int offset, int count);
390 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
391 public extern int WriteFile(IntPtr handle, byte[] buffer, int offset, int count);
393 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
394 public extern int SetLengthFile(IntPtr handle, long length);
396 public void FlushFile(IntPtr handle, byte[] byteBuf)
398 WriteFile(handle, byteBuf, 0, byteBuf.Length);
401 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
402 public extern IntPtr OpenFile(String path, FileMode mode, FileAccess access, FileShare share);
404 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
405 public extern void CloseFile(IntPtr handle);
407 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
408 public extern long SeekFile(IntPtr handle, long offset, SeekOrigin origin);
410 public IntPtr CreateFile(string path, FileMode mode, FileAccess access, FileShare share)
412 return OpenFile(path, FileMode.CreateNew, access, share);
415 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
416 public extern void DeleteFile(string path);
418 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
419 public extern bool ExistsFile(string path);
421 /* The long time parameters in GetFileTime and
422 * SetFileTime correspond to Windows file times (ticks
423 * from DateTime(1/1/1601 00:00 GMT))
425 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
426 private extern bool GetFileTime(IntPtr handle, out long creat, out long lastaccess, out long lastwrite);
428 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
429 private extern bool SetFileTime(IntPtr handle, long creat, long lastaccess, long lastwrite);
431 public DateTime GetCreationTimeFile(string path)
433 long creat, lastaccess, lastwrite;
435 FileStream s = new FileStream(path, FileMode.Open, FileAccess.Read);
437 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
440 return DateTime.FromFileTime(creat);
443 public DateTime GetLastAccessTimeFile(string path)
445 long creat, lastaccess, lastwrite;
447 FileStream s = new FileStream(path, FileMode.Open, FileAccess.Read);
449 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
452 return DateTime.FromFileTime(lastaccess);
455 public DateTime GetLastWriteTimeFile(string path)
457 long creat, lastaccess, lastwrite;
459 FileStream s = new FileStream(path, FileMode.Open, FileAccess.Read);
461 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
464 return DateTime.FromFileTime(lastwrite);
467 public void SetCreationTimeFile(string path, DateTime creationTime)
469 long creat, lastaccess, lastwrite;
471 FileStream s = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
473 // Get the existing times first
474 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
476 creat=creationTime.ToFileTime();
478 ret=SetFileTime(s.Handle, creat, lastaccess, lastwrite);
482 public void SetLastAccessTimeFile(string path, DateTime lastAccessTime)
484 long creat, lastaccess, lastwrite;
486 FileStream s = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
488 // Get the existing times first
489 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
491 lastaccess=lastAccessTime.ToFileTime();
493 ret=SetFileTime(s.Handle, creat, lastaccess, lastwrite);
497 public void SetLastWriteTimeFile(string path, DateTime lastWriteTime)
499 long creat, lastaccess, lastwrite;
501 FileStream s = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
503 // Get the existing times first
504 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
506 lastwrite=lastWriteTime.ToFileTime();
508 ret=SetFileTime(s.Handle, creat, lastaccess, lastwrite);
513 public long FileLength(string path)
518 public long FileLength(IntPtr handle)
523 // Private implementation details
524 [DllImport("monowrapper", EntryPoint="mono_wrapper_environ", CharSet=CharSet.Ansi)]
525 private unsafe static extern IntPtr _getEnviron();
527 [DllImport("libc", EntryPoint="getpid")]
528 private unsafe static extern int _getPid();
530 [ DllImport("libm", EntryPoint="acos") ]
531 public extern static double Acos(double d);
533 [ DllImport("libm", EntryPoint="asin") ]
534 public extern static double Asin(double d);
536 [ DllImport("libm", EntryPoint="atan") ]
537 public extern static double Atan(double d);
539 [ DllImport("libm", EntryPoint="atan2") ]
540 public extern static double Atan2(double y, double x);
542 [ DllImport("libm", EntryPoint="cos") ]
543 public extern static double Cos(double d);
545 [ DllImport("libm", EntryPoint="cosh") ]
546 public extern static double Cosh(double d);
548 [ DllImport("libm", EntryPoint="exp") ]
549 public extern static double Exp(double d);
551 [ DllImport("libm", EntryPoint="log") ]
552 public extern static double Log(double d);
554 [ DllImport("libm", EntryPoint="log10") ]
555 public extern static double Log10(double d);
557 [ DllImport("libm", EntryPoint="pow") ]
558 public extern static double Pow(double x, double y);
560 [ DllImport("libm", EntryPoint="sin") ]
561 public extern static double Sin(double d);
563 [ DllImport("libm", EntryPoint="sinh") ]
564 public extern static double Sinh(double d);
566 [ DllImport("libm", EntryPoint="sqrt") ]
567 public extern static double Sqrt(double d);
569 [ DllImport("libm", EntryPoint="tan") ]
570 public extern static double Tan(double d);
572 [ DllImport("libm", EntryPoint="tanh") ]
573 public extern static double Tanh(double d);