From 90f8ad5863c45e9b0ac6db8267a19d6428e1c0f8 Mon Sep 17 00:00:00 2001 From: plt Date: Sun, 20 Nov 2011 12:43:22 +0800 Subject: [PATCH] Add GError parameter to searpc_call_function --- demo/searpc-demo-server.c | 9 ++++++++- lib/searpc-server.c | 15 ++++++++------- lib/searpc-server.h | 3 ++- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/demo/searpc-demo-server.c b/demo/searpc-demo-server.c index 4bbab24..76ca891 100644 --- a/demo/searpc-demo-server.c +++ b/demo/searpc-demo-server.c @@ -9,6 +9,9 @@ #include #include +#include +#include + #include "searpc-server.h" #include "searpc-demo-packet.h" #define BUFLEN 256 @@ -47,6 +50,7 @@ main(int argc, char *argv[]) socklen_t clilen; char buf[BUFLEN]; packet *pac, *pac_ret; + g_type_init(); start_rpc_service(); @@ -83,6 +87,8 @@ main(int argc, char *argv[]) } while (1) { + GError *error = NULL; + clilen = sizeof(client_addr); connfd = accept(listenfd, (struct sockaddr *)&client_addr, &clilen); if (connfd < 0) { @@ -100,7 +106,8 @@ main(int argc, char *argv[]) gsize ret_len; int fcall_len = ntohs(pac->length); /* 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->length = htons((uint16_t)ret_len); diff --git a/lib/searpc-server.c b/lib/searpc-server.c index 79f7fab..e1d62fd 100644 --- a/lib/searpc-server.c +++ b/lib/searpc-server.c @@ -121,9 +121,9 @@ void searpc_server_init () { 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, - NULL, marshal_item_free); + NULL, (GDestroyNotify)marshal_item_free); /* register buildin marshal functions */ register_marshals(marshal_table); @@ -184,18 +184,18 @@ searpc_server_register_function (void *func, const gchar *fname, gchar *signatur /* Called by RPC transport. */ 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; - GError *error = NULL; JsonNode *root; JsonArray *array; + + g_return_val_if_fail (error == NULL || *error == NULL, NULL); parser = json_parser_new (); - if (!json_parser_load_from_data (parser, func, len, &error)) { - g_warning ("[SeaRPC] failed to parse RPC call: %s\n", error->message); - g_error_free (error); + if (!json_parser_load_from_data (parser, func, len, error)) { + g_warning ("[SeaRPC] failed to parse RPC call: %s\n", (*error)->message); g_object_unref (parser); 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); if (!fitem) { g_warning ("[SeaRPC] cannot find function %s.\n", fname); + g_set_error (error, 0, 500, "cannot find function %s.", fname); return NULL; } diff --git a/lib/searpc-server.h b/lib/searpc-server.h index bf0596c..cfb87a2 100644 --- a/lib/searpc-server.h +++ b/lib/searpc-server.h @@ -55,7 +55,8 @@ gboolean searpc_server_register_function (void* func, * * 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: