2007-02-09 01:42:04 +03:00
/*
ctdb_message protocol code
Copyright ( C ) Andrew Tridgell 2007
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
version 2 of the License , or ( at your option ) any later version .
This library 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
Lesser General Public License for more details .
You should have received a copy of the GNU Lesser General Public
License along with this library ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
/*
see http : //wiki.samba.org/index.php/Samba_%26_Clustering for
protocol design and packet details
*/
# include "includes.h"
# include "lib/events/events.h"
# include "lib/tdb/include/tdb.h"
# include "system/network.h"
# include "system/filesys.h"
# include "../include/ctdb_private.h"
/*
called when a CTDB_REQ_MESSAGE packet comes in
this dispatches the messages to the registered ctdb message handler
*/
void ctdb_request_message ( struct ctdb_context * ctdb , struct ctdb_req_header * hdr )
{
struct ctdb_req_message * c = ( struct ctdb_req_message * ) hdr ;
TDB_DATA data ;
if ( ctdb - > message_handler = = NULL ) {
2007-02-09 04:45:58 +03:00
printf ( " no msg handler \n " ) ;
2007-02-09 01:42:04 +03:00
/* no registered message handler */
talloc_free ( hdr ) ;
return ;
}
data . dptr = & c - > data [ 0 ] ;
data . dsize = c - > datalen ;
ctdb - > message_handler ( ctdb , c - > srvid , data , ctdb - > message_private ) ;
talloc_free ( hdr ) ;
}
/*
send a ctdb message
*/
int ctdb_send_message ( struct ctdb_context * ctdb , uint32_t vnn ,
2007-02-09 04:45:58 +03:00
uint32_t srvid , TDB_DATA data )
2007-02-09 01:42:04 +03:00
{
struct ctdb_req_message * r ;
int len ;
len = offsetof ( struct ctdb_req_message , data ) + data . dsize ;
r = ctdb - > methods - > allocate_pkt ( ctdb , len ) ;
CTDB_NO_MEMORY ( ctdb , r ) ;
r - > hdr . length = len ;
r - > hdr . operation = CTDB_REQ_MESSAGE ;
r - > hdr . destnode = vnn ;
r - > hdr . srcnode = ctdb - > vnn ;
r - > hdr . reqid = 0 ;
r - > srvid = srvid ;
r - > datalen = data . dsize ;
memcpy ( & r - > data [ 0 ] , data . dptr , data . dsize ) ;
ctdb_queue_packet ( ctdb , & r - > hdr ) ;
talloc_free ( r ) ;
return 0 ;
}
/*
setup handler for receipt of ctdb messages from ctdb_send_message ( )
*/
int ctdb_set_message_handler ( struct ctdb_context * ctdb , ctdb_message_fn_t handler ,
void * private )
{
ctdb - > message_handler = handler ;
ctdb - > message_private = private ;
return 0 ;
}