mirror of
https://github.com/haiwen/libsearpc.git
synced 2025-09-02 13:25:25 +00:00
Add GError parameter to searpc_call_function
This commit is contained in:
@@ -9,6 +9,9 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
#include "searpc-server.h"
|
#include "searpc-server.h"
|
||||||
#include "searpc-demo-packet.h"
|
#include "searpc-demo-packet.h"
|
||||||
#define BUFLEN 256
|
#define BUFLEN 256
|
||||||
@@ -47,6 +50,7 @@ main(int argc, char *argv[])
|
|||||||
socklen_t clilen;
|
socklen_t clilen;
|
||||||
char buf[BUFLEN];
|
char buf[BUFLEN];
|
||||||
packet *pac, *pac_ret;
|
packet *pac, *pac_ret;
|
||||||
|
|
||||||
g_type_init();
|
g_type_init();
|
||||||
|
|
||||||
start_rpc_service();
|
start_rpc_service();
|
||||||
@@ -83,6 +87,8 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
clilen = sizeof(client_addr);
|
clilen = sizeof(client_addr);
|
||||||
connfd = accept(listenfd, (struct sockaddr *)&client_addr, &clilen);
|
connfd = accept(listenfd, (struct sockaddr *)&client_addr, &clilen);
|
||||||
if (connfd < 0) {
|
if (connfd < 0) {
|
||||||
@@ -100,7 +106,8 @@ main(int argc, char *argv[])
|
|||||||
gsize ret_len;
|
gsize ret_len;
|
||||||
int fcall_len = ntohs(pac->length);
|
int fcall_len = ntohs(pac->length);
|
||||||
/* Execute the RPC function */
|
/* Execute the RPC function */
|
||||||
char *res = searpc_server_call_function (pac->data, fcall_len, &ret_len);
|
char *res = searpc_server_call_function (pac->data, fcall_len,
|
||||||
|
&ret_len, &error);
|
||||||
|
|
||||||
pac_ret = (packet *)buf;
|
pac_ret = (packet *)buf;
|
||||||
pac_ret->length = htons((uint16_t)ret_len);
|
pac_ret->length = htons((uint16_t)ret_len);
|
||||||
|
@@ -121,9 +121,9 @@ void
|
|||||||
searpc_server_init ()
|
searpc_server_init ()
|
||||||
{
|
{
|
||||||
func_table = g_hash_table_new_full (g_str_hash, g_str_equal,
|
func_table = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
NULL, func_item_free);
|
NULL, (GDestroyNotify)func_item_free);
|
||||||
marshal_table = g_hash_table_new_full (g_str_hash, g_str_equal,
|
marshal_table = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
NULL, marshal_item_free);
|
NULL, (GDestroyNotify)marshal_item_free);
|
||||||
|
|
||||||
/* register buildin marshal functions */
|
/* register buildin marshal functions */
|
||||||
register_marshals(marshal_table);
|
register_marshals(marshal_table);
|
||||||
@@ -184,18 +184,18 @@ searpc_server_register_function (void *func, const gchar *fname, gchar *signatur
|
|||||||
|
|
||||||
/* Called by RPC transport. */
|
/* Called by RPC transport. */
|
||||||
gchar*
|
gchar*
|
||||||
searpc_server_call_function (gchar *func, gsize len, gsize *ret_len)
|
searpc_server_call_function (gchar *func, gsize len, gsize *ret_len, GError **error)
|
||||||
{
|
{
|
||||||
JsonParser *parser;
|
JsonParser *parser;
|
||||||
GError *error = NULL;
|
|
||||||
JsonNode *root;
|
JsonNode *root;
|
||||||
JsonArray *array;
|
JsonArray *array;
|
||||||
|
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
parser = json_parser_new ();
|
parser = json_parser_new ();
|
||||||
|
|
||||||
if (!json_parser_load_from_data (parser, func, len, &error)) {
|
if (!json_parser_load_from_data (parser, func, len, error)) {
|
||||||
g_warning ("[SeaRPC] failed to parse RPC call: %s\n", error->message);
|
g_warning ("[SeaRPC] failed to parse RPC call: %s\n", (*error)->message);
|
||||||
g_error_free (error);
|
|
||||||
g_object_unref (parser);
|
g_object_unref (parser);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -207,6 +207,7 @@ searpc_server_call_function (gchar *func, gsize len, gsize *ret_len)
|
|||||||
FuncItem *fitem = g_hash_table_lookup(func_table, fname);
|
FuncItem *fitem = g_hash_table_lookup(func_table, fname);
|
||||||
if (!fitem) {
|
if (!fitem) {
|
||||||
g_warning ("[SeaRPC] cannot find function %s.\n", fname);
|
g_warning ("[SeaRPC] cannot find function %s.\n", fname);
|
||||||
|
g_set_error (error, 0, 500, "cannot find function %s.", fname);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -55,7 +55,8 @@ gboolean searpc_server_register_function (void* func,
|
|||||||
*
|
*
|
||||||
* Returns the serialized representatio of the returned value.
|
* Returns the serialized representatio of the returned value.
|
||||||
*/
|
*/
|
||||||
gchar *searpc_server_call_function (gchar *func, gsize len, gsize *ret_len);
|
gchar *searpc_server_call_function (gchar *func, gsize len, gsize *ret_len,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* searpc_compute_signature:
|
* searpc_compute_signature:
|
||||||
|
Reference in New Issue
Block a user