#include #include #include #include #include #define MY_ENCODING "ISO-8859-1" int id_generator() { static int rand = 0; if (!rand) rand = random(); return rand+1; } xmlChar *ConvertInput(const char *in, const char *encoding) { xmlChar *out; int ret; int size; int out_size; int temp; xmlCharEncodingHandlerPtr handler; LIBXML_TEST_VERSION; if (in == 0) return 0; handler = xmlFindCharEncodingHandler(encoding); if (!handler) { printf("ConvertInput: no encoding handler found for '%s'\n", encoding ? encoding : ""); return 0; } size = (int) strlen(in) + 1; out_size = size * 2 - 1; out = (unsigned char *) xmlMalloc((size_t) out_size); if (out != 0) { temp = size - 1; ret = handler->input(out, &out_size, (const xmlChar *) in, &temp); if ((ret < 0) || (temp - size + 1)) { if (ret < 0) { printf("ConvertInput: conversion wasn't successful.\n"); } else { printf ("ConvertInput: conversion wasn't successful. converted: %i octets.\n", temp); } xmlFree(out); out = 0; } else { out = (unsigned char *) xmlRealloc(out, out_size + 1); out[out_size] = 0; /*null terminating out */ } } else { printf("ConvertInput: no mem\n"); } return out; } int start_xml_document(xmlTextWriterPtr *writer, xmlBufferPtr *buf) { int rc; *buf = xmlBufferCreate(); if (*buf == NULL) { fprintf(stderr, "initialise_connection: Error creating the xml buffer\n"); return 0; } *writer = xmlNewTextWriterMemory(*buf, 0); if (*writer == NULL) { printf("initialise_connection: Error creating the xml writer\n"); return 0; } rc = xmlTextWriterStartDocument(*writer, NULL, MY_ENCODING, NULL); if (rc < 0) { printf ("initialise_connection: Error at xmlTextWriterStartDocument\n"); // Return error here return 0; } rc = xmlTextWriterStartElement(*writer, BAD_CAST "semfs"); if (rc < 0) { printf ("initialise_connection: Error at xmlTextWriterStartElement\n"); return 0; } rc = xmlTextWriterStartElement(*writer, BAD_CAST "event"); if (rc < 0) { printf ("initialise_connection: Error at xmlTextWriterStartElement\n"); return 0; } return 1; } char *close_xml_document(xmlTextWriterPtr *writer, xmlBufferPtr *buf) { char *ret; int rc; rc = xmlTextWriterEndElement(*writer); if (rc < 0) { printf ("initialise_connection: Error at xmlTextWriterEndElement\n"); return NULL; } rc = xmlTextWriterEndDocument(*writer); if (rc < 0) { printf ("initialise_connection: Error at xmlTextWriterEndDocument\n"); return NULL; } xmlFreeTextWriter(*writer); // printf("%s", (*buf)->content); ret = strdup((*buf)->content); xmlBufferFree(*buf); return ret; } char *initialise_connection(char *uuid, char *mnt_point) { int rc; xmlTextWriterPtr writer; xmlBufferPtr buf; xmlChar *tmp; if (!start_xml_document(&writer, &buf)) return NULL; tmp = ConvertInput(uuid, MY_ENCODING); printf ("UUID: %s\n", tmp); rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "uid", BAD_CAST uuid); if (rc < 0) { printf ("initialise_connection: Error at xmlTextWriterWriteAttribute\n"); return NULL; } if (tmp != NULL) xmlFree(tmp); rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "mountPoint", BAD_CAST mnt_point); if (rc < 0) { printf ("initialise_connection: Error at xmlTextWriterWriteAttribute\n"); return NULL; } rc = xmlTextWriterWriteAttribute(writer, BAD_CAST "action", BAD_CAST "start"); if (rc < 0) { printf ("initialise_connection: Error at xmlTextWriterWriteAttribute\n"); return NULL; } return close_xml_document(&writer, &buf); } int notify_create(semfs_ino_t parent, semfs_ino_t child) { int rc; xmlTextWriterPtr writer; xmlBufferPtr buf; xmlChar *tmp; char **path; char *xml_doc; if (!start_xml_document(&writer, &buf)) return 0; if (xmlTextWriterWriteFormatAttribute(writer, BAD_CAST "id", "%d", id_generator()) < 0) return 0; if (xmlTextWriterWriteAttribute(writer, BAD_CAST "action", BAD_CAST "create") < 0) return 0; if (ext2fs_get_pathname (semfs.fs, parent, ino, path)) return 0; tmp = ConvertInput(*path, MY_ENCODING); if (xmlTextWriterWriteElement(writer, BAD_CAST "file", BAD_CAST tmp) < 0) { free(*path); xmlFree(tmp); return 0; } xml_doc = close_xml_document(&writer, &buf); printf ("XML DOCUMENT:\n%s\n", xml_doc); return 1; }