gcontini
2020-05-16 aa5b960ace514e036d932f6a45dc0c3a81f0db4a
src/library/os/windows/execution_environment.cpp
@@ -4,16 +4,15 @@
 *  Created on: Dec 15, 2019
 *      Author: GC
 */
#include <windows.h>
#include <sys/stat.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string>
#include "isvm/BIOSReader.h"
#include "isvm/Native.h"
#include "../../base/base.h"
#include "../../base/StringUtils.h"
#include "../cpu_info.hpp"
#include "../execution_environment.hpp"
@@ -21,19 +20,47 @@
namespace os {
using namespace std;
ExecutionEnvironment::ExecutionEnvironment() {
   if (InitEntryPoints()) {
      BIOSReader reader;
      SystemInformation info = reader.readSystemInfo();
      sys_vendor = toupper_copy(info.Manufacturer);
      bios_vendor = toupper_copy(info.ProductName);
      bios_description = toupper_copy(info.SysVersion) + toupper_copy(info.family);
ExecutionEnvironment::ExecutionEnvironment() : m_container_type(CONTAINER_TYPE::NONE) {}
#define MAX_UNITS 20
CONTAINER_TYPE wine_container() {
   size_t ndrives = 0;
   const DWORD dwSize = MAX_PATH;
   char szLogicalDrives[MAX_PATH] = {0};
   CONTAINER_TYPE result = CONTAINER_TYPE::NONE;
   const DWORD dwResult = GetLogicalDriveStrings(dwSize, szLogicalDrives);
   //FIXME! this code missed the increment in the loop...
   if (dwResult > 0 && dwResult <= MAX_PATH) {
      char* szSingleDrive = szLogicalDrives;
      while (*szSingleDrive && ndrives < MAX_UNITS) {
         // get the next drive
         UINT driveType = GetDriveType(szSingleDrive);
         if (driveType == DRIVE_FIXED) {
            string name = szSingleDrive + string("/var/run/systemd/container");
            try {
               ifstream systemd_container(name);
               if (systemd_container.good()) {
                  result = CONTAINER_TYPE::DOCKER;
                  for (string line; getline(systemd_container, line);) {
                     if (line.find("docker") != string::npos) {
                        result = CONTAINER_TYPE::DOCKER;
                        break;
                     } else if (line.find("lxc") != string::npos) {
                        result = CONTAINER_TYPE::LXC;
                        break;
                     }
                  }
               }
            } catch (...) {
               // no problem,we're just guessing
            }
         }
      }
   }
   return result;
}
//TODO
bool ExecutionEnvironment::is_docker() const { return false; }
//TODO
bool ExecutionEnvironment::is_container() const { return is_docker(); }
}  // namespace os
}  // namespace license