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
19 #include <sys/types.h>
22 #include <mono/io-layer/wapi.h>
23 #include <mono/io-layer/wapi-private.h>
24 #include <mono/io-layer/handles-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>
30 convert_from_flags(int flags)
35 #define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
38 if((flags & O_ACCMODE) == O_RDONLY) {
39 fileaccess=GENERIC_READ;
40 } else if ((flags & O_ACCMODE) == O_WRONLY) {
41 fileaccess=GENERIC_WRITE;
42 } else if ((flags & O_ACCMODE) == O_RDWR) {
43 fileaccess=GENERIC_READ|GENERIC_WRITE;
45 MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: Can't figure out flags 0x%x", __func__, flags);
48 /* Maybe sort out create mode too */
54 gpointer _wapi_stdhandle_create (int fd, const gchar *name)
56 struct _WapiHandle_file file_handle = {0};
60 MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: creating standard handle type %s, fd %d", __func__,
63 #if !defined(__native_client__)
64 /* Check if fd is valid */
66 flags=fcntl(fd, F_GETFL);
67 } while (flags == -1 && errno == EINTR);
70 /* Invalid fd. Not really much point checking for EBADF
73 MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: fcntl error on fd %d: %s", __func__, fd,
76 SetLastError (_wapi_get_win32_file_error (errno));
77 return(INVALID_HANDLE_VALUE);
79 file_handle.fileaccess=convert_from_flags(flags);
82 * fcntl will return -1 in nacl, as there is no real file system API.
83 * Yet, standard streams are available.
85 file_handle.fileaccess = (fd == STDIN_FILENO) ? GENERIC_READ : GENERIC_WRITE;
89 file_handle.filename = g_strdup(name);
90 /* some default security attributes might be needed */
91 file_handle.security_attributes=0;
93 /* Apparently input handles can't be written to. (I don't
94 * know if output or error handles can't be read from.)
97 file_handle.fileaccess &= ~GENERIC_WRITE;
100 file_handle.sharemode=0;
103 handle = _wapi_handle_new_fd (WAPI_HANDLE_CONSOLE, fd, &file_handle);
104 if (handle == _WAPI_HANDLE_INVALID) {
105 g_warning ("%s: error creating file handle", __func__);
106 SetLastError (ERROR_GEN_FAILURE);
107 return(INVALID_HANDLE_VALUE);
110 MONO_TRACE (G_LOG_LEVEL_DEBUG, MONO_TRACE_IO_LAYER, "%s: returning handle %p", __func__, handle);