2 * posix.c: Posix-specific support.
5 * Dick Porter (dick@ximian.com)
7 * (C) 2002 Ximian, Inc.
8 * Copyright (c) 2002-2009 Novell, Inc.
9 * Copyright 2011 Xamarin Inc
10 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
20 #include <sys/types.h>
23 #include <mono/io-layer/wapi.h>
24 #include <mono/io-layer/wapi-private.h>
25 #include <mono/io-layer/io-private.h>
26 #include <mono/io-layer/io-trace.h>
27 #include <mono/utils/mono-logger-internals.h>
28 #include <mono/metadata/w32handle.h>
31 convert_from_flags(int flags
)
36 #define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
39 if((flags
& O_ACCMODE
) == O_RDONLY
) {
40 fileaccess
=GENERIC_READ
;
41 } else if ((flags
& O_ACCMODE
) == O_WRONLY
) {
42 fileaccess
=GENERIC_WRITE
;
43 } else if ((flags
& O_ACCMODE
) == O_RDWR
) {
44 fileaccess
=GENERIC_READ
|GENERIC_WRITE
;
46 MONO_TRACE (G_LOG_LEVEL_DEBUG
, MONO_TRACE_IO_LAYER
, "%s: Can't figure out flags 0x%x", __func__
, flags
);
49 /* Maybe sort out create mode too */
55 gpointer
_wapi_stdhandle_create (int fd
, const gchar
*name
)
57 struct _WapiHandle_file file_handle
= {0};
61 MONO_TRACE (G_LOG_LEVEL_DEBUG
, MONO_TRACE_IO_LAYER
, "%s: creating standard handle type %s, fd %d", __func__
,
64 #if !defined(__native_client__)
65 /* Check if fd is valid */
67 flags
=fcntl(fd
, F_GETFL
);
68 } while (flags
== -1 && errno
== EINTR
);
71 /* Invalid fd. Not really much point checking for EBADF
74 MONO_TRACE (G_LOG_LEVEL_DEBUG
, MONO_TRACE_IO_LAYER
, "%s: fcntl error on fd %d: %s", __func__
, fd
,
77 SetLastError (_wapi_get_win32_file_error (errno
));
78 return(INVALID_HANDLE_VALUE
);
80 file_handle
.fileaccess
=convert_from_flags(flags
);
83 * fcntl will return -1 in nacl, as there is no real file system API.
84 * Yet, standard streams are available.
86 file_handle
.fileaccess
= (fd
== STDIN_FILENO
) ? GENERIC_READ
: GENERIC_WRITE
;
90 file_handle
.filename
= g_strdup(name
);
91 /* some default security attributes might be needed */
92 file_handle
.security_attributes
=0;
94 /* Apparently input handles can't be written to. (I don't
95 * know if output or error handles can't be read from.)
98 file_handle
.fileaccess
&= ~GENERIC_WRITE
;
101 file_handle
.sharemode
=0;
104 handle
= mono_w32handle_new_fd (MONO_W32HANDLE_CONSOLE
, fd
, &file_handle
);
105 if (handle
== INVALID_HANDLE_VALUE
) {
106 g_warning ("%s: error creating file handle", __func__
);
107 SetLastError (ERROR_GEN_FAILURE
);
108 return(INVALID_HANDLE_VALUE
);
111 MONO_TRACE (G_LOG_LEVEL_DEBUG
, MONO_TRACE_IO_LAYER
, "%s: returning handle %p", __func__
, handle
);