mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
151 lines
4.8 KiB
C
151 lines
4.8 KiB
C
/**
|
|
* @file htcs.h
|
|
* @brief HTC sockets (htcs) service IPC wrapper. Please use <<TODO>> instead.
|
|
* @author SciresM
|
|
* @copyright libnx Authors
|
|
*/
|
|
#pragma once
|
|
|
|
#include "../types.h"
|
|
#include "../sf/service.h"
|
|
|
|
#define HTCS_PEER_NAME_MAX 32
|
|
#define HTCS_PORT_NAME_MAX 32
|
|
|
|
#define HTCS_SESSION_COUNT_MAX 0x10
|
|
#define HTCS_SOCKET_COUNT_MAX 40
|
|
#define HTCS_FD_SET_SIZE HTCS_SOCKET_COUNT_MAX
|
|
|
|
typedef uint16_t HtcsAddressFamilyType;
|
|
|
|
typedef struct {
|
|
char name[HTCS_PEER_NAME_MAX];
|
|
} HtcsPeerName;
|
|
|
|
typedef struct {
|
|
char name[HTCS_PORT_NAME_MAX];
|
|
} HtcsPortName;
|
|
|
|
typedef struct {
|
|
HtcsAddressFamilyType family;
|
|
HtcsPeerName peer_name;
|
|
HtcsPortName port_name;
|
|
} HtcsSockAddr;
|
|
|
|
typedef struct {
|
|
s64 tv_sec;
|
|
s64 tv_usec;
|
|
} HtcsTimeVal;
|
|
|
|
typedef struct {
|
|
int fds[HTCS_FD_SET_SIZE];
|
|
} HtcsFdSet;
|
|
|
|
typedef enum {
|
|
HTCS_ENONE = 0,
|
|
HTCS_EACCES = 2,
|
|
HTCS_EADDRINUSE = 3,
|
|
HTCS_EADDRNOTAVAIL = 4,
|
|
HTCS_EAGAIN = 6,
|
|
HTCS_EALREADY = 7,
|
|
HTCS_EBADF = 8,
|
|
HTCS_EBUSY = 10,
|
|
HTCS_ECONNABORTED = 13,
|
|
HTCS_ECONNREFUSED = 14,
|
|
HTCS_ECONNRESET = 15,
|
|
HTCS_EDESTADDRREQ = 17,
|
|
HTCS_EFAULT = 21,
|
|
HTCS_EINPROGRESS = 26,
|
|
HTCS_EINTR = 27,
|
|
HTCS_EINVAL = 28,
|
|
HTCS_EIO = 29,
|
|
HTCS_EISCONN = 30,
|
|
HTCS_EMFILE = 33,
|
|
HTCS_EMSGSIZE = 35,
|
|
HTCS_ENETDOWN = 38,
|
|
HTCS_ENETRESET = 39,
|
|
HTCS_ENOBUFS = 42,
|
|
HTCS_ENOMEM = 49,
|
|
HTCS_ENOTCONN = 56,
|
|
HTCS_ETIMEDOUT = 76,
|
|
HTCS_EUNKNOWN = 79,
|
|
|
|
HTCS_EWOULDBLOCK = HTCS_EAGAIN,
|
|
} HtcsSocketError;
|
|
|
|
typedef enum {
|
|
HTCS_MSG_PEEK = 1,
|
|
HTCS_MSG_WAITALL = 2,
|
|
} HtcsMessageFlag;
|
|
|
|
typedef enum {
|
|
HTCS_SHUT_RD = 0,
|
|
HTCS_SHUT_WR = 1,
|
|
HTCS_SHUT_RDWR = 2,
|
|
} HtcsShutdownType;
|
|
|
|
typedef enum {
|
|
HTCS_F_GETFL = 3,
|
|
HTCS_F_SETFL = 4,
|
|
} HtcsFcntlOperation;
|
|
|
|
typedef enum {
|
|
HTCS_O_NONBLOCK = 4,
|
|
} HtcsFcntlFlag;
|
|
|
|
typedef enum {
|
|
HTCS_AF_HTCS = 0,
|
|
} HtcsAddressFamily;
|
|
|
|
typedef struct {
|
|
Service s;
|
|
} HtcsSocket;
|
|
|
|
|
|
/// Initialize the HTCS service.
|
|
Result htcsInitialize(u32 num_sessions);
|
|
|
|
/// Exit the HTCS service.
|
|
void htcsExit(void);
|
|
|
|
/// Gets the Service object for the actual HTCS manager service session.
|
|
Service* htcsGetManagerServiceSession(void);
|
|
|
|
/// Gets the Service object for the actual HTCS monitor service session.
|
|
Service* htcsGetMonitorServiceSession(void);
|
|
|
|
/// Manager functionality.
|
|
Result htcsGetPeerNameAny(HtcsPeerName *out);
|
|
Result htcsGetDefaultHostName(HtcsPeerName *out);
|
|
Result htcsCreateSocket(s32 *out_err, HtcsSocket *out, bool enable_disconnection_emulation);
|
|
Result htcsStartSelect(u32 *out_task_id, Handle *out_event_handle, const s32 *read, size_t num_read, const s32 *write, size_t num_write, const s32 *except, size_t num_except, s64 tv_sec, s64 tv_usec);
|
|
Result htcsEndSelect(s32 *out_err, s32 *out_count, s32 *read, size_t num_read, s32 *write, size_t num_write, s32 *except, size_t num_except, u32 task_id);
|
|
|
|
/// Socket functionality.
|
|
Result htcsSocketClose(HtcsSocket *s, s32 *out_err, s32 *out_res);
|
|
Result htcsSocketConnect(HtcsSocket *s, s32 *out_err, s32 *out_res, const HtcsSockAddr *address);
|
|
Result htcsSocketBind(HtcsSocket *s, s32 *out_err, s32 *out_res, const HtcsSockAddr *address);
|
|
Result htcsSocketListen(HtcsSocket *s, s32 *out_err, s32 *out_res, s32 backlog_count);
|
|
Result htcsSocketShutdown(HtcsSocket *s, s32 *out_err, s32 *out_res, s32 how);
|
|
Result htcsSocketFcntl(HtcsSocket *s, s32 *out_err, s32 *out_res, s32 command, s32 value);
|
|
|
|
Result htcsSocketAcceptStart(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle);
|
|
Result htcsSocketAcceptResults(HtcsSocket *s, s32 *out_err, HtcsSocket *out_socket, HtcsSockAddr *out_address, u32 task_id);
|
|
|
|
Result htcsSocketRecvStart(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle, s32 mem_size, s32 flags);
|
|
Result htcsSocketRecvResults(HtcsSocket *s, s32 *out_err, s64 *out_size, void *buffer, size_t buffer_size, u32 task_id);
|
|
|
|
Result htcsSocketSendStart(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle, const void *buffer, size_t buffer_size, s32 flags);
|
|
Result htcsSocketSendResults(HtcsSocket *s, s32 *out_err, s64 *out_size, u32 task_id);
|
|
|
|
Result htcsSocketStartSend(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle, s64 *out_max_size, s64 size, s32 flags);
|
|
Result htcsSocketContinueSend(HtcsSocket *s, s64 *out_size, bool *out_wait, const void *buffer, size_t buffer_size, u32 task_id);
|
|
Result htcsSocketEndSend(HtcsSocket *s, s32 *out_err, s64 *out_size, u32 task_id);
|
|
|
|
Result htcsSocketStartRecv(HtcsSocket *s, u32 *out_task_id, Handle *out_event_handle, s64 size, s32 flags);
|
|
Result htcsSocketEndRecv(HtcsSocket *s, s32 *out_err, s64 *out_size, void *buffer, size_t buffer_size, u32 task_id);
|
|
|
|
Result htcsSocketGetPrimitive(HtcsSocket *s, s32 *out);
|
|
|
|
void htcsCloseSocket(HtcsSocket *s);
|