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