3c1f479b9d
Former-commit-id: 806294f5ded97629b74c85c09952f2a74fe182d9
366 lines
11 KiB
C#
366 lines
11 KiB
C#
/*
|
|
* This file was automatically generated by make-map from Mono.Posix.dll.
|
|
*
|
|
* DO NOT MODIFY.
|
|
*/
|
|
|
|
using System;
|
|
using System.IO;
|
|
using System.Runtime.InteropServices;
|
|
using Mono.Unix.Native;
|
|
|
|
namespace Mono.Unix.Native {
|
|
|
|
[CLSCompliant (false)]
|
|
public sealed /* static */ partial class NativeConvert
|
|
{
|
|
//
|
|
// Non-generated exports
|
|
//
|
|
|
|
[DllImport (LIB, EntryPoint="Mono_Posix_FromRealTimeSignum")]
|
|
private static extern int FromRealTimeSignum (Int32 offset, out Int32 rval);
|
|
|
|
// convert a realtime signal to os signal
|
|
public static int FromRealTimeSignum (RealTimeSignum sig)
|
|
{
|
|
int sigNum;
|
|
if (FromRealTimeSignum (sig.Offset, out sigNum) == -1)
|
|
ThrowArgumentException (sig.Offset);
|
|
return sigNum;
|
|
}
|
|
|
|
// convert an offset to an rt signum
|
|
public static RealTimeSignum ToRealTimeSignum (int offset)
|
|
{
|
|
return new RealTimeSignum (offset);
|
|
}
|
|
|
|
// convert from octal representation.
|
|
public static FilePermissions FromOctalPermissionString (string value)
|
|
{
|
|
uint n = Convert.ToUInt32 (value, 8);
|
|
return ToFilePermissions (n);
|
|
}
|
|
|
|
public static string ToOctalPermissionString (FilePermissions value)
|
|
{
|
|
string s = Convert.ToString ((int) (value & ~FilePermissions.S_IFMT), 8);
|
|
return new string ('0', 4-s.Length) + s;
|
|
}
|
|
|
|
public static FilePermissions FromUnixPermissionString (string value)
|
|
{
|
|
if (value == null)
|
|
throw new ArgumentNullException ("value");
|
|
if (value.Length != 9 && value.Length != 10)
|
|
throw new ArgumentException ("value", "must contain 9 or 10 characters");
|
|
|
|
int i = 0;
|
|
FilePermissions perms = new FilePermissions ();
|
|
|
|
if (value.Length == 10) {
|
|
perms |= GetUnixPermissionDevice (value [i]);
|
|
++i;
|
|
}
|
|
|
|
perms |= GetUnixPermissionGroup (
|
|
value [i++], FilePermissions.S_IRUSR,
|
|
value [i++], FilePermissions.S_IWUSR,
|
|
value [i++], FilePermissions.S_IXUSR,
|
|
's', 'S', FilePermissions.S_ISUID);
|
|
|
|
perms |= GetUnixPermissionGroup (
|
|
value [i++], FilePermissions.S_IRGRP,
|
|
value [i++], FilePermissions.S_IWGRP,
|
|
value [i++], FilePermissions.S_IXGRP,
|
|
's', 'S', FilePermissions.S_ISGID);
|
|
|
|
perms |= GetUnixPermissionGroup (
|
|
value [i++], FilePermissions.S_IROTH,
|
|
value [i++], FilePermissions.S_IWOTH,
|
|
value [i++], FilePermissions.S_IXOTH,
|
|
't', 'T', FilePermissions.S_ISVTX);
|
|
|
|
return perms;
|
|
}
|
|
|
|
private static FilePermissions GetUnixPermissionDevice (char value)
|
|
{
|
|
switch (value) {
|
|
case 'd': return FilePermissions.S_IFDIR;
|
|
case 'c': return FilePermissions.S_IFCHR;
|
|
case 'b': return FilePermissions.S_IFBLK;
|
|
case '-': return FilePermissions.S_IFREG;
|
|
case 'p': return FilePermissions.S_IFIFO;
|
|
case 'l': return FilePermissions.S_IFLNK;
|
|
case 's': return FilePermissions.S_IFSOCK;
|
|
}
|
|
throw new ArgumentException ("value", "invalid device specification: " +
|
|
value);
|
|
}
|
|
|
|
private static FilePermissions GetUnixPermissionGroup (
|
|
char read, FilePermissions readb,
|
|
char write, FilePermissions writeb,
|
|
char exec, FilePermissions execb,
|
|
char xboth, char xbitonly, FilePermissions xbit)
|
|
{
|
|
FilePermissions perms = new FilePermissions ();
|
|
if (read == 'r')
|
|
perms |= readb;
|
|
if (write == 'w')
|
|
perms |= writeb;
|
|
if (exec == 'x')
|
|
perms |= execb;
|
|
else if (exec == xbitonly)
|
|
perms |= xbit;
|
|
else if (exec == xboth)
|
|
perms |= (execb | xbit);
|
|
return perms;
|
|
}
|
|
|
|
// Create ls(1) drwxrwxrwx permissions display
|
|
public static string ToUnixPermissionString (FilePermissions value)
|
|
{
|
|
char [] access = new char[] {
|
|
'-', // device
|
|
'-', '-', '-', // owner
|
|
'-', '-', '-', // group
|
|
'-', '-', '-', // other
|
|
};
|
|
bool have_device = true;
|
|
switch (value & FilePermissions.S_IFMT) {
|
|
case FilePermissions.S_IFDIR: access [0] = 'd'; break;
|
|
case FilePermissions.S_IFCHR: access [0] = 'c'; break;
|
|
case FilePermissions.S_IFBLK: access [0] = 'b'; break;
|
|
case FilePermissions.S_IFREG: access [0] = '-'; break;
|
|
case FilePermissions.S_IFIFO: access [0] = 'p'; break;
|
|
case FilePermissions.S_IFLNK: access [0] = 'l'; break;
|
|
case FilePermissions.S_IFSOCK: access [0] = 's'; break;
|
|
default: have_device = false; break;
|
|
}
|
|
SetUnixPermissionGroup (value, access, 1,
|
|
FilePermissions.S_IRUSR, FilePermissions.S_IWUSR, FilePermissions.S_IXUSR,
|
|
's', 'S', FilePermissions.S_ISUID);
|
|
SetUnixPermissionGroup (value, access, 4,
|
|
FilePermissions.S_IRGRP, FilePermissions.S_IWGRP, FilePermissions.S_IXGRP,
|
|
's', 'S', FilePermissions.S_ISGID);
|
|
SetUnixPermissionGroup (value, access, 7,
|
|
FilePermissions.S_IROTH, FilePermissions.S_IWOTH, FilePermissions.S_IXOTH,
|
|
't', 'T', FilePermissions.S_ISVTX);
|
|
return have_device
|
|
? new string (access)
|
|
: new string (access, 1, 9);
|
|
}
|
|
|
|
private static void SetUnixPermissionGroup (FilePermissions value,
|
|
char[] access, int index,
|
|
FilePermissions read, FilePermissions write, FilePermissions exec,
|
|
char both, char setonly, FilePermissions setxbit)
|
|
{
|
|
if (UnixFileSystemInfo.IsSet (value, read))
|
|
access [index] = 'r';
|
|
if (UnixFileSystemInfo.IsSet (value, write))
|
|
access [index+1] = 'w';
|
|
access [index+2] = GetSymbolicMode (value, exec, both, setonly, setxbit);
|
|
}
|
|
|
|
// Implement the GNU ls(1) permissions spec; see `info coreutils ls`,
|
|
// section 10.1.2, the `-l' argument information.
|
|
private static char GetSymbolicMode (FilePermissions value,
|
|
FilePermissions xbit, char both, char setonly, FilePermissions setxbit)
|
|
{
|
|
bool is_x = UnixFileSystemInfo.IsSet (value, xbit);
|
|
bool is_sx = UnixFileSystemInfo.IsSet (value, setxbit);
|
|
|
|
if (is_x && is_sx)
|
|
return both;
|
|
if (is_sx)
|
|
return setonly;
|
|
if (is_x)
|
|
return 'x';
|
|
return '-';
|
|
}
|
|
|
|
public static readonly DateTime UnixEpoch =
|
|
new DateTime (year:1970, month:1, day:1, hour:0, minute:0, second:0, kind:DateTimeKind.Utc);
|
|
public static readonly DateTime LocalUnixEpoch =
|
|
new DateTime (1970, 1, 1);
|
|
public static readonly TimeSpan LocalUtcOffset =
|
|
TimeZone.CurrentTimeZone.GetUtcOffset (DateTime.UtcNow);
|
|
|
|
public static DateTime ToDateTime (long time)
|
|
{
|
|
return FromTimeT (time);
|
|
}
|
|
|
|
public static DateTime ToDateTime (long time, long nanoTime)
|
|
{
|
|
return FromTimeT (time).AddMilliseconds (nanoTime / 1000);
|
|
}
|
|
|
|
public static long FromDateTime (DateTime time)
|
|
{
|
|
return ToTimeT (time);
|
|
}
|
|
|
|
public static DateTime FromTimeT (long time)
|
|
{
|
|
return UnixEpoch.AddSeconds (time).ToLocalTime ();
|
|
}
|
|
|
|
public static long ToTimeT (DateTime time)
|
|
{
|
|
if (time.Kind == DateTimeKind.Unspecified)
|
|
throw new ArgumentException ("DateTimeKind.Unspecified is not supported. Use Local or Utc times.", "time");
|
|
|
|
if (time.Kind == DateTimeKind.Local)
|
|
time = time.ToUniversalTime ();
|
|
|
|
return (long) (time - UnixEpoch).TotalSeconds;
|
|
}
|
|
|
|
public static OpenFlags ToOpenFlags (FileMode mode, FileAccess access)
|
|
{
|
|
OpenFlags flags = 0;
|
|
switch (mode) {
|
|
case FileMode.CreateNew:
|
|
flags = OpenFlags.O_CREAT | OpenFlags.O_EXCL;
|
|
break;
|
|
case FileMode.Create:
|
|
flags = OpenFlags.O_CREAT | OpenFlags.O_TRUNC;
|
|
break;
|
|
case FileMode.Open:
|
|
// do nothing
|
|
break;
|
|
case FileMode.OpenOrCreate:
|
|
flags = OpenFlags.O_CREAT;
|
|
break;
|
|
case FileMode.Truncate:
|
|
flags = OpenFlags.O_TRUNC;
|
|
break;
|
|
case FileMode.Append:
|
|
flags = OpenFlags.O_APPEND;
|
|
break;
|
|
default:
|
|
throw new ArgumentException (Locale.GetText ("Unsupported mode value"), "mode");
|
|
}
|
|
|
|
// Is O_LARGEFILE supported?
|
|
int _v;
|
|
if (TryFromOpenFlags (OpenFlags.O_LARGEFILE, out _v))
|
|
flags |= OpenFlags.O_LARGEFILE;
|
|
|
|
switch (access) {
|
|
case FileAccess.Read:
|
|
flags |= OpenFlags.O_RDONLY;
|
|
break;
|
|
case FileAccess.Write:
|
|
flags |= OpenFlags.O_WRONLY;
|
|
break;
|
|
case FileAccess.ReadWrite:
|
|
flags |= OpenFlags.O_RDWR;
|
|
break;
|
|
default:
|
|
throw new ArgumentOutOfRangeException (Locale.GetText ("Unsupported access value"), "access");
|
|
}
|
|
|
|
return flags;
|
|
}
|
|
|
|
public static string ToFopenMode (FileAccess access)
|
|
{
|
|
switch (access) {
|
|
case FileAccess.Read: return "rb";
|
|
case FileAccess.Write: return "wb";
|
|
case FileAccess.ReadWrite: return "r+b";
|
|
default: throw new ArgumentOutOfRangeException ("access");
|
|
}
|
|
}
|
|
|
|
public static string ToFopenMode (FileMode mode)
|
|
{
|
|
switch (mode) {
|
|
case FileMode.CreateNew: case FileMode.Create: return "w+b";
|
|
case FileMode.Open: case FileMode.OpenOrCreate: return "r+b";
|
|
case FileMode.Truncate: return "w+b";
|
|
case FileMode.Append: return "a+b";
|
|
default: throw new ArgumentOutOfRangeException ("mode");
|
|
}
|
|
}
|
|
|
|
private static readonly string[][] fopen_modes = new string[][]{
|
|
// Read Write ReadWrite
|
|
/* FileMode.CreateNew: */ new string[]{"Can't Read+Create", "wb", "w+b"},
|
|
/* FileMode.Create: */ new string[]{"Can't Read+Create", "wb", "w+b"},
|
|
/* FileMode.Open: */ new string[]{"rb", "wb", "r+b"},
|
|
/* FileMode.OpenOrCreate: */ new string[]{"rb", "wb", "r+b"},
|
|
/* FileMode.Truncate: */ new string[]{"Cannot Truncate and Read","wb", "w+b"},
|
|
/* FileMode.Append: */ new string[]{"Cannot Append and Read", "ab", "a+b"},
|
|
};
|
|
|
|
public static string ToFopenMode (FileMode mode, FileAccess access)
|
|
{
|
|
int fm = -1, fa = -1;
|
|
switch (mode) {
|
|
case FileMode.CreateNew: fm = 0; break;
|
|
case FileMode.Create: fm = 1; break;
|
|
case FileMode.Open: fm = 2; break;
|
|
case FileMode.OpenOrCreate: fm = 3; break;
|
|
case FileMode.Truncate: fm = 4; break;
|
|
case FileMode.Append: fm = 5; break;
|
|
}
|
|
switch (access) {
|
|
case FileAccess.Read: fa = 0; break;
|
|
case FileAccess.Write: fa = 1; break;
|
|
case FileAccess.ReadWrite: fa = 2; break;
|
|
}
|
|
|
|
if (fm == -1)
|
|
throw new ArgumentOutOfRangeException ("mode");
|
|
if (fa == -1)
|
|
throw new ArgumentOutOfRangeException ("access");
|
|
|
|
string fopen_mode = fopen_modes [fm][fa];
|
|
if (fopen_mode [0] != 'r' && fopen_mode [0] != 'w' && fopen_mode [0] != 'a')
|
|
throw new ArgumentException (fopen_mode);
|
|
return fopen_mode;
|
|
}
|
|
|
|
[DllImport (LIB, EntryPoint="Mono_Posix_FromStat")]
|
|
private static extern int FromStat (ref Stat source, IntPtr destination);
|
|
|
|
public static bool TryCopy (ref Stat source, IntPtr destination)
|
|
{
|
|
return FromStat (ref source, destination) == 0;
|
|
}
|
|
|
|
[DllImport (LIB, EntryPoint="Mono_Posix_ToStat")]
|
|
private static extern int ToStat (IntPtr source, out Stat destination);
|
|
|
|
public static bool TryCopy (IntPtr source, out Stat destination)
|
|
{
|
|
return ToStat (source, out destination) == 0;
|
|
}
|
|
|
|
[DllImport (LIB, EntryPoint="Mono_Posix_FromStatvfs")]
|
|
private static extern int FromStatvfs (ref Statvfs source, IntPtr destination);
|
|
|
|
public static bool TryCopy (ref Statvfs source, IntPtr destination)
|
|
{
|
|
return FromStatvfs (ref source, destination) == 0;
|
|
}
|
|
|
|
[DllImport (LIB, EntryPoint="Mono_Posix_ToStatvfs")]
|
|
private static extern int ToStatvfs (IntPtr source, out Statvfs destination);
|
|
|
|
public static bool TryCopy (IntPtr source, out Statvfs destination)
|
|
{
|
|
return ToStatvfs (source, out destination) == 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
// vim: noexpandtab
|