• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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