From fef53eb2c407834b300be6e5a7bdc66fd5fdd337 Mon Sep 17 00:00:00 2001 From: Patrick Caulfield Date: Wed, 7 May 2008 07:27:37 +0000 Subject: [PATCH] Expose confdb write to the library. git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1536 fd59a12c-fef9-0310-b244-a6a79926bd2f --- exec/confdb.c | 26 +++++++++++++++++++++++ include/confdb.h | 8 +++++++ include/ipc_confdb.h | 11 ++++++++-- lib/confdb.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ lib/sa-confdb.c | 14 +++++++++++++ lib/sa-confdb.h | 1 + test/Makefile | 2 +- test/testconfdb.c | 4 ++++ 8 files changed, 113 insertions(+), 3 deletions(-) diff --git a/exec/confdb.c b/exec/confdb.c index b39d2067..e6228b16 100644 --- a/exec/confdb.c +++ b/exec/confdb.c @@ -73,6 +73,7 @@ static void message_handler_req_lib_confdb_object_iter (void *conn, void *messag static void message_handler_req_lib_confdb_object_find (void *conn, void *message); static void message_handler_req_lib_confdb_object_parent_get (void *conn, void *message); +static void message_handler_req_lib_confdb_write (void *conn, void *message); static void message_handler_req_lib_confdb_track_start (void *conn, void *message); static void message_handler_req_lib_confdb_track_stop (void *conn, void *message); @@ -155,6 +156,12 @@ static struct openais_lib_handler confdb_lib_service[] = .response_id = MESSAGE_RES_CONFDB_TRACK_START, .flow_control = OPENAIS_FLOW_CONTROL_NOT_REQUIRED }, + { /* 12 */ + .lib_handler_fn = message_handler_req_lib_confdb_write, + .response_size = sizeof (struct res_lib_confdb_write), + .response_id = MESSAGE_RES_CONFDB_WRITE, + .flow_control = OPENAIS_FLOW_CONTROL_NOT_REQUIRED + }, }; @@ -444,6 +451,24 @@ static void message_handler_req_lib_confdb_object_find (void *conn, void *messag openais_conn_send_response(conn, &res_lib_confdb_object_find, sizeof(res_lib_confdb_object_find)); } +static void message_handler_req_lib_confdb_write (void *conn, void *message) +{ + struct res_lib_confdb_write res_lib_confdb_write; + int ret = SA_AIS_OK; + char *error_string; + + if (global_objdb->object_write_config(&error_string)) + ret = SA_AIS_ERR_ACCESS; + + res_lib_confdb_write.header.size = sizeof(res_lib_confdb_write); + res_lib_confdb_write.header.id = MESSAGE_RES_CONFDB_WRITE; + res_lib_confdb_write.header.error = ret; + strcpy((char *)res_lib_confdb_write.error.value, error_string); + res_lib_confdb_write.error.length = strlen(error_string) + 1; + + openais_conn_send_response(conn, &res_lib_confdb_write, sizeof(res_lib_confdb_write)); +} + /* TODO: when we have notification in the objdb. */ static void message_handler_req_lib_confdb_track_start (void *conn, void *message) { @@ -465,3 +490,4 @@ static void message_handler_req_lib_confdb_track_stop (void *conn, void *message openais_conn_send_response(conn, &res, sizeof(res)); } + diff --git a/include/confdb.h b/include/confdb.h index 095e1e4a..831d9826 100644 --- a/include/confdb.h +++ b/include/confdb.h @@ -96,6 +96,14 @@ confdb_error_t confdb_initialize ( confdb_error_t confdb_finalize ( confdb_handle_t handle); + +/* + * Write back the configuration + */ +confdb_error_t confdb_write ( + confdb_handle_t handle, + char *error_text); + /* * Get a file descriptor on which to poll. confdb_handle_t is NOT a * file descriptor and may not be used directly. diff --git a/include/ipc_confdb.h b/include/ipc_confdb.h index 84649e56..acc0871b 100644 --- a/include/ipc_confdb.h +++ b/include/ipc_confdb.h @@ -50,7 +50,8 @@ enum req_confdb_types { MESSAGE_REQ_CONFDB_OBJECT_PARENT_GET = 8, MESSAGE_REQ_CONFDB_KEY_ITER = 9, MESSAGE_REQ_CONFDB_TRACK_START = 10, - MESSAGE_REQ_CONFDB_TRACK_STOP = 11 + MESSAGE_REQ_CONFDB_TRACK_STOP = 11, + MESSAGE_REQ_CONFDB_WRITE = 12 }; enum res_confdb_types { @@ -66,7 +67,8 @@ enum res_confdb_types { MESSAGE_RES_CONFDB_KEY_ITER = 9, MESSAGE_RES_CONFDB_TRACK_START = 10, MESSAGE_RES_CONFDB_TRACK_STOP = 11, - MESSAGE_RES_CONFDB_CHANGE_CALLBACK = 12 + MESSAGE_RES_CONFDB_CHANGE_CALLBACK = 12, + MESSAGE_RES_CONFDB_WRITE = 13 }; @@ -167,6 +169,11 @@ struct res_lib_confdb_key_get { mar_name_t value __attribute__((aligned(8))); }; +struct res_lib_confdb_write { + mar_res_header_t header __attribute__((aligned(8))); + mar_name_t error __attribute__((aligned(8))); +}; + struct res_lib_confdb_change_callback { mar_res_header_t header __attribute__((aligned(8))); mar_uint32_t parent_object_handle __attribute__((aligned(8))); diff --git a/lib/confdb.c b/lib/confdb.c index ca3fd537..03a4e7bc 100644 --- a/lib/confdb.c +++ b/lib/confdb.c @@ -1089,3 +1089,53 @@ error_exit: return (error); } + +confdb_error_t confdb_write ( + confdb_handle_t handle, + char *error_text) +{ + confdb_error_t error; + struct confdb_inst *confdb_inst; + struct iovec iov[2]; + mar_req_header_t req; + struct res_lib_confdb_write res_lib_confdb_write; + + error = saHandleInstanceGet (&confdb_handle_t_db, handle, (void *)&confdb_inst); + if (error != SA_AIS_OK) { + return (error); + } + + if (confdb_inst->standalone) { + error = SA_AIS_OK; + + if (confdb_sa_write(error_text)) + error = SA_AIS_ERR_ACCESS; + goto error_exit; + } + + req.size = sizeof (mar_req_header_t); + req.id = MESSAGE_REQ_CONFDB_WRITE; + + iov[0].iov_base = (char *)&req; + iov[0].iov_len = sizeof (mar_req_header_t); + + pthread_mutex_lock (&confdb_inst->response_mutex); + + error = saSendMsgReceiveReply (confdb_inst->response_fd, iov, 1, + &res_lib_confdb_write, sizeof ( struct res_lib_confdb_write)); + + pthread_mutex_unlock (&confdb_inst->response_mutex); + if (error != SA_AIS_OK) { + goto error_exit; + } + + error = res_lib_confdb_write.header.error; + memcpy(error_text, res_lib_confdb_write.error.value, res_lib_confdb_write.error.length); + +error_exit: + saHandleInstancePut (&confdb_handle_t_db, handle); + + return (error); +} + + diff --git a/lib/sa-confdb.c b/lib/sa-confdb.c index 9b7d7fde..f54309e1 100644 --- a/lib/sa-confdb.c +++ b/lib/sa-confdb.c @@ -270,6 +270,20 @@ int confdb_sa_object_find ( next_pos); } +int confdb_sa_write ( + unsigned int parent_object_handle, + char *error_text) +{ + char *errtext; + int ret; + + ret = objdb->object_write_config(&errtext); + if (!ret) + strcpy(error_text, errtext); + + return ret; +} + int confdb_sa_object_iter ( unsigned int parent_object_handle, diff --git a/lib/sa-confdb.h b/lib/sa-confdb.h index c30d7356..e22555b4 100644 --- a/lib/sa-confdb.h +++ b/lib/sa-confdb.h @@ -42,3 +42,4 @@ extern int confdb_sa_key_replace(unsigned int parent_object_handle, void *key_na extern int confdb_sa_object_find(unsigned int parent_object_handle, unsigned int start_pos, void *object_name, int object_name_len, unsigned int *object_handle, unsigned int *next_pos); extern int confdb_sa_object_iter(unsigned int parent_object_handle, unsigned int start_pos, unsigned int *object_handle, void *object_name, int *object_name_len); extern int confdb_sa_key_iter(unsigned int parent_object_handle, unsigned int start_pos, void *key_name, int *key_name_len, void *value, int *value_len); +extern int confdb_sa_write(char *error_text); diff --git a/test/Makefile b/test/Makefile index 1e30e517..d1e587bd 100644 --- a/test/Makefile +++ b/test/Makefile @@ -155,7 +155,7 @@ cpgbench: cpgbench.o $(LIBRARIES) $(CC) $(LDFLAGS) -o cpgbench cpgbench.o $(LIBS) testconfdb: testconfdb.o $(LIBRARIES) - $(CC) $(LDFLAGS) -o testconfdb testconfdb.o $(LIBS)# -rdynamic + $(CC) $(LDFLAGS) -o testconfdb testconfdb.o $(LIBS) -rdynamic openais-cfgtool: openais-cfgtool.o $(LIBRARIES) $(CC) $(LDFLAGS) -o openais-cfgtool openais-cfgtool.o $(LIBS) diff --git a/test/testconfdb.c b/test/testconfdb.c index 64e194ab..8ecbf469 100644 --- a/test/testconfdb.c +++ b/test/testconfdb.c @@ -108,6 +108,7 @@ static void do_write_tests(confdb_handle_t handle) { int res; unsigned int object_handle; + char error_string[1024]; /* Add a scratch object and put some keys into it */ res = confdb_object_create(handle, OBJECT_PARENT_HANDLE, (void *)"testconfdb", strlen("testconfdb"), &object_handle); @@ -153,6 +154,9 @@ static void do_write_tests(confdb_handle_t handle) printf( "error destroying 'testconfdb' object: %d\n", res); return; } + + res = confdb_write(handle, error_string); + printf("confdb_write returned %d: %s\n", res, error_string); }