PostgreSQL Source Code  git master
win32common.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * win32common.c
4  * Common routines shared among the win32*.c ports.
5  *
6  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  * src/port/win32common.c
12  *
13  *-------------------------------------------------------------------------
14  */
15 
16 #ifdef FRONTEND
17 #include "postgres_fe.h"
18 #else
19 #include "postgres.h"
20 #endif
21 
22 /*
23  * pgwin32_get_file_type
24  *
25  * Convenience wrapper for GetFileType() with specific error handling for all the
26  * port implementations. Returns the file type associated with a HANDLE.
27  *
28  * On error, sets errno with FILE_TYPE_UNKNOWN as file type.
29  */
30 DWORD
31 pgwin32_get_file_type(HANDLE hFile)
32 {
33  DWORD fileType = FILE_TYPE_UNKNOWN;
34  DWORD lastError;
35 
36  errno = 0;
37 
38  /*
39  * When stdin, stdout, and stderr aren't associated with a stream the
40  * special value -2 is returned:
41  * https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle
42  */
43  if (hFile == INVALID_HANDLE_VALUE || hFile == (HANDLE) -2)
44  {
45  errno = EINVAL;
46  return FILE_TYPE_UNKNOWN;
47  }
48 
49  fileType = GetFileType(hFile);
50  lastError = GetLastError();
51 
52  /*
53  * Invoke GetLastError in order to distinguish between a "valid" return of
54  * FILE_TYPE_UNKNOWN and its return due to a calling error. In case of
55  * success, GetLastError() returns NO_ERROR.
56  */
57  if (fileType == FILE_TYPE_UNKNOWN && lastError != NO_ERROR)
58  {
59  _dosmaperr(lastError);
60  return FILE_TYPE_UNKNOWN;
61  }
62 
63  return fileType;
64 }
void _dosmaperr(unsigned long)
Definition: win32error.c:177
DWORD pgwin32_get_file_type(HANDLE hFile)
Definition: win32common.c:31