File: Interop.Read.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (51 lines) | stat: -rw-r--r-- 1,695 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

// This file reiimplements CoreFX source file 'src/Common/src/Interop/Unix/System.Native/Interop.Read.cs'

using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using System;

internal static partial class Interop
{
	internal static partial class Sys
	{
		static Sys ()
		{
			Interop.mono_pal_init ();
		}

		/// <summary>
		/// Reads a number of bytes from an open file descriptor into a specified buffer.
		/// </summary>
		/// <param name="fd">The open file descriptor to try to read from</param>
		/// <param name="buffer">The buffer to read info into</param>
		/// <param name="count">The size of the buffer</param>
		/// <returns>
		/// Returns the number of bytes read on success; otherwise, -1 is returned
		/// Note - on fail. the position of the stream may change depending on the platform; consult man 2 read for more info
		/// </returns>
		internal static unsafe int Read (SafeFileHandle fd, byte* buffer, int count)
		{
			int bytes_read = -1;
			bool release = false;
			try {
				fd.DangerousAddRef (ref release);
				do {
					bytes_read = Read (fd.DangerousGetHandle (), buffer, count);
				} while (bytes_read < 0 && Marshal.GetLastWin32Error () == (int) Interop.Error.EINTR);
			}
			finally {
				if (release)
					fd.DangerousRelease ();
			}
			return bytes_read;
		}

		[MethodImplAttribute(MethodImplOptions.InternalCall)]
		internal static extern unsafe int Read (IntPtr fd, byte* buffer, int count);
	}
}