Skip to content

Commit 8453ede

Browse files
committed
mex: is_admin()
1 parent 750225c commit 8453ede

File tree

4 files changed

+70
-7
lines changed

4 files changed

+70
-7
lines changed

+stdlib/is_admin.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
%% IS_ADMIN is the process run as root / admin (requires MEX)

private/get_mex_sources.m

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
sym = fullfile(top, "src/symlink_fs.cpp");
1616

1717

18-
srcs = {fullfile(top, "src/is_char_device.cpp"), ...
19-
fullfile(top, "src/set_permissions.cpp"), ...
20-
[fullfile(top, "src/is_rosetta.cpp"), mac], ...
21-
[fullfile(top, "src/windows_shortname.cpp"), win], ...
18+
srcs = {
19+
fullfile(top, "src/is_admin.cpp"), ...
20+
fullfile(top, "src/is_char_device.cpp"), ...
21+
fullfile(top, "src/set_permissions.cpp"), ...
22+
[fullfile(top, "src/is_rosetta.cpp"), mac], ...
23+
[fullfile(top, "src/windows_shortname.cpp"), win], ...
2224
};
2325

2426
%% new in R2024b

src/is_admin.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include "mex.hpp"
2+
#include "mexAdapter.hpp"
3+
4+
#include <vector>
5+
#include <memory>
6+
7+
#if defined(_WIN32)
8+
#define WIN32_LEAN_AND_MEAN
9+
#include <windows.h> // GetTokenInformation
10+
#else
11+
#include <unistd.h> // geteuid
12+
#include <sys/types.h> // geteuid, pid_t
13+
#endif
14+
15+
16+
static bool fs_is_admin(){
17+
// running as admin / root / superuser
18+
#if defined(_WIN32)
19+
HANDLE hToken = nullptr;
20+
TOKEN_ELEVATION elevation;
21+
DWORD dwSize;
22+
23+
const bool ok = (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken) &&
24+
GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &dwSize));
25+
26+
if(hToken)
27+
CloseHandle(hToken);
28+
if(ok)
29+
return elevation.TokenIsElevated;
30+
31+
return false;
32+
#else
33+
return geteuid() == 0;
34+
#endif
35+
}
36+
37+
38+
class MexFunction : public matlab::mex::Function {
39+
public:
40+
void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
41+
// boilerplate engine & ArrayFactory setup
42+
std::shared_ptr<matlab::engine::MATLABEngine> matlabEng = getEngine();
43+
matlab::data::ArrayFactory factory;
44+
45+
if (inputs.size() != 0) {
46+
matlabEng->feval(u"error", 0,
47+
std::vector<matlab::data::Array>({ factory.createScalar("Mex: No input required") }));
48+
}
49+
50+
// actual function algorithm / computation
51+
bool y = fs_is_admin();
52+
53+
outputs[0] = factory.createScalar<bool>(y);
54+
}
55+
};

test/TestMex.m

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
methods (Test)
44

55
function test_is_char_device(tc)
6-
import matlab.unittest.fixtures.CurrentFolderFixture
7-
8-
tc.applyFixture(CurrentFolderFixture(".."))
6+
tc.applyFixture(matlab.unittest.fixtures.CurrentFolderFixture(".."))
97
% matlab exist() doesn't work for MEX detection with ".." leading path
108

119
tc.assumeEqual(exist("+stdlib/is_char_device", "file"), 3)
@@ -18,7 +16,14 @@ function test_is_char_device(tc)
1816
end
1917

2018
tc.verifyTrue(stdlib.is_char_device(n))
19+
end
20+
21+
22+
function test_is_admin(tc)
23+
tc.applyFixture(matlab.unittest.fixtures.CurrentFolderFixture(".."))
2124

25+
tc.assumeEqual(exist("+stdlib/is_admin", "file"), 3)
26+
tc.verifyClass(stdlib.is_admin(), "logical")
2227
end
2328

2429
end

0 commit comments

Comments
 (0)