2016-08-31 17:02:55 +10:00
/*
CTDB eventd protocol marshalling
Copyright ( C ) Amitay Isaacs 2016
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , see < http : //www.gnu.org/licenses/>.
*/
# include "replace.h"
# include "system/network.h"
# include <talloc.h>
# include "protocol.h"
# include "protocol_private.h"
# include "protocol_api.h"
static size_t ctdb_event_len ( enum ctdb_event in )
{
2017-06-29 22:14:23 +10:00
uint32_t u32 = in ;
return ctdb_uint32_len ( & u32 ) ;
2016-08-31 17:02:55 +10:00
}
2017-07-27 01:26:43 +10:00
static void ctdb_event_push ( enum ctdb_event in , uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-06-29 22:14:23 +10:00
size_t np ;
uint32_t u32 = in ;
ctdb_uint32_push ( & u32 , buf , & np ) ;
2017-07-27 01:26:43 +10:00
* npush = np ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_pull ( uint8_t * buf , size_t buflen ,
2017-07-27 01:26:43 +10:00
TALLOC_CTX * mem_ctx , enum ctdb_event * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
uint32_t uint32_value ;
enum ctdb_event value ;
2017-06-29 22:14:23 +10:00
size_t np ;
2016-08-31 17:02:55 +10:00
int ret ;
2017-06-29 22:14:23 +10:00
ret = ctdb_uint32_pull ( buf , buflen , & uint32_value , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
switch ( uint32_value ) {
case 0 :
value = CTDB_EVENT_INIT ;
break ;
case 1 :
value = CTDB_EVENT_SETUP ;
break ;
case 2 :
value = CTDB_EVENT_STARTUP ;
break ;
case 3 :
value = CTDB_EVENT_START_RECOVERY ;
break ;
case 4 :
value = CTDB_EVENT_RECOVERED ;
break ;
case 5 :
value = CTDB_EVENT_TAKE_IP ;
break ;
case 6 :
value = CTDB_EVENT_RELEASE_IP ;
break ;
case 7 :
value = CTDB_EVENT_STOPPED ;
break ;
case 8 :
value = CTDB_EVENT_MONITOR ;
break ;
case 9 :
value = CTDB_EVENT_STATUS ;
break ;
case 10 :
value = CTDB_EVENT_SHUTDOWN ;
break ;
case 11 :
value = CTDB_EVENT_RELOAD ;
break ;
case 12 :
value = CTDB_EVENT_UPDATE_IP ;
break ;
case 13 :
value = CTDB_EVENT_IPREALLOCATED ;
break ;
default :
return EINVAL ;
}
* out = value ;
2017-07-27 01:26:43 +10:00
* npull = np ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_command_len ( enum ctdb_event_command in )
{
2017-06-29 22:14:23 +10:00
uint32_t u32 = in ;
return ctdb_uint32_len ( & u32 ) ;
2016-08-31 17:02:55 +10:00
}
2017-07-27 01:28:43 +10:00
static void ctdb_event_command_push ( enum ctdb_event_command in , uint8_t * buf ,
size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-06-29 22:14:23 +10:00
size_t np ;
uint32_t u32 = in ;
ctdb_uint32_push ( & u32 , buf , & np ) ;
2017-07-27 01:28:43 +10:00
* npush = np ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_command_pull ( uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:28:43 +10:00
enum ctdb_event_command * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
uint32_t uint32_value ;
enum ctdb_event_command value ;
2017-06-29 22:14:23 +10:00
size_t np ;
2016-08-31 17:02:55 +10:00
int ret ;
2017-06-29 22:14:23 +10:00
ret = ctdb_uint32_pull ( buf , buflen , & uint32_value , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
switch ( uint32_value ) {
case 1 :
value = CTDB_EVENT_COMMAND_RUN ;
break ;
case 2 :
value = CTDB_EVENT_COMMAND_STATUS ;
break ;
case 3 :
value = CTDB_EVENT_COMMAND_SCRIPT_LIST ;
break ;
case 4 :
value = CTDB_EVENT_COMMAND_SCRIPT_ENABLE ;
break ;
case 5 :
value = CTDB_EVENT_COMMAND_SCRIPT_DISABLE ;
break ;
default :
return EINVAL ;
}
* out = value ;
2017-07-27 01:28:43 +10:00
* npull = np ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_status_state_len ( enum ctdb_event_status_state in )
{
2017-06-29 22:14:23 +10:00
uint32_t u32 = in ;
return ctdb_uint32_len ( & u32 ) ;
2016-08-31 17:02:55 +10:00
}
static void ctdb_event_status_state_push ( enum ctdb_event_status_state in ,
2017-07-27 01:30:17 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-06-29 22:14:23 +10:00
size_t np ;
uint32_t u32 = in ;
ctdb_uint32_push ( & u32 , buf , & np ) ;
2017-07-27 01:30:17 +10:00
* npush = np ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_status_state_pull ( uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:30:17 +10:00
enum ctdb_event_status_state * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
uint32_t uint32_value ;
enum ctdb_event_status_state value ;
2017-06-29 22:14:23 +10:00
size_t np ;
2016-08-31 17:02:55 +10:00
int ret ;
2017-06-29 22:14:23 +10:00
ret = ctdb_uint32_pull ( buf , buflen , & uint32_value , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
switch ( uint32_value ) {
case 1 :
value = CTDB_EVENT_LAST_RUN ;
break ;
case 2 :
value = CTDB_EVENT_LAST_PASS ;
break ;
case 3 :
value = CTDB_EVENT_LAST_FAIL ;
break ;
default :
return EINVAL ;
}
* out = value ;
2017-07-27 01:30:17 +10:00
* npull = np ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_request_run_len ( struct ctdb_event_request_run * in )
{
return ctdb_event_len ( in - > event ) +
2017-06-29 22:14:23 +10:00
ctdb_uint32_len ( & in - > timeout ) +
2017-04-20 12:45:24 +10:00
ctdb_stringn_len ( & in - > arg_str ) ;
2016-08-31 17:02:55 +10:00
}
static void ctdb_event_request_run_push ( struct ctdb_event_request_run * in ,
2017-07-27 01:32:10 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-06-29 22:14:23 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:26:43 +10:00
ctdb_event_push ( in - > event , buf , & np ) ;
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-06-29 22:14:23 +10:00
ctdb_uint32_push ( & in - > timeout , buf + offset , & np ) ;
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-04-20 12:45:24 +10:00
ctdb_stringn_push ( & in - > arg_str , buf + offset , & np ) ;
2017-07-27 01:32:10 +10:00
offset + = np ;
* npush = offset ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_request_run_pull ( uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:32:10 +10:00
struct ctdb_event_request_run * * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
struct ctdb_event_request_run * rdata ;
2017-06-29 22:14:23 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
int ret ;
rdata = talloc ( mem_ctx , struct ctdb_event_request_run ) ;
if ( rdata = = NULL ) {
return ENOMEM ;
}
2017-07-27 01:26:43 +10:00
ret = ctdb_event_pull ( buf , buflen , rdata , & rdata - > event , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
goto fail ;
}
2017-07-27 01:26:43 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-06-29 22:14:23 +10:00
ret = ctdb_uint32_pull ( buf + offset , buflen - offset , & rdata - > timeout ,
& np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
goto fail ;
}
2017-06-29 22:14:23 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
ret = ctdb_stringn_pull ( buf + offset , buflen - offset ,
2017-04-20 12:45:24 +10:00
rdata , & rdata - > arg_str , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
goto fail ;
}
2017-07-27 01:32:10 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
* out = rdata ;
2017-07-27 01:32:10 +10:00
* npull = offset ;
2016-08-31 17:02:55 +10:00
return 0 ;
fail :
talloc_free ( rdata ) ;
return ret ;
}
static size_t ctdb_event_request_status_len (
struct ctdb_event_request_status * in )
{
return ctdb_event_len ( in - > event ) +
ctdb_event_status_state_len ( in - > state ) ;
}
static void ctdb_event_request_status_push (
struct ctdb_event_request_status * in ,
2017-07-27 01:33:45 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-07-27 01:26:43 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:26:43 +10:00
ctdb_event_push ( in - > event , buf , & np ) ;
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:30:17 +10:00
ctdb_event_status_state_push ( in - > state , buf + offset , & np ) ;
2017-07-27 01:33:45 +10:00
offset + = np ;
* npush = offset ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_request_status_pull (
uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:33:45 +10:00
struct ctdb_event_request_status * * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
struct ctdb_event_request_status * rdata ;
2017-07-27 01:26:43 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
int ret ;
rdata = talloc ( mem_ctx , struct ctdb_event_request_status ) ;
if ( rdata = = NULL ) {
return ENOMEM ;
}
2017-07-27 01:26:43 +10:00
ret = ctdb_event_pull ( buf , buflen , rdata , & rdata - > event , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
talloc_free ( rdata ) ;
return ret ;
}
2017-07-27 01:26:43 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
ret = ctdb_event_status_state_pull ( buf + offset , buflen - offset ,
2017-07-27 01:30:17 +10:00
rdata , & rdata - > state , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
talloc_free ( rdata ) ;
return ret ;
}
2017-07-27 01:33:45 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
* out = rdata ;
2017-07-27 01:33:45 +10:00
* npull = offset ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_request_script_enable_len (
struct ctdb_event_request_script_enable * in )
{
2017-04-20 12:45:24 +10:00
return ctdb_stringn_len ( & in - > script_name ) ;
2016-08-31 17:02:55 +10:00
}
static void ctdb_event_request_script_enable_push (
struct ctdb_event_request_script_enable * in ,
2017-07-27 01:35:20 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-04-20 12:45:24 +10:00
size_t np ;
ctdb_stringn_push ( & in - > script_name , buf , & np ) ;
2017-07-27 01:35:20 +10:00
* npush = np ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_request_script_enable_pull (
uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:35:20 +10:00
struct ctdb_event_request_script_enable * * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
struct ctdb_event_request_script_enable * rdata ;
2017-04-20 12:45:24 +10:00
size_t np ;
2016-08-31 17:02:55 +10:00
int ret ;
rdata = talloc ( mem_ctx , struct ctdb_event_request_script_enable ) ;
if ( rdata = = NULL ) {
return ENOMEM ;
}
2017-04-20 12:45:24 +10:00
ret = ctdb_stringn_pull ( buf , buflen , rdata , & rdata - > script_name , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
talloc_free ( rdata ) ;
return ret ;
}
* out = rdata ;
2017-07-27 01:35:20 +10:00
* npull = np ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_request_script_disable_len (
struct ctdb_event_request_script_disable * in )
{
2017-04-20 12:45:24 +10:00
return ctdb_stringn_len ( & in - > script_name ) ;
2016-08-31 17:02:55 +10:00
}
static void ctdb_event_request_script_disable_push (
struct ctdb_event_request_script_disable * in ,
2017-07-27 01:36:56 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-04-20 12:45:24 +10:00
size_t np ;
ctdb_stringn_push ( & in - > script_name , buf , & np ) ;
2017-07-27 01:36:56 +10:00
* npush = np ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_request_script_disable_pull (
uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:36:56 +10:00
struct ctdb_event_request_script_disable * * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
struct ctdb_event_request_script_disable * rdata ;
2017-04-20 12:45:24 +10:00
size_t np ;
2016-08-31 17:02:55 +10:00
int ret ;
rdata = talloc ( mem_ctx , struct ctdb_event_request_script_disable ) ;
if ( rdata = = NULL ) {
return ENOMEM ;
}
2017-04-20 12:45:24 +10:00
ret = ctdb_stringn_pull ( buf , buflen , rdata , & rdata - > script_name , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
talloc_free ( rdata ) ;
return ret ;
}
* out = rdata ;
2017-07-27 01:36:56 +10:00
* npull = np ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_request_data_len ( struct ctdb_event_request_data * in )
{
size_t len = 0 ;
len + = ctdb_event_command_len ( in - > command ) ;
switch ( in - > command ) {
case CTDB_EVENT_COMMAND_RUN :
len + = ctdb_event_request_run_len ( in - > data . run ) ;
break ;
case CTDB_EVENT_COMMAND_STATUS :
len + = ctdb_event_request_status_len ( in - > data . status ) ;
break ;
case CTDB_EVENT_COMMAND_SCRIPT_LIST :
break ;
case CTDB_EVENT_COMMAND_SCRIPT_ENABLE :
len + = ctdb_event_request_script_enable_len (
in - > data . script_enable ) ;
break ;
case CTDB_EVENT_COMMAND_SCRIPT_DISABLE :
len + = ctdb_event_request_script_disable_len (
in - > data . script_disable ) ;
break ;
}
return len ;
}
static void ctdb_event_request_data_push ( struct ctdb_event_request_data * in ,
2017-07-27 01:41:58 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-07-27 01:28:43 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:28:43 +10:00
ctdb_event_command_push ( in - > command , buf , & np ) ;
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:41:58 +10:00
np = 0 ;
2016-08-31 17:02:55 +10:00
switch ( in - > command ) {
case CTDB_EVENT_COMMAND_RUN :
2017-07-27 01:32:10 +10:00
ctdb_event_request_run_push ( in - > data . run , buf + offset , & np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_STATUS :
2017-07-27 01:33:45 +10:00
ctdb_event_request_status_push ( in - > data . status , buf + offset ,
& np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_SCRIPT_LIST :
break ;
case CTDB_EVENT_COMMAND_SCRIPT_ENABLE :
ctdb_event_request_script_enable_push (
in - > data . script_enable ,
2017-07-27 01:35:20 +10:00
buf + offset , & np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_SCRIPT_DISABLE :
ctdb_event_request_script_disable_push (
in - > data . script_disable ,
2017-07-27 01:36:56 +10:00
buf + offset , & np ) ;
2016-08-31 17:02:55 +10:00
break ;
}
2017-07-27 01:41:58 +10:00
offset + = np ;
* npush = offset ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_request_data_pull ( uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:41:58 +10:00
struct ctdb_event_request_data * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
2017-07-27 01:28:43 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
int ret ;
2017-07-27 01:28:43 +10:00
ret = ctdb_event_command_pull ( buf , buflen , mem_ctx , & out - > command ,
& np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
2017-07-27 01:28:43 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:41:58 +10:00
np = 0 ;
2016-08-31 17:02:55 +10:00
switch ( out - > command ) {
case CTDB_EVENT_COMMAND_RUN :
ret = ctdb_event_request_run_pull ( buf + offset , buflen - offset ,
2017-07-27 01:32:10 +10:00
mem_ctx , & out - > data . run ,
& np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_STATUS :
ret = ctdb_event_request_status_pull (
buf + offset , buflen - offset ,
2017-07-27 01:33:45 +10:00
mem_ctx , & out - > data . status ,
& np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_SCRIPT_LIST :
ret = 0 ;
break ;
case CTDB_EVENT_COMMAND_SCRIPT_ENABLE :
ret = ctdb_event_request_script_enable_pull (
buf + offset , buflen - offset ,
mem_ctx ,
2017-07-27 01:35:20 +10:00
& out - > data . script_enable ,
& np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_SCRIPT_DISABLE :
ret = ctdb_event_request_script_disable_pull (
buf + offset , buflen - offset ,
mem_ctx ,
2017-07-27 01:36:56 +10:00
& out - > data . script_disable ,
& np ) ;
2016-08-31 17:02:55 +10:00
break ;
}
if ( ret ! = 0 ) {
return ret ;
}
2017-07-27 01:41:58 +10:00
offset + = np ;
* npull = offset ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_reply_status_len ( struct ctdb_event_reply_status * in )
{
2017-06-29 22:09:26 +10:00
return ctdb_int32_len ( & in - > status ) +
2016-08-31 17:02:55 +10:00
ctdb_script_list_len ( in - > script_list ) ;
}
static void ctdb_event_reply_status_push ( struct ctdb_event_reply_status * in ,
2017-07-27 01:43:54 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-06-29 22:09:26 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
2017-06-29 22:09:26 +10:00
ctdb_int32_push ( & in - > status , buf , & np ) ;
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-07-12 18:18:29 +10:00
ctdb_script_list_push ( in - > script_list , buf + offset , & np ) ;
2017-07-27 01:43:54 +10:00
offset + = np ;
* npush = offset ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_reply_status_pull ( uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:43:54 +10:00
struct ctdb_event_reply_status * * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
struct ctdb_event_reply_status * rdata ;
2017-06-29 22:09:26 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
int ret ;
rdata = talloc ( mem_ctx , struct ctdb_event_reply_status ) ;
if ( rdata = = NULL ) {
return ENOMEM ;
}
2017-06-29 22:09:26 +10:00
ret = ctdb_int32_pull ( buf , buflen , & rdata - > status , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
talloc_free ( rdata ) ;
return ret ;
}
2017-06-29 22:09:26 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
ret = ctdb_script_list_pull ( buf + offset , buflen - offset ,
2017-07-12 18:18:29 +10:00
rdata , & rdata - > script_list , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
talloc_free ( rdata ) ;
return ret ;
}
2017-07-27 01:43:54 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
* out = rdata ;
2017-07-27 01:43:54 +10:00
* npull = offset ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_reply_script_list_len (
struct ctdb_event_reply_script_list * in )
{
return ctdb_script_list_len ( in - > script_list ) ;
}
static void ctdb_event_reply_script_list_push (
struct ctdb_event_reply_script_list * in ,
2017-07-27 01:45:44 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-07-12 18:18:29 +10:00
size_t np ;
ctdb_script_list_push ( in - > script_list , buf , & np ) ;
2017-07-27 01:45:44 +10:00
* npush = np ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_reply_script_list_pull (
uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:45:44 +10:00
struct ctdb_event_reply_script_list * * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
struct ctdb_event_reply_script_list * rdata ;
2017-07-12 18:18:29 +10:00
size_t np ;
2016-08-31 17:02:55 +10:00
int ret ;
rdata = talloc ( mem_ctx , struct ctdb_event_reply_script_list ) ;
if ( rdata = = NULL ) {
return ENOMEM ;
}
2017-07-12 18:18:29 +10:00
ret = ctdb_script_list_pull ( buf , buflen , rdata , & rdata - > script_list ,
& np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
talloc_free ( rdata ) ;
return ret ;
}
* out = rdata ;
2017-07-27 01:45:44 +10:00
* npull = np ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
static size_t ctdb_event_reply_data_len ( struct ctdb_event_reply_data * in )
{
size_t len = 0 ;
len + = ctdb_event_command_len ( in - > command ) ;
2017-06-29 22:09:26 +10:00
len + = ctdb_int32_len ( & in - > result ) ;
2016-08-31 17:02:55 +10:00
switch ( in - > command ) {
case CTDB_EVENT_COMMAND_RUN :
break ;
case CTDB_EVENT_COMMAND_STATUS :
len + = ctdb_event_reply_status_len ( in - > data . status ) ;
break ;
case CTDB_EVENT_COMMAND_SCRIPT_LIST :
len + = ctdb_event_reply_script_list_len ( in - > data . script_list ) ;
break ;
case CTDB_EVENT_COMMAND_SCRIPT_ENABLE :
break ;
case CTDB_EVENT_COMMAND_SCRIPT_DISABLE :
break ;
}
return len ;
}
static void ctdb_event_reply_data_push ( struct ctdb_event_reply_data * in ,
2017-07-27 01:48:51 +10:00
uint8_t * buf , size_t * npush )
2016-08-31 17:02:55 +10:00
{
2017-06-29 22:09:26 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:28:43 +10:00
ctdb_event_command_push ( in - > command , buf , & np ) ;
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-06-29 22:09:26 +10:00
ctdb_int32_push ( & in - > result , buf + offset , & np ) ;
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:48:51 +10:00
np = 0 ;
2016-08-31 17:02:55 +10:00
switch ( in - > command ) {
case CTDB_EVENT_COMMAND_RUN :
break ;
case CTDB_EVENT_COMMAND_STATUS :
2017-07-27 01:43:54 +10:00
ctdb_event_reply_status_push ( in - > data . status , buf + offset , & np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_SCRIPT_LIST :
ctdb_event_reply_script_list_push ( in - > data . script_list ,
2017-07-27 01:45:44 +10:00
buf + offset , & np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_SCRIPT_ENABLE :
break ;
case CTDB_EVENT_COMMAND_SCRIPT_DISABLE :
break ;
}
2017-07-27 01:48:51 +10:00
offset + = np ;
* npush = offset ;
2016-08-31 17:02:55 +10:00
}
static int ctdb_event_reply_data_pull ( uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
2017-07-27 01:48:51 +10:00
struct ctdb_event_reply_data * out ,
size_t * npull )
2016-08-31 17:02:55 +10:00
{
2017-06-29 22:09:26 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
int ret ;
2017-07-27 01:28:43 +10:00
ret = ctdb_event_command_pull ( buf , buflen , mem_ctx , & out - > command ,
& np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
2017-07-27 01:28:43 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-06-29 22:09:26 +10:00
ret = ctdb_int32_pull ( buf + offset , buflen - offset , & out - > result , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
2017-06-29 22:09:26 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:48:51 +10:00
np = 0 ;
2016-08-31 17:02:55 +10:00
switch ( out - > command ) {
case CTDB_EVENT_COMMAND_RUN :
break ;
case CTDB_EVENT_COMMAND_STATUS :
ret = ctdb_event_reply_status_pull (
buf + offset , buflen - offset ,
2017-07-27 01:43:54 +10:00
mem_ctx , & out - > data . status , & np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_SCRIPT_LIST :
ret = ctdb_event_reply_script_list_pull (
buf + offset , buflen - offset ,
2017-07-27 01:45:44 +10:00
mem_ctx , & out - > data . script_list , & np ) ;
2016-08-31 17:02:55 +10:00
break ;
case CTDB_EVENT_COMMAND_SCRIPT_ENABLE :
break ;
case CTDB_EVENT_COMMAND_SCRIPT_DISABLE :
break ;
}
if ( ret ! = 0 ) {
return ret ;
}
2017-07-27 01:48:51 +10:00
offset + = np ;
* npull = offset ;
2016-08-31 17:02:55 +10:00
return 0 ;
}
size_t ctdb_event_request_len ( struct ctdb_event_request * in )
{
2017-07-10 18:35:12 +10:00
return sock_packet_header_len ( & in - > header ) +
2016-08-31 17:02:55 +10:00
ctdb_event_request_data_len ( & in - > rdata ) ;
}
int ctdb_event_request_push ( struct ctdb_event_request * in ,
uint8_t * buf , size_t * buflen )
{
2017-07-27 01:41:58 +10:00
size_t len , offset = 0 , np ;
2016-08-31 17:02:55 +10:00
len = ctdb_event_request_len ( in ) ;
if ( * buflen < len ) {
* buflen = len ;
return EMSGSIZE ;
}
in - > header . length = * buflen ;
2017-07-10 18:35:12 +10:00
sock_packet_header_push ( & in - > header , buf , & np ) ;
2017-07-27 01:51:40 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:41:58 +10:00
ctdb_event_request_data_push ( & in - > rdata , buf + offset , & np ) ;
2017-08-07 17:55:50 +10:00
offset + = np ;
if ( offset > * buflen ) {
return EMSGSIZE ;
}
2016-08-31 17:02:55 +10:00
return 0 ;
}
int ctdb_event_request_pull ( uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
struct ctdb_event_request * out )
{
2017-07-27 01:41:58 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
int ret ;
2017-07-10 18:35:12 +10:00
ret = sock_packet_header_pull ( buf , buflen , & out - > header , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
2017-07-27 01:51:40 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
ret = ctdb_event_request_data_pull ( buf + offset , buflen - offset ,
2017-07-27 01:41:58 +10:00
mem_ctx , & out - > rdata , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
2017-08-07 17:55:50 +10:00
offset + = np ;
if ( offset > buflen ) {
return EMSGSIZE ;
}
2016-08-31 17:02:55 +10:00
return 0 ;
}
size_t ctdb_event_reply_len ( struct ctdb_event_reply * in )
{
2017-07-10 18:35:12 +10:00
return sock_packet_header_len ( & in - > header ) +
2016-08-31 17:02:55 +10:00
ctdb_event_reply_data_len ( & in - > rdata ) ;
}
int ctdb_event_reply_push ( struct ctdb_event_reply * in ,
uint8_t * buf , size_t * buflen )
{
2017-07-27 01:48:51 +10:00
size_t len , offset = 0 , np ;
2016-08-31 17:02:55 +10:00
len = ctdb_event_reply_len ( in ) ;
if ( * buflen < len ) {
* buflen = len ;
return EMSGSIZE ;
}
in - > header . length = * buflen ;
2017-07-10 18:35:12 +10:00
sock_packet_header_push ( & in - > header , buf , & np ) ;
2017-07-27 01:51:40 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
2017-07-27 01:48:51 +10:00
ctdb_event_reply_data_push ( & in - > rdata , buf + offset , & np ) ;
2017-08-07 18:00:04 +10:00
offset + = np ;
if ( offset > * buflen ) {
return EMSGSIZE ;
}
2016-08-31 17:02:55 +10:00
return 0 ;
}
int ctdb_event_reply_pull ( uint8_t * buf , size_t buflen ,
TALLOC_CTX * mem_ctx ,
struct ctdb_event_reply * out )
{
2017-07-27 01:48:51 +10:00
size_t offset = 0 , np ;
2016-08-31 17:02:55 +10:00
int ret ;
2017-07-10 18:35:12 +10:00
ret = sock_packet_header_pull ( buf , buflen , & out - > header , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
2017-07-27 01:51:40 +10:00
offset + = np ;
2016-08-31 17:02:55 +10:00
ret = ctdb_event_reply_data_pull ( buf + offset , buflen - offset ,
2017-07-27 01:48:51 +10:00
mem_ctx , & out - > rdata , & np ) ;
2016-08-31 17:02:55 +10:00
if ( ret ! = 0 ) {
return ret ;
}
2017-08-07 18:00:04 +10:00
offset + = np ;
if ( offset > buflen ) {
return EMSGSIZE ;
}
2016-08-31 17:02:55 +10:00
return 0 ;
}