1 /*
2  * Copyright (c) 2021 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 #include "platform/dl_operation/include/aie_dl_operation.h"
17 
18 #include <climits>
19 #include <cstdlib>
20 #include <cstring>
21 #include <dlfcn.h>
22 
23 #include "utils/aie_macros.h"
24 #include "utils/log/aie_log.h"
25 
26 namespace {
27 const int LOCAL = (RTLD_NOW | RTLD_LOCAL);
28 const int GLOBAL = (RTLD_NOW | RTLD_GLOBAL);
29 const char *LIB_PATH = "/usr/";
30 }
31 
AieDlopen(const char * libName,int local)32 void *AieDlopen(const char *libName, int local)
33 {
34     int flag = local ? LOCAL : GLOBAL;
35     unsigned int length = strlen(LIB_PATH);
36     if ((libName == nullptr) || (strlen(libName) < length)) {
37         HILOGD("[AieDlOperation] libName is invalid.");
38         return nullptr;
39     }
40 
41     char realLibPath[PATH_MAX + 1] = {0};
42     if (realpath(libName, realLibPath) == nullptr) {
43         HILOGD("[AieDlOperation] get libName realpath failed.");
44         return nullptr;
45     }
46 
47     int retCode = strncmp(realLibPath, LIB_PATH, length);
48     if (retCode != 0) {
49         HILOGD("[AieDlOperation] lib path is error.");
50         return nullptr;
51     }
52 
53     void *res = dlopen(realLibPath, flag);
54     return res;
55 }
56 
AieDlclose(void * lib)57 void AieDlclose(void *lib)
58 {
59     dlclose(lib);
60 }
61 
AieDlsym(void * handle,const char * funName)62 void *AieDlsym(void *handle, const char *funName)
63 {
64     return dlsym(handle, funName);
65 }
66 
AieDlerror()67 const char *AieDlerror()
68 {
69     return dlerror();
70 }
71