On 01/11/2011 10:24 PM, Angus Salkeld wrote:
> This is useful when tracking object changes.
> 
> Signed-off-by: Angus Salkeld <[email protected]>
> ---
>  include/corosync/confdb.h     |    6 ++++
>  include/corosync/ipc_confdb.h |   11 ++++++++
>  lib/confdb.c                  |   55 
> +++++++++++++++++++++++++++++++++++++++++
>  lib/sa-confdb.c               |    8 ++++++
>  lib/sa-confdb.h               |    3 ++
>  services/confdb.c             |   28 +++++++++++++++++++++
>  6 files changed, 111 insertions(+), 0 deletions(-)
> 
> diff --git a/include/corosync/confdb.h b/include/corosync/confdb.h
> index ca8e21b..ca0d7ba 100644
> --- a/include/corosync/confdb.h
> +++ b/include/corosync/confdb.h
> @@ -194,6 +194,12 @@ cs_error_t confdb_object_parent_get (
>       hdb_handle_t object_handle,
>       hdb_handle_t *parent_object_handle);
>  
> +cs_error_t confdb_object_name_get (
> +     confdb_handle_t handle,
> +     hdb_handle_t object_handle,
> +     char *object_name,
> +     size_t *object_name_len);
> +
>  /*
>   * Manipulate keys
>   */
> diff --git a/include/corosync/ipc_confdb.h b/include/corosync/ipc_confdb.h
> index c92bcc6..856c8a6 100644
> --- a/include/corosync/ipc_confdb.h
> +++ b/include/corosync/ipc_confdb.h
> @@ -59,6 +59,7 @@ enum req_confdb_types {
>       MESSAGE_REQ_CONFDB_KEY_CREATE_TYPED = 17,
>       MESSAGE_REQ_CONFDB_KEY_GET_TYPED = 18,
>       MESSAGE_REQ_CONFDB_KEY_ITER_TYPED = 19,
> +     MESSAGE_REQ_CONFDB_OBJECT_NAME_GET = 20,
>  };
>  
>  enum res_confdb_types {
> @@ -85,6 +86,7 @@ enum res_confdb_types {
>       MESSAGE_RES_CONFDB_KEY_GET_TYPED = 20,
>       MESSAGE_RES_CONFDB_KEY_ITER_TYPED = 21,
>       MESSAGE_RES_CONFDB_RELOAD_CALLBACK = 22,
> +     MESSAGE_RES_CONFDB_OBJECT_NAME_GET = 23,
>  };
>  
>  
> @@ -114,6 +116,15 @@ struct res_lib_confdb_object_parent_get {
>       mar_uint64_t parent_object_handle __attribute__((aligned(8)));
>  };
>  
> +struct req_lib_confdb_object_name_get {
> +     coroipc_request_header_t header __attribute__((aligned(8)));
> +     mar_uint64_t object_handle __attribute__((aligned(8)));
> +};
> +
> +struct res_lib_confdb_object_name_get {
> +     coroipc_response_header_t header __attribute__((aligned(8)));
> +     mar_name_t object_name __attribute__((aligned(8)));
> +};
>  
>  struct req_lib_confdb_key_create {
>       coroipc_request_header_t header __attribute__((aligned(8)));
> diff --git a/lib/confdb.c b/lib/confdb.c
> index fe87073..156a7ca 100644
> --- a/lib/confdb.c
> +++ b/lib/confdb.c
> @@ -575,6 +575,61 @@ error_exit:
>       return (error);
>  }
>  
> +cs_error_t confdb_object_name_get (
> +     confdb_handle_t handle,
> +     hdb_handle_t object_handle,
> +     char *object_name,
> +     size_t *object_name_len)
> +{
> +     cs_error_t error;
> +     struct confdb_inst *confdb_inst;
> +     struct iovec iov;
> +     struct req_lib_confdb_object_name_get request;
> +     struct res_lib_confdb_object_name_get response;
> +
> +     error = hdb_error_to_cs(hdb_handle_get (&confdb_handle_t_db, handle, 
> (void *)&confdb_inst));
> +     if (error != CS_OK) {
> +             return (error);
> +     }
> +
> +     if (confdb_inst->standalone) {
> +             error = CS_OK;
> +
> +             if (confdb_sa_object_name_get(object_handle, object_name, 
> object_name_len))
> +                     error = CS_ERR_ACCESS;
> +             goto error_exit;
> +     }
> +
> +     request.header.size = sizeof (struct req_lib_confdb_object_name_get);
> +     request.header.id = MESSAGE_REQ_CONFDB_OBJECT_NAME_GET;
> +     request.object_handle = object_handle;
> +
> +     iov.iov_base = (char *)&request;
> +     iov.iov_len = sizeof (struct req_lib_confdb_object_name_get);
> +
> +        error = coroipcc_msg_send_reply_receive (
> +             confdb_inst->handle,
> +             &iov,
> +             1,
> +                &response,
> +             sizeof (struct res_lib_confdb_object_name_get));
> +
> +     if (error != CS_OK) {
> +             goto error_exit;
> +     }
> +
> +     error = response.header.error;
> +     if (error == CS_OK) {
> +             *object_name_len = response.object_name.length;
> +             memcpy(object_name, response.object_name.value, 
> *object_name_len);
> +     }
> +
> +error_exit:
> +     (void)hdb_handle_put (&confdb_handle_t_db, handle);
> +
> +     return (error);
> +}
> +
>  static cs_error_t do_find_destroy(
>       struct confdb_inst *confdb_inst,
>       hdb_handle_t find_handle)
> diff --git a/lib/sa-confdb.c b/lib/sa-confdb.c
> index 0a71115..03995e3 100644
> --- a/lib/sa-confdb.c
> +++ b/lib/sa-confdb.c
> @@ -186,6 +186,14 @@ int confdb_sa_object_parent_get (
>       return objdb->object_parent_get(object_handle, parent_object_handle);
>  }
>  
> +int confdb_sa_object_name_get(
> +     hdb_handle_t object_handle,
> +     char *object_name,
> +     size_t *object_name_len)
> +{
> +     return objdb->object_name_get(object_handle, object_name, 
> object_name_len);
> +}
> +
>  int confdb_sa_key_create (
>       hdb_handle_t parent_object_handle,
>       const void *key_name,
> diff --git a/lib/sa-confdb.h b/lib/sa-confdb.h
> index d9ea906..61a0fa7 100644
> --- a/lib/sa-confdb.h
> +++ b/lib/sa-confdb.h
> @@ -40,6 +40,9 @@ extern int confdb_sa_object_create(hdb_handle_t 
> parent_object_handle,
>  extern int confdb_sa_object_destroy(hdb_handle_t object_handle);
>  extern int confdb_sa_object_parent_get(hdb_handle_t object_handle,
>                                      hdb_handle_t *parent_object_handle);
> +extern int confdb_sa_object_name_get(hdb_handle_t object_handle,
> +                                  char *object_name,
> +                                  size_t *object_name_len);
>  extern int confdb_sa_key_create(hdb_handle_t parent_object_handle,
>                               const void *key_name,
>                               size_t key_name_len,
> diff --git a/services/confdb.c b/services/confdb.c
> index 78770ed..56e3ae1 100644
> --- a/services/confdb.c
> +++ b/services/confdb.c
> @@ -107,6 +107,8 @@ static void message_handler_req_lib_confdb_object_find 
> (void *conn,
>  
>  static void message_handler_req_lib_confdb_object_parent_get (void *conn,
>                                                             const void 
> *message);
> +static void message_handler_req_lib_confdb_object_name_get (void *conn,
> +                                                           const void 
> *message);
>  static void message_handler_req_lib_confdb_write (void *conn,
>                                                 const void *message);
>  static void message_handler_req_lib_confdb_reload (void *conn,
> @@ -227,6 +229,10 @@ static struct corosync_lib_handler confdb_lib_engine[] =
>               .lib_handler_fn                         = 
> message_handler_req_lib_confdb_key_iter_typed,
>               .flow_control                           = 
> CS_LIB_FLOW_CONTROL_NOT_REQUIRED
>       },
> +     { /* 20 */
> +             .lib_handler_fn                         = 
> message_handler_req_lib_confdb_object_name_get,
> +             .flow_control                           = 
> CS_LIB_FLOW_CONTROL_NOT_REQUIRED
> +     },
>  };
>  
>  
> @@ -570,6 +576,28 @@ static void 
> message_handler_req_lib_confdb_object_parent_get (void *conn,
>       api->ipc_response_send(conn, &res_lib_confdb_object_parent_get, 
> sizeof(res_lib_confdb_object_parent_get));
>  }
>  
> +static void message_handler_req_lib_confdb_object_name_get (void *conn,
> +                                                           const void 
> *message)
> +{
> +     const struct req_lib_confdb_object_name_get *request = message;
> +     struct res_lib_confdb_object_name_get response;
> +     int ret = CS_OK;
> +     char object_name[CS_MAX_NAME_LENGTH];
> +     size_t object_name_len;
> +
> +     if (api->object_name_get(request->object_handle,
> +                             object_name, &object_name_len)) {
> +             ret = CS_ERR_ACCESS;
> +     }
> +
> +     response.object_name.length = object_name_len;
> +     strncpy((char*)response.object_name.value, object_name, 
> CS_MAX_NAME_LENGTH);
> +     response.object_name.value[CS_MAX_NAME_LENGTH-1] = '\0';
> +     response.header.size = sizeof(response);
> +     response.header.id = MESSAGE_RES_CONFDB_OBJECT_NAME_GET;
> +     response.header.error = ret;
> +     api->ipc_response_send(conn, &response, sizeof(response));
> +}
>  
>  static void message_handler_req_lib_confdb_key_iter (void *conn,
>                                                    const void *message)

Reviewed-by: Seven Dake <[email protected]>
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to