ldom_xmpp_client.c revision e6590bdc0d540003c7df26f1d3b66db7cae9be2c
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * CDDL HEADER START
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * The contents of this file are subject to the terms of the
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Common Development and Distribution License (the "License").
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * You may not use this file except in compliance with the License.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * See the License for the specific language governing permissions
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * and limitations under the License.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * When distributing Covered Code, include this CDDL HEADER in each
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * If applicable, add the following below this CDDL HEADER, with the
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * fields enclosed by brackets "[]" replaced with your own identifying
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * information: Portions Copyright [yyyy] [name of copyright owner]
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * CDDL HEADER END
e6590bdc0d540003c7df26f1d3b66db7cae9be2cVuong Nguyen * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Use is subject to license terms.
c95876f50441415f3e5c0424ecdbb7fb6db06f74Vuong Nguyen * ldom_xmpp_client.c Extensible Messaging and Presence Protocol (XMPP)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Implement an xmpp client to subscribe for domain events from the ldmd.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Notify fmd module clients upon receiving the events.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef struct xmpp_conn {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen/* Forward declaration */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic int iowrite(xmpp_conn_t *conn, char *buf, int size);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic void start_element(void *state, const xmlChar *name,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic void end_element(void *state, const xmlChar *name);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic void error_func(void *state, const char *msg, ...);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic void handle_ldm_resp(xmpp_conn_t *conn, char *buf, size_t buf_size);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic void handle_ldm_event(xmpp_conn_t *conn, char *buf, size_t buf_size);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic int xmpp_enable = 0;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic pthread_mutex_t xmpp_tid_lock = PTHREAD_MUTEX_INITIALIZER;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic client_list_t clt_list = { NULL, NULL, PTHREAD_MUTEX_INITIALIZER };
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen#define FUNCTION_ADD(_function, _pointer, _lib, _func_name, _ret) \
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen _function = (_pointer)dlsym(_lib, _func_name); \
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Prototypes and pointers to functions needed from libssl.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef void (*SSL_load_error_strings_pt)(void);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef int (*SSL_library_init_pt)(void);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef SSL_CTX *(*SSL_CTX_new_pt)(const SSL_METHOD *method);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef SSL_METHOD *(*SSLv23_client_method_pt)(void);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef int (*SSL_write_pt)(SSL *ssl, const void *buf, int num);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef int (*SSL_CTX_use_PrivateKey_file_pt)(SSL_CTX *ctx, const char *file,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef void (*RAND_seed_pt)(const void *buf, int num);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef int (*SSL_get_error_pt)(const SSL *ssl, int ret);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef long (*ERR_get_error_pt)(void);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef char *(*ERR_error_string_pt)(unsigned long e, char *buf);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef int (*SSL_CTX_use_certificate_chain_file_pt)(SSL_CTX *ctx,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen const char *file);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef int (*SSL_read_pt)(SSL *ssl, void *buf, int num);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyentypedef SSL_CTX *(*SSL_get_SSL_CTX_pt)(const SSL *ssl);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic SSL_load_error_strings_pt SSL_load_error_strings_f = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic SSL_library_init_pt SSL_library_init_f = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic SSLv23_client_method_pt SSLv23_client_method_f = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic SSL_CTX_use_PrivateKey_file_pt SSL_CTX_use_PrivateKey_file_f = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic ERR_error_string_pt ERR_error_string_f = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic SSL_get_SSL_CTX_pt SSL_get_SSL_CTX_f = NULL;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen sizeof (event_table) / sizeof (ldom_event_info_t);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen 0, /* unsigned int */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen } else if (xmlStrcmp(name, STARTTLS_NODE) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) iowrite(conn, START_TLS, strlen(START_TLS));
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen } else if (xmlStrcmp(name, PROCEED_NODE) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen } else if (xmlStrcmp(name, FEATURE_NODE) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) iowrite(conn, (char *)LDM_REG_DOMAIN_EVENTS,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen } else if (xmlStrcmp(name, XML_LDM_INTERFACE) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen } else if (xmlStrcmp(name, XML_LDM_EVENT) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen } else if (xmlStrcmp(name, XML_FAILURE) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstart_element(void *state, const xmlChar *name, const xmlChar **attrs)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen serveraddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen serveraddr.sin_port = htons(XMPP_DEFAULT_PORT);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (connect(sock, (struct sockaddr *)(&serveraddr),
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen sizeof (struct sockaddr_in)) < 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen conn->parser = xmlCreatePushParserCtxt(&xml_handler, (void *) conn,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * notify_event()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Notify all clients an event by going through the client list and invoke
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * the callback functions.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyennotify_event(ldom_event_t event, char *ldom_name)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (p = clt_list.head; p != NULL; p = p->next) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * xmpp_client_thr()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * The main entry fo the xmpp client thread.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenstatic void *
e6590bdc0d540003c7df26f1d3b66db7cae9be2cVuong Nguyen /* clear the conn struct */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* keep making a connection until successfully */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* write the stream node */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* process input */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (conn.state != CONN_STATE_DONE) && xmpp_enable) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Assume the document size of a ldmd response is
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * less than 1KB. This assumption is valid with the
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * current ldmd implementation.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Should the document size exceeds 1KB, the buffer
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * size should be revisited accordingly.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (rc = xmlParseChunk(conn.parser, buf, cnt, 0)) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * For now, the parser is reset after every read.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * It should only be reset once after the ssl is opened
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * in the start_tls().
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) xmlCtxtResetPush(conn.parser, NULL, NULL, NULL,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * find_client()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Walk to the list to find a libldom client
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (p = clt_list.head; p != NULL; p = p->next) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * xmpp_add_client()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Add a libldom client from the client list.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenxmpp_add_client(ldom_hdl_t *lhp, ldom_reg_cb_t cb, ldom_cb_arg_t data)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* already exists */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* new client */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen clt = (client_info_t *)ldom_alloc(sizeof (client_info_t));
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (clt_list.head == NULL && clt_list.tail == NULL) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* append to the list */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * xmpp_remove_client()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Remove a libldom client from the client list.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* not present */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (clt_list.head == p && clt_list.tail == p) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* single item list */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* delete the head */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* delete the tail */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* delete a middle node */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * xmpp_stop()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Stop the xmpp client thread
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * xmpp_start()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Start the xmpp client thread if have not done so.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* Check if the xmmp thread has already started */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* Check if the ldmd supports xmpp by opening a connection */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * create xmpp client thread for receiving domain events
e6590bdc0d540003c7df26f1d3b66db7cae9be2cVuong Nguyen * xmpp_thr_sig stores the signal number that is not currently masked.
e6590bdc0d540003c7df26f1d3b66db7cae9be2cVuong Nguyen * It is used to stop the client thread.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) pthread_create(&xmpp_tid, NULL, xmpp_client_thr, NULL);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Register a function to stop the above thread upon a termination
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * This routine will run through the first time we get a remote XMPP
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * connection. After that we will not need to do this again. It cannot be run
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * from main thread at start as we need to alert remote users if the TLS
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * handshake failed.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* If we have already opened the library no need to do it again. */
c95876f50441415f3e5c0424ecdbb7fb6db06f74Vuong Nguyen * If the libssl.so in not in the default path, attempt to open it
c95876f50441415f3e5c0424ecdbb7fb6db06f74Vuong Nguyen xmpp_dl = dlopen("/usr/sfw/lib/libssl.so", RTLD_NOW);
c95876f50441415f3e5c0424ecdbb7fb6db06f74Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_load_error_strings_f, SSL_load_error_strings_pt,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_library_init_f, SSL_library_init_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_CTX_new_f, SSL_CTX_new_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSLv23_client_method_f, SSLv23_client_method_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_write_f, SSL_write_pt, xmpp_dl, "SSL_write", ret);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(RAND_seed_f, RAND_seed_pt, xmpp_dl, "RAND_seed", ret);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_get_error_f, SSL_get_error_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(ERR_get_error_f, ERR_get_error_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(ERR_error_string_f, ERR_error_string_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_connect_f, SSL_connect_pt, xmpp_dl, "SSL_connect",
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_CTX_use_certificate_chain_file_f,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen SSL_CTX_use_certificate_chain_file_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_set_fd_f, SSL_set_fd_pt, xmpp_dl, "SSL_set_fd", ret);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_free_f, SSL_free_pt, xmpp_dl, "SSL_free", ret);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_read_f, SSL_read_pt, xmpp_dl, "SSL_read", ret);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_new_f, SSL_new_pt, xmpp_dl, "SSL_new", ret);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_get_SSL_CTX_f, SSL_get_SSL_CTX_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen FUNCTION_ADD(SSL_CTX_free_f, SSL_CTX_free_pt, xmpp_dl,
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * start_tls()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Load the libssl.so if has not done so and open a ssl connection.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * It is assumed that there is one xmpp thread to use the ssl connection.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * If multi-thread xmpp clients use the ssl connection, addtional work is
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * needed to ensure the usage of the ssl be thread-safe.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) read(urand_fd, rand_buf, RAND_BUF_SIZE);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen ssl_ctx = SSL_CTX_new_f(SSLv23_client_method_f());
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen return (-1);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen (void) iowrite(conn, STREAM_START, strlen(STREAM_START));
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Find and return the first-level subnode (if any) of 'node' which has name
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenxml_find_subnode(xmlNodePtr node, const xmlChar *name)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * handle_ldm_resp()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Parse the ldmd response of the domain event registration for the failure
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * status. If found, set the connection to failure so that it will be
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * closed and a new xmpp connection is established.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenhandle_ldm_resp(xmpp_conn_t *conn, char *buf, size_t buf_size)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((xml_output = xmlParseMemory((const char *)buf, buf_size)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((root = xmlDocGetRootElement(xml_output)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* get the cmd node */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((cmd = xml_find_subnode(root, XML_CMD)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (strcmp((char *)cmd->name, (char *)XML_CMD) != 0)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* get the action node and make sure it is the reg-domain-events */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((action = xml_find_subnode(cmd, XML_ACTION)) == NULL) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((action_str = (char *)xmlNodeGetContent(action)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (strcmp(action_str, XML_REGISTER_ACTION) != 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* check the status of the response */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((resp = xml_find_subnode(cmd, XML_RESPONSE)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((status = xml_find_subnode(resp, XML_STATUS)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((status_str = (char *)xmlNodeGetContent(status)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if (strcmp(status_str, (char *)XML_FAILURE) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * handle_ldm_event()
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Description:
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * Parse the LDM_event for the ldom name and domain action. Then invokes
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen * the clients's callback to notify them the event.
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyenhandle_ldm_event(xmpp_conn_t *conn, char *buf, size_t buf_size)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen xmlNodePtr root, cmd, action, data, envelope, content;
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((xml_output = xmlParseMemory((const char *)buf, buf_size)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((root = xmlDocGetRootElement(xml_output)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* get the action such as bind-domain, unbind-domain, etc. */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((cmd = xml_find_subnode(root, XML_CMD)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((action = xml_find_subnode(cmd, XML_ACTION)) == NULL) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((action_str = (char *)xmlNodeGetContent(action)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen for (i = 0; i < event_table_size; i++) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen strcasecmp(event_table[i].name, action_str) == 0) {
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* get the ldom name */
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen envelope = xml_find_subnode(data, XML_ENVELOPE);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen content = xml_find_subnode(envelope, XML_CONTENT);
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen if ((ldom_name = (char *)xmlGetProp(content, XML_ATTR_ID)) == NULL)
25351652d920ae27c5a56c199da581033ce763f6Vuong Nguyen /* Notifies all the clients the event */