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/**
26570af302Sopenharmony_ci * @tc.name      : dlopen_0100
27570af302Sopenharmony_ci * @tc.desc      : Enter a valid path, dlopen compatibility test
28570af302Sopenharmony_ci * @tc.level     : Level 0
29570af302Sopenharmony_ci */
30570af302Sopenharmony_civoid dlopen_0100(void)
31570af302Sopenharmony_ci{
32570af302Sopenharmony_ci    void* handle = dlopen(dllNamePath, RTLD_LAZY);
33570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_0100", handle);
34570af302Sopenharmony_ci    dlclose(handle);
35570af302Sopenharmony_ci}
36570af302Sopenharmony_ci
37570af302Sopenharmony_ci
38570af302Sopenharmony_ci/**
39570af302Sopenharmony_ci * @tc.name      : dlopen_0200
40570af302Sopenharmony_ci * @tc.desc      : Enter invalid path, dlopen compatibility test
41570af302Sopenharmony_ci * @tc.level     : Level 2
42570af302Sopenharmony_ci */
43570af302Sopenharmony_civoid dlopen_0200(void)
44570af302Sopenharmony_ci{
45570af302Sopenharmony_ci    void* handle = dlopen(errPath_ns, RTLD_LAZY);
46570af302Sopenharmony_ci    EXPECT_FALSE("dlopen_0200", handle);
47570af302Sopenharmony_ci}
48570af302Sopenharmony_ci
49570af302Sopenharmony_ci/**
50570af302Sopenharmony_ci * @tc.name      : dlns_init_0100
51570af302Sopenharmony_ci * @tc.desc      : Use a string less than 255 bytes as the dlns_init parameter
52570af302Sopenharmony_ci * @tc.level     : Level 1
53570af302Sopenharmony_ci */
54570af302Sopenharmony_civoid dlns_init_0100(void)
55570af302Sopenharmony_ci{
56570af302Sopenharmony_ci    Dl_namespace dlns;
57570af302Sopenharmony_ci    char n[] = "dlns_init_0100";
58570af302Sopenharmony_ci    dlns_init(&dlns, n);
59570af302Sopenharmony_ci    EXPECT_EQ("dlns_init_0100", strcmp(dlns.name, n), 0);
60570af302Sopenharmony_ci}
61570af302Sopenharmony_ci
62570af302Sopenharmony_ci/**
63570af302Sopenharmony_ci * @tc.name      : dlns_init_0200
64570af302Sopenharmony_ci * @tc.desc      : Use very long strings as dlns_init parameters
65570af302Sopenharmony_ci * @tc.level     : Level 2
66570af302Sopenharmony_ci */
67570af302Sopenharmony_civoid dlns_init_0200(void)
68570af302Sopenharmony_ci{
69570af302Sopenharmony_ci    Dl_namespace dlns;
70570af302Sopenharmony_ci    int size = 256;
71570af302Sopenharmony_ci    char n[] = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 \
72570af302Sopenharmony_ci                012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 \
73570af302Sopenharmony_ci                012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 \
74570af302Sopenharmony_ci                012345678901234567890123456789";
75570af302Sopenharmony_ci    int len = strlen(n);
76570af302Sopenharmony_ci    dlns_init(&dlns, n);
77570af302Sopenharmony_ci    EXPECT_TRUE("dlns_init_0200", size < len);
78570af302Sopenharmony_ci
79570af302Sopenharmony_ci    int dlnslen = strlen(dlns.name);
80570af302Sopenharmony_ci    EXPECT_TRUE("dlns_init_0200", size > dlnslen);
81570af302Sopenharmony_ci}
82570af302Sopenharmony_ci
83570af302Sopenharmony_ci/**
84570af302Sopenharmony_ci * @tc.name      : dlns_create_0100
85570af302Sopenharmony_ci * @tc.desc      : Using dlns_create, create a new namespace
86570af302Sopenharmony_ci * @tc.level     : Level 1
87570af302Sopenharmony_ci */
88570af302Sopenharmony_civoid dlns_create_0100(void)
89570af302Sopenharmony_ci{
90570af302Sopenharmony_ci    Dl_namespace dlns;
91570af302Sopenharmony_ci    dlns_init(&dlns, "dlns_create_0100");
92570af302Sopenharmony_ci
93570af302Sopenharmony_ci    EXPECT_EQ("dlns_create_0100", dlns_create(&dlns, path), EOK);
94570af302Sopenharmony_ci}
95570af302Sopenharmony_ci
96570af302Sopenharmony_ci/**
97570af302Sopenharmony_ci * @tc.name      : dlns_create_0200
98570af302Sopenharmony_ci * @tc.desc      : Using dlns_create, create a new namespace
99570af302Sopenharmony_ci * @tc.level     : Level 2
100570af302Sopenharmony_ci */
101570af302Sopenharmony_civoid dlns_create_0200(void)
102570af302Sopenharmony_ci{
103570af302Sopenharmony_ci    // ns_no_allowed_libs already exists
104570af302Sopenharmony_ci    Dl_namespace dlns;
105570af302Sopenharmony_ci    dlns_init(&dlns, "ns_no_allowed_libs");
106570af302Sopenharmony_ci
107570af302Sopenharmony_ci    dlns_create(&dlns, NULL);
108570af302Sopenharmony_ci    EXPECT_EQ("dlns_create_0200", dlns_create(&dlns, NULL), EEXIST);
109570af302Sopenharmony_ci}
110570af302Sopenharmony_ci
111570af302Sopenharmony_ci/**
112570af302Sopenharmony_ci * @tc.name      : dlns_create_0300
113570af302Sopenharmony_ci * @tc.desc      : After creating a new namespace, check lib_path validity
114570af302Sopenharmony_ci * @tc.level     : Level 1
115570af302Sopenharmony_ci */
116570af302Sopenharmony_civoid dlns_create_0300(void)
117570af302Sopenharmony_ci{
118570af302Sopenharmony_ci    // ns_no_allowed_libs already exists
119570af302Sopenharmony_ci    Dl_namespace dlns;
120570af302Sopenharmony_ci    dlns_init(&dlns, "dlns_create_0300");
121570af302Sopenharmony_ci
122570af302Sopenharmony_ci    EXPECT_EQ("dlns_create_0300", dlns_create(&dlns, path), EOK);
123570af302Sopenharmony_ci
124570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlns, dllName, RTLD_LAZY);
125570af302Sopenharmony_ci    EXPECT_TRUE("dlns_create_0300", handle);
126570af302Sopenharmony_ci    dlclose(handle);
127570af302Sopenharmony_ci}
128570af302Sopenharmony_ci
129570af302Sopenharmony_ci/**
130570af302Sopenharmony_ci * @tc.name      : dlns_create_0400
131570af302Sopenharmony_ci * @tc.desc      : Namespace creation when dlns=NULL
132570af302Sopenharmony_ci * @tc.level     : Level 2
133570af302Sopenharmony_ci */
134570af302Sopenharmony_civoid dlns_create_0400(void)
135570af302Sopenharmony_ci{
136570af302Sopenharmony_ci    EXPECT_EQ("dlns_create_0400", dlns_create(NULL, path), EINVAL);
137570af302Sopenharmony_ci}
138570af302Sopenharmony_ci
139570af302Sopenharmony_ci/**
140570af302Sopenharmony_ci * @tc.name      : dlns_create_0500
141570af302Sopenharmony_ci * @tc.desc      : Namespace creation when lib_path=NULL
142570af302Sopenharmony_ci * @tc.level     : Level 2
143570af302Sopenharmony_ci */
144570af302Sopenharmony_civoid dlns_create_0500(void)
145570af302Sopenharmony_ci{
146570af302Sopenharmony_ci    Dl_namespace dlns;
147570af302Sopenharmony_ci    dlns_init(&dlns, "dlns_create_0500");
148570af302Sopenharmony_ci
149570af302Sopenharmony_ci    EXPECT_EQ("dlns_create_0500", dlns_create(&dlns, NULL), EOK);
150570af302Sopenharmony_ci}
151570af302Sopenharmony_ci
152570af302Sopenharmony_ci
153570af302Sopenharmony_ci/**
154570af302Sopenharmony_ci * @tc.name      : dlopen_ns_0100
155570af302Sopenharmony_ci * @tc.desc      : dlopen_ns valid full path test
156570af302Sopenharmony_ci * @tc.level     : Level 1
157570af302Sopenharmony_ci */
158570af302Sopenharmony_civoid dlopen_ns_0100(void)
159570af302Sopenharmony_ci{
160570af302Sopenharmony_ci    Dl_namespace dlns_default;
161570af302Sopenharmony_ci    dlns_get(NULL, &dlns_default);
162570af302Sopenharmony_ci    Dl_namespace dlns;
163570af302Sopenharmony_ci    dlns_init(&dlns, "ns_no_allowed_libs");
164570af302Sopenharmony_ci    dlns_inherit(&dlns, &dlns_default, "libc++.so");
165570af302Sopenharmony_ci
166570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlns, dllNamePath, RTLD_LAZY);
167570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_ns_0100", handle);
168570af302Sopenharmony_ci    dlclose(handle);
169570af302Sopenharmony_ci}
170570af302Sopenharmony_ci
171570af302Sopenharmony_ci/**
172570af302Sopenharmony_ci * @tc.name      : dlopen_ns_0200
173570af302Sopenharmony_ci * @tc.desc      : dlopen_ns invalid full path test
174570af302Sopenharmony_ci * @tc.level     : Level 2
175570af302Sopenharmony_ci */
176570af302Sopenharmony_civoid dlopen_ns_0200(void)
177570af302Sopenharmony_ci{
178570af302Sopenharmony_ci    Dl_namespace dlns_default;
179570af302Sopenharmony_ci    dlns_get(NULL, &dlns_default);
180570af302Sopenharmony_ci    Dl_namespace dlns;
181570af302Sopenharmony_ci    dlns_init(&dlns, "ns_no_allowed_libs");
182570af302Sopenharmony_ci    dlns_inherit(&dlns, &dlns_default, "libc++.so");
183570af302Sopenharmony_ci
184570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlns, errdllNamePath, RTLD_LAZY);
185570af302Sopenharmony_ci    EXPECT_FALSE("dlopen_ns_0200", handle);
186570af302Sopenharmony_ci}
187570af302Sopenharmony_ci
188570af302Sopenharmony_ci/**
189570af302Sopenharmony_ci * @tc.name      : dlopen_ns_0300
190570af302Sopenharmony_ci * @tc.desc      : dlopen_ns valid short name test
191570af302Sopenharmony_ci * @tc.level     : Level 1
192570af302Sopenharmony_ci */
193570af302Sopenharmony_civoid dlopen_ns_0300(void)
194570af302Sopenharmony_ci{
195570af302Sopenharmony_ci    Dl_namespace dlns_default;
196570af302Sopenharmony_ci    dlns_get(NULL, &dlns_default);
197570af302Sopenharmony_ci    Dl_namespace dlns;
198570af302Sopenharmony_ci    dlns_init(&dlns, "ns_no_allowed_libs");
199570af302Sopenharmony_ci    dlns_inherit(&dlns, &dlns_default, "libc++.so");
200570af302Sopenharmony_ci
201570af302Sopenharmony_ci    void* handle = dlopen_ns(&dlns, dllName, RTLD_LAZY);
202570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_ns_0300", handle);
203570af302Sopenharmony_ci    dlclose(handle);
204570af302Sopenharmony_ci}
205570af302Sopenharmony_ci
206570af302Sopenharmony_ci/**
207570af302Sopenharmony_ci * @tc.name      : dlopen_ns_0400
208570af302Sopenharmony_ci * @tc.desc      : When dlns=NULL, call dlopen_ns to load the library
209570af302Sopenharmony_ci * @tc.level     : Level 1
210570af302Sopenharmony_ci */
211570af302Sopenharmony_civoid dlopen_ns_0400(void)
212570af302Sopenharmony_ci{
213570af302Sopenharmony_ci    void* handle = dlopen_ns(NULL, dllNamePath, RTLD_LAZY);
214570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_ns_0400", handle);
215570af302Sopenharmony_ci    dlclose(handle);
216570af302Sopenharmony_ci}
217570af302Sopenharmony_ci
218570af302Sopenharmony_ci/**
219570af302Sopenharmony_ci * @tc.name      : dlopen_ns_0500
220570af302Sopenharmony_ci * @tc.desc      : When file=NULL, call dlopen_ns to load the library
221570af302Sopenharmony_ci * @tc.level     : Level 2
222570af302Sopenharmony_ci */
223570af302Sopenharmony_civoid dlopen_ns_0500(void)
224570af302Sopenharmony_ci{
225570af302Sopenharmony_ci    Dl_namespace dlns;
226570af302Sopenharmony_ci    dlns_init(&dlns, "ns_no_allowed_libs");
227570af302Sopenharmony_ci
228570af302Sopenharmony_ci    void *handle = dlopen_ns(&dlns, NULL, RTLD_LAZY);
229570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_ns_0500", handle);
230570af302Sopenharmony_ci    dlclose(handle);
231570af302Sopenharmony_ci}
232570af302Sopenharmony_ci
233570af302Sopenharmony_ci/**
234570af302Sopenharmony_ci * @tc.name      : dlns_get_0100
235570af302Sopenharmony_ci * @tc.desc      : Gets an existing namespace handle.
236570af302Sopenharmony_ci * @tc.level     : Level 1
237570af302Sopenharmony_ci */
238570af302Sopenharmony_civoid dlns_get_0100(void)
239570af302Sopenharmony_ci{
240570af302Sopenharmony_ci    Dl_namespace dlns;
241570af302Sopenharmony_ci    dlns_init(&dlns, "dlns_get_0100");
242570af302Sopenharmony_ci    dlns_create(&dlns, NULL);
243570af302Sopenharmony_ci    dlns_get("dlns_get_0100", &dlns);
244570af302Sopenharmony_ci    EXPECT_EQ("dlns_get_0100", strcmp(dlns.name, "dlns_get_0100"), 0);
245570af302Sopenharmony_ci}
246570af302Sopenharmony_ci
247570af302Sopenharmony_ci/**
248570af302Sopenharmony_ci * @tc.name      : dlns_get_0200
249570af302Sopenharmony_ci * @tc.desc      : Gets the current namespace handle when name=NULL.
250570af302Sopenharmony_ci * @tc.level     : Level 1
251570af302Sopenharmony_ci */
252570af302Sopenharmony_civoid dlns_get_0200(void)
253570af302Sopenharmony_ci{
254570af302Sopenharmony_ci    Dl_namespace dlns;
255570af302Sopenharmony_ci    dlns_get(NULL, &dlns);
256570af302Sopenharmony_ci    EXPECT_EQ("dlns_get_0200", strcmp(dlns.name, "default"), 0);
257570af302Sopenharmony_ci}
258570af302Sopenharmony_ci
259570af302Sopenharmony_ci/**
260570af302Sopenharmony_ci * @tc.name      : dlns_get_0300
261570af302Sopenharmony_ci * @tc.desc      : Call dlns_get when dlns=NULL.
262570af302Sopenharmony_ci * @tc.level     : Level 2
263570af302Sopenharmony_ci */
264570af302Sopenharmony_civoid dlns_get_0300(void)
265570af302Sopenharmony_ci{
266570af302Sopenharmony_ci    dlns_get(NULL, NULL);
267570af302Sopenharmony_ci    EXPECT_EQ("dlns_get_0300", dlns_get(NULL, NULL), EINVAL);
268570af302Sopenharmony_ci}
269570af302Sopenharmony_ci
270570af302Sopenharmony_ci/**
271570af302Sopenharmony_ci * @tc.name      : dlns_get_0400
272570af302Sopenharmony_ci * @tc.desc      : Gets a namespace handle that does not exist.
273570af302Sopenharmony_ci * @tc.level     : Level 2
274570af302Sopenharmony_ci */
275570af302Sopenharmony_civoid dlns_get_0400(void)
276570af302Sopenharmony_ci{
277570af302Sopenharmony_ci    Dl_namespace dlns;
278570af302Sopenharmony_ci    dlns_init(&dlns, "dlns_get_0400");
279570af302Sopenharmony_ci    EXPECT_EQ("dlns_get_0400", dlns_get("dlns_get_0400", &dlns), ENOKEY);
280570af302Sopenharmony_ci}
281570af302Sopenharmony_ci
282570af302Sopenharmony_ci/**
283570af302Sopenharmony_ci * @tc.name      : dlopen_add_reloc
284570af302Sopenharmony_ci * @tc.desc      : Test add_reloc_can_search_dso: not enough memory.
285570af302Sopenharmony_ci *                 Dlopen lib whth more than 32 dependent libs.(libace.z.so)
286570af302Sopenharmony_ci * @tc.level     : Level 1
287570af302Sopenharmony_ci */
288570af302Sopenharmony_civoid dlopen_add_reloc(void)
289570af302Sopenharmony_ci{
290570af302Sopenharmony_ci    void* handle = dlopen(dllAcePath, RTLD_LAZY);
291570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_add_reloc", handle);
292570af302Sopenharmony_ci}
293570af302Sopenharmony_ci
294570af302Sopenharmony_ci/**
295570af302Sopenharmony_ci * @tc.name      : dlopen_relocation
296570af302Sopenharmony_ci * @tc.desc      : Test dlopen lib relocation type is REL_DTPMOD/REL_DTPOFF.(libstd.dylib.so)
297570af302Sopenharmony_ci * @tc.level     : Level 1
298570af302Sopenharmony_ci */
299570af302Sopenharmony_civoid dlopen_relocation(void)
300570af302Sopenharmony_ci{
301570af302Sopenharmony_ci    void* handle = dlopen(dllDylibPath, RTLD_LAZY);
302570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_relocation", handle);
303570af302Sopenharmony_ci    if(handle){
304570af302Sopenharmony_ci        dlclose(handle);
305570af302Sopenharmony_ci    }
306570af302Sopenharmony_ci}
307570af302Sopenharmony_ci
308570af302Sopenharmony_ci/**
309570af302Sopenharmony_ci * @tc.name      : dlopen_hash_type
310570af302Sopenharmony_ci * @tc.desc      : Test dlopen lib hash type is sysv.(libdlopen_hash_sysv.so)
311570af302Sopenharmony_ci * @tc.level     : Level 1
312570af302Sopenharmony_ci */
313570af302Sopenharmony_civoid dlopen_hash_type(void)
314570af302Sopenharmony_ci{
315570af302Sopenharmony_ci    void* handle = dlopen(dllHashsysvPath, RTLD_LAZY);
316570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_hash_type", handle);
317570af302Sopenharmony_ci    if(handle){
318570af302Sopenharmony_ci        dlclose(handle);
319570af302Sopenharmony_ci    }
320570af302Sopenharmony_ci}
321570af302Sopenharmony_ci
322570af302Sopenharmony_ci/**
323570af302Sopenharmony_ci * @tc.name      : dlopen_set_rpath
324570af302Sopenharmony_ci * @tc.desc      : Test dlopen lib by set rpath.(libdlopen_hash_sysv.so)
325570af302Sopenharmony_ci * @tc.level     : Level 1
326570af302Sopenharmony_ci */
327570af302Sopenharmony_civoid dlopen_set_rpath(void)
328570af302Sopenharmony_ci{
329570af302Sopenharmony_ci    void* handle = dlopen(dllHashsysv, RTLD_LAZY);
330570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_set_rpath", handle);
331570af302Sopenharmony_ci    if(handle){
332570af302Sopenharmony_ci        dlclose(handle);
333570af302Sopenharmony_ci    }
334570af302Sopenharmony_ci}
335570af302Sopenharmony_ci
336570af302Sopenharmony_ci/**
337570af302Sopenharmony_ci * @tc.name      : dlopen_fill_random
338570af302Sopenharmony_ci * @tc.desc      : Test dlopen lib libdlopen_fill_random.so to coverage fill_random_data.
339570af302Sopenharmony_ci * @tc.level     : Level 1
340570af302Sopenharmony_ci */
341570af302Sopenharmony_civoid dlopen_fill_random(void)
342570af302Sopenharmony_ci{
343570af302Sopenharmony_ci    void* handle = dlopen(dllFillRandom, RTLD_LAZY);
344570af302Sopenharmony_ci    EXPECT_TRUE("dlopen_fill_random", handle);
345570af302Sopenharmony_ci    if(handle){
346570af302Sopenharmony_ci        dlclose(handle);
347570af302Sopenharmony_ci    }
348570af302Sopenharmony_ci}
349570af302Sopenharmony_ci
350570af302Sopenharmony_ciTEST_FUN G_Fun_Array[] = {
351570af302Sopenharmony_ci    dlopen_0100,
352570af302Sopenharmony_ci    dlopen_0200,
353570af302Sopenharmony_ci    dlns_init_0100,
354570af302Sopenharmony_ci    dlns_init_0200,
355570af302Sopenharmony_ci    dlns_create_0100,
356570af302Sopenharmony_ci    dlns_create_0200,
357570af302Sopenharmony_ci    dlns_create_0300,
358570af302Sopenharmony_ci    dlns_create_0400,
359570af302Sopenharmony_ci    dlns_create_0500,
360570af302Sopenharmony_ci    dlopen_ns_0100,
361570af302Sopenharmony_ci    dlopen_ns_0200,
362570af302Sopenharmony_ci    dlopen_ns_0300,
363570af302Sopenharmony_ci    dlopen_ns_0400,
364570af302Sopenharmony_ci    dlopen_ns_0500,
365570af302Sopenharmony_ci    dlns_get_0100,
366570af302Sopenharmony_ci    dlns_get_0200,
367570af302Sopenharmony_ci    dlns_get_0300,
368570af302Sopenharmony_ci    dlns_get_0400,
369570af302Sopenharmony_ci    dlopen_relocation,
370570af302Sopenharmony_ci    dlopen_hash_type,
371570af302Sopenharmony_ci    dlopen_set_rpath,
372570af302Sopenharmony_ci    dlopen_fill_random,
373570af302Sopenharmony_ci    dlopen_add_reloc,
374570af302Sopenharmony_ci};
375570af302Sopenharmony_ci
376570af302Sopenharmony_ciint main(void)
377570af302Sopenharmony_ci{
378570af302Sopenharmony_ci    int num = sizeof(G_Fun_Array)/sizeof(TEST_FUN);
379570af302Sopenharmony_ci    for (int pos = 0; pos < num; ++pos) {
380570af302Sopenharmony_ci        G_Fun_Array[pos]();
381570af302Sopenharmony_ci    }
382570af302Sopenharmony_ci
383570af302Sopenharmony_ci    return t_status;
384570af302Sopenharmony_ci}