e985b92992
Change-Id: Ic75f4cac5eb07ffaba8f97d10673d7d7e2b1762d
871 lines
27 KiB
Groff
871 lines
27 KiB
Groff
.TH "event2/rpc.h" 3 "Wed Apr 10 2013" "libevent" \" -*- nroff -*-
|
|
.ad l
|
|
.nh
|
|
.SH NAME
|
|
event2/rpc.h \-
|
|
.PP
|
|
This header files provides basic support for an RPC server and client\&.
|
|
|
|
.SH SYNOPSIS
|
|
.br
|
|
.PP
|
|
.SS "Macros"
|
|
|
|
.in +1c
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_GENERATE\fP(rpcname, reqstruct, rplystruct)"
|
|
.br
|
|
.RI "\fIGenerates the code for receiving and sending an RPC message\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_HEADER\fP(rpcname, reqstruct, rplystruct)"
|
|
.br
|
|
.RI "\fICreates the definitions and prototypes for an RPC\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_MAKE_CTX\fP(rpcname, reqstruct, rplystruct, pool, request, reply, cb, cbarg)"
|
|
.br
|
|
.RI "\fICreates a context structure that contains rpc specific information\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_MAKE_REQUEST\fP(name, pool, request, reply, cb, cbarg) evrpc_send_request_##name((pool), (request), (reply), (cb), (cbarg))"
|
|
.br
|
|
.RI "\fIlaunches an RPC and sends it to the server \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_REGISTER\fP(base, name, request, reply, callback, cbarg)"
|
|
.br
|
|
.RI "\fIregister RPCs with the HTTP Server \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_REQUEST_DONE\fP(rpc_req)"
|
|
.br
|
|
.RI "\fICreates the reply to an RPC request\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_REQUEST_HTTP\fP(rpc_req) (rpc_req)->http_req"
|
|
.br
|
|
.RI "\fIProvides access to the HTTP request object underlying an RPC\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_STRUCT\fP(rpcname) struct evrpc_req__##rpcname"
|
|
.br
|
|
.RI "\fIThe type of a specific RPC Message\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVRPC_UNREGISTER\fP(base, name) evrpc_unregister_rpc((base), #name)"
|
|
.br
|
|
.RI "\fIUnregisters an already registered RPC\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_ARRAY_ADD\fP(msg, member) (*(msg)->base->member##_add)(msg)"
|
|
.br
|
|
.RI "\fIAllocates a new entry in the array and returns it\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_ARRAY_ADD_VALUE\fP(msg, member, value) (*(msg)->base->member##_add)((msg), (value))"
|
|
.br
|
|
.RI "\fIAdds a value to an array\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_ARRAY_GET\fP(msg, member, offset, pvalue) (*(msg)->base->member##_get)((msg), (offset), (pvalue))"
|
|
.br
|
|
.RI "\fIGets a variable at the specified offset from the array\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_ARRAY_LEN\fP(msg, member) ((msg)->member##_length)"
|
|
.br
|
|
.RI "\fIReturns the number of entries in the array\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_ASSIGN\fP(msg, member, value) (*(msg)->base->member##_assign)((msg), (value))"
|
|
.br
|
|
.RI "\fIAssigns a value to the member in the message\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_ASSIGN_WITH_LEN\fP(msg, member, value, len) (*(msg)->base->member##_assign)((msg), (value), (len))"
|
|
.br
|
|
.RI "\fIAssigns a value to the member in the message\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_GET\fP(msg, member, pvalue) (*(msg)->base->member##_get)((msg), (pvalue))"
|
|
.br
|
|
.RI "\fIReturns the value for a member\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_GET_WITH_LEN\fP(msg, member, pvalue, plen) (*(msg)->base->member##_get)((msg), (pvalue), (plen))"
|
|
.br
|
|
.RI "\fIReturns the value for a member\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBEVTAG_HAS\fP(msg, member) ((msg)->member##_set == 1)"
|
|
.br
|
|
.RI "\fIDetermines if the member has been set in the message\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBINPUT\fP \fBEVRPC_INPUT\fP"
|
|
.br
|
|
.RI "\fIDeprecated alias for EVRPC_INPUT\&. \fP"
|
|
.ti -1c
|
|
.RI "#define \fBOUTPUT\fP \fBEVRPC_OUTPUT\fP"
|
|
.br
|
|
.RI "\fIDeprecated alias for EVRPC_OUTPUT\&. \fP"
|
|
.in -1c
|
|
.SS "Enumerations"
|
|
|
|
.in +1c
|
|
.ti -1c
|
|
.RI "enum \fBEVRPC_HOOK_RESULT\fP { \fBEVRPC_TERMINATE\fP = -1, \fBEVRPC_CONTINUE\fP = 0, \fBEVRPC_PAUSE\fP = 1 }"
|
|
.br
|
|
.RI "\fIReturn value from hook processing functions\&. \fP"
|
|
.ti -1c
|
|
.RI "enum \fBEVRPC_HOOK_TYPE\fP { \fBEVRPC_INPUT\fP, \fBEVRPC_OUTPUT\fP }"
|
|
.br
|
|
.RI "\fIHooks for changing the input and output of RPCs; this can be used to implement compression, authentication, encryption, \&.\&.\&. \fP"
|
|
.in -1c
|
|
.SS "Functions"
|
|
|
|
.in +1c
|
|
.ti -1c
|
|
.RI "void * \fBevrpc_add_hook\fP (void *vbase, enum \fBEVRPC_HOOK_TYPE\fP hook_type, int(*cb)(void *, struct evhttp_request *, struct \fBevbuffer\fP *, void *), void *cb_arg)"
|
|
.br
|
|
.RI "\fIadds a processing hook to either an rpc base or rpc pool \fP"
|
|
.ti -1c
|
|
.RI "void \fBevrpc_free\fP (struct evrpc_base *base)"
|
|
.br
|
|
.RI "\fIFrees the evrpc base\&. \fP"
|
|
.ti -1c
|
|
.RI "void * \fBevrpc_get_reply\fP (struct evrpc_req_generic *req)"
|
|
.br
|
|
.ti -1c
|
|
.RI "void * \fBevrpc_get_request\fP (struct evrpc_req_generic *req)"
|
|
.br
|
|
.RI "\fIaccessors for request and reply \fP"
|
|
.ti -1c
|
|
.RI "void \fBevrpc_hook_add_meta\fP (void *ctx, const char *key, const void *data, size_t data_size)"
|
|
.br
|
|
.RI "\fIadds meta data to request \fP"
|
|
.ti -1c
|
|
.RI "int \fBevrpc_hook_find_meta\fP (void *ctx, const char *key, void **data, size_t *data_size)"
|
|
.br
|
|
.RI "\fIretrieves meta data previously associated \fP"
|
|
.ti -1c
|
|
.RI "struct evhttp_connection * \fBevrpc_hook_get_connection\fP (void *ctx)"
|
|
.br
|
|
.RI "\fIreturns the connection object associated with the request \fP"
|
|
.ti -1c
|
|
.RI "struct evrpc_base * \fBevrpc_init\fP (struct evhttp *server)"
|
|
.br
|
|
.RI "\fICreates a new rpc base from which RPC requests can be received\&. \fP"
|
|
.ti -1c
|
|
.RI "int \fBevrpc_make_request\fP (struct evrpc_request_wrapper *ctx)"
|
|
.br
|
|
.RI "\fIMakes an RPC request based on the provided context\&. \fP"
|
|
.ti -1c
|
|
.RI "struct evrpc_request_wrapper * \fBevrpc_make_request_ctx\fP (struct evrpc_pool *pool, void *request, void *reply, const char *rpcname, void(*req_marshal)(struct \fBevbuffer\fP *, void *), void(*rpl_clear)(void *), int(*rpl_unmarshal)(void *, struct \fBevbuffer\fP *), void(*cb)(struct evrpc_status *, void *, void *, void *), void *cbarg)"
|
|
.br
|
|
.RI "\fIuse EVRPC_GENERATE instead \fP"
|
|
.ti -1c
|
|
.RI "void \fBevrpc_pool_add_connection\fP (struct evrpc_pool *pool, struct evhttp_connection *evcon)"
|
|
.br
|
|
.RI "\fIAdds a connection over which rpc can be dispatched to the pool\&. \fP"
|
|
.ti -1c
|
|
.RI "void \fBevrpc_pool_free\fP (struct evrpc_pool *pool)"
|
|
.br
|
|
.RI "\fIfrees an rpc connection pool \fP"
|
|
.ti -1c
|
|
.RI "struct evrpc_pool * \fBevrpc_pool_new\fP (struct \fBevent_base\fP *base)"
|
|
.br
|
|
.RI "\fIcreates an rpc connection pool \fP"
|
|
.ti -1c
|
|
.RI "void \fBevrpc_pool_remove_connection\fP (struct evrpc_pool *pool, struct evhttp_connection *evcon)"
|
|
.br
|
|
.RI "\fIRemoves a connection from the pool\&. \fP"
|
|
.ti -1c
|
|
.RI "void \fBevrpc_pool_set_timeout\fP (struct evrpc_pool *pool, int timeout_in_secs)"
|
|
.br
|
|
.RI "\fISets the timeout in secs after which a request has to complete\&. \fP"
|
|
.ti -1c
|
|
.RI "int \fBevrpc_register_generic\fP (struct evrpc_base *base, const char *name, void(*callback)(struct evrpc_req_generic *, void *), void *cbarg, void *(*req_new)(void *), void *req_new_arg, void(*req_free)(void *), int(*req_unmarshal)(void *, struct \fBevbuffer\fP *), void *(*rpl_new)(void *), void *rpl_new_arg, void(*rpl_free)(void *), int(*rpl_complete)(void *), void(*rpl_marshal)(struct \fBevbuffer\fP *, void *))"
|
|
.br
|
|
.RI "\fIFunction for registering a generic RPC with the RPC base\&. \fP"
|
|
.ti -1c
|
|
.RI "int \fBevrpc_register_rpc\fP (struct evrpc_base *, struct evrpc *, void(*)(struct evrpc_req_generic *, void *), void *)"
|
|
.br
|
|
.RI "\fILow level function for registering an RPC with a server\&. \fP"
|
|
.ti -1c
|
|
.RI "int \fBevrpc_remove_hook\fP (void *vbase, enum \fBEVRPC_HOOK_TYPE\fP hook_type, void *handle)"
|
|
.br
|
|
.RI "\fIremoves a previously added hook \fP"
|
|
.ti -1c
|
|
.RI "void \fBevrpc_request_done\fP (struct evrpc_req_generic *req)"
|
|
.br
|
|
.RI "\fIcompletes the server response to an rpc request \fP"
|
|
.ti -1c
|
|
.RI "struct evrpc_pool * \fBevrpc_request_get_pool\fP (struct evrpc_request_wrapper *ctx)"
|
|
.br
|
|
.RI "\fIaccessors for obscure and undocumented functionality \fP"
|
|
.ti -1c
|
|
.RI "void \fBevrpc_request_set_cb\fP (struct evrpc_request_wrapper *ctx, void(*cb)(struct evrpc_status *, void *request, void *reply, void *arg), void *cb_arg)"
|
|
.br
|
|
.ti -1c
|
|
.RI "void \fBevrpc_request_set_pool\fP (struct evrpc_request_wrapper *ctx, struct evrpc_pool *pool)"
|
|
.br
|
|
.ti -1c
|
|
.RI "int \fBevrpc_resume_request\fP (void *vbase, void *ctx, enum \fBEVRPC_HOOK_RESULT\fP res)"
|
|
.br
|
|
.RI "\fIresume a paused request \fP"
|
|
.ti -1c
|
|
.RI "int \fBevrpc_send_request_generic\fP (struct evrpc_pool *pool, void *request, void *reply, void(*cb)(struct evrpc_status *, void *, void *, void *), void *cb_arg, const char *rpcname, void(*req_marshal)(struct \fBevbuffer\fP *, void *), void(*rpl_clear)(void *), int(*rpl_unmarshal)(void *, struct \fBevbuffer\fP *))"
|
|
.br
|
|
.RI "\fIFunction for sending a generic RPC request\&. \fP"
|
|
.ti -1c
|
|
.RI "int \fBevrpc_unregister_rpc\fP (struct evrpc_base *base, const char *name)"
|
|
.br
|
|
.in -1c
|
|
.SH "Detailed Description"
|
|
.PP
|
|
This header files provides basic support for an RPC server and client\&.
|
|
|
|
To support RPCs in a server, every supported RPC command needs to be defined and registered\&.
|
|
.PP
|
|
\fBEVRPC_HEADER(SendCommand, Request, Reply)\fP;
|
|
.PP
|
|
SendCommand is the name of the RPC command\&. Request is the name of a structure generated by event_rpcgen\&.py\&. It contains all parameters relating to the SendCommand RPC\&. The server needs to fill in the Reply structure\&. Reply is the name of a structure generated by event_rpcgen\&.py\&. It contains the answer to the RPC\&.
|
|
.PP
|
|
To register an RPC with an HTTP server, you need to first create an RPC base with:
|
|
.PP
|
|
struct evrpc_base *base = evrpc_init(http);
|
|
.PP
|
|
A specific RPC can then be registered with
|
|
.PP
|
|
\fBEVRPC_REGISTER(base, SendCommand, Request, Reply, FunctionCB, arg)\fP;
|
|
.PP
|
|
when the server receives an appropriately formatted RPC, the user callback is invoked\&. The callback needs to fill in the reply structure\&.
|
|
.PP
|
|
void FunctionCB(\fBEVRPC_STRUCT(SendCommand)\fP* rpc, void *arg);
|
|
.PP
|
|
To send the reply, call \fBEVRPC_REQUEST_DONE(rpc)\fP;
|
|
.PP
|
|
See the regression test for an example\&.
|
|
.SH "Macro Definition Documentation"
|
|
.PP
|
|
.SS "#define EVRPC_GENERATE(rpcname, reqstruct, rplystruct)"
|
|
\fBValue:\fP
|
|
.PP
|
|
.nf
|
|
int evrpc_send_request_##rpcname(struct evrpc_pool *pool, \
|
|
struct reqstruct *request, struct rplystruct *reply, \
|
|
void (*cb)(struct evrpc_status *, \
|
|
struct reqstruct *, struct rplystruct *, void *cbarg), \
|
|
void *cbarg) { \
|
|
return evrpc_send_request_generic(pool, request, reply, \
|
|
(void (*)(struct evrpc_status *, void *, void *, void *))cb, \
|
|
cbarg, \
|
|
#rpcname, \
|
|
(void (*)(struct evbuffer *, void *))reqstruct##_marshal, \
|
|
(void (*)(void *))rplystruct##_clear, \
|
|
(int (*)(void *, struct evbuffer *))rplystruct##_unmarshal); \
|
|
}
|
|
.fi
|
|
.PP
|
|
Generates the code for receiving and sending an RPC message\&. EVRPC_GENERATE is used to create the code corresponding to sending and receiving a particular RPC message
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIrpcname\fP the name of the RPC
|
|
.br
|
|
\fIreqstruct\fP the name of the RPC request structure
|
|
.br
|
|
\fIreplystruct\fP the name of the RPC reply structure
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBEVRPC_HEADER()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVRPC_HEADER(rpcname, reqstruct, rplystruct)"
|
|
\fBValue:\fP
|
|
.PP
|
|
.nf
|
|
EVRPC_STRUCT(rpcname) { \
|
|
struct evrpc_hook_meta *hook_meta; \
|
|
struct reqstruct* request; \
|
|
struct rplystruct* reply; \
|
|
struct evrpc* rpc; \
|
|
struct evhttp_request* http_req; \
|
|
struct evbuffer* rpc_data; \
|
|
}; \
|
|
int evrpc_send_request_##rpcname(struct evrpc_pool *, \
|
|
struct reqstruct *, struct rplystruct *, \
|
|
void (*)(struct evrpc_status *, \
|
|
struct reqstruct *, struct rplystruct *, void *cbarg), \
|
|
void *);
|
|
.fi
|
|
.PP
|
|
Creates the definitions and prototypes for an RPC\&. You need to use EVRPC_HEADER to create structures and function prototypes needed by the server and client implementation\&. The structures have to be defined in an \&.rpc file and converted to source code via event_rpcgen\&.py
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIrpcname\fP the name of the RPC
|
|
.br
|
|
\fIreqstruct\fP the name of the RPC request structure
|
|
.br
|
|
\fIreplystruct\fP the name of the RPC reply structure
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBEVRPC_GENERATE()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVRPC_MAKE_CTX(rpcname, reqstruct, rplystruct, pool, request, reply, cb, cbarg)"
|
|
\fBValue:\fP
|
|
.PP
|
|
.nf
|
|
evrpc_make_request_ctx(pool, request, reply, \
|
|
#rpcname, \
|
|
(void (*)(struct evbuffer *, void *))reqstruct##_marshal, \
|
|
(void (*)(void *))rplystruct##_clear, \
|
|
(int (*)(void *, struct evbuffer *))rplystruct##_unmarshal, \
|
|
(void (*)(struct evrpc_status *, void *, void *, void *))cb, \
|
|
cbarg)
|
|
.fi
|
|
.PP
|
|
Creates a context structure that contains rpc specific information\&. EVRPC_MAKE_CTX is used to populate a RPC specific context that contains information about marshaling the RPC data types\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIrpcname\fP the name of the RPC
|
|
.br
|
|
\fIreqstruct\fP the name of the RPC request structure
|
|
.br
|
|
\fIreplystruct\fP the name of the RPC reply structure
|
|
.br
|
|
\fIpool\fP the evrpc_pool over which to make the request
|
|
.br
|
|
\fIrequest\fP a pointer to the RPC request structure object
|
|
.br
|
|
\fIreply\fP a pointer to the RPC reply structure object
|
|
.br
|
|
\fIcb\fP the callback function to call when the RPC has completed
|
|
.br
|
|
\fIcbarg\fP the argument to supply to the callback
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVRPC_MAKE_REQUEST(name, pool, request, reply, cb, cbarg) evrpc_send_request_##name((pool), (request), (reply), (cb), (cbarg))"
|
|
|
|
.PP
|
|
launches an RPC and sends it to the server \fBEVRPC_MAKE_REQUEST()\fP is used by the client to send an RPC to the server\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIname\fP the name of the RPC
|
|
.br
|
|
\fIpool\fP the evrpc_pool that contains the connection objects over which the request should be sent\&.
|
|
.br
|
|
\fIrequest\fP a pointer to the RPC request structure - it contains the data to be sent to the server\&.
|
|
.br
|
|
\fIreply\fP a pointer to the RPC reply structure\&. It is going to be filled if the request was answered successfully
|
|
.br
|
|
\fIcb\fP the callback to invoke when the RPC request has been answered
|
|
.br
|
|
\fIcbarg\fP an additional argument to be passed to the client
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
0 on success, -1 on failure
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVRPC_REGISTER(base, name, request, reply, callback, cbarg)"
|
|
\fBValue:\fP
|
|
.PP
|
|
.nf
|
|
evrpc_register_generic(base, #name, \
|
|
(void (*)(struct evrpc_req_generic *, void *))callback, cbarg, \
|
|
(void *(*)(void *))request##_new, NULL, \
|
|
(void (*)(void *))request##_free, \
|
|
(int (*)(void *, struct evbuffer *))request##_unmarshal, \
|
|
(void *(*)(void *))reply##_new, NULL, \
|
|
(void (*)(void *))reply##_free, \
|
|
(int (*)(void *))reply##_complete, \
|
|
(void (*)(struct evbuffer *, void *))reply##_marshal)
|
|
.fi
|
|
.PP
|
|
register RPCs with the HTTP Server registers a new RPC with the HTTP server, each RPC needs to have a unique name under which it can be identified\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIbase\fP the evrpc_base structure in which the RPC should be registered\&.
|
|
.br
|
|
\fIname\fP the name of the RPC
|
|
.br
|
|
\fIrequest\fP the name of the RPC request structure
|
|
.br
|
|
\fIreply\fP the name of the RPC reply structure
|
|
.br
|
|
\fIcallback\fP the callback that should be invoked when the RPC is received\&. The callback has the following prototype void (\fIcallback)(\fBEVRPC_STRUCT(Message)\fP\fP rpc, void *arg)
|
|
.br
|
|
\fIcbarg\fP an additional parameter that can be passed to the callback\&. The parameter can be used to carry around state\&.
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVRPC_REQUEST_DONE(rpc_req)"
|
|
\fBValue:\fP
|
|
.PP
|
|
.nf
|
|
do { \
|
|
struct evrpc_req_generic *_req = (struct evrpc_req_generic *)(rpc_req); \
|
|
evrpc_request_done(_req); \
|
|
} while (/*CONSTCOND*/0)
|
|
.fi
|
|
.PP
|
|
Creates the reply to an RPC request\&. EVRPC_REQUEST_DONE is used to answer a request; the reply is expected to have been filled in\&. The request and reply pointers become invalid after this call has finished\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIrpc_req\fP the rpc request structure provided to the server callback
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVRPC_REQUEST_HTTP(rpc_req) (rpc_req)->http_req"
|
|
|
|
.PP
|
|
Provides access to the HTTP request object underlying an RPC\&. Access to the underlying http object; can be used to look at headers or for getting the remote ip address
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIrpc_req\fP the rpc request structure provided to the server callback
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
an struct evhttp_request object that can be inspected for HTTP headers or sender information\&.
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVRPC_STRUCT(rpcname) struct evrpc_req__##rpcname"
|
|
|
|
.PP
|
|
The type of a specific RPC Message\&. \fBParameters:\fP
|
|
.RS 4
|
|
\fIrpcname\fP the name of the RPC message
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVRPC_UNREGISTER(base, name) evrpc_unregister_rpc((base), #name)"
|
|
|
|
.PP
|
|
Unregisters an already registered RPC\&. \fBParameters:\fP
|
|
.RS 4
|
|
\fIbase\fP the evrpc_base object from which to unregister an RPC
|
|
.br
|
|
\fIname\fP the name of the rpc to unregister
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
-1 on error or 0 when successful\&.
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBEVRPC_REGISTER()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVTAG_ASSIGN(msg, member, value) (*(msg)->base->member##_assign)((msg), (value))"
|
|
|
|
.PP
|
|
Assigns a value to the member in the message\&. \fBParameters:\fP
|
|
.RS 4
|
|
\fImsg\fP the message to which to assign a value
|
|
.br
|
|
\fImember\fP the name of the member variable
|
|
.br
|
|
\fIvalue\fP the value to assign
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVTAG_ASSIGN_WITH_LEN(msg, member, value, len) (*(msg)->base->member##_assign)((msg), (value), (len))"
|
|
|
|
.PP
|
|
Assigns a value to the member in the message\&. \fBParameters:\fP
|
|
.RS 4
|
|
\fImsg\fP the message to which to assign a value
|
|
.br
|
|
\fImember\fP the name of the member variable
|
|
.br
|
|
\fIvalue\fP the value to assign
|
|
.br
|
|
\fIlen\fP the length of the value
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVTAG_GET(msg, member, pvalue) (*(msg)->base->member##_get)((msg), (pvalue))"
|
|
|
|
.PP
|
|
Returns the value for a member\&. \fBParameters:\fP
|
|
.RS 4
|
|
\fImsg\fP the message from which to get the value
|
|
.br
|
|
\fImember\fP the name of the member variable
|
|
.br
|
|
\fIpvalue\fP a pointer to the variable to hold the value
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
0 on success, -1 otherwise\&.
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVTAG_GET_WITH_LEN(msg, member, pvalue, plen) (*(msg)->base->member##_get)((msg), (pvalue), (plen))"
|
|
|
|
.PP
|
|
Returns the value for a member\&. \fBParameters:\fP
|
|
.RS 4
|
|
\fImsg\fP the message from which to get the value
|
|
.br
|
|
\fImember\fP the name of the member variable
|
|
.br
|
|
\fIpvalue\fP a pointer to the variable to hold the value
|
|
.br
|
|
\fIplen\fP a pointer to the length of the value
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
0 on success, -1 otherwise\&.
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define EVTAG_HAS(msg, member) ((msg)->member##_set == 1)"
|
|
|
|
.PP
|
|
Determines if the member has been set in the message\&. \fBParameters:\fP
|
|
.RS 4
|
|
\fImsg\fP the message to inspect
|
|
.br
|
|
\fImember\fP the member variable to test for presences
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
1 if it's present or 0 otherwise\&.
|
|
.RE
|
|
.PP
|
|
|
|
.SS "#define INPUT \fBEVRPC_INPUT\fP"
|
|
|
|
.PP
|
|
Deprecated alias for EVRPC_INPUT\&. Not available on windows, where it conflicts with platform headers\&.
|
|
.SS "#define OUTPUT \fBEVRPC_OUTPUT\fP"
|
|
|
|
.PP
|
|
Deprecated alias for EVRPC_OUTPUT\&. Not available on windows, where it conflicts with platform headers\&.
|
|
.SH "Enumeration Type Documentation"
|
|
.PP
|
|
.SS "enum \fBEVRPC_HOOK_RESULT\fP"
|
|
|
|
.PP
|
|
Return value from hook processing functions\&.
|
|
.PP
|
|
\fBEnumerator\fP
|
|
.in +1c
|
|
.TP
|
|
\fB\fIEVRPC_TERMINATE \fP\fP
|
|
indicates the rpc should be terminated
|
|
.TP
|
|
\fB\fIEVRPC_CONTINUE \fP\fP
|
|
continue processing the rpc
|
|
.TP
|
|
\fB\fIEVRPC_PAUSE \fP\fP
|
|
pause processing request until resumed
|
|
.SS "enum \fBEVRPC_HOOK_TYPE\fP"
|
|
|
|
.PP
|
|
Hooks for changing the input and output of RPCs; this can be used to implement compression, authentication, encryption, \&.\&.\&.
|
|
.PP
|
|
\fBEnumerator\fP
|
|
.in +1c
|
|
.TP
|
|
\fB\fIEVRPC_INPUT \fP\fP
|
|
apply the function to an input hook
|
|
.TP
|
|
\fB\fIEVRPC_OUTPUT \fP\fP
|
|
apply the function to an output hook
|
|
.SH "Function Documentation"
|
|
.PP
|
|
.SS "void* evrpc_add_hook (void *vbase, enum \fBEVRPC_HOOK_TYPE\fPhook_type, int(*)(void *, struct evhttp_request *, struct \fBevbuffer\fP *, void *)cb, void *cb_arg)"
|
|
|
|
.PP
|
|
adds a processing hook to either an rpc base or rpc pool If a hook returns TERMINATE, the processing is aborted\&. On CONTINUE, the request is immediately processed after the hook returns\&. If the hook returns PAUSE, request processing stops until \fBevrpc_resume_request()\fP has been called\&.
|
|
.PP
|
|
The add functions return handles that can be used for removing hooks\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIvbase\fP a pointer to either struct evrpc_base or struct evrpc_pool
|
|
.br
|
|
\fIhook_type\fP either INPUT or OUTPUT
|
|
.br
|
|
\fIcb\fP the callback to call when the hook is activated
|
|
.br
|
|
\fIcb_arg\fP an additional argument for the callback
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
a handle to the hook so it can be removed later
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBevrpc_remove_hook()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "void evrpc_free (struct evrpc_base *base)"
|
|
|
|
.PP
|
|
Frees the evrpc base\&. For now, you are responsible for making sure that no rpcs are ongoing\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIbase\fP the evrpc_base object to be freed
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBevrpc_init\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "void evrpc_hook_add_meta (void *ctx, const char *key, const void *data, size_tdata_size)"
|
|
|
|
.PP
|
|
adds meta data to request \fBevrpc_hook_add_meta()\fP allows hooks to add meta data to a request\&. for a client request, the meta data can be inserted by an outgoing request hook and retrieved by the incoming request hook\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIctx\fP the context provided to the hook call
|
|
.br
|
|
\fIkey\fP a NUL-terminated c-string
|
|
.br
|
|
\fIdata\fP the data to be associated with the key
|
|
.br
|
|
\fIdata_size\fP the size of the data
|
|
.RE
|
|
.PP
|
|
|
|
.SS "int evrpc_hook_find_meta (void *ctx, const char *key, void **data, size_t *data_size)"
|
|
|
|
.PP
|
|
retrieves meta data previously associated \fBevrpc_hook_find_meta()\fP can be used to retrieve meta data associated to a request by a previous hook\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIctx\fP the context provided to the hook call
|
|
.br
|
|
\fIkey\fP a NUL-terminated c-string
|
|
.br
|
|
\fIdata\fP pointer to a data pointer that will contain the retrieved data
|
|
.br
|
|
\fIdata_size\fP pointer to the size of the data
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
0 on success or -1 on failure
|
|
.RE
|
|
.PP
|
|
|
|
.SS "struct evhttp_connection* evrpc_hook_get_connection (void *ctx)\fC [read]\fP"
|
|
|
|
.PP
|
|
returns the connection object associated with the request \fBParameters:\fP
|
|
.RS 4
|
|
\fIctx\fP the context provided to the hook call
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
a pointer to the evhttp_connection object
|
|
.RE
|
|
.PP
|
|
|
|
.SS "struct evrpc_base* evrpc_init (struct evhttp *server)\fC [read]\fP"
|
|
|
|
.PP
|
|
Creates a new rpc base from which RPC requests can be received\&. \fBParameters:\fP
|
|
.RS 4
|
|
\fIserver\fP a pointer to an existing HTTP server
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
a newly allocated evrpc_base struct
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBevrpc_free()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "int evrpc_make_request (struct evrpc_request_wrapper *ctx)"
|
|
|
|
.PP
|
|
Makes an RPC request based on the provided context\&. This is a low-level function and should not be used directly unless a custom context object is provided\&. Use \fBEVRPC_MAKE_REQUEST()\fP instead\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIctx\fP a context from \fBEVRPC_MAKE_CTX()\fP
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
0 on success, -1 otherwise\&.
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBEVRPC_MAKE_REQUEST()\fP, \fBEVRPC_MAKE_CTX()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "void evrpc_pool_add_connection (struct evrpc_pool *pool, struct evhttp_connection *evcon)"
|
|
|
|
.PP
|
|
Adds a connection over which rpc can be dispatched to the pool\&. The connection object must have been newly created\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIpool\fP the pool to which to add the connection
|
|
.br
|
|
\fIevcon\fP the connection to add to the pool\&.
|
|
.RE
|
|
.PP
|
|
|
|
.SS "void evrpc_pool_free (struct evrpc_pool *pool)"
|
|
|
|
.PP
|
|
frees an rpc connection pool \fBParameters:\fP
|
|
.RS 4
|
|
\fIpool\fP a pointer to an evrpc_pool allocated via \fBevrpc_pool_new()\fP
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBevrpc_pool_new()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "struct evrpc_pool* evrpc_pool_new (struct \fBevent_base\fP *base)\fC [read]\fP"
|
|
|
|
.PP
|
|
creates an rpc connection pool a pool has a number of connections associated with it\&. rpc requests are always made via a pool\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIbase\fP a pointer to an struct event_based object; can be left NULL in singled-threaded applications
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
a newly allocated struct evrpc_pool object
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBevrpc_pool_free()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "void evrpc_pool_remove_connection (struct evrpc_pool *pool, struct evhttp_connection *evcon)"
|
|
|
|
.PP
|
|
Removes a connection from the pool\&. The connection object must have been newly created\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIpool\fP the pool from which to remove the connection
|
|
.br
|
|
\fIevcon\fP the connection to remove from the pool\&.
|
|
.RE
|
|
.PP
|
|
|
|
.SS "void evrpc_pool_set_timeout (struct evrpc_pool *pool, inttimeout_in_secs)"
|
|
|
|
.PP
|
|
Sets the timeout in secs after which a request has to complete\&. The RPC is completely aborted if it does not complete by then\&. Setting the timeout to 0 means that it never timeouts and can be used to implement callback type RPCs\&.
|
|
.PP
|
|
Any connection already in the pool will be updated with the new timeout\&. Connections added to the pool after set_timeout has be called receive the pool timeout only if no timeout has been set for the connection itself\&.
|
|
.PP
|
|
\fBParameters:\fP
|
|
.RS 4
|
|
\fIpool\fP a pointer to a struct evrpc_pool object
|
|
.br
|
|
\fItimeout_in_secs\fP the number of seconds after which a request should timeout and a failure be returned to the callback\&.
|
|
.RE
|
|
.PP
|
|
|
|
.SS "int evrpc_register_generic (struct evrpc_base *base, const char *name, void(*)(struct evrpc_req_generic *, void *)callback, void *cbarg, void *(*)(void *)req_new, void *req_new_arg, void(*)(void *)req_free, int(*)(void *, struct \fBevbuffer\fP *)req_unmarshal, void *(*)(void *)rpl_new, void *rpl_new_arg, void(*)(void *)rpl_free, int(*)(void *)rpl_complete, void(*)(struct \fBevbuffer\fP *, void *)rpl_marshal)"
|
|
|
|
.PP
|
|
Function for registering a generic RPC with the RPC base\&. Do not call this function directly, use \fBEVRPC_REGISTER()\fP instead\&.
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBEVRPC_REGISTER()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "int evrpc_register_rpc (struct evrpc_base *, struct evrpc *, void(*)(struct evrpc_req_generic *, void *), void *)"
|
|
|
|
.PP
|
|
Low level function for registering an RPC with a server\&. Use \fBEVRPC_REGISTER()\fP instead\&.
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBEVRPC_REGISTER()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "int evrpc_remove_hook (void *vbase, enum \fBEVRPC_HOOK_TYPE\fPhook_type, void *handle)"
|
|
|
|
.PP
|
|
removes a previously added hook \fBParameters:\fP
|
|
.RS 4
|
|
\fIvbase\fP a pointer to either struct evrpc_base or struct evrpc_pool
|
|
.br
|
|
\fIhook_type\fP either INPUT or OUTPUT
|
|
.br
|
|
\fIhandle\fP a handle returned by \fBevrpc_add_hook()\fP
|
|
.RE
|
|
.PP
|
|
\fBReturns:\fP
|
|
.RS 4
|
|
1 on success or 0 on failure
|
|
.RE
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBevrpc_add_hook()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SS "int evrpc_resume_request (void *vbase, void *ctx, enum \fBEVRPC_HOOK_RESULT\fPres)"
|
|
|
|
.PP
|
|
resume a paused request \fBParameters:\fP
|
|
.RS 4
|
|
\fIvbase\fP a pointer to either struct evrpc_base or struct evrpc_pool
|
|
.br
|
|
\fIctx\fP the context pointer provided to the original hook call
|
|
.RE
|
|
.PP
|
|
|
|
.SS "int evrpc_send_request_generic (struct evrpc_pool *pool, void *request, void *reply, void(*)(struct evrpc_status *, void *, void *, void *)cb, void *cb_arg, const char *rpcname, void(*)(struct \fBevbuffer\fP *, void *)req_marshal, void(*)(void *)rpl_clear, int(*)(void *, struct \fBevbuffer\fP *)rpl_unmarshal)"
|
|
|
|
.PP
|
|
Function for sending a generic RPC request\&. Do not call this function directly, use \fBEVRPC_MAKE_REQUEST()\fP instead\&.
|
|
.PP
|
|
\fBSee Also:\fP
|
|
.RS 4
|
|
\fBEVRPC_MAKE_REQUEST()\fP
|
|
.RE
|
|
.PP
|
|
|
|
.SH "Author"
|
|
.PP
|
|
Generated automatically by Doxygen for libevent from the source code\&.
|