gcontini
2020-04-25 e047dbe884f5288943d5ba2f8843a078d647d7ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
 * virtualization.cpp
 *
 *  Created on: Dec 15, 2019
 *      Author: GC
 */
#include <windows.h>
#include <sys/stat.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string>
 
#include "../../base/base.h"
 
#include "../cpu_info.hpp"
#include "../execution_environment.hpp"
 
namespace license {
namespace os {
using namespace std;
 
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;
}
 
}  // namespace os
}  // namespace license