My Project
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
soc_sendto.c
Go to the documentation of this file.
1 #include "soc_common.h"
2 #include <errno.h>
3 #include <sys/socket.h>
4 
5 ssize_t socuipc_cmd9(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
6 {
7  int ret=0;
8  u32 *cmdbuf = getThreadCommandBuffer();
9  u32 tmp_addrlen=0;
10  u8 tmpaddr[0x1c];
11 
12  memset(tmpaddr, 0, 0x1c);
13 
14  if(dest_addr)
15  {
16  if(dest_addr->sa_family == AF_INET)
17  {
18  tmp_addrlen = 8;
19  }
20  else
21  {
22  tmp_addrlen = 0x1c;
23  }
24 
25  if(addrlen < tmp_addrlen)
26  {
27  SOCU_errno = -EINVAL;
28  return -1;
29  }
30 
31  tmpaddr[0] = tmp_addrlen;
32  tmpaddr[1] = dest_addr->sa_family;
33  memcpy(&tmpaddr[2], &dest_addr->sa_data, tmp_addrlen-2);
34  }
35 
36  cmdbuf[0] = 0x00090106;
37  cmdbuf[1] = (u32)sockfd;
38  cmdbuf[2] = (u32)len;
39  cmdbuf[3] = (u32)flags;
40  cmdbuf[4] = (u32)tmp_addrlen;
41  cmdbuf[5] = 0x20;
42  cmdbuf[7] = (tmp_addrlen<<14) | 0x402;
43  cmdbuf[8] = (u32)tmpaddr;
44  cmdbuf[9] = (((u32)len)<<4) | 10;
45  cmdbuf[10] = (u32)buf;
46 
47  if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
48 
49  ret = (int)cmdbuf[1];
50  if(ret==0)ret = _net_convert_error(cmdbuf[2]);
51  if(ret<0)SOCU_errno = ret;
52 
53  if(ret<0)return -1;
54  return ret;
55 }
56 
57 ssize_t socuipc_cmda(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
58 {
59  int ret=0;
60  u32 *cmdbuf = getThreadCommandBuffer();
61  u32 tmp_addrlen=0;
62  u8 tmpaddr[0x1c];
63 
64  memset(tmpaddr, 0, 0x1c);
65 
66  if(dest_addr)
67  {
68  if(dest_addr->sa_family == AF_INET)
69  {
70  tmp_addrlen = 8;
71  }
72  else
73  {
74  tmp_addrlen = 0x1c;
75  }
76 
77  if(addrlen < tmp_addrlen)
78  {
79  SOCU_errno = -EINVAL;
80  return -1;
81  }
82 
83  tmpaddr[0] = tmp_addrlen;
84  tmpaddr[1] = dest_addr->sa_family;
85  memcpy(&tmpaddr[2], &dest_addr->sa_data, tmp_addrlen-2);
86  }
87 
88  cmdbuf[0] = 0x000A0106;
89  cmdbuf[1] = (u32)sockfd;
90  cmdbuf[2] = (u32)len;
91  cmdbuf[3] = (u32)flags;
92  cmdbuf[4] = (u32)tmp_addrlen;
93  cmdbuf[5] = 0x20;
94  cmdbuf[7] = (((u32)len)<<14) | 0x802;
95  cmdbuf[8] = (u32)buf;
96  cmdbuf[9] = (tmp_addrlen<<14) | 0x402;
97  cmdbuf[10] = (u32)tmpaddr;
98 
99  if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
100 
101  ret = (int)cmdbuf[1];
102  if(ret==0)ret = _net_convert_error(cmdbuf[2]);
103  if(ret<0)SOCU_errno = ret;
104 
105  if(ret<0)return -1;
106  return ret;
107 }
108 
109 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
110 {
111  if(len<0x2000)return socuipc_cmda(sockfd, buf, len, flags, dest_addr, addrlen);
112  return socuipc_cmd9(sockfd, buf, len, flags, (struct sockaddr*)dest_addr, addrlen);
113 }
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
ssize_t socuipc_cmda(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
Definition: soc_sendto.c:57
uint32_t u32
Definition: types.h:23
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
Definition: soc_sendto.c:109
#define AF_INET
Definition: socket.h:13
ssize_t socuipc_cmd9(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
Definition: soc_sendto.c:5
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