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-2025, 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 */
30DWORD
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