/*
 * Copyright 2022-2026 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#ifndef OSSL_E_WINSOCK_H
#define OSSL_E_WINSOCK_H
#pragma once

#ifdef WINDOWS
#if !defined(_WIN32_WCE) && !defined(_WIN32_WINNT)
/*
 * The _WIN32_WINNT is described here:
 * https://learn.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-170
 * In a nutshell the macro defines minimal required Windows version where
 * the resulting application is guaranteed to run on. If left undefined here,
 * then the definition is provided by the Windows SDK found on host where
 * application is being built.
 *
 * OpenSSL defaults to version 0x501, which matches Windows XP, meaning the
 * compiled library will use APIs available on Windows XP and later.  User may
 * override the version specified here at build time using command as
 * follows:
 *     perl ./Configure "-D_WIN32_WINNT=0x...." ...
 *
 * The list of recognized constants (as found in the link above) is as follows:
 * 	0x0400 // Windows NT 4.0
 *	0x0500 // Windows 2000
 *	0x0501 // Windows XP
 *	0x0502 // Windows Server 2003
 *	0x0600 // Windows Vista, Windows Server 2008, Windows Vista
 *	0x0601 // Windows 7
 *	0x0602 // Windows 8
 *	0x0603 // Windows 8.1
 *	0x0A00 // Windows 10
 */
#define _WIN32_WINNT 0x0501
#endif
#if defined(_WIN32_WINNT) || defined(_WIN32_WCE)
/*
 * Just like defining _WIN32_WINNT including winsock2.h implies
 * certain "discipline" for maintaining [broad] binary compatibility.
 * As long as structures are invariant among Winsock versions,
 * it's sufficient to check for specific Winsock2 API availability
 * at run-time [DSO_global_lookup is recommended]...
 */
#include <winsock2.h>
#include <ws2tcpip.h>
/*
 * Clang-based C++Builder 10.3.3 toolchains cannot find C inline
 * definitions at link-time.  This header defines WspiapiLoad() as an
 * __inline function.  https://quality.embarcadero.com/browse/RSP-33806
 */
#if !defined(__BORLANDC__) || !defined(__clang__)
#include <wspiapi.h>
#endif
/* yes, they have to be #included prior to <windows.h> */
#endif
#include <windows.h>
#endif
#endif /* !(OSSL_E_WINSOCK_H) */
