diff --git a/backends/server/command.c b/backends/server/command.c index a29f52f3..0e10b08e 100644 --- a/backends/server/command.c +++ b/backends/server/command.c @@ -85,15 +85,13 @@ glibtop_call_i (glibtop *server, glibtop_backend *backend, unsigned command, if (recv_ptr) glibtop_read_i (server, backend, recv_size, recv_ptr); -#if 0 - if (response.data_size) { - void *ptr = glibtop_malloc_r (server, response.data_size); + if (resp.data_size) { + void *ptr = glibtop_malloc_r (server, resp.data_size); - glibtop_read_i (server, backend, response.data_size, ptr); + glibtop_read_i (server, backend, resp.data_size, ptr); return ptr; } -#endif return NULL; } diff --git a/backends/server/demarshal.pl b/backends/server/demarshal.pl index 1b90034c..41dcd360 100644 --- a/backends/server/demarshal.pl +++ b/backends/server/demarshal.pl @@ -295,8 +295,16 @@ sub output { $recv_buf_code .= "\t*recv_buf_ptr = _LIBGTOP_RECV_buf;\n"; $recv_buf_code .= "\t*recv_size_ptr = _LIBGTOP_RECV_len;\n"; + if ($line_fields[3] =~ /^array/) { + $recv_buf_code .= "\n"; + $recv_buf_code .= "\tif (recv_data_ptr) {\n"; + $recv_buf_code .= "\t\t*recv_data_ptr = retval;\n"; + $recv_buf_code .= "\t\t*recv_data_size_ptr = array.total;\n"; + $recv_buf_code .= "\t}\n"; + } + $func_decl_code = sprintf - (qq[static int\n_glibtop_demarshal_%s_i (glibtop *server, glibtop_backend *backend, const void *send_ptr, size_t send_size, void *data_ptr, size_t data_size, void **recv_buf_ptr, size_t *recv_size_ptr, int *retval_ptr)\n], $feature); + (qq[static int\n_glibtop_demarshal_%s_i (glibtop *server, glibtop_backend *backend, const void *send_ptr, size_t send_size, void *data_ptr, size_t data_size, void **recv_buf_ptr, size_t *recv_size_ptr, void **recv_data_ptr, size_t *recv_data_size_ptr, int *retval_ptr)\n], $feature); if (!($call_code eq '')) { $call_code .= "\n"; @@ -314,7 +322,7 @@ sub output { } $func_decl_code = sprintf - (qq[int\nglibtop_demarshal_func_i (glibtop *server, glibtop_backend *backend, unsigned command, const void *send_ptr, size_t send_size, void *data_ptr, size_t data_size, void **recv_buf_ptr, size_t *recv_size_ptr, int *retval_ptr)]); + (qq[int\nglibtop_demarshal_func_i (glibtop *server, glibtop_backend *backend, unsigned command, const void *send_ptr, size_t send_size, void *data_ptr, size_t data_size, void **recv_buf_ptr, size_t *recv_size_ptr, void **recv_data_ptr, size_t *recv_data_size_ptr, int *retval_ptr)]); $switch_body_code = ''; @@ -322,7 +330,7 @@ for ($nr = 1; $nr <= $feature_count; $nr++) { $feature = $features{$nr}; $switch_body_code .= sprintf - (qq[\tcase GLIBTOP_CMND_%s:\n\t\treturn _glibtop_demarshal_%s_i\n\t\t\t(server, backend, send_ptr, send_size,\n\t\t\t data_ptr, data_size,\n\t\t\t recv_buf_ptr, recv_size_ptr, retval_ptr);\n], + (qq[\tcase GLIBTOP_CMND_%s:\n\t\treturn _glibtop_demarshal_%s_i\n\t\t\t(server, backend, send_ptr, send_size,\n\t\t\t data_ptr, data_size,\n\t\t\t recv_buf_ptr, recv_size_ptr,\n\t\t\t recv_data_ptr, recv_data_size_ptr, retval_ptr);\n], &toupper ($feature), $feature); } diff --git a/backends/server/server.c b/backends/server/server.c index 24a5eb25..e738610d 100644 --- a/backends/server/server.c +++ b/backends/server/server.c @@ -112,10 +112,10 @@ handle_slave_connection (int input, int output) // glibtop_send_version_i (glibtop_global_server, output); while (do_read (input, cmnd, sizeof (glibtop_command))) { - size_t recv_size = 0, send_size = 0; + size_t recv_size = 0, send_size = 0, recv_data_size = 0; + void *recv_ptr = NULL, *recv_data_ptr = NULL; char parameter [BUFSIZ]; int retval, func_retval; - void *recv_ptr = NULL; glibtop_response resp; fprintf (stderr, "Slave %d received command " @@ -151,18 +151,24 @@ handle_slave_connection (int input, int output) cmnd->command, parameter, send_size, NULL, 0, &recv_ptr, &recv_size, + &recv_data_ptr, &recv_data_size, &func_retval); fprintf (stderr, "Retval %d / %d - %p - %d\n", retval, func_retval, recv_ptr, recv_size); + if (recv_data_size) { + fprintf (stderr, "Returning %d bytes of data from %p.\n", + recv_data_size, recv_data_ptr); + } + memset (&resp, 0, sizeof (glibtop_response)); resp.retval = retval; resp.glibtop_errno = func_retval; resp.recv_size = recv_size; - resp.data_size = 0; + resp.data_size = recv_data_size; - do_output (output, &resp, recv_ptr, NULL); + do_output (output, &resp, recv_ptr, recv_data_ptr); } } diff --git a/backends/server/server.h b/backends/server/server.h index 2721920b..1273babd 100644 --- a/backends/server/server.h +++ b/backends/server/server.h @@ -85,7 +85,7 @@ void handle_slave_connection (int input, int output); int -glibtop_demarshal_func_i (glibtop *server, glibtop_backend *backend, unsigned command, const void *send_ptr, size_t send_size, void *data_ptr, size_t data_size, void **recv_buf_ptr, size_t *recv_size_ptr, int *retval_ptr); +glibtop_demarshal_func_i (glibtop *server, glibtop_backend *backend, unsigned command, const void *send_ptr, size_t send_size, void *data_ptr, size_t data_size, void **recv_buf_ptr, size_t *recv_size_ptr, void **recv_data_ptr, size_t *recv_data_size_ptr, int *retval_ptr); void glibtop_send_version_i (glibtop *server, int fd);