1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci* Copyright (c) 2022 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci* you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci* You may obtain a copy of the License at
6d9f0492fSopenharmony_ci*
7d9f0492fSopenharmony_ci*     http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci*
9d9f0492fSopenharmony_ci* Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci* See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci* limitations under the License.
14d9f0492fSopenharmony_ci*/
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#include <errno.h>
17d9f0492fSopenharmony_ci#include <fcntl.h>
18d9f0492fSopenharmony_ci#include <sched.h>
19d9f0492fSopenharmony_ci#include <string.h>
20d9f0492fSopenharmony_ci#include <unistd.h>
21d9f0492fSopenharmony_ci#include "beget_ext.h"
22d9f0492fSopenharmony_ci
23d9f0492fSopenharmony_cistatic int g_defaultNs;
24d9f0492fSopenharmony_ci
25d9f0492fSopenharmony_ciint GetNamespaceFd(const char *nsPath)
26d9f0492fSopenharmony_ci{
27d9f0492fSopenharmony_ci    BEGET_CHECK(nsPath != NULL, return -1);
28d9f0492fSopenharmony_ci    int ns = open(nsPath, O_RDONLY | O_CLOEXEC);
29d9f0492fSopenharmony_ci    if (ns < 0) {
30d9f0492fSopenharmony_ci        BEGET_LOGE("Open default namespace failed, err=%d", errno);
31d9f0492fSopenharmony_ci        return -1;
32d9f0492fSopenharmony_ci    }
33d9f0492fSopenharmony_ci    return ns;
34d9f0492fSopenharmony_ci}
35d9f0492fSopenharmony_ci
36d9f0492fSopenharmony_ciint UnshareNamespace(int nsType)
37d9f0492fSopenharmony_ci{
38d9f0492fSopenharmony_ci    if (nsType == CLONE_NEWNS) {
39d9f0492fSopenharmony_ci        if (unshare(nsType) < 0) {
40d9f0492fSopenharmony_ci            BEGET_LOGE("Unshare namespace failed, err=%d", errno);
41d9f0492fSopenharmony_ci            return -1;
42d9f0492fSopenharmony_ci        } else {
43d9f0492fSopenharmony_ci            return 0;
44d9f0492fSopenharmony_ci        }
45d9f0492fSopenharmony_ci    } else {
46d9f0492fSopenharmony_ci        BEGET_LOGE("Namespace type is not support");
47d9f0492fSopenharmony_ci        return -1;
48d9f0492fSopenharmony_ci    }
49d9f0492fSopenharmony_ci}
50d9f0492fSopenharmony_ci
51d9f0492fSopenharmony_ciint SetNamespace(int nsFd, int nsType)
52d9f0492fSopenharmony_ci{
53d9f0492fSopenharmony_ci    if (nsFd < 0) {
54d9f0492fSopenharmony_ci        BEGET_LOGE("Namespace fd is invalid");
55d9f0492fSopenharmony_ci        return -1;
56d9f0492fSopenharmony_ci    }
57d9f0492fSopenharmony_ci    if (nsType != CLONE_NEWNS) {
58d9f0492fSopenharmony_ci        BEGET_LOGE("Namespace type is not support");
59d9f0492fSopenharmony_ci        return -1;
60d9f0492fSopenharmony_ci    }
61d9f0492fSopenharmony_ci    return setns(nsFd, nsType);
62d9f0492fSopenharmony_ci}
63d9f0492fSopenharmony_ci
64d9f0492fSopenharmony_civoid InitDefaultNamespace(void)
65d9f0492fSopenharmony_ci{
66d9f0492fSopenharmony_ci    BEGET_CHECK(!(g_defaultNs > 0), (void)close(g_defaultNs));
67d9f0492fSopenharmony_ci    g_defaultNs = GetNamespaceFd("/proc/self/ns/mnt");
68d9f0492fSopenharmony_ci    return;
69d9f0492fSopenharmony_ci}
70d9f0492fSopenharmony_ci
71d9f0492fSopenharmony_ciint EnterDefaultNamespace(void)
72d9f0492fSopenharmony_ci{
73d9f0492fSopenharmony_ci    BEGET_CHECK(!(g_defaultNs < 0), return -1);
74d9f0492fSopenharmony_ci    return SetNamespace(g_defaultNs, CLONE_NEWNS);
75d9f0492fSopenharmony_ci}
76d9f0492fSopenharmony_ci
77d9f0492fSopenharmony_civoid CloseDefaultNamespace(void)
78d9f0492fSopenharmony_ci{
79d9f0492fSopenharmony_ci    if (g_defaultNs > 0) {
80d9f0492fSopenharmony_ci        (void)close(g_defaultNs);
81d9f0492fSopenharmony_ci        g_defaultNs = -1;
82d9f0492fSopenharmony_ci    }
83d9f0492fSopenharmony_ci    return;
84d9f0492fSopenharmony_ci}
85