1 /*
2 * Copyright (c) 2022-2024 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 "netsys_client.h"
17
18 #include <errno.h>
19 #include <sys/socket.h>
20
21 #include "app_net_client.h"
22 #include "dns_config_client.h"
23 #include "hilog/log_c.h"
24 #include <netdb.h>
25 #include <securec.h>
26 #include <stdbool.h>
27 #include <sys/select.h>
28 #include <sys/un.h>
29 #include <unistd.h>
30
31 #undef LOG_TAG
32 #ifndef NETMGRNATIVE_LOG_TAG
33 #define LOG_TAG "NetsysNativeService"
34 #else
35 #define LOG_TAG NETMGRNATIVE_LOG_TAG
36 #endif
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 static volatile uint8_t g_allowInternet = 1;
43
DisallowInternet(void)44 void DisallowInternet(void)
45 {
46 g_allowInternet = 0;
47 }
48
IsAllowInternet(void)49 uint8_t IsAllowInternet(void)
50 {
51 return g_allowInternet;
52 }
53
Min(uint32_t a,uint32_t b)54 static inline uint32_t Min(uint32_t a, uint32_t b)
55 {
56 return a < b ? a : b;
57 }
58
CloseSocketReturn(int sock,int ret)59 static inline int CloseSocketReturn(int sock, int ret)
60 {
61 close(sock);
62 return ret;
63 }
64
MakeDefaultDnsServer(char * server,size_t length)65 void MakeDefaultDnsServer(char *server, size_t length)
66 {
67 int ret = memset_s(server, length, 0, DEFAULT_SERVER_LENTH);
68 if (ret < 0) {
69 DNS_CONFIG_PRINT("MakeDefaultDnsServer memset_s failed");
70 return;
71 }
72
73 ret = sprintf_s(server, length, "%d.%d.%d.%d", DEFAULT_SERVER_NAME, DEFAULT_SERVER_NAME, DEFAULT_SERVER_NAME,
74 DEFAULT_SERVER_NAME);
75 if (ret != 0) {
76 DNS_CONFIG_PRINT("MakeDefaultDnsServer sprintf_s failed");
77 }
78 }
79
NonBlockConnect(int sock,struct sockaddr * addr,socklen_t addrLen)80 static bool NonBlockConnect(int sock, struct sockaddr *addr, socklen_t addrLen)
81 {
82 int ret = connect(sock, addr, addrLen);
83 if (ret >= 0) {
84 return true;
85 }
86 if (errno != EINPROGRESS) {
87 return false;
88 }
89
90 fd_set set = {0};
91 FD_ZERO(&set);
92 FD_SET(sock, &set);
93 struct timeval timeout = {
94 .tv_sec = DEFAULT_CONNECT_TIMEOUT,
95 .tv_usec = 0,
96 };
97
98 ret = select(sock + 1, NULL, &set, NULL, &timeout);
99 if (ret < 0) {
100 DNS_CONFIG_PRINT("select error: %s", strerror(errno));
101 return false;
102 } else if (ret == 0) {
103 DNS_CONFIG_PRINT("timeout!");
104 return false;
105 }
106
107 int err = 0;
108 socklen_t optLen = sizeof(err);
109 ret = getsockopt(sock, SOL_SOCKET, SO_ERROR, (void *)(&err), &optLen);
110 if (ret < 0 || err != 0) {
111 return false;
112 }
113 return true;
114 }
115
CreateConnectionToNetSys(void)116 static int CreateConnectionToNetSys(void)
117 {
118 int32_t sockFd = socket(AF_UNIX, SOCK_STREAM, 0);
119 if (sockFd < 0) {
120 DNS_CONFIG_PRINT("socket failed %d", errno);
121 return -errno;
122 }
123 if (!MakeNonBlock(sockFd)) {
124 DNS_CONFIG_PRINT("MakeNonBlock failed");
125 return CloseSocketReturn(sockFd, -errno);
126 }
127
128 struct sockaddr_un address = {0};
129 address.sun_family = AF_UNIX;
130
131 if (strcpy_s(address.sun_path, sizeof(address.sun_path), DNS_SOCKET_PATH) != 0) {
132 DNS_CONFIG_PRINT("str copy failed ");
133 return CloseSocketReturn(sockFd, -1);
134 }
135
136 if (!NonBlockConnect(sockFd, (struct sockaddr *)&address, sizeof(address))) {
137 return CloseSocketReturn(sockFd, -errno);
138 }
139
140 return sockFd;
141 }
142
MakeKey(const char * hostName,const char * serv,const struct addrinfo * hints,char key[static MAX_KEY_LENGTH])143 static bool MakeKey(const char *hostName, const char *serv, const struct addrinfo *hints,
144 char key[static MAX_KEY_LENGTH])
145 {
146 if (serv && hints) {
147 return sprintf_s(key, MAX_KEY_LENGTH, "%s %s %d %d %d %d", hostName, serv, hints->ai_family, hints->ai_flags,
148 hints->ai_protocol, hints->ai_socktype) > 0;
149 }
150
151 if (hints) {
152 return sprintf_s(key, MAX_KEY_LENGTH, "%s %d %d %d %d", hostName, hints->ai_family, hints->ai_flags,
153 hints->ai_protocol, hints->ai_socktype) > 0;
154 }
155
156 if (serv) {
157 return sprintf_s(key, MAX_KEY_LENGTH, "%s %s", hostName, serv) > 0;
158 }
159
160 return sprintf_s(key, MAX_KEY_LENGTH, "%s", hostName) > 0;
161 }
162
NetSysGetResolvConfInternal(int sockFd,uint16_t netId,struct ResolvConfig * config)163 static int32_t NetSysGetResolvConfInternal(int sockFd, uint16_t netId, struct ResolvConfig *config)
164 {
165 struct RequestInfo info = {
166 .uid = getuid(),
167 .command = GET_CONFIG,
168 .netId = netId,
169 };
170 if (netId == 0 && GetNetForApp() > 0) {
171 info.netId = (uint32_t)GetNetForApp();
172 }
173 DNS_CONFIG_PRINT("NetSysGetResolvConfInternal begin netid: %d", info.netId);
174 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
175 DNS_CONFIG_PRINT("send failed %d", errno);
176 return CloseSocketReturn(sockFd, -errno);
177 }
178
179 if (!PollRecvData(sockFd, (char *)(config), sizeof(struct ResolvConfig))) {
180 DNS_CONFIG_PRINT("receive failed %d", errno);
181 return CloseSocketReturn(sockFd, -errno);
182 }
183
184 if (config->error < 0) {
185 DNS_CONFIG_PRINT("get Config error: %d", config->error);
186 return CloseSocketReturn(sockFd, config->error);
187 }
188
189 DNS_CONFIG_PRINT("NetSysGetResolvConfInternal end netid: %d", info.netId);
190 return CloseSocketReturn(sockFd, 0);
191 }
192
NetSysGetResolvConf(uint16_t netId,struct ResolvConfig * config)193 int32_t NetSysGetResolvConf(uint16_t netId, struct ResolvConfig *config)
194 {
195 if (config == NULL) {
196 DNS_CONFIG_PRINT("Invalid Param");
197 return -EINVAL;
198 }
199
200 int sockFd = CreateConnectionToNetSys();
201 if (sockFd < 0) {
202 DNS_CONFIG_PRINT("NetSysGetResolvConf CreateConnectionToNetSys connect to netsys err: %d", errno);
203 return -errno;
204 }
205
206 int32_t err = NetSysGetResolvConfInternal(sockFd, netId, config);
207 if (err < 0) {
208 DNS_CONFIG_PRINT("NetSysGetResolvConf NetSysGetResolvConfInternal err: %d", errno);
209 return err;
210 }
211
212 if (strlen(config->nameservers[0]) == 0) {
213 return -1;
214 }
215 return 0;
216 }
217
NetsysSendKeyForCache(int sockFd,struct ParamWrapper param,struct RequestInfo info)218 static int32_t NetsysSendKeyForCache(int sockFd, struct ParamWrapper param, struct RequestInfo info)
219 {
220 char key[MAX_KEY_LENGTH] = {0};
221 if (!MakeKey(param.host, param.serv, param.hint, key)) {
222 return CloseSocketReturn(sockFd, -1);
223 }
224
225 DNS_CONFIG_PRINT("NetSysSetResolvCacheInternal begin netid: %d", info.netId);
226 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
227 DNS_CONFIG_PRINT("send failed %d", errno);
228 return CloseSocketReturn(sockFd, -errno);
229 }
230
231 uint32_t nameLen = strlen(key) + 1;
232 if (!PollSendData(sockFd, (const char *)&nameLen, sizeof(nameLen))) {
233 DNS_CONFIG_PRINT("send failed %d", errno);
234 return CloseSocketReturn(sockFd, -errno);
235 }
236
237 if (!PollSendData(sockFd, key, nameLen)) {
238 DNS_CONFIG_PRINT("send failed %d", errno);
239 return CloseSocketReturn(sockFd, -errno);
240 }
241 return 0;
242 };
243
NetSysGetResolvCacheInternal(int sockFd,uint16_t netId,const struct ParamWrapper param,struct AddrInfo addrInfo[static MAX_RESULTS],uint32_t * num)244 static int32_t NetSysGetResolvCacheInternal(int sockFd, uint16_t netId, const struct ParamWrapper param,
245 struct AddrInfo addrInfo[static MAX_RESULTS], uint32_t *num)
246 {
247 struct RequestInfo info = {
248 .uid = getuid(),
249 .command = GET_CACHE,
250 .netId = netId,
251 };
252 if (netId == 0 && GetNetForApp() > 0) {
253 info.netId = (uint32_t)GetNetForApp();
254 }
255 int32_t res = NetsysSendKeyForCache(sockFd, param, info);
256 if (res < 0) {
257 return res;
258 }
259
260 if (!PollRecvData(sockFd, (char *)num, sizeof(uint32_t))) {
261 DNS_CONFIG_PRINT("read failed %d", errno);
262 return CloseSocketReturn(sockFd, -errno);
263 }
264
265 *num = Min(*num, MAX_RESULTS);
266 if (*num == 0) {
267 return CloseSocketReturn(sockFd, 0);
268 }
269
270 if (!PollRecvData(sockFd, (char *)addrInfo, sizeof(struct AddrInfo) * (*num))) {
271 DNS_CONFIG_PRINT("read failed %d", errno);
272 return CloseSocketReturn(sockFd, -errno);
273 }
274
275 DNS_CONFIG_PRINT("NetSysGetResolvCacheInternal end netid: %d", info.netId);
276 return CloseSocketReturn(sockFd, 0);
277 }
278
NetSysGetResolvCache(uint16_t netId,const struct ParamWrapper param,struct AddrInfo addrInfo[static MAX_RESULTS],uint32_t * num)279 int32_t NetSysGetResolvCache(uint16_t netId, const struct ParamWrapper param,
280 struct AddrInfo addrInfo[static MAX_RESULTS], uint32_t *num)
281 {
282 char *hostName = param.host;
283 if (hostName == NULL || strlen(hostName) == 0 || num == NULL) {
284 DNS_CONFIG_PRINT("Invalid Param");
285 return -EINVAL;
286 }
287
288 int sockFd = CreateConnectionToNetSys();
289 if (sockFd < 0) {
290 DNS_CONFIG_PRINT("NetSysGetResolvCache CreateConnectionToNetSys connect to netsys err: %d", errno);
291 return sockFd;
292 }
293
294 int err = NetSysGetResolvCacheInternal(sockFd, netId, param, addrInfo, num);
295 if (err < 0) {
296 DNS_CONFIG_PRINT("NetSysGetResolvCache NetSysGetResolvCacheInternal err: %d", errno);
297 return err;
298 }
299
300 return 0;
301 }
302
FillAddrInfo(struct AddrInfo addrInfo[static MAX_RESULTS],struct addrinfo * res)303 static int32_t FillAddrInfo(struct AddrInfo addrInfo[static MAX_RESULTS], struct addrinfo *res)
304 {
305 if (memset_s(addrInfo, sizeof(struct AddrInfo) * MAX_RESULTS, 0, sizeof(struct AddrInfo) * MAX_RESULTS) != 0) {
306 return -1;
307 }
308
309 int32_t resNum = 0;
310 for (struct addrinfo *tmp = res; tmp != NULL; tmp = tmp->ai_next) {
311 addrInfo[resNum].aiFlags = tmp->ai_flags;
312 addrInfo[resNum].aiFamily = tmp->ai_family;
313 addrInfo[resNum].aiSockType = (uint32_t)(tmp->ai_socktype);
314 addrInfo[resNum].aiProtocol = tmp->ai_protocol;
315 addrInfo[resNum].aiAddrLen = tmp->ai_addrlen;
316 if (memcpy_s(&addrInfo[resNum].aiAddr, sizeof(addrInfo[resNum].aiAddr), tmp->ai_addr, tmp->ai_addrlen) != 0) {
317 DNS_CONFIG_PRINT("memcpy_s failed");
318 return -1;
319 }
320 if (strcpy_s(addrInfo[resNum].aiCanonName, sizeof(addrInfo[resNum].aiCanonName), tmp->ai_canonname) != 0) {
321 DNS_CONFIG_PRINT("strcpy_s failed");
322 return -1;
323 }
324
325 ++resNum;
326 if (resNum >= MAX_RESULTS) {
327 break;
328 }
329 }
330
331 return resNum;
332 }
333
FillQueryParam(struct queryparam * orig,struct QueryParam * dest)334 static int32_t FillQueryParam(struct queryparam *orig, struct QueryParam *dest)
335 {
336 dest->type = orig->qp_type;
337 dest->netId = orig->qp_netid;
338 dest->mark = orig->qp_mark;
339 dest->flags = orig->qp_flag;
340 dest->qHook = NULL;
341 return 0;
342 }
343
NetSysSetResolvCacheInternal(int sockFd,uint16_t netId,const struct ParamWrapper param,struct addrinfo * res)344 static int32_t NetSysSetResolvCacheInternal(int sockFd, uint16_t netId, const struct ParamWrapper param,
345 struct addrinfo *res)
346 {
347 struct RequestInfo info = {
348 .uid = getuid(),
349 .command = SET_CACHE,
350 .netId = netId,
351 };
352 if (netId == 0 && GetNetForApp() > 0) {
353 info.netId = (uint32_t)GetNetForApp();
354 }
355 int32_t result = NetsysSendKeyForCache(sockFd, param, info);
356 if (result < 0) {
357 return result;
358 }
359
360 struct AddrInfo addrInfo[MAX_RESULTS] = {};
361 int32_t resNum = FillAddrInfo(addrInfo, res);
362 if (resNum < 0) {
363 return CloseSocketReturn(sockFd, -1);
364 }
365
366 if (!PollSendData(sockFd, (char *)&resNum, sizeof(resNum))) {
367 DNS_CONFIG_PRINT("send failed %d", errno);
368 return CloseSocketReturn(sockFd, -errno);
369 }
370
371 if (resNum == 0) {
372 return CloseSocketReturn(sockFd, 0);
373 }
374
375 if (!PollSendData(sockFd, (char *)addrInfo, sizeof(struct AddrInfo) * resNum)) {
376 DNS_CONFIG_PRINT("send failed %d", errno);
377 return CloseSocketReturn(sockFd, -errno);
378 }
379
380 return CloseSocketReturn(sockFd, 0);
381 }
382
NetSysSetResolvCache(uint16_t netId,const struct ParamWrapper param,struct addrinfo * res)383 int32_t NetSysSetResolvCache(uint16_t netId, const struct ParamWrapper param, struct addrinfo *res)
384 {
385 char *hostName = param.host;
386 if (hostName == NULL || strlen(hostName) == 0 || res == NULL) {
387 DNS_CONFIG_PRINT("Invalid Param");
388 return -EINVAL;
389 }
390
391 int sockFd = CreateConnectionToNetSys();
392 if (sockFd < 0) {
393 DNS_CONFIG_PRINT("NetSysSetResolvCache CreateConnectionToNetSys connect to netsys err: %d", errno);
394 return sockFd;
395 }
396
397 int err = NetSysSetResolvCacheInternal(sockFd, netId, param, res);
398 if (err < 0) {
399 DNS_CONFIG_PRINT("NetSysSetResolvCache NetSysSetResolvCacheInternal err: %d", errno);
400 return err;
401 }
402
403 return 0;
404 }
405
NetSysIsIpv6EnableInternal(int sockFd,uint16_t netId,int * enable)406 static int32_t NetSysIsIpv6EnableInternal(int sockFd, uint16_t netId, int *enable)
407 {
408 struct RequestInfo info = {
409 .uid = getuid(),
410 .command = JUDGE_IPV6,
411 .netId = netId,
412 };
413 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
414 DNS_CONFIG_PRINT("send failed %d", errno);
415 return CloseSocketReturn(sockFd, -errno);
416 }
417
418 if (!PollRecvData(sockFd, (char *)enable, sizeof(int))) {
419 DNS_CONFIG_PRINT("read failed %d", errno);
420 return CloseSocketReturn(sockFd, -errno);
421 }
422
423 return CloseSocketReturn(sockFd, 0);
424 }
425
NetSysIsIpv6Enable(uint16_t netId)426 int NetSysIsIpv6Enable(uint16_t netId)
427 {
428 int sockFd = CreateConnectionToNetSys();
429 if (sockFd < 0) {
430 DNS_CONFIG_PRINT("NetSysIsIpv6Enable CreateConnectionToNetSys connect to netsys err: %d", errno);
431 return sockFd;
432 }
433 int enable = 0;
434 int err = NetSysIsIpv6EnableInternal(sockFd, netId, &enable);
435 if (err < 0) {
436 return 0;
437 }
438
439 return enable;
440 }
441
NetSysPostDnsResultPollSendData(int sockFd,int queryret,int32_t resNum,struct QueryParam * param,struct AddrInfo addrInfo[static MAX_RESULTS])442 static int32_t NetSysPostDnsResultPollSendData(int sockFd, int queryret, int32_t resNum, struct QueryParam *param,
443 struct AddrInfo addrInfo[static MAX_RESULTS])
444 {
445 if (!PollSendData(sockFd, (char *)&queryret, sizeof(int))) {
446 DNS_CONFIG_PRINT("send failed %d", errno);
447 return CloseSocketReturn(sockFd, -errno);
448 }
449
450 if (!PollSendData(sockFd, (char *)&resNum, sizeof(int32_t))) {
451 DNS_CONFIG_PRINT("send failed %d", errno);
452 return CloseSocketReturn(sockFd, -errno);
453 }
454
455 if (!PollSendData(sockFd, (char *)param, sizeof(struct QueryParam))) {
456 DNS_CONFIG_PRINT("send failed %d", errno);
457 return CloseSocketReturn(sockFd, -errno);
458 }
459
460 if (resNum > 0) {
461 if (!PollSendData(sockFd, (char *)addrInfo, sizeof(struct AddrInfo) * resNum)) {
462 DNS_CONFIG_PRINT("send failed %d", errno);
463 return CloseSocketReturn(sockFd, -errno);
464 }
465 }
466 return CloseSocketReturn(sockFd, 0);
467 }
468
NetSysPostDnsResultInternal(int sockFd,uint16_t netId,char * name,int usedtime,int queryret,struct addrinfo * res,struct queryparam * param)469 static int32_t NetSysPostDnsResultInternal(int sockFd, uint16_t netId, char* name, int usedtime, int queryret,
470 struct addrinfo *res, struct queryparam *param)
471 {
472 struct RequestInfo info = {
473 .uid = getuid(),
474 .command = POST_DNS_RESULT,
475 .netId = netId,
476 };
477
478 int32_t uid = (int32_t)(getuid());
479 int32_t pid = getpid();
480 uint32_t nameLen = strlen(name) + 1;
481 NETSYS_CLIENT_PRINT("NetSysPostDnsResultInternal uid %d, pid %d, netid %d pkg", uid, pid, netId);
482
483 struct AddrInfo addrInfo[MAX_RESULTS] = {};
484 struct QueryParam netparam = {};
485 int32_t resNum = 0;
486 if (queryret == 0) {
487 resNum = FillAddrInfo(addrInfo, res);
488 }
489 if (resNum < 0) {
490 return CloseSocketReturn(sockFd, -1);
491 }
492 FillQueryParam(param, &netparam);
493
494 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
495 DNS_CONFIG_PRINT("send failed %d", errno);
496 return CloseSocketReturn(sockFd, -errno);
497 }
498
499 if (!PollSendData(sockFd, (char *)&uid, sizeof(int32_t))) {
500 DNS_CONFIG_PRINT("send failed %d", errno);
501 return CloseSocketReturn(sockFd, -errno);
502 }
503
504 if (!PollSendData(sockFd, (char *)&pid, sizeof(int32_t))) {
505 DNS_CONFIG_PRINT("send failed %d", errno);
506 return CloseSocketReturn(sockFd, -errno);
507 }
508
509 if (!PollSendData(sockFd, (char *)&nameLen, sizeof(uint32_t))) {
510 DNS_CONFIG_PRINT("send failed %d", errno);
511 return CloseSocketReturn(sockFd, -errno);
512 }
513
514 if (!PollSendData(sockFd, name, (sizeof(char) * nameLen))) {
515 DNS_CONFIG_PRINT("send failed %d", errno);
516 return CloseSocketReturn(sockFd, -errno);
517 }
518
519 if (!PollSendData(sockFd, (char *)&usedtime, sizeof(int))) {
520 DNS_CONFIG_PRINT("send failed %d", errno);
521 return CloseSocketReturn(sockFd, -errno);
522 }
523
524 return NetSysPostDnsResultPollSendData(sockFd, queryret, resNum, &netparam, addrInfo);
525 }
526
NetSysPostDnsResult(int netid,char * name,int usedtime,int queryret,struct addrinfo * res,struct queryparam * param)527 int32_t NetSysPostDnsResult(int netid, char* name, int usedtime, int queryret,
528 struct addrinfo *res, struct queryparam *param)
529 {
530 if (name == NULL) {
531 return -1;
532 }
533
534 int sockFd = CreateConnectionToNetSys();
535 if (sockFd < 0) {
536 DNS_CONFIG_PRINT("NetSysPostDnsResult CreateConnectionToNetSys connect to netsys err: %d", errno);
537 return sockFd;
538 }
539 int err = NetSysPostDnsResultInternal(sockFd, netid, name, usedtime, queryret, res, param);
540 if (err < 0) {
541 return -1;
542 }
543
544 return 0;
545 }
546
NetSysGetDefaultNetworkInternal(int sockFd,uint16_t netId,int32_t * currentNetId)547 static int32_t NetSysGetDefaultNetworkInternal(int sockFd, uint16_t netId, int32_t *currentNetId)
548 {
549 struct RequestInfo info = {
550 .uid = getuid(),
551 .command = GET_DEFAULT_NETWORK,
552 .netId = netId,
553 };
554 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
555 DNS_CONFIG_PRINT("send failed %d", errno);
556 return CloseSocketReturn(sockFd, -errno);
557 }
558
559 if (!PollRecvData(sockFd, (char *)currentNetId, sizeof(int))) {
560 DNS_CONFIG_PRINT("read failed %d", errno);
561 return CloseSocketReturn(sockFd, -errno);
562 }
563 DNS_CONFIG_PRINT("currentNetId %d", *currentNetId);
564 return CloseSocketReturn(sockFd, 0);
565 }
566
NetSysGetDefaultNetwork(uint16_t netId,int32_t * currentNetId)567 int32_t NetSysGetDefaultNetwork(uint16_t netId, int32_t* currentNetId)
568 {
569 int sockFd = CreateConnectionToNetSys();
570 int err = NetSysGetDefaultNetworkInternal(sockFd, netId, currentNetId);
571 if (err < 0) {
572 return -1;
573 }
574
575 return 0;
576 }
577
NetSysBindSocketInternal(int sockFd,uint16_t netId,int32_t fd)578 static int32_t NetSysBindSocketInternal(int sockFd, uint16_t netId, int32_t fd)
579 {
580 struct RequestInfo info = {
581 .uid = getuid(),
582 .command = BIND_SOCKET,
583 .netId = netId,
584 };
585 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
586 DNS_CONFIG_PRINT("send failed %d", errno);
587 return CloseSocketReturn(sockFd, -errno);
588 }
589
590 if (!PollSendData(sockFd, (const char *)(&fd), sizeof(int32_t))) {
591 DNS_CONFIG_PRINT("send failed %d", errno);
592 return CloseSocketReturn(sockFd, -errno);
593 }
594
595 return CloseSocketReturn(sockFd, 0);
596 }
597
NetSysBindSocket(int32_t fd,uint32_t netId)598 int32_t NetSysBindSocket(int32_t fd, uint32_t netId)
599 {
600 int sockFd = CreateConnectionToNetSys();
601 DNS_CONFIG_PRINT("NetSysBindSocket %d", fd);
602 int err = NetSysBindSocketInternal(sockFd, netId, fd);
603 if (err < 0) {
604 return -1;
605 }
606
607 return 0;
608 }
609
610 #ifdef __cplusplus
611 }
612 #endif
613