diff --git a/libctru/include/3ds/services/soc.h b/libctru/include/3ds/services/soc.h index 26d68e8..b84f924 100644 --- a/libctru/include/3ds/services/soc.h +++ b/libctru/include/3ds/services/soc.h @@ -138,3 +138,10 @@ int SOCU_GetNetworkOpt(int level, NetworkOpt optname, void * optval, socklen_t * * @return error */ int SOCU_GetIPInfo(struct in_addr *ip, struct in_addr *netmask, struct in_addr *broadcast); + +/** + * @brief Adds a global socket. + * @param sockfd The socket fd. + * @return error + */ +int SOCU_AddGlobalSocket(int sockfd); diff --git a/libctru/source/services/soc/soc_addglobalsocket.c b/libctru/source/services/soc/soc_addglobalsocket.c new file mode 100644 index 0000000..267da30 --- /dev/null +++ b/libctru/source/services/soc/soc_addglobalsocket.c @@ -0,0 +1,21 @@ +#include "soc_common.h" +#include <3ds/ipc.h> +#include <3ds/result.h> + +int SOCU_AddGlobalSocket(int sockfd) +{ + u32 *cmdbuf = getThreadCommandBuffer(); + + sockfd = soc_get_fd(sockfd); + if(sockfd < 0) { + errno = -sockfd; + return -1; + } + + cmdbuf[0] = IPC_MakeHeader(0x23,1,0); // 0x230040 + cmdbuf[1] = (u32)sockfd; + + int ret = svcSendSyncRequest(SOCU_handle); + if(R_FAILED(ret))return ret; + return cmdbuf[1]; +}