• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is part of the openHiTLS project.
3  *
4  * openHiTLS is licensed under the Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *
8  *     http://license.coscl.org.cn/MulanPSL2
9  *
10  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13  * See the Mulan PSL v2 for more details.
14  */
15 
16 #include "hitls_build.h"
17 #if defined(HITLS_BSL_SAL_LINUX) && defined(HITLS_BSL_SAL_NET)
18 
19 #include <stdbool.h>
20 
21 #include <unistd.h>
22 #include <sys/ioctl.h>
23 #include <sys/socket.h>
24 #include <sys/un.h>
25 #include <arpa/inet.h>
26 #include <netdb.h>
27 #include <errno.h>
28 #include "securec.h"
29 #include "bsl_sal.h"
30 #include "bsl_errno.h"
31 #include "sal_net.h"
32 
33 typedef union {
34     struct sockaddr addr;
35     struct sockaddr_in6 addrIn6;
36     struct sockaddr_in addrIn;
37     struct sockaddr_un addrUn;
38 } LinuxSockAddr;
39 
SAL_NET_Write(int32_t fd,const void * buf,uint32_t len,int32_t * err)40 int32_t SAL_NET_Write(int32_t fd, const void *buf, uint32_t len, int32_t *err)
41 {
42     if (err == NULL) {
43         return BSL_NULL_INPUT;
44     }
45     int32_t ret = (int32_t)write(fd, buf, len);
46     if (ret < 0) {
47         *err = errno;
48     }
49     return ret;
50 }
51 
SAL_NET_Read(int32_t fd,void * buf,uint32_t len,int32_t * err)52 int32_t SAL_NET_Read(int32_t fd, void *buf, uint32_t len, int32_t *err)
53 {
54     if (err == NULL) {
55         return BSL_NULL_INPUT;
56     }
57     int32_t ret = (int32_t)read(fd, buf, len);
58     if (ret < 0) {
59         *err = errno;
60     }
61     return ret;
62 }
63 
SAL_NET_Sendto(int32_t sock,const void * buf,size_t len,int32_t flags,void * address,int32_t addrLen,int32_t * err)64 int32_t SAL_NET_Sendto(int32_t sock, const void *buf, size_t len, int32_t flags, void *address, int32_t addrLen,
65                        int32_t *err)
66 {
67     if (err == NULL) {
68         return BSL_NULL_INPUT;
69     }
70     int32_t ret = (int32_t)sendto(sock, buf, len, flags, (struct sockaddr *)address, (socklen_t)addrLen);
71     if (ret <= 0) {
72         *err = errno;
73     }
74     return ret;
75 }
76 
SAL_NET_RecvFrom(int32_t sock,void * buf,size_t len,int32_t flags,void * address,int32_t * addrLen,int32_t * err)77 int32_t SAL_NET_RecvFrom(int32_t sock, void *buf, size_t len, int32_t flags, void *address, int32_t *addrLen,
78                          int32_t *err)
79 {
80     if (err == NULL) {
81         return BSL_NULL_INPUT;
82     }
83     int32_t ret = (int32_t)recvfrom(sock, buf, len, flags, (struct sockaddr *)address, (socklen_t *)addrLen);
84     if (ret <= 0) {
85         *err = errno;
86     }
87     return ret;
88 }
89 
SAL_NET_SockAddrNew(BSL_SAL_SockAddr * sockAddr)90 int32_t SAL_NET_SockAddrNew(BSL_SAL_SockAddr *sockAddr)
91 {
92     LinuxSockAddr *addr = (LinuxSockAddr *)BSL_SAL_Calloc(1, sizeof(LinuxSockAddr));
93     if (addr == NULL) {
94         return BSL_MALLOC_FAIL;
95     }
96     *sockAddr = (BSL_SAL_SockAddr)addr;
97     return BSL_SUCCESS;
98 }
99 
SAL_NET_SockAddrFree(BSL_SAL_SockAddr sockAddr)100 void SAL_NET_SockAddrFree(BSL_SAL_SockAddr sockAddr)
101 {
102     BSL_SAL_Free(sockAddr);
103 }
104 
SAL_NET_SockAddrSize(const BSL_SAL_SockAddr sockAddr)105 uint32_t SAL_NET_SockAddrSize(const BSL_SAL_SockAddr sockAddr)
106 {
107     const LinuxSockAddr *addr = (const LinuxSockAddr *)sockAddr;
108     if (addr == NULL) {
109         return 0;
110     }
111     switch (addr->addr.sa_family) {
112         case AF_INET:
113             return sizeof(addr->addrIn);
114         case AF_INET6:
115             return sizeof(addr->addrIn6);
116         case AF_UNIX:
117             return sizeof(addr->addrUn);
118         default:
119             break;
120     }
121     return sizeof(LinuxSockAddr);
122 }
123 
SAL_NET_SockAddrCopy(BSL_SAL_SockAddr dst,BSL_SAL_SockAddr src)124 void SAL_NET_SockAddrCopy(BSL_SAL_SockAddr dst, BSL_SAL_SockAddr src)
125 {
126     memcpy_s(dst, sizeof(LinuxSockAddr), src, sizeof(LinuxSockAddr));
127 }
128 
SAL_Socket(int32_t af,int32_t type,int32_t protocol)129 int32_t SAL_Socket(int32_t af, int32_t type, int32_t protocol)
130 {
131     return (int32_t)socket(af, type, protocol);
132 }
133 
SAL_SockClose(int32_t sockId)134 int32_t SAL_SockClose(int32_t sockId)
135 {
136     if (close((int32_t)(long)sockId) != 0) {
137         return BSL_SAL_ERR_NET_SOCKCLOSE;
138     }
139     return BSL_SUCCESS;
140 }
141 
SAL_SetSockopt(int32_t sockId,int32_t level,int32_t name,const void * val,int32_t len)142 int32_t SAL_SetSockopt(int32_t sockId, int32_t level, int32_t name, const void *val, int32_t len)
143 {
144     if (setsockopt((int32_t)sockId, level, name, (char *)(uintptr_t)val, (socklen_t)len) != 0) {
145         return BSL_SAL_ERR_NET_SETSOCKOPT;
146     }
147     return BSL_SUCCESS;
148 }
149 
SAL_GetSockopt(int32_t sockId,int32_t level,int32_t name,void * val,int32_t * len)150 int32_t SAL_GetSockopt(int32_t sockId, int32_t level, int32_t name, void *val, int32_t *len)
151 {
152     if (getsockopt((int32_t)sockId, level, name, val, (socklen_t *)len) != 0) {
153         return BSL_SAL_ERR_NET_GETSOCKOPT;
154     }
155     return BSL_SUCCESS;
156 }
157 
SAL_SockListen(int32_t sockId,int32_t backlog)158 int32_t SAL_SockListen(int32_t sockId, int32_t backlog)
159 {
160     if (listen(sockId, backlog) != 0) {
161         return BSL_SAL_ERR_NET_LISTEN;
162     }
163     return BSL_SUCCESS;
164 }
165 
SAL_SockBind(int32_t sockId,BSL_SAL_SockAddr addr,size_t len)166 int32_t SAL_SockBind(int32_t sockId, BSL_SAL_SockAddr addr, size_t len)
167 {
168     if (bind(sockId, (struct sockaddr *)addr, (socklen_t)len) != 0) {
169         return BSL_SAL_ERR_NET_BIND;
170     }
171     return BSL_SUCCESS;
172 }
173 
SAL_SockConnect(int32_t sockId,BSL_SAL_SockAddr addr,size_t len)174 int32_t SAL_SockConnect(int32_t sockId, BSL_SAL_SockAddr addr, size_t len)
175 {
176     if (connect(sockId, (struct sockaddr *)addr, (socklen_t)len) != 0) {
177         return BSL_SAL_ERR_NET_CONNECT;
178     }
179     return BSL_SUCCESS;
180 }
181 
SAL_SockSend(int32_t sockId,const void * msg,size_t len,int32_t flags)182 int32_t SAL_SockSend(int32_t sockId, const void *msg, size_t len, int32_t flags)
183 {
184     return (int32_t)send(sockId, msg, len, flags);
185 }
186 
SAL_SockRecv(int32_t sockfd,void * buff,size_t len,int32_t flags)187 int32_t SAL_SockRecv(int32_t sockfd, void *buff, size_t len, int32_t flags)
188 {
189     return (int32_t)recv(sockfd, (char *)buff, len, flags);
190 }
191 
SAL_Select(int32_t nfds,void * readfds,void * writefds,void * exceptfds,void * timeout)192 int32_t SAL_Select(int32_t nfds, void *readfds, void *writefds, void *exceptfds, void *timeout)
193 {
194     return select(nfds, (fd_set *)readfds, (fd_set *)writefds, (fd_set *)exceptfds, (struct timeval *)timeout);
195 }
196 
SAL_Ioctlsocket(int32_t sockId,long cmd,unsigned long * arg)197 int32_t SAL_Ioctlsocket(int32_t sockId, long cmd, unsigned long *arg)
198 {
199     if (ioctl(sockId, (unsigned long)cmd, arg) != 0) {
200         return BSL_SAL_ERR_NET_IOCTL;
201     }
202     return BSL_SUCCESS;
203 }
204 
SAL_SockGetLastSocketError(void)205 int32_t SAL_SockGetLastSocketError(void)
206 {
207     return errno;
208 }
209 
210 #endif
211