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 {
374 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
375 public extern void DeleteFile(string path);
377 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
378 public extern bool ExistsFile(string path);
380 /* The long time parameters in GetFileTime and
381 * SetFileTime correspond to Windows file times (ticks
382 * from DateTime(1/1/1601 00:00 GMT))
384 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
385 private extern static bool GetFileTime(IntPtr handle, out long creat, out long lastaccess, out long lastwrite);
387 [MethodImplAttribute(System.Runtime.CompilerServices.MethodImplOptions.InternalCall)]
388 private extern static bool SetFileTime(IntPtr handle, long creat, long lastaccess, long lastwrite);
390 public DateTime GetCreationTimeFile(string path)
392 long creat, lastaccess, lastwrite;
394 FileStream s = new FileStream(path, FileMode.Open, FileAccess.Read);
396 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
399 return DateTime.FromFileTime(creat);
402 public DateTime GetLastAccessTimeFile(string path)
404 long creat, lastaccess, lastwrite;
406 FileStream s = new FileStream(path, FileMode.Open, FileAccess.Read);
408 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
411 return DateTime.FromFileTime(lastaccess);
414 public DateTime GetLastWriteTimeFile(string path)
416 long creat, lastaccess, lastwrite;
418 FileStream s = new FileStream(path, FileMode.Open, FileAccess.Read);
420 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
423 return DateTime.FromFileTime(lastwrite);
426 public void SetCreationTimeFile(string path, DateTime creationTime)
428 long creat, lastaccess, lastwrite;
430 FileStream s = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
432 // Get the existing times first
433 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
435 creat=creationTime.ToFileTime();
437 ret=SetFileTime(s.Handle, creat, lastaccess, lastwrite);
441 public void SetLastAccessTimeFile(string path, DateTime lastAccessTime)
443 long creat, lastaccess, lastwrite;
445 FileStream s = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
447 // Get the existing times first
448 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
450 lastaccess=lastAccessTime.ToFileTime();
452 ret=SetFileTime(s.Handle, creat, lastaccess, lastwrite);
456 public void SetLastWriteTimeFile(string path, DateTime lastWriteTime)
458 long creat, lastaccess, lastwrite;
460 FileStream s = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
462 // Get the existing times first
463 ret=GetFileTime(s.Handle, out creat, out lastaccess, out lastwrite);
465 lastwrite=lastWriteTime.ToFileTime();
467 ret=SetFileTime(s.Handle, creat, lastaccess, lastwrite);
472 public long FileLength(string path)
477 // Private implementation details
478 [DllImport("monowrapper", EntryPoint="mono_wrapper_environ", CharSet=CharSet.Ansi)]
479 private unsafe static extern IntPtr _getEnviron();
481 [DllImport("libc", EntryPoint="getpid")]
482 private unsafe static extern int _getPid();