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