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], ¶m);
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], ¶m);
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