| /******************************************************************************* |
| * Copyright (C) 2004-2006 Intel Corp. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * - Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * - Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * - Neither the name of Intel Corp. nor the names of its |
| * contributors may be used to endorse or promote products derived from this |
| * software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL Intel Corp. OR THE CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| *******************************************************************************/ |
| |
| /** |
| * @author Liang Hou |
| */ |
| #ifdef HAVE_CONFIG_H |
| #include <wsman_config.h> |
| #endif |
| |
| #include "stdlib.h" |
| #include "stdio.h" |
| #include <string.h> |
| #ifdef HAVE_DIRENT_H |
| #include <dirent.h> |
| #endif |
| #include "u/libu.h" |
| #include "wsman-soap.h" |
| #include "wsman-names.h" |
| #include "wsman-types.h" |
| #include "wsman-xml-api.h" |
| #include "wsman-xml-binding.h" |
| |
| int LocalSubscriptionOpInit (char * uri_repository, void *opaqueData); |
| int LocalSubscriptionOpFinalize (char * uri_repository, void *opaqueData); |
| int LocalSubscriptionOpGet (char * uri_repository, char * uuid, unsigned char **subscriptionDoc, int *len); |
| int LocalSubscriptionOpSearch (char * uri_repository, char * uuid); |
| int LocalSubscriptionOpLoad (char * uri_repository, list_t * subscription_list); |
| int LocalSubscriptionOpSave (char * uri_repository, char * uuid, unsigned char *subscriptionDoc); |
| int LocalSubscriptionOpUpdate (char * uri_repository, char * uuid, char *expire); |
| int LocalSubscriptionOpDelete (char * uri_repository, char * uuid); |
| |
| |
| struct __SubsRepositoryOpSet subscription_repository_op_set = { |
| LocalSubscriptionOpInit, |
| LocalSubscriptionOpFinalize, |
| LocalSubscriptionOpLoad, |
| LocalSubscriptionOpGet, |
| LocalSubscriptionOpSearch, |
| LocalSubscriptionOpSave, |
| LocalSubscriptionOpUpdate, |
| LocalSubscriptionOpDelete |
| }; |
| |
| static int LocalSubscriptionInitFlag = 0; |
| |
| SubsRepositoryOpSetH wsman_get_subsrepos_opset() |
| { |
| return &subscription_repository_op_set; |
| } |
| |
| int LocalSubscriptionOpInit (char * uri_repository, void *opaqueData) |
| { |
| LocalSubscriptionInitFlag = 1; |
| |
| return 0; |
| } |
| |
| int LocalSubscriptionOpFinalize(char * uri_repository, void *opaqueData) |
| { |
| return (LocalSubscriptionInitFlag == 0) ? -1 : 0; |
| } |
| |
| int LocalSubscriptionOpGet(char * uri_repository, char * uuid, unsigned char **subscriptionDoc, int *len) |
| { |
| unsigned char block[512]; |
| unsigned char *buf = NULL; |
| int count,m; |
| int pre_count; |
| char *subs_path; |
| FILE *fp; |
| |
| count = m = 0; |
| *subscriptionDoc = NULL; |
| if (LocalSubscriptionInitFlag == 0) |
| return -1; |
| subs_path = u_strdup_printf ("%s/uuid:%s", uri_repository, uuid); |
| fp = fopen(subs_path, "r"); |
| if (fp == NULL) { |
| error("Can't open %s: %s", subs_path, strerror(errno)); |
| u_free(subs_path); |
| return -1; |
| } |
| u_free(subs_path); |
| while (!feof(fp)) { |
| memset(block, 0, 512); |
| m = fread(block, 1, 511, fp); |
| if (m > 0) { |
| debug("read [%s] from file, len = %d",block, m); |
| pre_count = count; |
| count += m; |
| debug("buf = %0x, count = %d", buf, count); |
| buf = u_realloc(buf, count); |
| memcpy(buf+pre_count, block, m); |
| } |
| } |
| fclose(fp); |
| *subscriptionDoc = buf; |
| *len = count; |
| return 0; |
| } |
| |
| int LocalSubscriptionOpSearch(char * uri_repository, char * uuid) |
| { |
| char *subs_path; |
| FILE *fp; |
| if (LocalSubscriptionInitFlag == 0) |
| return -1; |
| subs_path = u_strdup_printf ("%s/uuid:%s", uri_repository, uuid); |
| fp = fopen(subs_path, "r"); |
| if (fp == NULL) { |
| error("Can't open %s: %s", subs_path, strerror(errno)); |
| u_free(subs_path); |
| return -1; |
| } |
| u_free(subs_path); |
| fclose(fp); |
| return 0; |
| } |
| |
| int LocalSubscriptionOpLoad (char * uri_repository, list_t * subscription_list) |
| { |
| struct dirent **namelist; |
| int n, m, count; |
| int pre_count; |
| char block[512]; |
| unsigned char *buf = NULL; |
| |
| if (LocalSubscriptionInitFlag == 0) |
| return -1; |
| if (subscription_list == NULL) |
| return -1; |
| if (0 > (n = scandir (uri_repository, &namelist, 0, alphasort))) { |
| return -1; |
| } |
| else { |
| while (n--) { |
| char *subs_path; |
| FILE *subs; |
| lnode_t *node; |
| |
| if (strstr(namelist[n]->d_name,"uuid") == NULL || strlen(namelist[n]->d_name) < 41) { |
| u_free(namelist[n]); |
| continue; |
| } |
| subs_path = u_strdup_printf ("%s/%s", uri_repository, namelist[n]->d_name); |
| subs = fopen(subs_path, "r"); |
| if (subs == NULL) { |
| error("Can't open %s: %s", subs_path, strerror(errno)); |
| u_free(subs_path); |
| return -1; |
| } |
| u_free(subs_path); |
| count = 0; |
| buf = NULL; |
| while (!feof(subs)) { |
| memset(block, 0, 512); |
| m = fread(block, 1, 511, subs); |
| if (m > 0) { |
| pre_count = count; |
| count += m; |
| buf = u_realloc(buf, count); |
| memcpy(buf+pre_count, block, m); |
| } |
| } |
| fclose(subs); |
| SubsRepositoryEntryH entry = u_malloc(sizeof(*entry)); |
| if (entry) { |
| entry->strdoc = buf; |
| entry->len = count; |
| entry->uuid = u_strdup(namelist[n]->d_name); |
| node = lnode_create(entry); |
| list_append(subscription_list, node); |
| debug("subscription file found: %s", namelist[n]->d_name ); |
| } |
| u_free(namelist[n]); |
| } |
| u_free(namelist); |
| } |
| return 0; |
| } |
| |
| int LocalSubscriptionOpSave (char * uri_repository, char * uuid, unsigned char *subscriptionDoc) |
| { |
| char buf[U_NAME_MAX]; |
| FILE *subsfile; |
| |
| if (LocalSubscriptionInitFlag == 0) |
| return -1; |
| snprintf(buf, U_NAME_MAX, "%s/uuid:%s", uri_repository, uuid); |
| subsfile = fopen(buf, "w"); |
| if (subsfile == NULL) { |
| error("Can't open %s: %s", buf, strerror(errno)); |
| return -1; |
| } |
| fprintf(subsfile, "%s", subscriptionDoc); |
| fclose(subsfile); |
| return 0; |
| } |
| |
| int LocalSubscriptionOpUpdate(char * uri_repository, char * uuid, char *expire) |
| { |
| char buf[U_NAME_MAX]; |
| WsXmlDocH doc= NULL; |
| char *temp; |
| int len = 0; |
| |
| if (LocalSubscriptionInitFlag == 0) |
| return -1; |
| snprintf(buf, U_NAME_MAX, "%s/uuid:%s", uri_repository, uuid); |
| doc = xml_parser_file_to_doc( buf, "UTF-8", 0); |
| if (doc) { |
| FILE *subsfile; |
| WsXmlNodeH node = ws_xml_get_child(ws_xml_get_soap_body(doc), |
| 0, XML_NS_EVENTING, WSEVENT_SUBSCRIBE); |
| node = ws_xml_get_child(node, 0, XML_NS_EVENTING, WSEVENT_EXPIRES); |
| ws_xml_set_node_text(node, expire); |
| ws_xml_dump_memory_enc(doc, &temp, &len, "UTF-8"); |
| subsfile = fopen(buf, "w"); |
| if (subsfile == NULL) { |
| error("Can't open %s: %s", buf, strerror(errno)); |
| return -1; |
| } |
| fprintf(subsfile, "%s", temp); |
| fclose(subsfile); |
| ws_xml_free_memory(temp); |
| ws_xml_destroy_doc(doc); |
| } |
| return 0; |
| } |
| |
| int LocalSubscriptionOpDelete (char * uri_repository, char * uuid) |
| { |
| char buf[U_NAME_MAX]; |
| |
| if (LocalSubscriptionInitFlag == 0) |
| return -1; |
| snprintf(buf, U_NAME_MAX, "%s/uuid:%s", uri_repository, uuid); |
| if (unlink(buf)) { |
| debug("unlink %s failed! %s", buf, strerror(errno)); |
| } |
| return 0; |
| } |