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 #include "common/napi_helper.cpp"
17 #include "common/native_common.h"
18 #include <js_native_api.h>
19 #include <js_native_api_types.h>
20 #include <node_api.h>
21 #include <resolv.h>
22 
23 #define MAXDNAME_A 1025
24 #define PARAM_0 0
25 #define PARAM_1 1
26 #define PARAM_2 2
27 #define PARAM_UNNORMAL (-1)
28 #define RETURN_0 0
29 #define FAILD (-1)
30 #define ERRON_0 0
31 #define SIZE_10 10
32 #define SIZE_100 100
33 #define SIZE_1024 1024
34 #define SIZE_4096 4096
35 #define SIZE_8192 8192
36 #define NO_ERR 0
37 #define SUCCESS 1
38 #define FAIL (-1)
39 #define BUFSIZ 1024
40 
ResInit(napi_env env, napi_callback_info info)41 static napi_value ResInit(napi_env env, napi_callback_info info)
42 {
43     napi_value result = nullptr;
44     int resultValue = res_init();
45 
46     napi_create_int32(env, resultValue, &result);
47 
48     return result;
49 }
50 
ResMkquery(napi_env env, napi_callback_info info)51 static napi_value ResMkquery(napi_env env, napi_callback_info info)
52 {
53     size_t argc = PARAM_1;
54     napi_value args[1] = {nullptr};
55     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
56     int param = PARAM_0;
57     napi_get_value_int32(env, args[0], &param);
58 
59     const int op = QUERY;
60     const int cla = C_IN;
61     const char dname[] = "www.example.com";
62     const unsigned char *data = (const unsigned char *)"";
63     unsigned char buf[SIZE_1024] = {PARAM_0};
64 
65     int resultValue = FAILD;
66     if (param == PARAM_UNNORMAL) {
67         resultValue = res_mkquery(op, dname, cla, T_ANY + PARAM_1, data, PARAM_0, nullptr, nullptr, PARAM_0);
68     } else {
69         int ret = res_mkquery(op, dname, cla, T_TXT, data, PARAM_0, nullptr, buf, sizeof(buf));
70         if (ret > PARAM_0) {
71             resultValue = RETURN_0;
72         }
73     }
74 
75     napi_value result = nullptr;
76     napi_create_int32(env, resultValue, &result);
77 
78     return result;
79 }
80 
ResQuery(napi_env env, napi_callback_info info)81 static napi_value ResQuery(napi_env env, napi_callback_info info)
82 {
83     size_t argc = PARAM_1;
84     napi_value args[1] = {nullptr};
85     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
86     int param = PARAM_0;
87     napi_get_value_int32(env, args[0], &param);
88 
89     const char dname[] = "www.baidu.com";
90     const int cla = C_IN;
91     const int type = T_TXT;
92     unsigned char buf[PARAM_1] = {PARAM_0};
93 
94     int resultValue = FAILD;
95     if (param == PARAM_UNNORMAL) {
96         resultValue = res_query(dname, cla, type, buf, sizeof(buf));
97     } else {
98         int ret = res_query(dname, cla, T_ANY + 1, buf, sizeof(buf));
99         if (ret > PARAM_0) {
100             resultValue = RETURN_0;
101         }
102     }
103 
104     napi_value result = nullptr;
105     napi_create_int32(env, resultValue, &result);
106 
107     return result;
108 }
109 
ResQuerydomain(napi_env env, napi_callback_info info)110 static napi_value ResQuerydomain(napi_env env, napi_callback_info info)
111 {
112     const char name[] = "www";
113     const char domain[] = "baidu.com";
114     const int cla = C_IN;
115     const int type = T_TXT;
116     unsigned char buf[PARAM_1] = {PARAM_0};
117 
118     int resultValue = res_querydomain(name, domain, cla, type, buf, sizeof(buf));
119 
120     napi_value result = nullptr;
121     napi_create_int32(env, resultValue, &result);
122 
123     return result;
124 }
125 
ResSend(napi_env env, napi_callback_info info)126 static napi_value ResSend(napi_env env, napi_callback_info info)
127 {
128     const int op = QUERY;
129     const int cla = C_IN;
130     const int type = T_TXT;
131     const char dname[] = "www.example.com";
132     const unsigned char *data = (const unsigned char *)"";
133     int resultValue = FAIL;
134     unsigned char buf[BUFSIZ] = {0};
135     unsigned char answer[512];
136     int value = res_mkquery(op, dname, cla, type, data, PARAM_0, nullptr, buf, sizeof(buf));
137     int ret = res_send(buf, value, answer, sizeof(answer));
138     if (ret >= NO_ERR) {
139         resultValue = SUCCESS;
140     }
141     napi_value result = nullptr;
142     napi_create_int32(env, resultValue, &result);
143     return result;
144 }
145 
ResSearch(napi_env env, napi_callback_info info)146 static napi_value ResSearch(napi_env env, napi_callback_info info)
147 {
148     char name[] = "www.baidu.com";
149     int cla = C_IN;
150     unsigned char answer[MAXDNAME_A] = {PARAM_0};
151     int ret = res_search(name, cla, T_TXT, answer, sizeof(answer));
152     int resultValue = FAIL;
153     if (ret >= NO_ERR) {
154         resultValue = SUCCESS;
155     }
156     napi_value result = nullptr;
157     napi_create_int32(env, resultValue, &result);
158     return result;
159 }
160 
Dn_expand(napi_env env, napi_callback_info info)161 static napi_value Dn_expand(napi_env env, napi_callback_info info)
162 {
163     int backParam = PARAM_0;
164     const char domain[] = "www.testohos.com";
165     unsigned char buff[MAXDNAME_A] = {0};
166     unsigned char *bufPtr = buff;
167     int ret = dn_comp(domain, bufPtr, MAXDNAME_A, nullptr, nullptr);
168     if (ret != PARAM_UNNORMAL) {
169         char expandDn[MAXDNAME_A];
170         const unsigned char *eomorig = buff + MAXDNAME_A;
171         backParam = dn_expand(buff, eomorig, buff, expandDn, MAXDNAME_A);
172     }
173     napi_value result = nullptr;
174     napi_create_int32(env, backParam, &result);
175     return result;
176 }
177 
178 EXTERN_C_START
Init(napi_env env, napi_value exports)179 static napi_value Init(napi_env env, napi_value exports)
180 {
181     napi_property_descriptor desc[] = {
182         {"resInit", nullptr, ResInit, nullptr, nullptr, nullptr, napi_default, nullptr},
183         {"dn_expand", nullptr, Dn_expand, nullptr, nullptr, nullptr, napi_default, nullptr},
184         {"resMkquery", nullptr, ResMkquery, nullptr, nullptr, nullptr, napi_default, nullptr},
185         {"resQuery", nullptr, ResQuery, nullptr, nullptr, nullptr, napi_default, nullptr},
186         {"resSearch", nullptr, ResSearch, nullptr, nullptr, nullptr, napi_default, nullptr},
187         {"resQuerydomain", nullptr, ResQuerydomain, nullptr, nullptr, nullptr, napi_default, nullptr},
188         {"resSend", nullptr, ResSend, nullptr, nullptr, nullptr, napi_default, nullptr}};
189     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
190     return exports;
191 }
192 EXTERN_C_END
193 
194 static napi_module demoModule = {
195     .nm_version = 1,
196     .nm_flags = 0,
197     .nm_filename = nullptr,
198     .nm_register_func = Init,
199     .nm_modname = "resolv",
200     .nm_priv = ((void *)0),
201     .reserved = {0},
202 };
203 
RegisterModule(void)204 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
205