text: /*
   * Copyright 2016 MongoDB, Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  #include "mongoc-prelude.h"
  
  #ifndef MONGOC_HANDSHAKE_OS_PRIVATE
  #define MONGOC_HANDSHAKE_OS_PRIVATE
  
  /* Based on tables from
   * http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
   */
  
  #if defined(_WIN32) || defined(__CYGWIN__)
  #define MONGOC_OS_TYPE "Windows"
  #if defined(__CYGWIN__)
  #define MONGOC_OS_NAME "Cygwin"
  #else
  #define MONGOC_OS_NAME "Windows"
  #endif
  
  /* osx and iphone defines __APPLE__ and __MACH__, but not __unix__ */
  #elif defined(__APPLE__) && defined(__MACH__) && !defined(__unix__)
  #define MONGOC_OS_TYPE "Darwin"
  #include <TargetConditionals.h>
  #if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR == 1
  #define MONGOC_OS_NAME "iOS Simulator"
  #elif defined(TARGET_OS_IOS) && TARGET_OS_IOS == 1
  #define MONGOC_OS_NAME "iOS"
  #elif defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1
  #define MONGOC_OS_NAME "macOS"
  #elif defined(TARGET_OS_TV) && TARGET_OS_TV == 1
  #define MONGOC_OS_NAME "tvOS"
  #elif defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1
  #define MONGOC_OS_NAME "watchOS"
  #else
  /*     Fall back to uname () */
  #endif
  
  /* Need to check if __unix is defined since sun and hpux always have __unix,
   * but not necessarily __unix__ defined. */
  #elif defined(__unix__) || defined(__unix)
  #include <sys/param.h>
  #if defined(__linux__)
  #define MONGOC_OS_IS_LINUX
  #if defined(__ANDROID__)
  #define MONGOC_OS_TYPE "Linux (Android)"
  #else
  #define MONGOC_OS_TYPE "Linux"
  #endif
  /*     Don't define OS_NAME. We'll scan the file system to determine distro. */
  #elif defined(BSD)
  #define MONGOC_OS_TYPE "BSD"
  #if defined(__FreeBSD__)
  #define MONGOC_OS_NAME "FreeBSD"
  #elif defined(__NetBSD__)
  #define MONGOC_OS_NAME "NetBSD"
  #elif defined(__OpenBSD__)
  #define MONGOC_OS_NAME "OpenBSD"
  #elif defined(__DragonFly__)
  #define MONGOC_OS_NAME "DragonFlyBSD"
  #else
  /*        Don't define OS_NAME. We'll use uname to figure it out. */
  #endif
  #else
  #define MONGOC_OS_TYPE "Unix"
  #if defined(_AIX)
  #define MONGOC_OS_NAME "AIX"
  #elif defined(__sun) && defined(__SVR4)
  #define MONGOC_OS_NAME "Solaris"
  #elif defined(__hpux)
  #define MONGOC_OS_NAME "HP-UX"
  #else
  /*        Don't set OS name. We'll just fall back to uname. */
  #endif
  #endif
  
  #endif
  
  #endif
  