rendered paste body#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/encoding.h>
#include <libxml/xmlwriter.h>
#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;
}