Merge branch 'ab/config-based-hooks-base' into seen
[git] / simple-ipc.h
1 #ifndef GIT_SIMPLE_IPC_H
2 #define GIT_SIMPLE_IPC_H
3
4 /*
5  * See Documentation/technical/api-simple-ipc.txt
6  */
7
8 #ifdef SUPPORTS_SIMPLE_IPC
9 #include "pkt-line.h"
10
11 /*
12  * Simple IPC Client Side API.
13  */
14
15 enum ipc_active_state {
16         /*
17          * The pipe/socket exists and the daemon is waiting for connections.
18          */
19         IPC_STATE__LISTENING = 0,
20
21         /*
22          * The pipe/socket exists, but the daemon is not listening.
23          * Perhaps it is very busy.
24          * Perhaps the daemon died without deleting the path.
25          * Perhaps it is shutting down and draining existing clients.
26          * Perhaps it is dead, but other clients are lingering and
27          * still holding a reference to the pathname.
28          */
29         IPC_STATE__NOT_LISTENING,
30
31         /*
32          * The requested pathname is bogus and no amount of retries
33          * will fix that.
34          */
35         IPC_STATE__INVALID_PATH,
36
37         /*
38          * The requested pathname is not found.  This usually means
39          * that there is no daemon present.
40          */
41         IPC_STATE__PATH_NOT_FOUND,
42
43         IPC_STATE__OTHER_ERROR,
44 };
45
46 struct ipc_client_connect_options {
47         /*
48          * Spin under timeout if the server is running but can't
49          * accept our connection yet.  This should always be set
50          * unless you just want to poke the server and see if it
51          * is alive.
52          */
53         unsigned int wait_if_busy:1;
54
55         /*
56          * Spin under timeout if the pipe/socket is not yet present
57          * on the file system.  This is useful if we just started
58          * the service and need to wait for it to become ready.
59          */
60         unsigned int wait_if_not_found:1;
61
62         /*
63          * Disallow chdir() when creating a Unix domain socket.
64          */
65         unsigned int uds_disallow_chdir:1;
66 };
67
68 #define IPC_CLIENT_CONNECT_OPTIONS_INIT { \
69         .wait_if_busy = 0, \
70         .wait_if_not_found = 0, \
71         .uds_disallow_chdir = 0, \
72 }
73
74 /*
75  * Determine if a server is listening on this named pipe or socket using
76  * platform-specific logic.  This might just probe the filesystem or it
77  * might make a trivial connection to the server using this pathname.
78  */
79 enum ipc_active_state ipc_get_active_state(const char *path);
80
81 struct ipc_client_connection {
82         int fd;
83 };
84
85 /*
86  * Try to connect to the daemon on the named pipe or socket.
87  *
88  * Returns IPC_STATE__LISTENING and a connection handle.
89  *
90  * Otherwise, returns info to help decide whether to retry or to
91  * spawn/respawn the server.
92  */
93 enum ipc_active_state ipc_client_try_connect(
94         const char *path,
95         const struct ipc_client_connect_options *options,
96         struct ipc_client_connection **p_connection);
97
98 void ipc_client_close_connection(struct ipc_client_connection *connection);
99
100 /*
101  * Used by the client to synchronously send and receive a message with
102  * the server on the provided client connection.
103  *
104  * Returns 0 when successful.
105  *
106  * Calls error() and returns non-zero otherwise.
107  */
108 int ipc_client_send_command_to_connection(
109         struct ipc_client_connection *connection,
110         const char *message, size_t message_len,
111         struct strbuf *answer);
112
113 /*
114  * Used by the client to synchronously connect and send and receive a
115  * message to the server listening at the given path.
116  *
117  * Returns 0 when successful.
118  *
119  * Calls error() and returns non-zero otherwise.
120  */
121 int ipc_client_send_command(const char *path,
122                             const struct ipc_client_connect_options *options,
123                             const char *message, size_t message_len,
124                             struct strbuf *answer);
125
126 /*
127  * Simple IPC Server Side API.
128  */
129
130 struct ipc_server_reply_data;
131
132 typedef int (ipc_server_reply_cb)(struct ipc_server_reply_data *,
133                                   const char *response,
134                                   size_t response_len);
135
136 /*
137  * Prototype for an application-supplied callback to process incoming
138  * client IPC messages and compose a reply.  The `application_cb` should
139  * use the provided `reply_cb` and `reply_data` to send an IPC response
140  * back to the client.  The `reply_cb` callback can be called multiple
141  * times for chunking purposes.  A reply message is optional and may be
142  * omitted if not necessary for the application.
143  *
144  * The return value from the application callback is ignored.
145  * The value `SIMPLE_IPC_QUIT` can be used to shutdown the server.
146  */
147 typedef int (ipc_server_application_cb)(void *application_data,
148                                         const char *request,
149                                         size_t request_len,
150                                         ipc_server_reply_cb *reply_cb,
151                                         struct ipc_server_reply_data *reply_data);
152
153 #define SIMPLE_IPC_QUIT -2
154
155 /*
156  * Opaque instance data to represent an IPC server instance.
157  */
158 struct ipc_server_data;
159
160 /*
161  * Control parameters for the IPC server instance.
162  * Use this to hide platform-specific settings.
163  */
164 struct ipc_server_opts
165 {
166         int nr_threads;
167
168         /*
169          * Disallow chdir() when creating a Unix domain socket.
170          */
171         unsigned int uds_disallow_chdir:1;
172 };
173
174 /*
175  * Start an IPC server instance in one or more background threads
176  * and return a handle to the pool.
177  *
178  * Returns 0 if the asynchronous server pool was started successfully.
179  * Returns -1 if not.
180  * Returns -2 if we could not startup because another server is using
181  * the socket or named pipe.
182  *
183  * When a client IPC message is received, the `application_cb` will be
184  * called (possibly on a random thread) to handle the message and
185  * optionally compose a reply message.
186  */
187 int ipc_server_run_async(struct ipc_server_data **returned_server_data,
188                          const char *path, const struct ipc_server_opts *opts,
189                          ipc_server_application_cb *application_cb,
190                          void *application_data);
191
192 /*
193  * Gently signal the IPC server pool to shutdown.  No new client
194  * connections will be accepted, but existing connections will be
195  * allowed to complete.
196  */
197 int ipc_server_stop_async(struct ipc_server_data *server_data);
198
199 /*
200  * Block the calling thread until all threads in the IPC server pool
201  * have completed and been joined.
202  */
203 int ipc_server_await(struct ipc_server_data *server_data);
204
205 /*
206  * Close and free all resource handles associated with the IPC server
207  * pool.
208  */
209 void ipc_server_free(struct ipc_server_data *server_data);
210
211 /*
212  * Run an IPC server instance and block the calling thread of the
213  * current process.  It does not return until the IPC server has
214  * either shutdown or had an unrecoverable error.
215  *
216  * The IPC server handles incoming IPC messages from client processes
217  * and may use one or more background threads as necessary.
218  *
219  * Returns 0 after the server has completed successfully.
220  * Returns -1 if the server cannot be started.
221  * Returns -2 if we could not startup because another server is using
222  * the socket or named pipe.
223  *
224  * When a client IPC message is received, the `application_cb` will be
225  * called (possibly on a random thread) to handle the message and
226  * optionally compose a reply message.
227  *
228  * Note that `ipc_server_run()` is a synchronous wrapper around the
229  * above asynchronous routines.  It effectively hides all of the
230  * server state and thread details from the caller and presents a
231  * simple synchronous interface.
232  */
233 int ipc_server_run(const char *path, const struct ipc_server_opts *opts,
234                    ipc_server_application_cb *application_cb,
235                    void *application_data);
236
237 #endif /* SUPPORTS_SIMPLE_IPC */
238 #endif /* GIT_SIMPLE_IPC_H */