1570af302Sopenharmony_ci/** 2570af302Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3570af302Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4570af302Sopenharmony_ci * you may not use this file except in compliance with the License. 5570af302Sopenharmony_ci * You may obtain a copy of the License at 6570af302Sopenharmony_ci * 7570af302Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8570af302Sopenharmony_ci * 9570af302Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10570af302Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11570af302Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12570af302Sopenharmony_ci * See the License for the specific language governing permissions and 13570af302Sopenharmony_ci * limitations under the License. 14570af302Sopenharmony_ci */ 15570af302Sopenharmony_ci 16570af302Sopenharmony_ci#include <dlfcn.h> 17570af302Sopenharmony_ci#include <errno.h> 18570af302Sopenharmony_ci#include <stdio.h> 19570af302Sopenharmony_ci#include <string.h> 20570af302Sopenharmony_ci 21570af302Sopenharmony_ci#include "dlns_test.h" 22570af302Sopenharmony_ci#include "functionalext.h" 23570af302Sopenharmony_ci 24570af302Sopenharmony_ci/** 25570af302Sopenharmony_ci * @tc.name : dlopen_ns_special_0100 26570af302Sopenharmony_ci * @tc.desc : Loading the same library multiple times from the same namespace. 27570af302Sopenharmony_ci * @tc.level : Level 2 28570af302Sopenharmony_ci */ 29570af302Sopenharmony_civoid dlopen_ns_special_0100(void) 30570af302Sopenharmony_ci{ 31570af302Sopenharmony_ci Dl_namespace dlns_default; 32570af302Sopenharmony_ci dlns_get(NULL, &dlns_default); 33570af302Sopenharmony_ci Dl_namespace dlns; 34570af302Sopenharmony_ci dlns_init(&dlns, "ns_no_allowed_libs"); 35570af302Sopenharmony_ci dlns_inherit(&dlns, &dlns_default, "libc++.so"); 36570af302Sopenharmony_ci 37570af302Sopenharmony_ci void* handle1 = dlopen_ns(&dlns, dllName, RTLD_LAZY); 38570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_special_0100", handle1); 39570af302Sopenharmony_ci 40570af302Sopenharmony_ci void* handle2 = dlopen_ns(&dlns, dllName, RTLD_LAZY); 41570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_special_0100", handle2); 42570af302Sopenharmony_ci 43570af302Sopenharmony_ci void* handle3 = dlopen_ns(&dlns, dllName, RTLD_LAZY); 44570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_special_0100", handle3); 45570af302Sopenharmony_ci 46570af302Sopenharmony_ci dlclose(handle1); 47570af302Sopenharmony_ci dlclose(handle2); 48570af302Sopenharmony_ci dlclose(handle3); 49570af302Sopenharmony_ci} 50570af302Sopenharmony_ci 51570af302Sopenharmony_ci/** 52570af302Sopenharmony_ci * @tc.name : dlopen_ns_special_0200 53570af302Sopenharmony_ci * @tc.desc : Loading the same library multiple times in different namespaces. 54570af302Sopenharmony_ci * @tc.level : Level 2 55570af302Sopenharmony_ci */ 56570af302Sopenharmony_civoid dlopen_ns_special_0200(void) 57570af302Sopenharmony_ci{ 58570af302Sopenharmony_ci Dl_namespace dlns_default; 59570af302Sopenharmony_ci dlns_get(NULL, &dlns_default); 60570af302Sopenharmony_ci Dl_namespace dlns_no_allowed_libs, dlns_normal, dlns_wrong_lib_path; 61570af302Sopenharmony_ci dlns_init(&dlns_no_allowed_libs, "ns_no_allowed_libs"); 62570af302Sopenharmony_ci dlns_init(&dlns_normal, "ns_normal"); 63570af302Sopenharmony_ci dlns_init(&dlns_wrong_lib_path, "inherited_class"); 64570af302Sopenharmony_ci dlns_inherit(&dlns_no_allowed_libs, &dlns_default, "libc++.so"); 65570af302Sopenharmony_ci dlns_inherit(&dlns_normal, &dlns_default, "libc++.so"); 66570af302Sopenharmony_ci dlns_inherit(&dlns_wrong_lib_path, &dlns_default, "libc++.so"); 67570af302Sopenharmony_ci 68570af302Sopenharmony_ci void* handle1 = dlopen_ns(&dlns_no_allowed_libs, dllName, RTLD_LAZY); 69570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_special_0200", handle1); 70570af302Sopenharmony_ci 71570af302Sopenharmony_ci void* handle2 = dlopen_ns(&dlns_normal, dllName, RTLD_LAZY); 72570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_special_0200", handle2); 73570af302Sopenharmony_ci 74570af302Sopenharmony_ci void* handle3 = dlopen_ns(&dlns_wrong_lib_path, dllName, RTLD_LAZY); 75570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_special_0200", handle3); 76570af302Sopenharmony_ci 77570af302Sopenharmony_ci dlclose(handle1); 78570af302Sopenharmony_ci dlclose(handle2); 79570af302Sopenharmony_ci dlclose(handle3); 80570af302Sopenharmony_ci} 81570af302Sopenharmony_ci 82570af302Sopenharmony_ci/** 83570af302Sopenharmony_ci * @tc.name : dlopen_ns_sys_path_0100 84570af302Sopenharmony_ci * @tc.desc : arm platform, lib_paths in the default namespace is the system path 85570af302Sopenharmony_ci * read in the ld-musl-namespace-arm.ini file 86570af302Sopenharmony_ci * @tc.level : Level 2 87570af302Sopenharmony_ci */ 88570af302Sopenharmony_civoid dlopen_ns_sys_path_0100(void) 89570af302Sopenharmony_ci{ 90570af302Sopenharmony_ci Dl_namespace dlns; 91570af302Sopenharmony_ci dlns_init(&dlns, "default"); 92570af302Sopenharmony_ci void* handle = dlopen_ns(&dlns, dllName, RTLD_LAZY); 93570af302Sopenharmony_ci EXPECT_TRUE("dlopen_ns_sys_path_0100", handle); 94570af302Sopenharmony_ci dlclose(handle); 95570af302Sopenharmony_ci} 96570af302Sopenharmony_ci 97570af302Sopenharmony_ciint main(void) 98570af302Sopenharmony_ci{ 99570af302Sopenharmony_ci dlopen_ns_special_0100(); 100570af302Sopenharmony_ci dlopen_ns_special_0200(); 101570af302Sopenharmony_ci dlopen_ns_sys_path_0100(); 102570af302Sopenharmony_ci 103570af302Sopenharmony_ci return t_status; 104570af302Sopenharmony_ci}