1 /*
2 * Copyright (c) 2023 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 #include "napi/native_api.h"
16 #include <arpa/nameser.h>
17 #include <cerrno>
18 #include <cstddef>
19 #include <cstring>
20 #include <js_native_api_types.h>
21 #include <stdint.h>
22 #include <sys/inotify.h>
23 #include <unistd.h>
24
25 #define PARAM_0 0
26 #define PARAM_1 1
27 #define PARAM_3 3
28 #define PARAM_0x0 0x0
29 #define RETURN_0 0
30 #define FAILD (-1)
31 #define NO_ERR 0
32 #define TEST_DNS_HEAD 12
33 #define TEST_SKIP_SIZE 4
34 #define SKIPRR_RESULT 17
35 #define PARAM_UNNORMAL (-1)
36 #define ERRON_0 0
37 static unsigned char msg[] = "\x71\x79\x81\x80\x00\x01"
38 "\x00\x02\x00\x04\x00\x04\x03\x77\x77\x77\x03\x61\x62\x63\x03\x63"
39 "\x6f\x6d\x00\x00\x01\x00\x01\xc0\x0c\x00\x05\x00\x01\x00\x00\x02"
40 "\xe8\x00\x02\xc0\x10\xc0\x10\x00\x01\x00\x01\x00\x00\x02\xe9\x00"
41 "\x04\x0a\xb5\x84\xfa\xc0\x10\x00\x02\x00\x01\x00\x00\xda\xeb\x00"
42 "\x0d\x06\x73\x65\x6e\x73\x30\x31\x03\x64\x69\x67\xc0\x14\xc0\x10"
43 "\x00\x02\x00\x01\x00\x00\xda\xeb\x00\x09\x06\x73\x65\x6e\x73\x30"
44 "\x32\xc0\x4e\xc0\x10\x00\x02\x00\x01\x00\x00\xda\xeb\x00\x09\x06"
45 "\x6f\x72\x6e\x73\x30\x31\xc0\x4e\xc0\x10\x00\x02\x00\x01\x00\x00"
46 "\xda\xeb\x00\x09\x06\x6f\x72\x6e\x73\x30\x32\xc0\x4e\xc0\x75\x00"
47 "\x01\x00\x01\x00\x00\x7a\x36\x00\x04\x0a\xbb\xbd\x2c\xc0\x8a\x00"
48 "\x01\x00\x01\x00\x00\x1b\x96\x00\x04\x0a\xbb\xbe\x2c\xc0\x47\x00"
49 "\x01\x00\x01\x00\x00\x92\xb1\x00\x04\x0a\xb5\x86\x10\xc0\x60\x00"
50 "\x01\x00\x01\x00\x00\x92\xb1\x00\x04\x0a\xb5\x87\xc7";
51
52 extern unsigned ns_get16(const unsigned char *);
53 extern unsigned long ns_get32(const unsigned char *);
54 extern void ns_put16(unsigned, unsigned char *);
55 extern void ns_put32(unsigned long, unsigned char *);
56 extern int ns_initparse(const unsigned char *, int, ns_msg *);
57 extern int ns_parserr(ns_msg *, ns_sect, int, ns_rr *);
58 extern int ns_skiprr(const unsigned char *, const unsigned char *, ns_sect, int);
59 extern int ns_name_uncompress(const unsigned char *, const unsigned char *, const unsigned char *, char *, size_t);
60
NsGet16(napi_env env,napi_callback_info info)61 static napi_value NsGet16(napi_env env, napi_callback_info info)
62 {
63 errno = ERRON_0;
64 unsigned char com[] = "com";
65 ns_get16(com);
66 napi_value result;
67 if (errno == ERRON_0) {
68 napi_create_int32(env, PARAM_0, &result);
69 } else {
70 napi_create_int32(env, PARAM_UNNORMAL, &result);
71 }
72 return result;
73 }
74
NsGet32(napi_env env,napi_callback_info info)75 static napi_value NsGet32(napi_env env, napi_callback_info info)
76 {
77 errno = ERRON_0;
78 unsigned char com[] = "com";
79 ns_get32(com);
80 napi_value result;
81 if (errno == ERRON_0) {
82 napi_create_int32(env, PARAM_0, &result);
83 } else {
84 napi_create_int32(env, PARAM_UNNORMAL, &result);
85 }
86 return result;
87 }
88
NsPut16(napi_env env,napi_callback_info info)89 static napi_value NsPut16(napi_env env, napi_callback_info info)
90 {
91 errno = ERRON_0;
92 unsigned char com[] = "com";
93 ns_put16(NS_ALG_DSA, com);
94 napi_value result;
95 if (errno == ERRON_0) {
96 napi_create_int32(env, PARAM_0, &result);
97 } else {
98 napi_create_int32(env, PARAM_UNNORMAL, &result);
99 }
100 return result;
101 }
102
NsPut32(napi_env env,napi_callback_info info)103 static napi_value NsPut32(napi_env env, napi_callback_info info)
104 {
105 errno = ERRON_0;
106 unsigned char com[] = "com";
107 ns_put32(NS_ALG_DSA, com);
108 napi_value result;
109 if (errno == ERRON_0) {
110 napi_create_int32(env, PARAM_0, &result);
111 } else {
112 napi_create_int32(env, PARAM_UNNORMAL, &result);
113 }
114 return result;
115 }
116
NsNameUnCompress(napi_env env,napi_callback_info info)117 static napi_value NsNameUnCompress(napi_env env, napi_callback_info info)
118 {
119 errno = ERRON_0;
120 unsigned char com[] = "com";
121 unsigned char comp[10] = {0};
122 char exp[10] = {0};
123 ns_name_uncompress(com, com + PARAM_3, comp, exp, MAXDNAME);
124 napi_value result;
125 if (errno == ERRON_0) {
126 napi_create_int32(env, PARAM_0, &result);
127 } else {
128 napi_create_int32(env, PARAM_UNNORMAL, &result);
129 }
130 return result;
131 }
132
NsParsErr(napi_env env,napi_callback_info info)133 static napi_value NsParsErr(napi_env env, napi_callback_info info)
134 {
135 errno = ERRON_0;
136 ns_msg handle = {nullptr};
137 ns_rr rr;
138 ns_initparse(msg, sizeof(msg) - PARAM_1, &handle);
139 memset(&rr, PARAM_0x0, sizeof(ns_rr));
140 int ret = ns_parserr(&handle, ns_s_qd, PARAM_0, &rr);
141 napi_value result = nullptr;
142 napi_create_int32(env, ret, &result);
143 return result;
144 }
NsInitParse(napi_env env,napi_callback_info info)145 static napi_value NsInitParse(napi_env env, napi_callback_info info)
146 {
147 ns_msg handle = {nullptr};
148 int ret = ns_initparse(msg, sizeof(msg) - PARAM_1, &handle);
149 napi_value result;
150 napi_create_int32(env, ret, &result);
151 return result;
152 }
153
NsSkiPrr(napi_env env,napi_callback_info info)154 static napi_value NsSkiPrr(napi_env env, napi_callback_info info)
155 {
156 napi_value result = nullptr;
157 unsigned char *ptr = msg + TEST_DNS_HEAD;
158 unsigned char *eom = msg + sizeof(msg) - PARAM_1;
159 int ret;
160 ns_sect sec = ns_s_qd;
161 ret = ns_skiprr(ptr, eom, sec, PARAM_1);
162 if (ret == SKIPRR_RESULT) {
163 napi_create_int32(env, NO_ERR, &result);
164 } else {
165 napi_create_int32(env, FAILD, &result);
166 }
167 return result;
168 }
169
NsFlagdata(napi_env env,napi_callback_info info)170 static napi_value NsFlagdata(napi_env env, napi_callback_info info)
171 {
172 struct _ns_flagdata nf;
173 napi_value result = nullptr;
174 if (sizeof(nf) >= PARAM_0) {
175 napi_create_int32(env, RETURN_0, &result);
176 } else {
177 napi_create_int32(env, FAILD, &result);
178 }
179 return result;
180 }
181
182 EXTERN_C_START
Init(napi_env env,napi_value exports)183 static napi_value Init(napi_env env, napi_value exports)
184 {
185 napi_property_descriptor desc[] = {
186 {"nsGet16", nullptr, NsGet16, nullptr, nullptr, nullptr, napi_default, nullptr},
187 {"nsGet32", nullptr, NsGet32, nullptr, nullptr, nullptr, napi_default, nullptr},
188 {"nsPut16", nullptr, NsPut16, nullptr, nullptr, nullptr, napi_default, nullptr},
189 {"nsPut32", nullptr, NsPut32, nullptr, nullptr, nullptr, napi_default, nullptr},
190 {"nsInitParse", nullptr, NsInitParse, nullptr, nullptr, nullptr, napi_default, nullptr},
191 {"nsNameUnCompress", nullptr, NsNameUnCompress, nullptr, nullptr, nullptr, napi_default, nullptr},
192 {"nsParsErr", nullptr, NsParsErr, nullptr, nullptr, nullptr, napi_default, nullptr},
193 {"nsSkiPrr", nullptr, NsSkiPrr, nullptr, nullptr, nullptr, napi_default, nullptr},
194 {"nsFlagdata", nullptr, NsFlagdata, nullptr, nullptr, nullptr, napi_default, nullptr},
195 };
196 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
197 return exports;
198 }
199 EXTERN_C_END
200
201 static napi_module demoModule = {
202 .nm_version = 1,
203 .nm_flags = 0,
204 .nm_filename = nullptr,
205 .nm_register_func = Init,
206 .nm_modname = "libifaddrs",
207 .nm_priv = ((void *)0),
208 .reserved = {0},
209 };
210
RegisterModule(void)211 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); }
212