libtransistor
A userland library for the Nintendo Switch
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
ipcserver.h
Go to the documentation of this file.
1 
7 #pragma once
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 #include<libtransistor/types.h>
14 #include<libtransistor/ipc.h>
15 #include<libtransistor/waiter.h>
16 
17 #define MAX_SERVICE_PORTS 63
18 #define MAX_SERVICE_SESSIONS 63
19 #define MAX_DOMAIN_OBJECTS 512
20 
21 struct ipc_server_object_t;
22 struct ipc_server_domain_t;
24 struct ipc_server;
25 
30 typedef struct ipc_server_object_t {
31  void *userdata;
32 
34  uint32_t domain_id;
37 
38  // raw_data points to SFCI
48  void (*dispatch)(struct ipc_server_object_t *obj, ipc_message_t *msg, uint32_t request_id);
49 
55  void (*close)(struct ipc_server_object_t *obj);
57 
62 typedef struct ipc_server_domain_t {
66 
67 typedef enum {
74 
75 typedef struct ipc_server_session_t {
78  bool is_domain;
85  uint8_t message_buffer[0x100];
86 
87  uint8_t *pointer_buffer;
88  size_t pointer_buffer_size;
89 
90  wait_record_t *wait_record;
92 
93 /*
94  you are expected to initialize `userdata`, `dispatch`, and `close`.
95  libtransistor will initialize all other fields.
96  */
97 typedef result_t (*ipc_server_object_factory_t)(ipc_server_object_t **obj, void *userdata);
98 
99 typedef struct ipc_server_port_t {
100  port_h port;
101  ipc_server_object_factory_t factory;
102  void *userdata;
103  wait_record_t *wait_record;
104  struct ipc_server_t *server;
106 
107 typedef struct ipc_server_t {
108  ipc_server_port_t *ports;
109  uint32_t num_ports;
110  uint32_t max_ports;
111 
112  ipc_server_session_t *sessions;
113  uint32_t max_sessions;
114 
115  size_t pointer_buffer_size;
116  uint8_t *pointer_buffers;
117 
118  waiter_t *waiter;
119 } ipc_server_t;
120 
121 result_t ipc_server_create(ipc_server_t *srv, waiter_t *waiter);
122 result_t ipc_server_create_ex(ipc_server_t *srv, waiter_t *waiter, uint32_t max_ports, uint32_t max_sessions, size_t pointer_buffer_size);
123 result_t ipc_server_add_port(ipc_server_t *srv, port_h port, ipc_server_object_factory_t object_factory, void *userdata);
124 result_t ipc_server_create_session(ipc_server_t *srv, session_h server_side, session_h client_side, ipc_server_object_t *object);
125 result_t ipc_server_accept_session(ipc_server_t *srv, ipc_server_port_t *port);
126 result_t ipc_server_destroy(ipc_server_t *srv);
127 
128 result_t ipc_server_object_register(ipc_server_object_t *owner, ipc_server_object_t *new_object);
129 result_t ipc_server_object_reply(ipc_server_object_t *obj, const ipc_response_t *rs);
130 result_t ipc_server_object_close(ipc_server_object_t *obj);
131 
132 result_t ipc_server_domain_add_object(ipc_server_domain_t *domain, ipc_server_object_t *object);
133 result_t ipc_server_domain_get_object(ipc_server_domain_t *domain, uint32_t object_id, ipc_server_object_t **object);
134 result_t ipc_server_domain_destroy(ipc_server_domain_t *domain);
135 
136 result_t ipc_server_session_receive(ipc_server_session_t *sess);
137 result_t ipc_server_session_close(ipc_server_session_t *sess);
138 
139 #ifdef __cplusplus
140 }
141 #endif
Represents the server side of an IPC object.
Definition: ipcserver.h:30
ipc_server_session_state_t
Definition: ipcserver.h:67
Manager for waiting on synchronizable handles.
Various system types.
struct ipc_server_session_t * owning_session
The session that owns this domain.
Definition: ipcserver.h:64
Session is waiting for incoming IPC messages.
Definition: ipcserver.h:70
struct ipc_server_domain_t * owning_domain
The domain that owns this object, if applicable.
Definition: ipcserver.h:35
ipc_server_domain_t domain
The session's domain. Invalid unless is_domain is true.
Definition: ipcserver.h:82
ipc_server_object_t hipc_manager_object
The object for type-5 messages.
Definition: ipcserver.h:79
Session has been allocated but is still in the process of being initialized.
Definition: ipcserver.h:69
Describes an incoming IPC message. Used as an intermediate during unpacking.
Definition: ipc.h:234
bool is_domain_object
Whether or not this object is part of a domain.
Definition: ipcserver.h:33
uint32_t domain_id
This object's ID within its owning domain, if applicable.
Definition: ipcserver.h:34
session_h client_handle
Client-side handle.
Definition: ipcserver.h:77
Session has encountered an error.
Definition: ipcserver.h:72
uint32_t result_t
Function result.
Definition: types.h:51
Represents an unmarshalled outgoing IPC response.
Definition: ipc.h:121
handle_t session_h
Session handle.
Definition: types.h:42
ipc_server_object_t * active_object
The object that is being serviced.
Definition: ipcserver.h:80
#define MAX_DOMAIN_OBJECTS
Maximum number of objects per domain.
Definition: ipcserver.h:19
void(* dispatch)(struct ipc_server_object_t *obj, ipc_message_t *msg, uint32_t request_id)
IPC message handler function.
Definition: ipcserver.h:48
Session is waiting for ipc_server_object_reply or ipc_server_object_close to be called.
Definition: ipcserver.h:71
bool is_domain
Whether this session represents a domain or a single object.
Definition: ipcserver.h:78
session_h handle
Server-side handle.
Definition: ipcserver.h:76
struct ipc_server_session_t * owning_session
The session that owns this object.
Definition: ipcserver.h:36
ipc_server_session_state_t state
Session's state.
Definition: ipcserver.h:83
handle_t port_h
Port handle.
Definition: types.h:43
uint8_t message_buffer[0x100]
IPC buffer.
Definition: ipcserver.h:85
struct ipc_server_t * owning_server
Server that owns this session.
Definition: ipcserver.h:84
void * userdata
Pointer to user data.
Definition: ipcserver.h:31
Interprocess Communication data structures and functions.
Session does not exist.
Definition: ipcserver.h:68
Represents the server side of an IPC object domain.
Definition: ipcserver.h:62
Definition: ipcserver.h:107
void(* close)(struct ipc_server_object_t *obj)
Release any resources associated with this object.
Definition: ipcserver.h:55
Definition: ipcserver.h:99
ipc_server_object_t * objects[MAX_DOMAIN_OBJECTS]
The objects within this domain.
Definition: ipcserver.h:63
ipc_server_object_t * object
The object that this session owns, if it is not a domain.
Definition: ipcserver.h:81
Definition: ipcserver.h:75