* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / Mono.Posix / Mono.Unix / UnixEnvironment.cs
index 11ac0d98ec1c95abe0d7abda3ebe7284b232593a..4144c13317fc17f674cb6876df0e763866f75923 100644 (file)
@@ -39,10 +39,10 @@ namespace Mono.Unix {
 
                public static string CurrentDirectory {
                        get {
-                               return UnixDirectory.GetCurrentDirectory ();
+                               return UnixDirectoryInfo.GetCurrentDirectory ();
                        }
                        set {
-                               UnixDirectory.SetCurrentDirectory (value);
+                               UnixDirectoryInfo.SetCurrentDirectory (value);
                        }
                }
 
@@ -50,105 +50,169 @@ namespace Mono.Unix {
                        get {
                                StringBuilder buf = new StringBuilder (8);
                                int r = 0;
-                               Error e = (Error) 0;
+                               Native.Errno e = (Native.Errno) 0;
                                do {
                                        buf.Capacity *= 2;
-                                       r = Syscall.gethostname (buf);
-                               } while (r == (-1) && ((e = Syscall.GetLastError()) == Error.EINVAL) || 
-                                               (e == Error.ENAMETOOLONG));
+                                       r = Native.Syscall.gethostname (buf);
+                               } while (r == (-1) && ((e = Native.Stdlib.GetLastError()) == Native.Errno.EINVAL) || 
+                                               (e == Native.Errno.ENAMETOOLONG));
                                if (r == (-1))
                                        UnixMarshal.ThrowExceptionForLastError ();
                                return buf.ToString ();
                        }
                        set {
-                               Syscall.sethostname (value);
+                               int r = Native.Syscall.sethostname (value);
+                               UnixMarshal.ThrowExceptionForLastErrorIf (r);
                        }
                }
 
-               public static long GetConfigurationValue (SysConf name)
+               public static string UserName {
+                       get {return UnixUserInfo.GetRealUser ().UserName;}
+               }
+
+               public static UnixGroupInfo RealGroup {
+                       get {return new UnixGroupInfo (RealGroupId);}
+                       // set can't be done as setgid(2) modifies effective gid as well
+               }
+
+               public static long RealGroupId {
+                       get {return Native.Syscall.getgid ();}
+                       // set can't be done as setgid(2) modifies effective gid as well
+               }
+
+               public static UnixUserInfo RealUser {
+                       get {return new UnixUserInfo (RealUserId);}
+                       // set can't be done as setuid(2) modifies effective uid as well
+               }
+
+               public static long RealUserId {
+                       get {return Native.Syscall.getuid ();}
+                       // set can't be done as setuid(2) modifies effective uid as well
+               }
+
+               public static UnixGroupInfo EffectiveGroup {
+                       get {return new UnixGroupInfo (EffectiveGroupId);}
+                       set {EffectiveGroupId = value.GroupId;}
+               }
+
+               public static long EffectiveGroupId {
+                       get {return Native.Syscall.getegid ();}
+                       set {Native.Syscall.setegid (Convert.ToUInt32 (value));}
+               }
+
+               public static UnixUserInfo EffectiveUser {
+                       get {return new UnixUserInfo (EffectiveUserId);}
+                       set {EffectiveUserId = value.UserId;}
+               }
+
+               public static long EffectiveUserId {
+                       get {return Native.Syscall.geteuid ();}
+                       set {Native.Syscall.seteuid (Convert.ToUInt32 (value));}
+               }
+
+               public static string Login {
+                       get {return UnixUserInfo.GetRealUser ().UserName;}
+               }
+
+               [CLSCompliant (false)]
+               public static long GetConfigurationValue (Native.SysconfName name)
                {
-                       long r = Syscall.sysconf (name);
-                       if (r == -1 && Syscall.GetLastError() == Error.EINVAL)
+                       long r = Native.Syscall.sysconf (name);
+                       if (r == -1 && Native.Stdlib.GetLastError() != (Native.Errno) 0)
                                UnixMarshal.ThrowExceptionForLastError ();
                        return r;
                }
 
-               public static string GetConfigurationString (ConfStr name)
+               [CLSCompliant (false)]
+               public static string GetConfigurationString (Native.ConfstrName name)
                {
-                       ulong len = Syscall.confstr (name, null, 0);
+                       ulong len = Native.Syscall.confstr (name, null, 0);
+                       if (len == unchecked ((ulong) (-1)))
+                               UnixMarshal.ThrowExceptionForLastError ();
                        if (len == 0)
                                return "";
                        StringBuilder buf = new StringBuilder ((int) len+1);
-                       len = Syscall.confstr (name, buf, len);
+                       len = Native.Syscall.confstr (name, buf, len);
+                       if (len == unchecked ((ulong) (-1)))
+                               UnixMarshal.ThrowExceptionForLastError ();
                        return buf.ToString ();
                }
 
                public static void SetNiceValue (int inc)
                {
-                       int r = Syscall.nice (inc);
+                       int r = Native.Syscall.nice (inc);
                        UnixMarshal.ThrowExceptionForLastErrorIf (r);
                }
 
