1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef _NAMESPACE_H 17 #define _NAMESPACE_H 18 19 #ifdef __cplusplus 20 extern "C" { 21 #endif 22 23 #include <stdbool.h> 24 #include <stdint.h> 25 #include "strops.h" 26 27 #define NS_DEFAULT_NAME "default" 28 struct dso; 29 /* define dso list */ 30 typedef struct _dso_list_ { 31 uint16_t num; 32 uint16_t size; 33 struct dso **dsos; 34 } dsolist; 35 /* define namespace struct */ 36 struct _ns_inherit_list_; 37 typedef struct _namespace_t_ { 38 char *ns_name; /* namespace name */ 39 char *env_paths; /* value of LD_LIBRARY_PATH. splited by ':'. */ 40 char *lib_paths; /* library search paths splited by ':'. */ 41 42 char *asan_lib_paths; /* when asan is enable, library search paths splited by ':'. */ 43 strlist *permitted_paths; /* when separated, permitted search paths splited by ':', including sub dirs. */ 44 strlist *asan_permitted_paths; /* when asan is enable and separated,the same as above. */ 45 46 bool separated; /* if separated */ 47 strlist *allowed_libs; /* when separated, allowed library names splited by ':'. */ 48 dsolist *ns_dsos; /* dso list in this namespace */ 49 struct _ns_inherit_list_ *ns_inherits; /* inherit list in this namespace */ 50 int flag; 51 } ns_t; 52 /* define namespace list */ 53 typedef struct _namespaces_list_ { 54 uint16_t num; 55 uint16_t size; 56 ns_t **nss; 57 } nslist; 58 /* define namespace inherit */ 59 typedef struct _namespace_inherit_ { 60 ns_t *inherited_ns; /* inherited namespace */ 61 strlist *shared_libs; /* when inherited, shared library names splited by ':'. */ 62 } ns_inherit; 63 /* define namespace inherit list */ 64 typedef struct _ns_inherit_list_ { 65 uint16_t num; 66 uint16_t size; 67 ns_inherit **inherits; 68 } ns_inherit_list; 69 70 /* init g_ns_list */ 71 nslist *nslist_init(); 72 73 /* namespace funcs */ 74 ns_t *ns_alloc(); 75 void ns_free(ns_t *ns); 76 void ns_set_name(ns_t *ns, const char *name); 77 void ns_set_env_paths(ns_t *ns, const char *env_paths); 78 void ns_set_lib_paths(ns_t *ns, const char *lib_paths); 79 void ns_set_asan_lib_paths(ns_t *ns, const char *asan_lib_paths); 80 void ns_set_permitted_paths(ns_t *ns, const char *permitted_paths); 81 void ns_set_asan_permitted_paths(ns_t *ns, const char *asan_permitted_paths); 82 void ns_set_separated(ns_t *ns, bool separated); 83 void ns_set_allowed_libs(ns_t *ns, const char *allowed_libs); 84 void ns_add_dso(ns_t *ns, struct dso *dso); 85 void nslist_add_ns(ns_t *ns); 86 void ns_add_inherit(ns_t *ns,ns_t *inherited, const char *shared_libs); 87 void ns_set_flag(ns_t *ns, int flag); 88 89 /* get default namespace */ 90 ns_t *get_default_ns(); 91 92 /* check if library pathname is accessible in the namespace */ 93 bool is_accessible(ns_t *ns, const char *lib_pathname, bool is_asan, bool check_inherited); 94 95 /* check if asan_lib_paths or asan_permitted_paths pathname is accessible in the namespace */ 96 bool check_asan_path(ns_t *ns, const char *lib_pathname); 97 98 /* check if library is sharable in the inherited namespace */ 99 bool is_sharable(ns_inherit *inherit, const char *lib_name); 100 101 /* find namespace by name */ 102 ns_t *find_ns_by_name(const char *ns_name); 103 104 #ifdef __cplusplus 105 } 106 #endif 107 108 #endif