aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/src/mpt/osinfo/class.hpp
blob: 2c9979660345d17ded226a688aeb03d542bd8640 (plain) (blame)
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */

#ifndef MPT_OSINFO_CLASS_HPP
#define MPT_OSINFO_CLASS_HPP



#include "mpt/base/detect_os.hpp"
#include "mpt/base/namespace.hpp"
#if !MPT_OS_WINDOWS
#include "mpt/string/buffer.hpp"
#endif // !MPT_OS_WINDOWS

#include <string>

#if !MPT_OS_WINDOWS
#include <sys/utsname.h>
#endif // !MPT_OS_WINDOWS



namespace mpt {
inline namespace MPT_INLINE_NS {



namespace osinfo {

enum class osclass {
	Unknown,
	Windows,
	Linux,
	Darwin,
	BSD,
	Haiku,
	DOS,
};

inline mpt::osinfo::osclass get_class_from_sysname(const std::string & sysname) {
	mpt::osinfo::osclass result = mpt::osinfo::osclass::Unknown;
	if (sysname == "") {
		result = mpt::osinfo::osclass::Unknown;
	} else if (sysname == "Windows" || sysname == "WindowsNT" || sysname == "Windows_NT") {
		result = mpt::osinfo::osclass::Windows;
	} else if (sysname == "Linux") {
		result = mpt::osinfo::osclass::Linux;
	} else if (sysname == "Darwin") {
		result = mpt::osinfo::osclass::Darwin;
	} else if (sysname == "FreeBSD" || sysname == "DragonFly" || sysname == "NetBSD" || sysname == "OpenBSD" || sysname == "MidnightBSD") {
		result = mpt::osinfo::osclass::BSD;
	} else if (sysname == "Haiku") {
		result = mpt::osinfo::osclass::Haiku;
	} else if (sysname == "MS-DOS") {
		result = mpt::osinfo::osclass::DOS;
	}
	return result;
}

inline mpt::osinfo::osclass get_class() {
#if MPT_OS_WINDOWS
	return mpt::osinfo::osclass::Windows;
#else  // !MPT_OS_WINDOWS
	utsname uname_result;
	if (uname(&uname_result) != 0) {
		return mpt::osinfo::osclass::Unknown;
	}
	return mpt::osinfo::get_class_from_sysname(mpt::ReadAutoBuf(uname_result.sysname));
#endif // MPT_OS_WINDOWS
}

} // namespace osinfo



} // namespace MPT_INLINE_NS
} // namespace mpt



#endif // MPT_OSINFO_CLASS_HPP