My Project
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
soc_bind.c
Go to the documentation of this file.
1 #include "soc_common.h"
2 #include <errno.h>
3 #include <sys/socket.h>
4 
5 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
6 {
7  int ret=0;
8  int tmp_addrlen=0;
9  u32 *cmdbuf = getThreadCommandBuffer();
10  u8 tmpaddr[0x1c];
11 
12  memset(tmpaddr, 0, 0x1c);
13 
14  if(addr->sa_family == AF_INET)
15  {
16  tmp_addrlen = 8;
17  }
18  else
19  {
20  tmp_addrlen = 0x1c;
21  }
22 
23  if(addrlen < tmp_addrlen)
24  {
25  SOCU_errno = EINVAL;
26  return -1;
27  }
28 
29  tmpaddr[0] = tmp_addrlen;
30  tmpaddr[1] = addr->sa_family;
31  memcpy(&tmpaddr[2], &addr->sa_data, tmp_addrlen-2);
32 
33  cmdbuf[0] = 0x00050084;
34  cmdbuf[1] = (u32)sockfd;
35  cmdbuf[2] = (u32)tmp_addrlen;
36  cmdbuf[3] = 0x20;
37  cmdbuf[5] = (((u32)tmp_addrlen)<<14) | 2;
38  cmdbuf[6] = (u32)tmpaddr;
39 
40  if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
41 
42  ret = (int)cmdbuf[1];
43  if(ret==0)ret = _net_convert_error(cmdbuf[2]);
44  SOCU_errno = ret;
45 
46  if(ret<0)return -1;
47  return 0;
48 }
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
Definition: soc_bind.c:5
u32 * getThreadCommandBuffer(void)
uint8_t u8
Definition: types.h:21
uint32_t socklen_t
Definition: socket.h:50
int SOCU_errno
Definition: soc_common.c:5
uint32_t u32
Definition: types.h:23
#define AF_INET
Definition: socket.h:13
s32 _net_convert_error(s32 sock_retval)
Definition: soc_common.c:92
char sa_data[]
Definition: socket.h:55
s32 svcSendSyncRequest(Handle session)
Handle SOCU_handle
Definition: soc_common.c:4
sa_family_t sa_family
Definition: socket.h:54