-               public static uint User {
-                       get {return UnixUser.GetCurrentUserId ();}
-               }
-
-               public static string UserName {
-                       get {return UnixUser.GetCurrentUserName();}
-               }
-
-               public static string Login {
-                       get {return UnixUser.GetLogin ();}
-               }
-
                public static int CreateSession ()
                {
-                       return Syscall.setsid ();
+                       int s = Native.Syscall.setsid ();
+                       UnixMarshal.ThrowExceptionForLastErrorIf (s);
+                       return s;
                }
 
                public static void SetProcessGroup ()
                {
-                       int r = Syscall.setpgrp ();
+                       int r = Native.Syscall.setpgrp ();
                        UnixMarshal.ThrowExceptionForLastErrorIf (r);
                }
 
                public static int GetProcessGroup ()
                {
-                       return Syscall.getpgrp ();
+                       return Native.Syscall.getpgrp ();
                }
 
-               [Obsolete ("Use GetSupplementaryGroupIds")]
-               public static uint[] GetSupplementaryGroups ()
+               public static UnixGroupInfo[] GetSupplementaryGroups ()
                {
-                       return GetSupplementaryGroupIds ()
+                       uint[] ids = _GetSupplementaryGroupIds ();
+                       UnixGroupInfo[] groups = new UnixGroupInfo [ids.Length];
+                       for (int i = 0; i < groups.Length; ++i)
+                               groups [i] = new UnixGroupInfo (ids [i]);
+                       return groups;
                }
 
-               public static uint[] GetSupplementaryGroupIds ()
+               private static uint[] _GetSupplementaryGroupIds ()
                {
-                       int ngroups = Syscall.getgroups (0, new uint[]{});
+                       int ngroups = Native.Syscall.getgroups (0, new uint[]{});
                        if (ngroups == -1)
                                UnixMarshal.ThrowExceptionForLastError ();
                        uint[] groups = new uint[ngroups];
-                       int r = Syscall.getgroups (groups);
+                       int r = Native.Syscall.getgroups (groups);
                        UnixMarshal.ThrowExceptionForLastErrorIf (r);
                        return groups;
                }
 
-               [Obsolete ("Use SetSupplementaryGroupIds")]
-               public static void SetSupplementaryGroups (uint[] list)
+               public static void SetSupplementaryGroups (UnixGroupInfo[] groups)
                {
-                       SetSupplementaryGroupIds (list);
+                       uint[] list = new uint [groups.Length];
+                       for (int i = 0; i < list.Length; ++i) {
+                               list [i] = Convert.ToUInt32 (groups [i].GroupId);
+                       }
+                       int r = Native.Syscall.setgroups (list);
+                       UnixMarshal.ThrowExceptionForLastErrorIf (r);
+               }
+
+               public static long[] GetSupplementaryGroupIds ()
+               {
+                       uint[] _groups = _GetSupplementaryGroupIds ();
+                       long[] groups = new long [_groups.Length];
+                       for (int i = 0; i < groups.Length; ++i)
+                               groups [i] = _groups [i];
+                       return groups;
                }
 
-               public static void SetSupplementaryGroupIds (uint[] list)
+               public static void SetSupplementaryGroupIds (long[] list)
                {
-                       int r = Syscall.setgroups (list);
+                       uint[] _list = new uint [list.Length];
+                       for (int i = 0; i < _list.Length; ++i)
+                               _list [i] = Convert.ToUInt32 (list [i]);
+                       int r = Native.Syscall.setgroups (_list);
                        UnixMarshal.ThrowExceptionForLastErrorIf (r);
                }
 
                public static int GetParentProcessId ()
                {
-                       return Syscall.getppid ();
+                       return Native.Syscall.getppid ();
                }
                
                public static UnixProcess GetParentProcess ()
@@ -160,15 +224,16 @@ namespace Mono.Unix {
                {
                        ArrayList shells = new ArrayList ();
 
-                       lock (Syscall.usershell_lock) {
+                       lock (Native.Syscall.usershell_lock) {
                                try {
-                                       Syscall.setusershell ();
+                                       if (Native.Syscall.setusershell () != 0)
+                                               UnixMarshal.ThrowExceptionForLastError ();
                                        string shell;
-                                       while ((shell = Syscall.getusershell ()) != null)
+                                       while ((shell = Native.Syscall.getusershell ()) != null)
                                                shells.Add (shell);
                                }
                                finally {
-                                       Syscall.endusershell ();
+                                       Native.Syscall.endusershell ();
                                }
                        }