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 HILOG_ERROR(LOG_CORE, "send failed %{public}d", errno);
176 return CloseSocketReturn(sockFd, -errno);
177 }
178
179 if (!PollRecvData(sockFd, (char *)(config), sizeof(struct ResolvConfig))) {
180 HILOG_ERROR(LOG_CORE, "receive failed %{public}d", errno);
181 return CloseSocketReturn(sockFd, -errno);
182 }
183
184 if (config->error < 0) {
185 HILOG_ERROR(LOG_CORE, "get Config error: %{public}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 (tmp->ai_canonname &&
321 strcpy_s(addrInfo[resNum].aiCanonName, sizeof(addrInfo[resNum].aiCanonName), tmp->ai_canonname) != 0) {
322 DNS_CONFIG_PRINT("strcpy_s failed");
323 return -1;
324 }
325
326 ++resNum;
327 if (resNum >= MAX_RESULTS) {
328 break;
329 }
330 }
331
332 return resNum;
333 }
334
FillQueryParam(struct queryparam * orig,struct QueryParam * dest)335 static int32_t FillQueryParam(struct queryparam *orig, struct QueryParam *dest)
336 {
337 dest->type = orig->qp_type;
338 dest->netId = orig->qp_netid;
339 dest->mark = orig->qp_mark;
340 dest->flags = orig->qp_flag;
341 dest->qHook = NULL;
342 return 0;
343 }
344
NetSysSetResolvCacheInternal(int sockFd,uint16_t netId,const struct ParamWrapper param,struct addrinfo * res)345 static int32_t NetSysSetResolvCacheInternal(int sockFd, uint16_t netId, const struct ParamWrapper param,
346 struct addrinfo *res)
347 {
348 struct RequestInfo info = {
349 .uid = getuid(),
350 .command = SET_CACHE,
351 .netId = netId,
352 };
353 if (netId == 0 && GetNetForApp() > 0) {
354 info.netId = (uint32_t)GetNetForApp();
355 }
356 int32_t result = NetsysSendKeyForCache(sockFd, param, info);
357 if (result < 0) {
358 return result;
359 }
360
361 struct AddrInfo addrInfo[MAX_RESULTS] = {};
362 int32_t resNum = FillAddrInfo(addrInfo, res);
363 if (resNum < 0) {
364 return CloseSocketReturn(sockFd, -1);
365 }
366
367 if (!PollSendData(sockFd, (char *)&resNum, sizeof(resNum))) {
368 DNS_CONFIG_PRINT("send failed %d", errno);
369 return CloseSocketReturn(sockFd, -errno);
370 }
371
372 if (resNum == 0) {
373 return CloseSocketReturn(sockFd, 0);
374 }
375
376 if (!PollSendData(sockFd, (char *)addrInfo, sizeof(struct AddrInfo) * resNum)) {
377 DNS_CONFIG_PRINT("send failed %d", errno);
378 return CloseSocketReturn(sockFd, -errno);
379 }
380
381 return CloseSocketReturn(sockFd, 0);
382 }
383
NetSysSetResolvCache(uint16_t netId,const struct ParamWrapper param,struct addrinfo * res)384 int32_t NetSysSetResolvCache(uint16_t netId, const struct ParamWrapper param, struct addrinfo *res)
385 {
386 char *hostName = param.host;
387 if (hostName == NULL || strlen(hostName) == 0 || res == NULL) {
388 DNS_CONFIG_PRINT("Invalid Param");
389 return -EINVAL;
390 }
391
392 int sockFd = CreateConnectionToNetSys();
393 if (sockFd < 0) {
394 DNS_CONFIG_PRINT("NetSysSetResolvCache CreateConnectionToNetSys connect to netsys err: %d", errno);
395 return sockFd;
396 }
397
398 int err = NetSysSetResolvCacheInternal(sockFd, netId, param, res);
399 if (err < 0) {
400 DNS_CONFIG_PRINT("NetSysSetResolvCache NetSysSetResolvCacheInternal err: %d", errno);
401 return err;
402 }
403
404 return 0;
405 }
406
NetSysIsIpv6EnableInternal(int sockFd,uint16_t netId,int * enable)407 static int32_t NetSysIsIpv6EnableInternal(int sockFd, uint16_t netId, int *enable)
408 {
409 struct RequestInfo info = {
410 .uid = getuid(),
411 .command = JUDGE_IPV6,
412 .netId = netId,
413 };
414 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
415 DNS_CONFIG_PRINT("send failed %d", errno);
416 return CloseSocketReturn(sockFd, -errno);
417 }
418
419 if (!PollRecvData(sockFd, (char *)enable, sizeof(int))) {
420 DNS_CONFIG_PRINT("read failed %d", errno);
421 return CloseSocketReturn(sockFd, -errno);
422 }
423
424 return CloseSocketReturn(sockFd, 0);
425 }
426
NetSysIsIpv6Enable(uint16_t netId)427 int NetSysIsIpv6Enable(uint16_t netId)
428 {
429 int sockFd = CreateConnectionToNetSys();
430 if (sockFd < 0) {
431 DNS_CONFIG_PRINT("NetSysIsIpv6Enable CreateConnectionToNetSys connect to netsys err: %d", errno);
432 return sockFd;
433 }
434 int enable = 0;
435 int err = NetSysIsIpv6EnableInternal(sockFd, netId, &enable);
436 if (err < 0) {
437 return 0;
438 }
439
440 return enable;
441 }
442
NetSysPostDnsResultPollSendData(int sockFd,int queryret,int32_t resNum,struct QueryParam * param,struct AddrInfo addrInfo[static MAX_RESULTS])443 static int32_t NetSysPostDnsResultPollSendData(int sockFd, int queryret, int32_t resNum, struct QueryParam *param,
444 struct AddrInfo addrInfo[static MAX_RESULTS])
445 {
446 if (!PollSendData(sockFd, (char *)&queryret, sizeof(int))) {
447 DNS_CONFIG_PRINT("send failed %d", errno);
448 return CloseSocketReturn(sockFd, -errno);
449 }
450
451 if (!PollSendData(sockFd, (char *)&resNum, sizeof(int32_t))) {
452 DNS_CONFIG_PRINT("send failed %d", errno);
453 return CloseSocketReturn(sockFd, -errno);
454 }
455
456 if (!PollSendData(sockFd, (char *)param, sizeof(struct QueryParam))) {
457 DNS_CONFIG_PRINT("send failed %d", errno);
458 return CloseSocketReturn(sockFd, -errno);
459 }
460
461 if (resNum > 0) {
462 if (!PollSendData(sockFd, (char *)addrInfo, sizeof(struct AddrInfo) * resNum)) {
463 DNS_CONFIG_PRINT("send failed %d", errno);
464 return CloseSocketReturn(sockFd, -errno);
465 }
466 }
467 return CloseSocketReturn(sockFd, 0);
468 }
469
NetSysPostDnsResultInternal(int sockFd,uint16_t netId,char * name,int usedtime,int queryret,struct addrinfo * res,struct queryparam * param)470 static int32_t NetSysPostDnsResultInternal(int sockFd, uint16_t netId, char* name, int usedtime, int queryret,
471 struct addrinfo *res, struct queryparam *param)
472 {
473 struct RequestInfo info = {
474 .uid = getuid(),
475 .command = POST_DNS_RESULT,
476 .netId = netId,
477 };
478
479 int32_t uid = (int32_t)(getuid());
480 int32_t pid = getpid();
481 uint32_t nameLen = strlen(name) + 1;
482 NETSYS_CLIENT_PRINT("NetSysPostDnsResultInternal uid %d, pid %d, netid %d pkg", uid, pid, netId);
483
484 struct AddrInfo addrInfo[MAX_RESULTS] = {};
485 struct QueryParam netparam = {};
486 int32_t resNum = 0;
487 if (queryret == 0) {
488 resNum = FillAddrInfo(addrInfo, res);
489 }
490 if (resNum < 0) {
491 return CloseSocketReturn(sockFd, -1);
492 }
493 FillQueryParam(param, &netparam);
494
495 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
496 DNS_CONFIG_PRINT("send failed %d", errno);
497 return CloseSocketReturn(sockFd, -errno);
498 }
499
500 if (!PollSendData(sockFd, (char *)&uid, sizeof(int32_t))) {
501 DNS_CONFIG_PRINT("send failed %d", errno);
502 return CloseSocketReturn(sockFd, -errno);
503 }
504
505 if (!PollSendData(sockFd, (char *)&pid, sizeof(int32_t))) {
506 DNS_CONFIG_PRINT("send failed %d", errno);
507 return CloseSocketReturn(sockFd, -errno);
508 }
509
510 if (!PollSendData(sockFd, (char *)&nameLen, sizeof(uint32_t))) {
511 DNS_CONFIG_PRINT("send failed %d", errno);
512 return CloseSocketReturn(sockFd, -errno);
513 }
514
515 if (!PollSendData(sockFd, name, (sizeof(char) * nameLen))) {
516 DNS_CONFIG_PRINT("send failed %d", errno);
517 return CloseSocketReturn(sockFd, -errno);
518 }
519
520 if (!PollSendData(sockFd, (char *)&usedtime, sizeof(int))) {
521 DNS_CONFIG_PRINT("send failed %d", errno);
522 return CloseSocketReturn(sockFd, -errno);
523 }
524
525 return NetSysPostDnsResultPollSendData(sockFd, queryret, resNum, &netparam, addrInfo);
526 }
527
NetSysPostDnsResult(int netid,char * name,int usedtime,int queryret,struct addrinfo * res,struct queryparam * param)528 int32_t NetSysPostDnsResult(int netid, char* name, int usedtime, int queryret,
529 struct addrinfo *res, struct queryparam *param)
530 {
531 if (name == NULL) {
532 return -1;
533 }
534
535 int sockFd = CreateConnectionToNetSys();
536 if (sockFd < 0) {
537 DNS_CONFIG_PRINT("NetSysPostDnsResult CreateConnectionToNetSys connect to netsys err: %d", errno);
538 return sockFd;
539 }
540 int err = NetSysPostDnsResultInternal(sockFd, netid, name, usedtime, queryret, res, param);
541 if (err < 0) {
542 return -1;
543 }
544
545 return 0;
546 }
547
NetSysGetDefaultNetworkInternal(int sockFd,uint16_t netId,int32_t * currentNetId)548 static int32_t NetSysGetDefaultNetworkInternal(int sockFd, uint16_t netId, int32_t *currentNetId)
549 {
550 struct RequestInfo info = {
551 .uid = getuid(),
552 .command = GET_DEFAULT_NETWORK,
553 .netId = netId,
554 };
555 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
556 DNS_CONFIG_PRINT("send failed %d", errno);
557 return CloseSocketReturn(sockFd, -errno);
558 }
559
560 if (!PollRecvData(sockFd, (char *)currentNetId, sizeof(int))) {
561 DNS_CONFIG_PRINT("read failed %d", errno);
562 return CloseSocketReturn(sockFd, -errno);
563 }
564 DNS_CONFIG_PRINT("currentNetId %d", *currentNetId);
565 return CloseSocketReturn(sockFd, 0);
566 }
567
NetSysGetDefaultNetwork(uint16_t netId,int32_t * currentNetId)568 int32_t NetSysGetDefaultNetwork(uint16_t netId, int32_t* currentNetId)
569 {
570 int sockFd = CreateConnectionToNetSys();
571 int err = NetSysGetDefaultNetworkInternal(sockFd, netId, currentNetId);
572 if (err < 0) {
573 return -1;
574 }
575
576 return 0;
577 }
578
NetSysBindSocketInternal(int sockFd,uint16_t netId,int32_t fd)579 static int32_t NetSysBindSocketInternal(int sockFd, uint16_t netId, int32_t fd)
580 {
581 struct RequestInfo info = {
582 .uid = getuid(),
583 .command = BIND_SOCKET,
584 .netId = netId,
585 };
586 if (!PollSendData(sockFd, (const char *)(&info), sizeof(info))) {
587 DNS_CONFIG_PRINT("send failed %d", errno);
588 return CloseSocketReturn(sockFd, -errno);
589 }
590
591 if (!PollSendData(sockFd, (const char *)(&fd), sizeof(int32_t))) {
592 DNS_CONFIG_PRINT("send failed %d", errno);
593 return CloseSocketReturn(sockFd, -errno);
594 }
595
596 return CloseSocketReturn(sockFd, 0);
597 }
598
NetSysBindSocket(int32_t fd,uint32_t netId)599 int32_t NetSysBindSocket(int32_t fd, uint32_t netId)
600 {
601 int sockFd = CreateConnectionToNetSys();
602 DNS_CONFIG_PRINT("NetSysBindSocket %d", fd);
603 int err = NetSysBindSocketInternal(sockFd, netId, fd);
604 if (err < 0) {
605 return -1;
606 }
607
608 return 0;
609 }
610
611 #ifdef __cplusplus
612 }
613 #endif
614