summaryrefslogtreecommitdiff
path: root/src/pal/src/include/pal/file.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/src/include/pal/file.hpp')
-rw-r--r--src/pal/src/include/pal/file.hpp365
1 files changed, 365 insertions, 0 deletions
diff --git a/src/pal/src/include/pal/file.hpp b/src/pal/src/include/pal/file.hpp
new file mode 100644
index 0000000000..5acccb0a24
--- /dev/null
+++ b/src/pal/src/include/pal/file.hpp
@@ -0,0 +1,365 @@
+// 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.
+
+/*++
+
+
+
+Module Name:
+
+ include/pal/file.hpp
+
+Abstract:
+ Header file for file utility functions.
+
+Revision History:
+
+
+
+--*/
+
+#ifndef _PAL_FILE_HPP_
+#define _PAL_FILE_HPP_
+
+#include "corunix.hpp"
+#include "pal/stackstring.hpp"
+#include <sys/types.h>
+#include <sys/param.h>
+#include <dirent.h>
+
+
+namespace CorUnix
+{
+ extern CObjectType otFile;
+ extern CAllowedObjectTypes aotFile;
+
+ class CFileProcessLocalData
+ {
+ public:
+ IFileLockController *pLockController;
+
+ int unix_fd;
+ DWORD dwDesiredAccess; /* Unix assumes files are always opened for reading.
+ In Windows we can open a file for writing only */
+ int open_flags; /* stores Unix file creation flags */
+ BOOL open_flags_deviceaccessonly;
+ char unix_filename[MAXPATHLEN];
+ BOOL inheritable;
+ };
+
+ PAL_ERROR
+ InternalCreateFile(
+ CPalThread *pThread,
+ LPCSTR lpFileName,
+ DWORD dwDesiredAccess,
+ DWORD dwShareMode,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
+ DWORD dwCreationDisposition,
+ DWORD dwFlagsAndAttributes,
+ HANDLE hTemplateFile,
+ HANDLE *pFileHandle
+ );
+
+ PAL_ERROR
+ InternalWriteFile(
+ CPalThread *pThread,
+ HANDLE hFile,
+ LPCVOID lpBuffer,
+ DWORD nNumberOfBytesToWrite,
+ LPDWORD lpNumberOfBytesWritten,
+ LPOVERLAPPED lpOverlapped
+ );
+
+ PAL_ERROR
+ InternalReadFile(
+ CPalThread *pThread,
+ HANDLE hFile,
+ LPVOID lpBuffer,
+ DWORD nNumberOfBytesToRead,
+ LPDWORD lpNumberOfBytesRead,
+ LPOVERLAPPED lpOverlapped
+ );
+
+ PAL_ERROR
+ InternalSetEndOfFile(
+ CPalThread *pThread,
+ HANDLE hFile
+ );
+
+ PAL_ERROR
+ InternalGetFileSize(
+ CPalThread *pThread,
+ HANDLE hFile,
+ DWORD *pdwFileSizeLow,
+ DWORD *pdwFileSizeHigh
+ );
+
+ PAL_ERROR
+ InternalFlushFileBuffers(
+ CPalThread *pThread,
+ HANDLE hFile
+ );
+
+ PAL_ERROR
+ InternalGetFileType(
+ CPalThread *pThread,
+ HANDLE hFile,
+ DWORD *pdwFileType
+ );
+
+ PAL_ERROR
+ InternalCreatePipe(
+ CPalThread *pThread,
+ HANDLE *phReadPipe,
+ HANDLE *phWritePipe,
+ LPSECURITY_ATTRIBUTES lpPipeAttributes,
+ DWORD nSize
+ );
+
+ PAL_ERROR
+ InternalLockFile(
+ CPalThread *pThread,
+ HANDLE hFile,
+ DWORD dwFileOffsetLow,
+ DWORD dwFileOffsetHigh,
+ DWORD nNumberOfBytesToLockLow,
+ DWORD nNumberOfBytesToLockHigh
+ );
+
+ PAL_ERROR
+ InternalUnlockFile(
+ CPalThread *pThread,
+ HANDLE hFile,
+ DWORD dwFileOffsetLow,
+ DWORD dwFileOffsetHigh,
+ DWORD nNumberOfBytesToUnlockLow,
+ DWORD nNumberOfBytesToUnlockHigh
+ );
+
+ PAL_ERROR
+ InternalSetFilePointer(
+ CPalThread *pThread,
+ HANDLE hFile,
+ LONG lDistanceToMove,
+ PLONG lpDistanceToMoveHigh,
+ DWORD dwMoveMethod,
+ PLONG lpNewFilePointerLow
+ );
+
+ PAL_ERROR
+ InternalSetFileTime(
+ CPalThread *pThread,
+ IN HANDLE hFile,
+ IN CONST FILETIME *lpCreationTime,
+ IN CONST FILETIME *lpLastAccessTime,
+ IN CONST FILETIME *lpLastWriteTime
+ );
+
+ PAL_ERROR
+ InternalGetFileTime(
+ CPalThread *pThread,
+ IN HANDLE hFile,
+ OUT LPFILETIME lpCreationTime,
+ OUT LPFILETIME lpLastAccessTime,
+ OUT LPFILETIME lpLastWriteTime
+ );
+
+ BOOL
+ RealPathHelper(LPCSTR lpUnixPath, PathCharString& lpBuffer);
+ /*++
+ InternalCanonicalizeRealPath
+ Wraps realpath() to hide platform differences. See the man page for
+ realpath(3) for details of how realpath() works.
+
+ On systems on which realpath() allows the last path component to not
+ exist, this is a straight thunk through to realpath(). On other
+ systems, we remove the last path component, then call realpath().
+ --*/
+ PAL_ERROR
+ InternalCanonicalizeRealPath(
+ LPCSTR lpUnixPath,
+ PathCharString& lpBuffer
+ );
+
+ /*++
+ InternalMkstemp
+ Wraps mkstemp
+ --*/
+ int
+ InternalMkstemp(
+ char *szNameTemplate
+ );
+
+ /*++
+ InternalFgets
+ Wraps fgets
+ --*/
+ char *
+ InternalFgets(
+ char *sz,
+ int nSize,
+ FILE *f,
+ bool fTextMode
+ );
+
+ /*++
+ InternalFwrite
+ Wraps fwrite
+ --*/
+ size_t
+ InternalFwrite(
+ const void *pvBuffer,
+ size_t nSize,
+ size_t nCount,
+ FILE *f,
+ INT *pnErrorCode
+ );
+
+ /*++
+ InternalOpen
+ Wraps open
+ --*/
+ int
+ InternalOpen(
+ const char *szFilename,
+ int nFlags,
+ ...
+ );
+}
+
+extern "C"
+{
+
+//
+// These routines should all be separated out into something along the lines
+// of fileutils.* (instead of being commingled with the core file object
+// code).
+//
+
+/*++
+FILECanonicalizePath
+ Removes all instances of '/./', '/../' and '//' from an absolute path.
+
+Parameters:
+ LPSTR lpUnixPath : absolute path to modify, in Unix format
+
+(no return value)
+
+Notes :
+-behavior is undefined if path is not absolute
+-the order of steps *is* important: /one/./../two would give /one/two
+ instead of /two if step 3 was done before step 2
+-reason for this function is that GetFullPathName can't use realpath(), since
+ realpath() requires the given path to be valid and GetFullPathName does not.
+--*/
+void FILECanonicalizePath(LPSTR lpUnixPath);
+
+/*++
+Function:
+ FileDosToUnixPathA
+
+Abstract:
+ Change a DOS path to a Unix path. Replace '\' by '/'.
+
+Parameter:
+ IN/OUT lpPath: path to be modified
+--*/
+void
+FILEDosToUnixPathA(LPSTR lpPath);
+
+/*++
+Function:
+ FileDosToUnixPathW
+
+Abstract:
+ Change a DOS path to a Unix path. Replace '\' by '/'.
+
+Parameter:
+ IN/OUT lpPath: path to be modified
+ --*/
+void
+FILEDosToUnixPathW(LPWSTR lpPath);
+
+/*++
+Function:
+ FileUnixToDosPathA
+
+Abstract:
+ Change a Unix path to a DOS path. Replace '/' by '\'.
+
+Parameter:
+ IN/OUT lpPath: path to be modified
+--*/
+void
+FILEUnixToDosPathA(LPSTR lpPath);
+
+
+/*++
+Function:
+ FILEGetDirectoryFromFullPathA
+
+Parse the given path. If it contains a directory part and a file part,
+put the directory part into the supplied buffer, and return the number of
+characters written to the buffer. If the buffer is not large enough,
+return the required size of the buffer including the NULL character. If
+there is no directory part in the path, return 0.
+--*/
+DWORD FILEGetDirectoryFromFullPathA( LPCSTR lpFullPath,
+ DWORD nBufferLength,
+ LPSTR lpBuffer );
+
+/*++
+Function:
+ FILEGetFileNameFromFullPath
+
+Given a full path, return a pointer to the first char of the filename part.
+--*/
+LPCSTR FILEGetFileNameFromFullPathA( LPCSTR lpFullPath );
+
+/*++
+Function:
+ FILEGetLastErrorFromErrno
+
+Convert errno into the appropriate win32 error and return it.
+--*/
+DWORD FILEGetLastErrorFromErrno( void );
+
+/*++
+FILEInitStdHandles
+
+Create handle objects for stdin, stdout and stderr
+
+(no parameters)
+
+Return value:
+ TRUE on success, FALSE on failure
+--*/
+BOOL FILEInitStdHandles(void);
+
+/*++
+FILECleanupStdHandles
+
+Close primary handles for stdin, stdout and stderr
+
+(no parameters, no return value)
+--*/
+void FILECleanupStdHandles(void);
+
+/*++
+
+Function :
+ FILEGetProperNotFoundError
+
+Returns the proper error code, based on the
+Windows behavoir.
+
+ IN LPSTR lpPath - The path to check.
+ LPDWORD lpErrorCode - The error to set.
+*/
+void FILEGetProperNotFoundError( LPCSTR lpPath, LPDWORD lpErrorCode );
+
+}
+
+#endif /* _PAL_FILE_HPP_ */
+