[Commits] r683 - in trunk/daemon: . extensions lib lib/pyovcp src
new-commit at lists.openvcp.org
new-commit at lists.openvcp.org
Tue Dec 29 20:46:00 UTC 2009
Author: ftx
Date: 2009-12-29 20:45:59 +0000 (Tue, 29 Dec 2009)
New Revision: 683
Added:
trunk/daemon/extensions/
trunk/daemon/extensions/testmod.py
trunk/daemon/lib/ovcpxml.c
trunk/daemon/lib/ovcpxml.h
trunk/daemon/lib/pyovcp/
trunk/daemon/lib/pyovcp/Makefile.in
trunk/daemon/lib/pyovcp/pyovcp.c
trunk/daemon/lib/pyovcp/pyovcp.h
trunk/daemon/lib/pyovcp/pyovcpdata.c
trunk/daemon/lib/pyovcp/pyovcpdata.h
trunk/daemon/lib/pyovcp/pyovcprequest.c
trunk/daemon/lib/pyovcp/pyovcprequest.h
trunk/daemon/lib/pyovcp/pyovcpresponse.c
trunk/daemon/lib/pyovcp/pyovcpresponse.h
Removed:
trunk/daemon/src/parse_ipfmlogs.c
trunk/daemon/src/xml.c
trunk/daemon/src/xml.h
Modified:
trunk/daemon/Makefile.in
trunk/daemon/configure.ac
trunk/daemon/lib/strings.c
trunk/daemon/src/bandwidth.c
trunk/daemon/src/bandwidth.h
trunk/daemon/src/filter.c
trunk/daemon/src/get.h
trunk/daemon/src/logtraffic.c
trunk/daemon/src/main.c
trunk/daemon/src/misc.c
trunk/daemon/src/modules.c
trunk/daemon/src/modules.h
trunk/daemon/src/node.c
trunk/daemon/src/node.h
trunk/daemon/src/request.c
trunk/daemon/src/request.h
trunk/daemon/src/set.h
trunk/daemon/src/traffic.c
trunk/daemon/src/trafficlimit.c
trunk/daemon/src/userbackup.c
Log:
added python module support (experimental)
really crazy stuff
Modified: trunk/daemon/Makefile.in
===================================================================
--- trunk/daemon/Makefile.in 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/Makefile.in 2009-12-29 20:45:59 UTC (rev 683)
@@ -5,15 +5,15 @@
REV:=$(shell svnversion 2>/dev/null | sed 's/M//')
CC=@CC@
-CFLAGS=@CFLAGS@ @DEFS@ -DOPENVCP_CONFIG=\"$(sysconfdir)/openvcpd.conf\" -DOPENVCP_DATA=\"$(datadir)/openvcpd\" -Ilib/ -Isrc/ -rdynamic -DREVISION=\"$(REV)\"
+CFLAGS=@CFLAGS@ @DEFS@ -DOPENVCP_CONFIG=\"$(sysconfdir)/openvcpd.conf\" -DOPENVCP_DATA=\"$(datadir)/openvcpd\" -Ilib/ -Isrc/ -rdynamic -DREVISION=\"$(REV)\" `python-config --cflags`
LDFLAGS=@LDFLAGS@
-LIBS=@LIBS@
+LIBS=@LIBS@ `python-config --ldflags`
-OBJECTS = lib/libiptc/libip6tc.o lib/libiptc/libip4tc.o src/modules.o src/misc.o src/node.o src/traffic.o src/logtraffic.o src/setup.o src/set.o src/parseconfig.o src/get.o src/request.o lib/fs.o lib/strings.o src/xml.o src/filter.o src/bandwidth.o src/trafficlimit.o src/userbackup.o
+OBJECTS = lib/libiptc/libip6tc.o lib/libiptc/libip4tc.o src/modules.o src/misc.o src/node.o src/traffic.o src/logtraffic.o src/setup.o src/set.o src/parseconfig.o src/get.o src/request.o lib/fs.o lib/strings.o lib/ovcpxml.o src/filter.o src/bandwidth.o src/trafficlimit.o src/userbackup.o
-all: openvcpd parse_ipfmlogs
-openvcpd: $(OBJECTS)
- $(CC) $(CFLAGS) -o openvcpd src/main.c $(OBJECTS) $(LIBS)
+all: openvcpd lib/pyovcp/ovcp.so
+openvcpd: src/main.c $(OBJECTS) lib/pyovcp/pyovcp.a
+ $(CC) $(CFLAGS) -o openvcpd src/main.c $(OBJECTS) $(LIBS) lib/pyovcp/pyovcp.a
src/modules.o: src/modules.c
src/parseconfig.o: src/parseconfig.c
@@ -25,7 +25,6 @@
src/traffic.o: src/traffic.c
src/logtraffic.o: src/logtraffic.c
src/node.o: src/node.c
-src/xml.o: src/xml.c
src/filter.o: src/filter.c
lib/fs.o: lib/fs.c
lib/strings.o: lib/strings.c
@@ -33,6 +32,8 @@
src/trafficlimit.o: src/trafficlimit.c
src/userbackup.o: src/userbackup.c
+lib/ovcpxml.o: lib/ovcpxml.c
+ $(CC) $(CFLAGS) -fPIC -c lib/ovcpxml.c -o lib/ovcpxml.o
lib/libiptc/libip4tc.o:
cd lib/libiptc/; make libip4tc.o;
@@ -40,24 +41,26 @@
lib/libiptc/libip6tc.o:
cd lib/libiptc/; make libip6tc.o;
-parse_ipfmlogs: src/parse_ipfmlogs.c lib/fs.o lib/strings.o
- $(CC) $(LIBS) $(CFLAGS) -o parse_ipfmlogs src/parse_ipfmlogs.c lib/fs.o lib/strings.o
+lib/pyovcp/ovcp.so:
+ cd lib/pyovcp/; make ovcp.so;
+
+lib/pyovcp/pyovcp.a:
+ cd lib/pyovcp/; make pyovcp.a;
-
-
clean:
@rm -f $(OBJECTS)
@rm -f openvcpd
- @rm -f parse_ipfmlogs
+ @rm -f lib/pyovcp.o lib/pyovcp.so
cd lib/libiptc/; make clean;
+ cd lib/pyovcp; make clean;
install:
mkdir -p "$(DESTDIR)/$(datadir)"/openvcpd \
"$(DESTDIR)/$(bindir)" \
"$(DESTDIR)/$(sysconfdir)"
cp openvcpd "$(DESTDIR)/$(bindir)"/openvcpd
- cp parse_ipfmlogs "$(DESTDIR)/$(bindir)"/parse_ipfmlogs
+
@if (test -e "$(DESTDIR)/$(sysconfdir)"/openvcpd.conf); then \
echo "Configuration File exists. Please check for updates of the configurationfile"; \
else \
Modified: trunk/daemon/configure.ac
===================================================================
--- trunk/daemon/configure.ac 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/configure.ac 2009-12-29 20:45:59 UTC (rev 683)
@@ -88,6 +88,6 @@
CFLAGS="$CFLAGS $xmlflags"
-AC_CONFIG_FILES([Makefile lib/libiptc/Makefile])
+AC_CONFIG_FILES([Makefile lib/libiptc/Makefile lib/pyovcp/Makefile])
AC_OUTPUT
Added: trunk/daemon/extensions/testmod.py
===================================================================
--- trunk/daemon/extensions/testmod.py (rev 0)
+++ trunk/daemon/extensions/testmod.py 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,17 @@
+import ovcp
+
+def testmethod(req):
+ resp = ovcp.Response()
+ dat=req.getArg(0)
+ print dat.type()
+ print dat.getContent();
+ resp.addInt(22)
+
+ return resp
+
+
+
+
+ovcp.addMethod("vserver", "pytest", testmethod)
+
+
Copied: trunk/daemon/lib/ovcpxml.c (from rev 672, trunk/daemon/src/xml.c)
===================================================================
--- trunk/daemon/lib/ovcpxml.c (rev 0)
+++ trunk/daemon/lib/ovcpxml.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,1529 @@
+/* OpenVCP
+ * Copyright (C) 2006 Gerrit Wyen <gerrit at t4a.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#include <libxml/encoding.h>
+#include <libxml/xmlwriter.h>
+#include <libxml/xmlreader.h>
+
+#include "ovcpxml.h"
+
+
+
+#ifdef DEBUG_XML
+ #define XML_DEBUG(args) printf args
+#else
+ #define XML_DEBUG(...)
+#endif
+
+
+
+
+/* XML Writing */
+
+struct ovcp_response_st *ovcp_response_new(void)
+{
+ int rc;
+ struct ovcp_response_st *response;
+
+ response = (struct ovcp_response_st *)malloc(sizeof(struct ovcp_response_st));
+
+
+ response->buf = xmlBufferCreate();
+ if (response->buf == NULL)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error creating the xml buffer\n"));
+ free(response);
+ return NULL;
+ }
+
+ response->writer = xmlNewTextWriterMemory(response->buf, 0);
+ if (response->writer == NULL)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error creating the xml writer\n"));
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+
+ rc = xmlTextWriterStartDocument(response->writer, NULL, "utf-8", NULL);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n"));
+ xmlFreeTextWriter(response->writer);
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "methodResponse");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ xmlFreeTextWriter(response->writer);
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "params");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ xmlFreeTextWriter(response->writer);
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+ return response;
+}
+
+int ovcp_response_array_new(struct ovcp_response_st *response)
+{
+ int rc;
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "array");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "data");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_array_add_string(struct ovcp_response_st *response, char *string)
+{
+ int rc;
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "string", BAD_CAST string);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_array_add_int(struct ovcp_response_st *response, int value)
+{
+ int rc;
+ char value_str[12];
+
+ snprintf(value_str, 12, "%d", value);
+
+
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "int", BAD_CAST value_str);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_array_end(struct ovcp_response_st *response)
+{
+ int rc;
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_struct_new(struct ovcp_response_st *response)
+{
+ int rc;
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "struct");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_struct_end(struct ovcp_response_st *response)
+{
+ int rc;
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_struct_add_string(struct ovcp_response_st *response, char *name, char *string)
+{
+ int rc;
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "member");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "name", BAD_CAST name);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "string", BAD_CAST string);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_struct_add_int(struct ovcp_response_st *response, char *name, int value)
+{
+ int rc;
+ char value_str[12];
+
+ snprintf(value_str, 12, "%d", value);
+
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "member");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "name", BAD_CAST name);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "int", BAD_CAST value_str);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return rc;
+}
+
+int ovcp_response_struct_add_boolean(struct ovcp_response_st *response, char *name, int value)
+{
+ int rc;
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "member");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "name", BAD_CAST name);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ if(value == 1)
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "boolean", BAD_CAST "1");
+ else
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "boolean", BAD_CAST "0");
+
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return rc;
+}
+
+int ovcp_response_struct_add_double(struct ovcp_response_st *response, char *name, double value)
+{
+ int rc;
+ char value_str[20];
+
+ snprintf(value_str, 20, "%lf", value);
+
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "member");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "name", BAD_CAST name);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "double", BAD_CAST value_str);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_add_string(struct ovcp_response_st *response, char *string)
+{
+ int rc;
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "string", BAD_CAST string);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_add_int(struct ovcp_response_st *response, int value)
+{
+ int rc;
+ char value_str[12];
+
+ snprintf(value_str, 12, "%d", value);
+
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "int", BAD_CAST value_str);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_add_double(struct ovcp_response_st *response, double value)
+{
+ int rc;
+ char value_str[20];
+
+ snprintf(value_str, 20, "%lf", value);
+
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "double", BAD_CAST value_str);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+int ovcp_response_add_boolean(struct ovcp_response_st *response, int value)
+{
+ int rc;
+
+
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ return -1;
+ }
+
+ if(value == 1)
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "boolean", BAD_CAST "1");
+ else
+ rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "boolean", BAD_CAST "0");
+
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ rc = xmlTextWriterEndElement(response->writer);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
+ return -1;
+ }
+
+ return 0;
+}
+
+struct ovcp_response_st *ovcp_response_error(int code, char *desc)
+{
+ int rc;
+ struct ovcp_response_st *response;
+
+ response = (struct ovcp_response_st *)malloc(sizeof(struct ovcp_response_st));
+
+
+ response->buf = xmlBufferCreate();
+ if (response->buf == NULL)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error creating the xml buffer\n"));
+ free(response);
+ return NULL;
+ }
+
+ response->writer = xmlNewTextWriterMemory(response->buf, 0);
+ if (response->writer == NULL)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error creating the xml writer\n"));
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+
+ rc = xmlTextWriterStartDocument(response->writer, NULL, "ISO-8859-1", NULL);
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n"));
+ xmlFreeTextWriter(response->writer);
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "methodResponse");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ xmlFreeTextWriter(response->writer);
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "fault");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ xmlFreeTextWriter(response->writer);
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+ rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
+ xmlFreeTextWriter(response->writer);
+ xmlBufferFree(response->buf);
+ free(response);
+ return NULL;
+ }
+
+ ovcp_response_struct_new(response);
+ ovcp_response_struct_add_int(response, "faultCode", code);
+ ovcp_response_struct_add_string(response, "faultString", desc);
+ ovcp_response_struct_end(response);
+
+ return response;
+}
+
+
+char *ovcp_response_finalize(struct ovcp_response_st *response)
+{
+ int rc;
+ char *xml_string;
+
+ rc = xmlTextWriterEndDocument(response->writer);
+
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndDocument\n"));
+ return NULL;
+ }
+
+ xmlFreeTextWriter(response->writer);
+
+ xml_string = strdup((char *)response->buf->content);
+
+ xmlBufferFree(response->buf);
+
+ free(response);
+
+ return xml_string;
+}
+
+
+int ovcp_free_response(struct ovcp_response_st *response)
+{
+ int rc;
+
+ rc = xmlTextWriterEndDocument(response->writer);
+
+ if (rc < 0)
+ {
+ XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndDocument\n"));
+ return -1;
+ }
+
+ xmlFreeTextWriter(response->writer);
+
+ xmlBufferFree(response->buf);
+
+ free(response);
+
+ return 0;
+}
+
+
+
+
+
+
+
+/* XML Reading */
+
+
+static struct ovcp_data_st *xml_parse_values(xmlTextReaderPtr reader);
+static struct ovcp_data_st *xml_parse_struct(xmlTextReaderPtr reader);
+static struct ovcp_data_st *xml_parse_array(xmlTextReaderPtr reader);
+static struct ovcp_data_st *xml_parse_param(xmlTextReaderPtr reader);
+static int ovcp_free_data(struct ovcp_data_st *data);
+
+
+struct ovcp_data_st *ovcp_request_get_arg(struct ovcp_request_st *request, int id)
+{
+ int i = 0;
+ struct ovcp_data_st *tmpdata;
+
+ tmpdata = request->data;
+
+ while(tmpdata != NULL)
+ {
+ if(i == id)
+ break;
+
+ tmpdata = tmpdata->next;
+ i++;
+ }
+
+ return tmpdata;
+}
+
+struct ovcp_data_st *ovcp_array_get_element(struct ovcp_data_st *array, int id)
+{
+ int i = 0;
+ struct ovcp_data_st *tmpdata;
+
+ tmpdata = array->sub;
+
+ while(tmpdata != NULL)
+ {
+ if(i == id)
+ break;
+
+ tmpdata = tmpdata->next;
+ i++;
+ }
+
+ return tmpdata;
+}
+
+struct ovcp_data_st *ovcp_struct_get_element(struct ovcp_data_st *structure, char *name)
+{
+ struct ovcp_data_st *data;
+
+ data = ovcp_struct_get_member(structure, name);
+
+ if(data != NULL)
+ return data->sub;
+
+ return NULL;
+}
+
+struct ovcp_data_st *ovcp_struct_get_member(struct ovcp_data_st *structure, char *name)
+{
+ struct ovcp_data_st *tmpdata;
+
+ if(structure->sub == NULL)
+ return NULL;
+
+ tmpdata = structure->sub;
+
+ while(tmpdata != NULL)
+ {
+ if(strcmp(tmpdata->data, name) == 0)
+ break;
+
+ tmpdata = tmpdata->next;
+ }
+
+
+ if(tmpdata == NULL)
+ return NULL;
+ else
+ return tmpdata;
+}
+
+inline void *ovcp_data_get(struct ovcp_data_st *data)
+{
+ return (data != NULL) ? data->data : NULL;
+}
+
+inline void *ovcp_member_get(struct ovcp_data_st *data)
+{
+ return (data != NULL) ? data->sub : NULL;
+}
+
+inline int ovcp_data_is_array(struct ovcp_data_st *data)
+{
+ return (data != NULL) ? (data->type == OVCP_XML_ARRAY) : 0;
+}
+
+int ovcp_data_is_struct(struct ovcp_data_st *data)
+{
+ return (data != NULL) ? (data->type == OVCP_XML_STRUCT) : 0;
+}
+
+inline int ovcp_data_is_int(struct ovcp_data_st *data)
+{
+ return (data != NULL) ? (data->type == OVCP_XML_INT) : 0;
+}
+
+inline int ovcp_data_is_double(struct ovcp_data_st *data)
+{
+ return (data != NULL) ? (data->type == OVCP_XML_DOUBLE) : 0;
+}
+
+inline int ovcp_data_is_boolean(struct ovcp_data_st *data)
+{
+ return (data != NULL) ? (data->type == OVCP_XML_BOOLEAN) : 0;
+}
+
+inline int ovcp_data_is_string(struct ovcp_data_st *data)
+{
+ return (data != NULL) ? (data->type == OVCP_XML_STRING) : 0;
+}
+
+static int ovcp_free_data(struct ovcp_data_st *data)
+{
+
+ if(data->data != NULL)
+ free(data->data);
+
+ if(data->next != NULL)
+ ovcp_free_data(data->next);
+ if(data->sub != NULL)
+ ovcp_free_data(data->sub);
+
+
+ free(data);
+
+ return 0;
+}
+
+
+int ovcp_free_request(struct ovcp_request_st *request)
+{
+ if(request->methodname != NULL)
+ free(request->methodname);
+
+ if(request->data != NULL)
+ ovcp_free_data(request->data);
+
+
+ free(request);
+
+
+ return 0;
+}
+
+
+struct ovcp_request_st *ovcp_parse_request(char *xmlstr)
+{
+ if(xmlstr == NULL) return NULL;
+ if(strlen(xmlstr) <= 0) return NULL;
+
+ xmlTextReaderPtr reader;
+ struct ovcp_request_st *request;
+ struct ovcp_data_st *tmpdata = NULL;
+ char *p;
+
+ request = (struct ovcp_request_st *) malloc(sizeof(struct ovcp_request_st));
+ memset(request, 0, sizeof(struct ovcp_request_st));
+
+ reader = xmlReaderForMemory(xmlstr, strlen(xmlstr), NULL, NULL, 0);
+
+ if (reader == NULL)
+ {
+ XML_DEBUG(("Unable to open buffer\n"));
+ ovcp_free_request(request);
+ return NULL;
+ }
+
+ xmlTextReaderRead(reader);
+
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+ if(strcmp(p, "methodCall") == 0)
+ {
+ xmlTextReaderRead(reader);
+
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+ if(strcmp(p, "methodName") == 0)
+ {
+ xmlTextReaderRead(reader);
+
+ p = (char *) xmlTextReaderConstValue(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error: methodName missing\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+ request->methodname = strdup(p);
+
+
+ xmlTextReaderRead(reader);
+
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+ if(strcmp(p,"methodName") != 0)
+ {
+ XML_DEBUG(("Parsing Error: methodName not terminated\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+
+ xmlTextReaderRead(reader);
+
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parse Error\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+ if(strcmp(p, "params") != 0)
+ {
+ XML_DEBUG(("Parsing Error: params not found\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+
+ while(1)
+ {
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+ if(strcmp(p, "param") != 0)
+ break;
+
+ if(request->data == NULL)
+ {
+ request->data = xml_parse_param(reader);
+ tmpdata = request->data;
+ }
+ else
+ {
+ tmpdata->next = xml_parse_param(reader);
+ tmpdata = tmpdata->next;
+ }
+
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+
+ if(strcmp(p, "param") != 0)
+ {
+ XML_DEBUG(("Parsing Error: param tag not terminated [%s]\n", p));
+ ovcp_free_request(request);
+ xmlFreeTextReader(reader);
+ return NULL;
+ }
+ }
+ }
+
+ }
+
+
+
+ xmlFreeTextReader(reader);
+
+
+ xmlCleanupParser();
+
+
+ xmlMemoryDump();
+
+ return request;
+}
+
+static struct ovcp_data_st *xml_parse_param(xmlTextReaderPtr reader)
+{
+ struct ovcp_data_st *data = NULL;
+ char *p, *type;
+
+ xmlTextReaderRead(reader);
+ p = (char *)xmlTextReaderConstName(reader);
+
+ XML_DEBUG(("Param Type: %s\n", p));
+
+
+ if(strcmp(p, "value") == 0)
+ {
+
+ xmlTextReaderRead(reader);
+
+
+ type = (char *)xmlTextReaderConstName(reader);
+
+
+ if(strcmp(type, "struct") == 0)
+ {
+ data = xml_parse_struct(reader);
+ }
+ else if(strcmp(type, "array") == 0)
+ {
+ data = xml_parse_array(reader);
+ }
+ else
+ {
+ data = xml_parse_values(reader);
+ }
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ return NULL;
+ }
+
+ if(strcmp(p, "value") != 0)
+ {
+ XML_DEBUG(("Parsing Error: value not terminated [%s]\n", p));
+ return NULL;
+ }
+
+ }
+
+
+ return data;
+}
+
+static struct ovcp_data_st *xml_parse_array(xmlTextReaderPtr reader)
+{
+
+ struct ovcp_data_st *data, *tmpdata = NULL;
+ char *p;
+
+
+ data = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
+ memset(data, 0, sizeof(struct ovcp_data_st));
+
+ data->type = OVCP_XML_ARRAY;
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "data") != 0)
+ {
+ XML_DEBUG(("Parsing Error: data tag not found\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+
+ while(1)
+ {
+
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "data") == 0)
+ break;
+
+ if(strcmp(p, "value") != 0)
+ {
+ XML_DEBUG(("Parsing Error: value Tag not found [%s]\n", p));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ xmlTextReaderRead(reader);
+
+ if(data->sub == NULL)
+ {
+ data->sub = xml_parse_values(reader);
+ tmpdata = data->sub;
+ }
+ else
+ {
+ tmpdata->next = xml_parse_values(reader);
+ tmpdata = tmpdata->next;
+ }
+
+
+
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error: Read Failed\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "value") != 0)
+ {
+ XML_DEBUG(("Parsing Error: Tag not terminated [%s]\n", p));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+
+ }
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "array") != 0)
+ {
+ XML_DEBUG(("Parsing Error: array tag not terminated [%s]\n", p));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ return data;
+}
+
+static struct ovcp_data_st *xml_parse_struct(xmlTextReaderPtr reader)
+{
+ struct ovcp_data_st *data, *tmpdata = NULL;
+ char *p;
+
+ data = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
+ memset(data, 0, sizeof(struct ovcp_data_st));
+
+ data->type = OVCP_XML_STRUCT;
+
+ while(1)
+ {
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "struct") == 0)
+ break;
+
+
+ if(strcmp(p, "member") != 0)
+ {
+ XML_DEBUG(("Parsing Error: member Tag not found\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "name") != 0)
+ {
+ XML_DEBUG(("Parsing Error: Name Tag not found\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstValue(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error: name tag empty\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(data->sub == NULL)
+ {
+ data->sub = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
+ tmpdata = data->sub;
+ }
+ else
+ {
+ tmpdata->next = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
+ tmpdata = tmpdata->next;
+ }
+
+ memset(tmpdata, 0, sizeof(struct ovcp_data_st));
+ tmpdata->type = OVCP_XML_STRUCT_ELEMENT;
+ tmpdata->data = strdup(p);
+
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "name") != 0)
+ {
+ XML_DEBUG(("Parsing Error: Name Tag not found [%s]\n", p));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "value") != 0)
+ {
+ XML_DEBUG(("Parsing Error: Value Tag not found [%s]\n", p));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ xmlTextReaderRead(reader);
+ tmpdata->sub = xml_parse_values(reader);
+
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error: Read Failed\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "value") != 0)
+ {
+ XML_DEBUG(("Parsing Error: Tag not terminated [%s]\n", p));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error: Read Failed\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, "member") != 0)
+ {
+ XML_DEBUG(("Parsing Error: Tag not terminated [%s]\n", p));
+ ovcp_free_data(data);
+ return NULL;
+ }
+ }
+
+ return data;
+}
+
+
+static struct ovcp_data_st *xml_parse_values(xmlTextReaderPtr reader)
+{
+ struct ovcp_data_st *data;
+ char *type, *value;
+ char *p;
+
+
+ data = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
+ memset(data, 0, sizeof(struct ovcp_data_st));
+
+ type = (char *)xmlTextReaderConstName(reader);
+ xmlTextReaderRead(reader);
+ value = (char *)xmlTextReaderConstValue(reader);
+
+ if(type == NULL || value == NULL)
+ {
+ XML_DEBUG(("Parsing Error [%s] [%s]\n", type, value));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ XML_DEBUG(("Data Type: %s Value: %s\n", type, value));
+
+ if(strcmp(type, "int") == 0 || strcmp(type, "i4") == 0)
+ {
+ data->type = OVCP_XML_INT;
+ data->data = malloc(sizeof(int));
+ *(int *)data->data = atoi(value);
+ }
+ else if(strcmp(type, "boolean") == 0)
+ {
+ data->type = OVCP_XML_BOOLEAN;
+ data->data = malloc(sizeof(int));
+
+ if(strcmp(value, "1") == 0)
+ *(int *)data->data = 1;
+ else
+ *(int *)data->data = 0;
+ }
+ else if(strcmp(type, "string") == 0)
+ {
+ data->type = OVCP_XML_STRING;
+ data->data = malloc(strlen(value)+1);
+ strcpy(data->data, value);
+ }
+ else if(strcmp(type, "double") == 0)
+ {
+ data->type = OVCP_XML_DOUBLE;
+ data->data = malloc(sizeof(double));
+ *(double *)data->data = strtod(value, NULL);
+ }
+
+ xmlTextReaderRead(reader);
+ p = (char *) xmlTextReaderConstName(reader);
+
+
+ if(p == NULL)
+ {
+ XML_DEBUG(("Parsing Error: Read Failed\n"));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+ if(strcmp(p, type) != 0)
+ {
+ XML_DEBUG(("Parsing Error: %s tag not terminated [%s]\n", type, p));
+ ovcp_free_data(data);
+ return NULL;
+ }
+
+
+
+ return data;
+}
Property changes on: trunk/daemon/lib/ovcpxml.c
___________________________________________________________________
Name: svn:mergeinfo
+
Copied: trunk/daemon/lib/ovcpxml.h (from rev 672, trunk/daemon/src/xml.h)
===================================================================
--- trunk/daemon/lib/ovcpxml.h (rev 0)
+++ trunk/daemon/lib/ovcpxml.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,88 @@
+/* OpenVCP
+ * Copyright (C) 2006 Gerrit Wyen <gerrit at t4a.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+
+#ifndef OVCPXML_H
+ #define OVCPXML_H
+
+
+ #include <libxml/encoding.h>
+ #include <libxml/xmlwriter.h>
+
+ enum ovcp_xml_datatypes {OVCP_XML_STRUCT, OVCP_XML_STRUCT_ELEMENT, OVCP_XML_ARRAY, OVCP_XML_INT, OVCP_XML_BOOLEAN, OVCP_XML_STRING, OVCP_XML_DOUBLE};
+
+ #ifndef TRUE
+ #define TRUE 1
+ #define FALSE 0
+ #endif
+
+ struct ovcp_response_st
+ {
+ xmlTextWriterPtr writer;
+ xmlBufferPtr buf;
+ };
+
+ struct ovcp_request_st
+ {
+ char *methodname;
+ struct ovcp_data_st *data;
+ };
+
+ struct ovcp_data_st
+ {
+ int type;
+ void *data;
+
+ struct ovcp_data_st *next, *sub;
+ };
+
+ struct ovcp_response_st *ovcp_response_new(void);
+ int ovcp_response_array_new(struct ovcp_response_st *response);
+ int ovcp_response_array_add_string(struct ovcp_response_st *response, char *string);
+ int ovcp_response_array_add_int(struct ovcp_response_st *response, int value);
+ int ovcp_response_array_end(struct ovcp_response_st *response);
+ int ovcp_response_struct_new(struct ovcp_response_st *response);
+ int ovcp_response_struct_end(struct ovcp_response_st *response);
+ int ovcp_response_struct_add_string(struct ovcp_response_st *response, char *name, char *string);
+ int ovcp_response_struct_add_int(struct ovcp_response_st *response, char *name, int value);
+ int ovcp_response_struct_add_double(struct ovcp_response_st *response, char *name, double value);
+ int ovcp_response_struct_add_boolean(struct ovcp_response_st *response, char *name, int value);
+ int ovcp_response_add_string(struct ovcp_response_st *response, char *string);
+ int ovcp_response_add_int(struct ovcp_response_st *response, int value);
+ int ovcp_response_add_double(struct ovcp_response_st *response, double value);
+ int ovcp_response_add_boolean(struct ovcp_response_st *response, int value);
+ struct ovcp_response_st *ovcp_response_error(int code, char *desc);
+ char *ovcp_response_finalize(struct ovcp_response_st *response);
+ int ovcp_free_response(struct ovcp_response_st *response);
+
+ struct ovcp_request_st *ovcp_parse_request(char *xmlstr);
+ struct ovcp_data_st *ovcp_request_get_arg(struct ovcp_request_st *request, int id);
+ struct ovcp_data_st *ovcp_array_get_element(struct ovcp_data_st *array, int id);
+ struct ovcp_data_st *ovcp_struct_get_element(struct ovcp_data_st *structure, char *name);
+ struct ovcp_data_st *ovcp_struct_get_member(struct ovcp_data_st *structure, char *name);
+ inline void *ovcp_data_get(struct ovcp_data_st *data);
+ inline void *ovcp_member_get(struct ovcp_data_st *data);
+ inline int ovcp_data_is_array(struct ovcp_data_st *data);
+ inline int ovcp_data_is_struct(struct ovcp_data_st *data);
+ inline int ovcp_data_is_int(struct ovcp_data_st *data);
+ inline int ovcp_data_is_double(struct ovcp_data_st *data);
+ inline int ovcp_data_is_boolean(struct ovcp_data_st *data);
+ inline int ovcp_data_is_string(struct ovcp_data_st *data);
+ int ovcp_free_request(struct ovcp_request_st *request);
+
+#endif
Property changes on: trunk/daemon/lib/ovcpxml.h
___________________________________________________________________
Name: svn:mergeinfo
+
Added: trunk/daemon/lib/pyovcp/Makefile.in
===================================================================
--- trunk/daemon/lib/pyovcp/Makefile.in (rev 0)
+++ trunk/daemon/lib/pyovcp/Makefile.in 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,39 @@
+prefix = @prefix@
+bindir = @bindir@
+datadir = @datarootdir@
+sysconfdir = @sysconfdir@
+
+CC=@CC@
+CFLAGS=@CFLAGS@ @DEFS@ `python-config --cflags` -I ..
+LDFLAGS=@LDFLAGS@
+LIBS=@LIBS@
+
+
+OBJS=pyovcpdata.o pyovcpresponse.o pyovcprequest.o ../ovcpxml.o
+
+all: ovcp.so pyovcp.a
+
+pyovcpdata.o: pyovcpdata.c pyovcpdata.h
+ $(CC) -pthread $(CFLAGS) -fPIC -o pyovcpdata.o -c pyovcpdata.c
+pyovcpresponse.o: pyovcpresponse.c pyovcpresponse.h
+ $(CC) -pthread $(CFLAGS) -fPIC -o pyovcpresponse.o -c pyovcpresponse.c
+pyovcprequest.o: pyovcprequest.c pyovcprequest.h
+ $(CC) -pthread $(CFLAGS) -fPIC -o pyovcprequest.o -c pyovcprequest.c
+pyovcp.o: pyovcp.c pyovcp.h
+ $(CC) -pthread $(CFLAGS) -D SHAREDOBJ -fPIC -o pyovcp.o -c pyovcp.c
+spyovcp.o: pyovcp.c pyovcp.h
+ $(CC) -pthread $(CFLAGS) -o spyovcp.o -c pyovcp.c
+
+
+pyovcp.a: $(OBJS) spyovcp.o
+ ar cru pyovcp.a $(OBJS) spyovcp.o
+ ranlib pyovcp.a
+
+ovcp.so: $(OBJS) pyovcp.o
+ $(CC) -D SHAREDOBJ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -o ovcp.so $(OBJS) pyovcp.o
+
+clean:
+ @rm -f *.lo *.la *.o *.Plo *.Tpo *.so *.a
+
+
+
Added: trunk/daemon/lib/pyovcp/pyovcp.c
===================================================================
--- trunk/daemon/lib/pyovcp/pyovcp.c (rev 0)
+++ trunk/daemon/lib/pyovcp/pyovcp.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,121 @@
+#include <Python.h>
+#include "pyovcp.h"
+#include "pyovcprequest.h"
+#include "pyovcpresponse.h"
+#include "pyovcpdata.h"
+
+
+
+
+
+
+#ifndef SHAREDOBJ
+#include "../../src/modules.h"
+
+
+struct ovcp_response_st *ovcp_call_pythonmod(struct ovcp_request_st *req, void *func)
+{
+ OVCPResponse *respobj;
+ OVCPRequest *reqobj;
+ struct ovcp_response_st *resp;
+ PyObject *funcargobj;
+
+ reqobj = (OVCPRequest *)createPythonObject("ovcp", "Request", NULL);
+ reqobj->req = req;
+
+ funcargobj = Py_BuildValue("(O)", (PyObject *)reqobj);
+
+ respobj = (OVCPResponse *) PyObject_CallObject((PyObject *)func, funcargobj);
+ resp = respobj->resp;
+ respobj->resp = NULL;
+ Py_XDECREF(respobj);
+
+ return resp;
+}
+
+
+PyObject *OVCP_addMethod(PyObject* self, PyObject *args)
+{
+ PyObject *func;
+ char *module, *name;
+
+ if(!PyArg_ParseTuple(args, "ssO", &module, &name, &func))
+ return NULL;
+ Py_XINCREF(func);
+
+ ovcp_add_argmethod(module, name, ovcp_call_pythonmod, (void *)func);
+
+ Py_RETURN_TRUE;
+}
+
+#else
+
+
+PyMODINIT_FUNC initovcp(void)
+{
+ init_pyovcp();
+}
+
+
+#endif
+
+
+static PyMethodDef module_methods[] = {
+
+ #ifndef SHAREDOBJ
+ {"addMethod", (PyCFunction)OVCP_addMethod, METH_VARARGS, "adds a method"},
+ #endif
+
+ {NULL} /* Sentinel */
+};
+
+
+void init_pyovcp(void)
+{
+ PyObject* m;
+
+ if (PyType_Ready(&OVCPRequestType) < 0)
+ return;
+ if (PyType_Ready(&OVCPResponseType) < 0)
+ return;
+ if (PyType_Ready(&OVCPDataType) < 0)
+ return;
+
+ m = Py_InitModule3("ovcp", module_methods,
+ "python module that allows to write extensions for openvcp in python");
+ if (m == NULL)
+ return;
+
+ Py_INCREF(&OVCPRequestType);
+ Py_INCREF(&OVCPResponseType);
+ Py_INCREF(&OVCPDataType);
+
+ PyModule_AddObject(m, "Request", (PyObject *)&OVCPRequestType);
+ PyModule_AddObject(m, "Response", (PyObject *)&OVCPResponseType);
+ PyModule_AddObject(m, "Data", (PyObject *)&OVCPDataType);
+
+}
+
+
+
+
+PyObject *createPythonObject(char *module, char *attr, PyObject *args)
+{
+ PyObject *objdata=NULL;
+ PyObject *pModule, *pFunc;
+
+ pModule = PyImport_ImportModule(module);
+ pFunc = PyObject_GetAttrString(pModule, attr);
+
+ if (pFunc && PyCallable_Check(pFunc))
+ objdata = PyObject_CallObject(pFunc, args);
+
+ Py_XDECREF(pFunc);
+ Py_XDECREF(pModule);
+
+ return objdata;
+}
+
+
+
+
Added: trunk/daemon/lib/pyovcp/pyovcp.h
===================================================================
--- trunk/daemon/lib/pyovcp/pyovcp.h (rev 0)
+++ trunk/daemon/lib/pyovcp/pyovcp.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,8 @@
+#ifndef PYOVCP_H
+ #define PYOVCP_H
+
+
+ PyObject *createPythonObject(char *module, char *attr, PyObject *args);
+ void init_pyovcp(void);
+
+#endif
Added: trunk/daemon/lib/pyovcp/pyovcpdata.c
===================================================================
--- trunk/daemon/lib/pyovcp/pyovcpdata.c (rev 0)
+++ trunk/daemon/lib/pyovcp/pyovcpdata.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,120 @@
+#include <Python.h>
+#include "ovcpxml.h"
+#include "pyovcp.h"
+#include "pyovcpdata.h"
+
+
+void OVCPData_dealloc(OVCPData* self)
+{
+
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+
+PyObject *OVCPData_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ OVCPData *self;
+ self = (OVCPData *)type->tp_alloc(type, 0);
+
+
+ return (PyObject *)self;
+}
+
+
+int OVCPData_init(OVCPData *self, PyObject *args, PyObject *kwds)
+{
+
+ return 0;
+}
+
+
+PyObject *OVCPData_type(OVCPData *self, PyObject *args)
+{
+ char *type = NULL;
+
+ if(ovcp_data_is_array(self->data))
+ type = "array";
+ else
+ if(ovcp_data_is_struct(self->data))
+ type = "struct";
+ else
+ if(ovcp_data_is_int(self->data))
+ type = "int";
+ else
+ if(ovcp_data_is_double(self->data))
+ type = "double";
+ else
+ if(ovcp_data_is_boolean(self->data))
+ type = "boolean";
+ else
+ if(ovcp_data_is_string(self->data))
+ type = "string";
+
+ if(type == NULL) Py_RETURN_NONE;
+ else
+ return Py_BuildValue("s", type);
+}
+
+
+PyObject *OVCPData_getElement(OVCPData *self, PyObject *args)
+{
+ int id;
+ char *name;
+ OVCPData *objdata;
+
+ struct ovcp_data_st *data = NULL;
+
+ if(ovcp_data_is_array(self->data))
+ {
+ if(!PyArg_ParseTuple(args, "i", &id))
+ return NULL;
+
+ data = ovcp_array_get_element(self->data, id);
+ }
+ else
+ if(ovcp_data_is_struct(self->data))
+ {
+ if(!PyArg_ParseTuple(args, "s", &name))
+ return NULL;
+
+ data = ovcp_struct_get_element(self->data, name);
+ }
+
+ if(data == NULL) Py_RETURN_NONE;
+
+ objdata = (OVCPData *)createPythonObject("ovcp", "Data", NULL);
+
+ if(objdata != NULL)
+ objdata->data = data;
+ else Py_RETURN_NONE;
+
+ return (PyObject *)objdata;
+}
+
+
+PyObject *OVCPData_getContent(OVCPData *self)
+{
+ PyObject *content=NULL;
+
+ void *data = ovcp_data_get(self->data);
+
+ if(ovcp_data_is_int(self->data))
+ return PyInt_FromLong( (long)*((int *)data) );
+ else
+ if(ovcp_data_is_double(self->data))
+ return PyFloat_FromDouble( *((double *)data) );
+ else
+ if(ovcp_data_is_boolean(self->data))
+ return PyBool_FromLong( (long)*((int *)data) );
+ else
+ if(ovcp_data_is_string(self->data))
+ return PyString_FromString((char *)data);
+
+ if(content == NULL) Py_RETURN_NONE;
+
+ return content;
+}
+
+
+
+
Added: trunk/daemon/lib/pyovcp/pyovcpdata.h
===================================================================
--- trunk/daemon/lib/pyovcp/pyovcpdata.h (rev 0)
+++ trunk/daemon/lib/pyovcp/pyovcpdata.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,83 @@
+#ifndef PYOVCPDATA
+ #define PYOVCPDATA
+
+
+ typedef struct
+ {
+ PyObject_HEAD
+ struct ovcp_data_st *data;
+ } OVCPData;
+
+
+ void OVCPData_dealloc(OVCPData *self);
+ PyObject *OVCPData_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
+ int OVCPData_init(OVCPData *self, PyObject *args, PyObject *kwds);
+ PyObject *OVCPData_type(OVCPData *self, PyObject *args);
+ PyObject *OVCPData_getContent(OVCPData *self);
+ PyObject *OVCPData_getElement(OVCPData *self, PyObject *args);
+
+ /*
+ static PyMemberDef OVCPData_members[] =
+ {
+ {"first", T_OBJECT_EX, offsetof(OVCPData, first), 0, "first name"},
+ {"number", T_INT, offsetof(OVCPData, number), 0, "noddy number"},
+ {NULL}
+ };
+ */
+
+
+ static PyMethodDef OVCPData_methods[] = {
+ {"type", (PyCFunction)OVCPData_type, METH_VARARGS, "returns the type"},
+ {"getElement", (PyCFunction)OVCPData_getElement, METH_VARARGS, "returns an element of an array or a structure"},
+ {"getContent", (PyCFunction)OVCPData_getContent, METH_NOARGS, "returns the content"},
+ {NULL} /* Sentinel */
+ };
+
+
+ static PyTypeObject OVCPDataType =
+ {
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ "ovcp.Data", /* tp_name */
+ sizeof(OVCPData), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)OVCPData_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ "OVCPData objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ OVCPData_methods, /* tp_methods */
+ NULL, //OVCPData_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)OVCPData_init, /* tp_init */
+ 0, /* tp_alloc */
+ OVCPData_new, /* tp_new */
+ };
+
+
+
+
+#endif
Added: trunk/daemon/lib/pyovcp/pyovcprequest.c
===================================================================
--- trunk/daemon/lib/pyovcp/pyovcprequest.c (rev 0)
+++ trunk/daemon/lib/pyovcp/pyovcprequest.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,68 @@
+#include <Python.h>
+#include "ovcpxml.h"
+#include "pyovcp.h"
+#include "pyovcprequest.h"
+#include "pyovcpdata.h"
+
+
+void OVCPRequest_dealloc(OVCPRequest* self)
+{
+
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+
+PyObject *OVCPRequest_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ OVCPRequest *self;
+ self = (OVCPRequest *)type->tp_alloc(type, 0);
+
+
+ return (PyObject *)self;
+}
+
+
+int OVCPRequest_init(OVCPRequest *self, PyObject *args)
+{
+ char *xmlstr;
+
+ if(!PyArg_ParseTuple(args, "|s", &xmlstr))
+ return -1;
+
+ if(xmlstr != NULL)
+ self->req = ovcp_parse_request(xmlstr);
+
+ return 0;
+}
+
+
+PyObject *OVCPRequest_getArg(OVCPRequest *self, PyObject *args)
+{
+ int id;
+ struct ovcp_data_st *data;
+ OVCPData *objdata=NULL;
+
+
+
+ if(!PyArg_ParseTuple(args, "i", &id))
+ return NULL;
+
+ data = ovcp_request_get_arg(self->req, id);
+
+ if(data == NULL)
+ Py_RETURN_NONE;
+
+ objdata = (OVCPData *)createPythonObject("ovcp", "Data", NULL);
+
+ if(objdata != NULL)
+ objdata->data = data;
+ else Py_RETURN_NONE;
+
+
+ return (PyObject *)objdata;
+
+}
+
+
+
+
Added: trunk/daemon/lib/pyovcp/pyovcprequest.h
===================================================================
--- trunk/daemon/lib/pyovcp/pyovcprequest.h (rev 0)
+++ trunk/daemon/lib/pyovcp/pyovcprequest.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,83 @@
+#ifndef PYOVCPREQUEST
+ #define PYOVCPREQUEST
+
+
+ typedef struct
+ {
+ PyObject_HEAD
+ struct ovcp_request_st *req;
+ int number;
+ } OVCPRequest;
+
+
+ void OVCPRequest_dealloc(OVCPRequest *self);
+ PyObject *OVCPRequest_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
+ int OVCPRequest_init(OVCPRequest *self, PyObject *args);
+ PyObject *OVCPRequest_name(OVCPRequest* self);
+ PyObject *OVCPRequest_getArg(OVCPRequest *self, PyObject *args);
+
+
+ /*
+ static PyMemberDef OVCPRequest_members[] =
+ {
+ {"first", T_OBJECT_EX, offsetof(OVCPRequest, first), 0, "first name"},
+ {"last", T_OBJECT_EX, offsetof(OVCPRequest, last), 0, "last name"},
+ {"number", T_INT, offsetof(OVCPRequest, number), 0, "noddy number"},
+ {NULL}
+ };
+ */
+
+
+ static PyMethodDef OVCPRequest_methods[] = {
+ {"getArg", (PyCFunction)OVCPRequest_getArg, METH_VARARGS, "Returns the argument at position n"},
+ {NULL} /* Sentinel */
+ };
+
+
+ static PyTypeObject OVCPRequestType =
+ {
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ "ovcp.Request", /* tp_name */
+ sizeof(OVCPRequest), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)OVCPRequest_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ "Request objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ OVCPRequest_methods, /* tp_methods */
+ NULL, //OVCPRequest_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)OVCPRequest_init, /* tp_init */
+ 0, /* tp_alloc */
+ OVCPRequest_new, /* tp_new */
+ };
+
+
+
+
+#endif
Added: trunk/daemon/lib/pyovcp/pyovcpresponse.c
===================================================================
--- trunk/daemon/lib/pyovcp/pyovcpresponse.c (rev 0)
+++ trunk/daemon/lib/pyovcp/pyovcpresponse.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,247 @@
+#include <Python.h>
+#include "ovcpxml.h"
+#include "pyovcpresponse.h"
+
+
+void OVCPResponse_dealloc(OVCPResponse* self)
+{
+
+ if(self->resp != NULL)
+ ovcp_free_response(self->resp);
+
+ self->ob_type->tp_free((PyObject*)self);
+}
+
+
+PyObject *OVCPResponse_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+ OVCPResponse *self;
+ self = (OVCPResponse *)type->tp_alloc(type, 0);
+
+ if (self != NULL)
+ {
+ self->resp = ovcp_response_new();
+ if(self->resp == NULL)
+ {
+ Py_DECREF(self);
+ return NULL;
+ }
+ }
+
+ return (PyObject *)self;
+}
+
+
+int OVCPResponse_init(OVCPResponse *self, PyObject *args, PyObject *kwds)
+{
+
+ return 0;
+}
+
+
+
+
+PyObject *OVCPResponse_ArrayNew(OVCPResponse* self)
+{
+ int res;
+
+ res = ovcp_response_array_new(self->resp);
+
+ return PyInt_FromLong(res);
+}
+
+
+PyObject *OVCPResponse_ArrayAddString(OVCPResponse* self, PyObject *args)
+{
+ int res;
+ char *str;
+
+ if(!PyArg_ParseTuple(args, "s", &str))
+ return NULL;
+
+ res = ovcp_response_array_add_string(self->resp, str);
+
+
+
+ return PyInt_FromLong(res);
+}
+
+
+PyObject *OVCPResponse_ArrayAddInt(OVCPResponse* self, PyObject *args)
+{
+ int res, num;
+
+ if(!PyArg_ParseTuple(args, "i", &num))
+ return NULL;
+
+ res = ovcp_response_array_add_int(self->resp, num);
+
+
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_ArrayEnd(OVCPResponse* self)
+{
+ int res;
+
+ res = ovcp_response_array_end(self->resp);
+
+ return PyInt_FromLong(res);
+}
+
+
+PyObject *OVCPResponse_StructNew(OVCPResponse* self)
+{
+ int res;
+
+ res = ovcp_response_struct_new(self->resp);
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_StructEnd(OVCPResponse* self)
+{
+ int res;
+
+ res = ovcp_response_struct_end(self->resp);
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_StructAddString(OVCPResponse* self, PyObject *args)
+{
+ int res;
+ char *name, *str;
+
+ if(!PyArg_ParseTuple(args, "ss", &name, &str))
+ return NULL;
+
+ res = ovcp_response_struct_add_string(self->resp, name, str);
+
+
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_StructAddInt(OVCPResponse* self, PyObject *args)
+{
+ int res;
+ char *name;
+ int num;
+
+ if(!PyArg_ParseTuple(args, "si", &name, &num))
+ return NULL;
+
+ res = ovcp_response_struct_add_int(self->resp, name, num);
+
+
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_StructAddDouble(OVCPResponse* self, PyObject *args)
+{
+ int res;
+ char *name;
+ double num;
+
+ if(!PyArg_ParseTuple(args, "sd", &name, &num))
+ return NULL;
+
+ res = ovcp_response_struct_add_double(self->resp, name, num);
+
+
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_StructAddBool(OVCPResponse* self, PyObject *args)
+{
+ int res;
+ char *name;
+ int num;
+
+ if(!PyArg_ParseTuple(args, "si", &name, &num))
+ return NULL;
+
+ res = ovcp_response_struct_add_boolean(self->resp, name, num);
+
+
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_addString(OVCPResponse* self, PyObject *args)
+{
+ int res;
+ char *str;
+
+ if(!PyArg_ParseTuple(args, "s", &str))
+ return NULL;
+
+ res = ovcp_response_add_string(self->resp, str);
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_addInt(OVCPResponse* self, PyObject *args)
+{
+ int res, num;
+
+ if(!PyArg_ParseTuple(args, "i", &num))
+ return NULL;
+
+ res = ovcp_response_add_int(self->resp, num);
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_addDouble(OVCPResponse* self, PyObject *args)
+{
+ int res;
+ double num;
+
+ if(!PyArg_ParseTuple(args, "d", &num))
+ return NULL;
+
+ res = ovcp_response_add_double(self->resp, num);
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_addBool(OVCPResponse* self, PyObject *args)
+{
+ int res, num;
+
+ if(!PyArg_ParseTuple(args, "i", &num))
+ return NULL;
+
+ res = ovcp_response_add_boolean(self->resp, num);
+
+ return PyInt_FromLong(res);
+}
+
+PyObject *OVCPResponse_Error(OVCPResponse* self, PyObject *args)
+{
+ int code;
+ char *desc;
+
+
+ if(!PyArg_ParseTuple(args, "is", &code, &desc))
+ return NULL;
+
+ if(self->resp != NULL)
+ ovcp_free_response(self->resp);
+
+ self->resp = ovcp_response_error(code, desc);
+
+ return PyInt_FromLong(1);
+}
+
+
+
+
+
+
+
Added: trunk/daemon/lib/pyovcp/pyovcpresponse.h
===================================================================
--- trunk/daemon/lib/pyovcp/pyovcpresponse.h (rev 0)
+++ trunk/daemon/lib/pyovcp/pyovcpresponse.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -0,0 +1,107 @@
+#ifndef PYOVCPRESPONSE
+ #define PYOVCPRESPONSE
+
+
+ typedef struct
+ {
+ PyObject_HEAD
+ struct ovcp_response_st *resp;
+ } OVCPResponse;
+
+
+ void OVCPResponse_dealloc(OVCPResponse *self);
+ PyObject *OVCPResponse_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
+ int OVCPResponse_init(OVCPResponse *self, PyObject *args, PyObject *kwds);
+ PyObject *OVCPResponse_ArrayNew(OVCPResponse* self);
+ PyObject *OVCPResponse_ArrayAddString(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_ArrayAddInt(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_ArrayEnd(OVCPResponse* self);
+ PyObject *OVCPResponse_StructNew(OVCPResponse* self);
+ PyObject *OVCPResponse_StructEnd(OVCPResponse* self);
+ PyObject *OVCPResponse_StructAddString(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_StructAddInt(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_StructAddDouble(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_StructAddBool(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_addString(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_addInt(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_addDouble(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_addBool(OVCPResponse* self, PyObject *args);
+ PyObject *OVCPResponse_Error(OVCPResponse* self, PyObject *args);
+
+ /*
+ static PyMemberDef OVCPResponse_members[] =
+ {
+ {"first", T_OBJECT_EX, offsetof(OVCPResponse, first), 0, "first name"},
+ {"number", T_INT, offsetof(OVCPResponse, number), 0, "noddy number"},
+ {NULL}
+ };
+ */
+
+
+ static PyMethodDef OVCPResponse_methods[] = {
+ {"ArrayNew", (PyCFunction)OVCPResponse_ArrayNew, METH_NOARGS, "creates a new array"},
+ {"ArrayAddString", (PyCFunction)OVCPResponse_ArrayAddString, METH_VARARGS, "adds a string to the array"},
+ {"ArrayAddInt", (PyCFunction)OVCPResponse_ArrayAddInt, METH_VARARGS, "adds an int to the array"},
+ {"ArrayEnd", (PyCFunction)OVCPResponse_ArrayEnd, METH_NOARGS, "ends an array"},
+ {"StructNew", (PyCFunction)OVCPResponse_StructNew, METH_NOARGS, "creates a new structure"},
+ {"StructEnd", (PyCFunction)OVCPResponse_StructEnd, METH_NOARGS, "ends a structure"},
+ {"StructAddString", (PyCFunction)OVCPResponse_StructAddString, METH_VARARGS, "adds a string to the structure"},
+ {"StructAddInt", (PyCFunction)OVCPResponse_StructAddInt, METH_VARARGS, "adds an int to the structure"},
+ {"StructAddDouble", (PyCFunction)OVCPResponse_StructAddDouble, METH_VARARGS, "adds a double to the structure"},
+ {"StructAddBool", (PyCFunction)OVCPResponse_StructAddBool, METH_VARARGS, "adds a bool to the structure"},
+ {"addString", (PyCFunction)OVCPResponse_addString, METH_VARARGS, "adds a string"},
+ {"addInt", (PyCFunction)OVCPResponse_addInt, METH_VARARGS, "adds an int"},
+ {"addDouble", (PyCFunction)OVCPResponse_addDouble, METH_VARARGS, "adds a double"},
+ {"addBool", (PyCFunction)OVCPResponse_addBool, METH_VARARGS, "adds a bool"},
+ {"Error", (PyCFunction)OVCPResponse_Error, METH_VARARGS, "creates an error response"},
+ {NULL} /* Sentinel */
+ };
+
+
+ static PyTypeObject OVCPResponseType =
+ {
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ "ovcp.Response", /* tp_name */
+ sizeof(OVCPResponse), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)OVCPResponse_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ "OVCPResponse objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ OVCPResponse_methods, /* tp_methods */
+ NULL, //OVCPResponse_members, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)OVCPResponse_init, /* tp_init */
+ 0, /* tp_alloc */
+ OVCPResponse_new, /* tp_new */
+ };
+
+
+
+
+#endif
Modified: trunk/daemon/lib/strings.c
===================================================================
--- trunk/daemon/lib/strings.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/lib/strings.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
+#include <ctype.h>
#include "strings.h"
Modified: trunk/daemon/src/bandwidth.c
===================================================================
--- trunk/daemon/src/bandwidth.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/bandwidth.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -24,10 +24,12 @@
#include "config.h"
#include "request.h"
#include "error.h"
-
+#include "strings.h"
#include "fs.h"
+int ovcp_create_ratethrottle(char *name, int id, int direction, int rate, int ceil, int burst, int cburst);
+
struct ovcp_response_st *set_bandwidth(struct ovcp_request_st *request)
{
struct ovcp_response_st *response;
@@ -111,7 +113,7 @@
{
struct ovcp_response_st *response;
- struct ovcp_data_st *arg0, *arg1, *struct_element;
+ struct ovcp_data_st *arg0;
char *name;
char sql_query[BUF_SIZE];
char *sql_error, **sql_result;
@@ -165,11 +167,11 @@
{
struct ovcp_response_st *response;
- struct ovcp_data_st *arg0, *arg1, *struct_element;
+ struct ovcp_data_st *arg0, *arg1;
char *name, *direction;
char sql_query[BUF_SIZE];
- char *sql_error, **sql_result;
- int i, ret, nrow, ncolumn;
+ char *sql_error;
+ int ret;
arg0 = ovcp_request_get_arg(request, 0);
@@ -209,7 +211,6 @@
int ovcp_setup_trafficthrottling(sqlite3 *openvcp_db)
{
- char sql_query[BUF_SIZE];
char *sql_error, **sql_result;
int i, ret, nrow, ncolumn, res=0;
char **devs; int count;
@@ -270,7 +271,6 @@
{
struct iface_entry *ips;
int i;
- char buf[BUF_SIZE];
char idstr[50], ratestr[50], ceilstr[50];
char burststr[50], cburststr[50];
Modified: trunk/daemon/src/bandwidth.h
===================================================================
--- trunk/daemon/src/bandwidth.h 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/bandwidth.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -20,7 +20,7 @@
#ifndef BANDWIDTH_H
#define BANDWIDTH_H
- #include "xml.h"
+ #include "ovcpxml.h"
enum bandwidth_hook {INGRESS, EGRESS};
@@ -29,6 +29,6 @@
struct ovcp_response_st *get_bandwidth(struct ovcp_request_st *request);
struct ovcp_response_st *del_bandwidth(struct ovcp_request_st *request);
- int ifb_kernel_support();
+ int ifb_kernel_support(void);
#endif
Modified: trunk/daemon/src/filter.c
===================================================================
--- trunk/daemon/src/filter.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/filter.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -39,7 +39,7 @@
const char *chain, *target_name;
char intablename[] = "openvcp_in";
char outtablename[] = "openvcp_out";
- char *iptargv[6], *table = "filter";
+ char *iptargv[6];
const struct ipt_entry *e;
int ret, found = 0;
Modified: trunk/daemon/src/get.h
===================================================================
--- trunk/daemon/src/get.h 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/get.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include "xml.h"
+#include "ovcpxml.h"
#ifndef GET_H
#define GET_H
Modified: trunk/daemon/src/logtraffic.c
===================================================================
--- trunk/daemon/src/logtraffic.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/logtraffic.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -65,8 +65,9 @@
#ifdef IPV6_SUPPORT
struct ip6_hdr *ipv6_hdr;
+ ovcp_ip hostip;
#endif
- ovcp_ip hostip;
+
struct _packetlogger *packetlogdata = (struct _packetlogger *) arg;
Modified: trunk/daemon/src/main.c
===================================================================
--- trunk/daemon/src/main.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/main.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -35,7 +35,7 @@
#include "fs.h"
#include "strings.h"
#include "misc.h"
-#include "xml.h"
+#include "ovcpxml.h"
#include "error.h"
#include "request.h"
#include "modules.h"
@@ -52,8 +52,8 @@
static int handle_request(struct ovcp_session *session);
static void cleanup_socket(int args, void *socket);
static void usage(char *name);
-static void segv_handle();
-static void term_handle();
+static void signal_handle(int signal);
+static void term_handle(void);
#ifdef HAVE_LIBGNUTLS
static gnutls_anon_server_credentials_t anoncred;
@@ -141,7 +141,8 @@
if(daemon_pid == 0)
{
- signal(SIGSEGV, segv_handle);
+ signal(SIGINT, signal_handle);
+ signal(SIGSEGV, signal_handle);
atexit(term_handle);
init_modules();
@@ -200,6 +201,9 @@
client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &size);
fcntl(client_socket, F_SETFD, 1);
+ if(client_socket == -1)
+ continue;
+
ovcp_log(OVCP_INFO, "Connection from: %s", inet_ntoa(client_addr.sin_addr));
if((ret = fork()) == 0)
@@ -257,7 +261,7 @@
{
struct ovcp_session *session;
char *cmd, **arguments;
- unsigned int args, ret;
+ unsigned int args;
session = (struct ovcp_session *) malloc(sizeof(struct ovcp_session));
memset(session, 0, sizeof(struct ovcp_session));
@@ -291,6 +295,8 @@
if(strcmp(arguments[0], "TLS") == 0)
{
#ifdef HAVE_LIBGNUTLS
+ int ret;
+
ovcp_write(session, "OK\n", 4);
session->tls_session = tls_session_new (client_socket, anoncred);
@@ -422,7 +428,7 @@
if(strcmp(modules[i].methods[d].name, method) == 0)
{
- response = modules[i].methods[d].function(request);
+ response = modules[i].methods[d].function(request, modules[i].methods[d].usrdata);
break;
}
d++;
@@ -523,12 +529,22 @@
static void term_handle()
{
+ ovcp_free_modules();
ovcp_log(OVCP_INFO, "Process [%d] terminating", getpid());
- free_modules();
}
-static void segv_handle()
+static void signal_handle(int signal)
{
- ovcp_log(OVCP_ERROR, "Process [%d] received signal 'Segmentation fault'", getpid());
- exit(-1);
+ if(signal == SIGINT)
+ {
+ ovcp_log(OVCP_INFO, "Process [%d] received signal 'Interrupt'", getpid());
+ }
+ if(signal == SIGSEGV)
+ {
+ ovcp_log(OVCP_ERROR, "Process [%d] received signal 'Segmentation fault'", getpid());
+ exit(-1);
+ }
+
+
+ exit(0);
}
Modified: trunk/daemon/src/misc.c
===================================================================
--- trunk/daemon/src/misc.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/misc.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -23,21 +23,23 @@
#include <string.h>
#include <dirent.h>
#include <stdarg.h>
+#include <sys/wait.h>
-
#include "main.h"
#include "config.h"
#include "misc.h"
#include "fs.h"
#include "strings.h"
-#include "xml.h"
+#include "ovcpxml.h"
int ovcp_write(struct ovcp_session *session, char *data, int len)
{
- int ret=-1, transfered=0;
+ int ret=-1;
#ifdef HAVE_LIBGNUTLS
+ int transfered=0
+
if(session->tls_session != NULL)
{
@@ -340,7 +342,7 @@
int execb(char *cmd, char **argv)
{
- int pid, ret;
+ int pid;
int status = 0;
int fds[2];
@@ -850,7 +852,7 @@
{
int pipe_fds[2];
- int res, len = 0, ges = 0;
+ int len = 0;
if(msg == NULL) return 0;
@@ -891,6 +893,8 @@
if(ovcp_logstm == NULL)
printf("Unable to open logfile\n");
else setvbuf(ovcp_logstm, NULL, _IOLBF, -1);
+
+ return 1;
}
Modified: trunk/daemon/src/modules.c
===================================================================
--- trunk/daemon/src/modules.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/modules.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -15,17 +15,23 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-
+
+#include <Python.h>
#include <stdlib.h>
#include <string.h>
+#include <dirent.h>
+
+#include "ovcpxml.h"
#include "modules.h"
+#include "strings.h"
#include "misc.h"
-
+#include "pyovcp/pyovcp.h"
+
struct ovcp_module *modules = 0;
static int modulescount = 0;
+#define OVCP_EXTENSION_DIR "extensions"
-
int ovcp_add_module(char *name)
{
modulescount++;
@@ -38,12 +44,17 @@
memset(&modules[modulescount], 0, sizeof(struct ovcp_module));
+ return 1;
}
+int ovcp_add_method(char *module, char *name, struct ovcp_response_st *(*function)(struct ovcp_request_st*))
+{
+ return ovcp_add_argmethod(module, name, (struct ovcp_response_st *(*)(struct ovcp_request_st*, void *)) function, NULL);
+}
-int ovcp_add_method(char *module, char *name, struct ovcp_response_st *(*function)())
+int ovcp_add_argmethod(char *module, char *name, struct ovcp_response_st *(*function)(struct ovcp_request_st*, void *), void *usrdata)
{
int i=0;
@@ -59,6 +70,7 @@
memset(&modules[i].methods[modules[i].methodscount], 0, sizeof(struct ovcp_method));
modules[i].methods[modules[i].methodscount-1].name = strdup(name);
modules[i].methods[modules[i].methodscount-1].function = function;
+ modules[i].methods[modules[i].methodscount-1].usrdata = usrdata;
break;
}
@@ -99,6 +111,7 @@
i++;
}
+ return 1;
}
@@ -106,6 +119,8 @@
{
if(method->name != NULL) free(method->name);
if(method->help != NULL) free(method->help);
+
+ return 1;
}
int free_module(struct ovcp_module *module)
@@ -124,10 +139,11 @@
}
if(module->name != NULL) free(module->name);
-
+
+ return 1;
}
-int free_modules()
+int ovcp_free_modules()
{
int i=0;
@@ -138,6 +154,49 @@
}
free(modules);
+
+ /* Interpreter beenden */
+ Py_Finalize();
+
+ return 1;
}
+int ovcp_extensions_load()
+{
+ DIR *dir_ptr;
+ struct dirent *dir_entry;
+ char path[BUF_SIZE];
+ FILE * fmod;
+
+ /* Interpreter initialisieren */
+ Py_Initialize();
+ init_pyovcp();
+
+
+ if((dir_ptr = opendir(OVCP_EXTENSION_DIR)) != NULL)
+ {
+
+ while((dir_entry = readdir(dir_ptr)) != NULL)
+ {
+
+
+ if(dir_entry->d_name[0] != '.')
+ {
+ sconcat(path, BUF_SIZE, OVCP_EXTENSION_DIR, "/", dir_entry->d_name, NULL);
+
+ fmod = fopen(path,"r");
+ PyRun_SimpleFileEx(fmod, path, 1);
+ }
+
+ }
+
+
+ closedir(dir_ptr);
+ }
+
+ return 1;
+}
+
+
+
Modified: trunk/daemon/src/modules.h
===================================================================
--- trunk/daemon/src/modules.h 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/modules.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -31,9 +31,9 @@
{
char *name;
char **signature;
- int argcount;
char *help;
- struct ovcp_response_st *(*function)();
+ struct ovcp_response_st *(*function)(struct ovcp_request_st*, void*);
+ void *usrdata;
};
@@ -41,7 +41,9 @@
extern struct ovcp_module *modules;
int ovcp_add_module(char *name);
- int ovcp_add_method(char *module, char *name, struct ovcp_response_st *(*function)());
+ int ovcp_add_method(char *module, char *name, struct ovcp_response_st *(*function)(struct ovcp_request_st*));
+ int ovcp_add_argmethod(char *module, char *name, struct ovcp_response_st *(*function)(struct ovcp_request_st*, void *), void *usrdata);
int ovcp_method_sethelp(char *module, char *name, char *help, ...);
-
+ int ovcp_extensions_load(void);
+ int ovcp_free_modules(void);
#endif
Modified: trunk/daemon/src/node.c
===================================================================
--- trunk/daemon/src/node.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/node.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -29,7 +29,7 @@
#include "strings.h"
#include "fs.h"
#include "config.h"
-#include "xml.h"
+#include "ovcpxml.h"
#include "error.h"
#include "parseconfig.h"
#include "misc.h"
Modified: trunk/daemon/src/node.h
===================================================================
--- trunk/daemon/src/node.h 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/node.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -17,7 +17,7 @@
*/
#include "main.h"
-#include "xml.h"
+#include "ovcpxml.h"
#ifndef NODE_H
#define NODE_H
Deleted: trunk/daemon/src/parse_ipfmlogs.c
===================================================================
--- trunk/daemon/src/parse_ipfmlogs.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/parse_ipfmlogs.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -1,426 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <sqlite3.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <dirent.h>
-#include <strings.h>
-#include <fs.h>
-#include <fs.h>
-#include <inttypes.h>
-
-struct traffic_st
-{
- char ip[21];
- double in, out, total;
-};
-
-
-struct vsip_entry
-{
- char *name;
- char *ip;
-};
-
-
-uint32_t str2ip(char *ipstr)
-{
- char *octet;
- uint32_t ip = 0;
-
-
- octet = strtok(ipstr, ".");
- if(octet != NULL)
- ip = ip | (atoi(octet)<<24);
-
- octet = strtok(NULL, ".");
- if(octet != NULL)
- ip = ip | (atoi(octet)<<16);
-
- octet = strtok(NULL, ".");
- if(octet != NULL)
- ip = ip | (atoi(octet)<<8);
-
- octet = strtok(NULL, ".");
- if(octet != NULL)
- ip = ip | atoi(octet);
-
-
- return ip;
-}
-
-
-
-char **parse_ips(char *name, int *num)
-{
- int counter = 0;
- struct dirent *dir_info;
- char *path, *ip;
- DIR *dirst;
- char *subnet;
-
- char **output = NULL;
- *num = 0;
-
-
- path = concat("/etc/vservers/", name,"/interfaces", NULL);
- dirst = opendir(path);
- free(path);
-
- if(dirst != NULL)
- {
-
- while ((dir_info = readdir(dirst)) != NULL)
- {
-
- if(strcmp(dir_info->d_name, ".") != 0 && strcmp(dir_info->d_name, "..") != 0)
- {
-
- path = concat("/etc/vservers/", name,"/interfaces/", dir_info->d_name, NULL);
-
- if(dir_exist(path))
- {
- free(path);
- path = concat("/etc/vservers/", name,"/interfaces/", dir_info->d_name, "/ip", NULL);
-
- ip = file_read(path);
- if(ip != NULL)
- {
- trim_string(ip);
- subnet = strstr(ip, "/");
- if(subnet != NULL)
- subnet[0] = 0;
-
- output = realloc(output, (counter+1) * sizeof(char **));
- output[counter] = ip;
-
-
- counter++;
- }
- }
-
- free(path);
-
- }
-
- }
-
- *num = counter;
- closedir(dirst);
- }
-
- return output;
-}
-
-
-struct vsip_entry *vserver_iplist(void)
-{
- struct vsip_entry *allips = NULL;
- char **vsips;
- int i, entrysnum, allentrys = 0;
-
- DIR *dir_ptr;
- struct dirent *dir_entry;
- char path[1024];
-
-
-
- if((dir_ptr = opendir("/etc/vservers/")) != NULL)
- {
-
- while((dir_entry = readdir(dir_ptr)) != NULL)
- {
-
-
- if(dir_entry->d_name[0] != '.')
- {
- sconcat(path, 1024, "/etc/vservers/", dir_entry->d_name, NULL);
-
- if(dir_exist(path))
- {
- i = 0;
- vsips = parse_ips(dir_entry->d_name, &entrysnum);
-
- while(i<entrysnum)
- {
-
- allips = realloc(allips, sizeof(struct vsip_entry)*(allentrys+2));
- allips[allentrys].name = strdup(dir_entry->d_name);
- allips[allentrys].ip = strdup(vsips[i]);
-
- allentrys++;
- i++;
- }
-
- free_strings(vsips, entrysnum);
-
- }
- }
-
- }
-
-
- closedir(dir_ptr);
- }
-
- if(allips != NULL)
- {
- allips[allentrys].name = NULL;
- allips[allentrys].ip = NULL;
- }
-
- return allips;
-}
-
-int free_iplist(struct vsip_entry *list)
-{
- int i=0;
-
- if(list == NULL)
- return -1;
-
- while(list[i].name != NULL && list[i].ip != NULL)
- {
- free(list[i].name);
- free(list[i].ip);
-
- i++;
- }
-
- free(list);
-
- return 0;
-}
-
-struct traffic_st *parse_day_traffic(char *ipfm_dir, int month, int day, double *day_in, double *day_out, double *day_total, int *entry_num)
-{
- FILE *logfile;
- char buf[1024+1], *ip;
- double in, out, total;
- struct traffic_st *day_traffic = NULL;
-
- *day_in = 0;
- *day_out = 0;
- *day_total = 0;
-
- *entry_num = 0;
-
- snprintf(buf, 1024, "%s/%02d/%02d", ipfm_dir, month, day);
-
- if(file_exist(buf))
- {
-
- logfile = fopen(buf, "r");
-
-
- while(fgets(buf, 1024, logfile) != NULL)
- {
-
- if(buf[0] != '#')
- {
-
-
- sscanf(buf, "%as %lf %lf %lf", &ip, &in, &out, &total);
-
-
- day_traffic = (struct traffic_st *)realloc(day_traffic, sizeof(struct traffic_st) * (*entry_num+1));
-
- strncpy(day_traffic[*entry_num].ip, ip, 20);
- day_traffic[*entry_num].in = in;
- day_traffic[*entry_num].out = out;
- day_traffic[*entry_num].total = total;
-
- (*day_in) += in;
- (*day_out) += out;
- (*day_total) += total;
-
- (*entry_num)++;
-
- free(ip);
-
- }
-
- }
-
-
- fclose(logfile);
- }
-
-
-
-
-
- return day_traffic;
-}
-
-
-int main(int args, char **argv)
-{
-
- sqlite3 *openvcp_db;
- char *ipfm_dir, *sqlite_db_path, *sql_error;
- char sql_query[1024+1];
-
-
- struct traffic_st *day_traffic;
- int month, day = 1, year;
-
- double day_total, day_in, day_out;
- int ipid, i=1, ret, entry_num;
- struct vsip_entry *iplist;
-
-
-
- if(args < 2)
- {
- printf("Usage: %s sqlite_db_path [ipfm_dir month year]\n", argv[0]);
- return -1;
- }
-
-
- iplist = vserver_iplist();
-
- sqlite_db_path = argv[1];
- ret = sqlite3_open(sqlite_db_path, &openvcp_db);
-
- if(ret != 0)
- {
- printf("Can't open database: (%s)", sqlite3_errmsg(openvcp_db));
- sqlite3_close(openvcp_db);
- exit(-1);
- }
-
-
- if(args == 5)
- {
-
- ipfm_dir = argv[2];
-
- month = atoi(argv[3]);
- year = atoi(argv[4]);
-
- printf("parsing IPFM logs: %s into SQLite DB: %s\n\n", ipfm_dir, sqlite_db_path);
-
-
-
- ret = sqlite3_exec(openvcp_db,
- "CREATE TABLE vserver_traffic ('month', 'day', 'year', 'ip', 'in', 'out', 'total', UNIQUE(month, day, year, ip))"
- , NULL, 0, NULL);
- ret = sqlite3_exec(openvcp_db,
- "CREATE TABLE node_traffic ('month', 'day', 'year', 'in', 'out', 'total', UNIQUE(month, day, year))"
- , NULL, 0, NULL);
-
-
- while(day != 32)
- {
-
-
- day_traffic = parse_day_traffic(ipfm_dir, month, day, &day_in, &day_out, &day_total, &entry_num);
-
- i = 0;
-
- while(i != entry_num)
- {
-
- ipid = 0;
- while(iplist[ipid].ip != NULL)
- {
- if(strcmp(iplist[ipid].ip, day_traffic[i].ip) == 0)
- break;
-
- ipid++;
- }
-
- if(iplist[ipid].name != NULL)
- {
- snprintf(sql_query, 1024,
- "INSERT OR REPLACE INTO vserver_traffic VALUES(%d, %d, %d, %u, %.0lf, %.0lf, %.0lf, '%s')",
- month, day, year, str2ip(day_traffic[i].ip), day_traffic[i].in, day_traffic[i].out, day_traffic[i].total, iplist[ipid].name);
-
-
- ret = sqlite3_exec(openvcp_db, sql_query, NULL, 0, &sql_error);
-
- if(ret != SQLITE_OK)
- {
- printf("SQL error (%s)", sql_error);
- sqlite3_free(sql_error);
- sqlite3_close(openvcp_db);
- exit(-1);
- }
- }
-
- i++;
- }
-
- snprintf(sql_query, 1024,
- "INSERT OR REPLACE INTO node_traffic VALUES(%d, %d, %d, %.0lf, %.0lf, %.0lf)",
- month, day, year,
- day_in, day_out, day_total);
-
-
-
- ret = sqlite3_exec(openvcp_db, sql_query, NULL, 0, &sql_error);
-
- if(ret != SQLITE_OK)
- {
- printf("SQL error (%s)", sql_error);
- sqlite3_free(sql_error);
- sqlite3_close(openvcp_db);
- exit(-1);
- }
-
- printf("Month: %d\tDay: %d\tYear: %d\tIn: %.0lf\tOut: %.0lf\tTotal: %.0lf\n", month, day, year, day_in, day_out, day_total);
- free(day_traffic);
-
-
- day++;
- }
-
-
- }
- else
- {
- i=0;
-
- while(iplist[i].ip != NULL)
- {
-
-
- if(strstr(iplist[i].ip, ":") == NULL)
- {
- snprintf(sql_query, 1024,
- "UPDATE vserver_traffic SET name='%s' WHERE ip='%u'",
- iplist[i].name, str2ip(iplist[i].ip));
- }
- else
- {
- snprintf(sql_query, 1024,
- "UPDATE vserver_traffic SET name='%s' WHERE ip='%s'",
- iplist[i].name, iplist[i].ip);
-
- }
-
- ret = sqlite3_exec(openvcp_db, sql_query, NULL, 0, &sql_error);
-
- if(ret != SQLITE_OK)
- {
- printf("SQL error (%s)", sql_error);
- sqlite3_free(sql_error);
- sqlite3_close(openvcp_db);
- exit(-1);
- }
-
- i++;
- }
-
- printf("OK\n");
-
- }
-
- free_iplist(iplist);
- sqlite3_close(openvcp_db);
-
- return 0;
-}
-
Modified: trunk/daemon/src/request.c
===================================================================
--- trunk/daemon/src/request.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/request.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -22,8 +22,8 @@
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
+#include <unistd.h>
-
#include "strings.h"
#include "misc.h"
#include "main.h"
@@ -34,6 +34,7 @@
#include "trafficlimit.h"
#include "modules.h"
+
int init_modules(void)
{
@@ -137,98 +138,17 @@
" version is what the client expects.", "string", NULL);
+
+ /* Python Extensions */
+
+ ovcp_extensions_load();
+
+
+ return 0;
}
-/*
-struct ovcp_method ovcp_vserver_methods[] =
-{
- { "get_xid", { "int", "string", NULL }, "", get_xid },
- { "get_state", { "string", "string", NULL }, "", get_state },
- { "get_ips", { NULL }, "", get_ips },
- { "get_flags", { NULL }, "", get_flags },
- { "get_schedule", { NULL }, "", get_schedule },
- { "get_hostname", { NULL }, "", get_hostname },
- { "set_filter", { NULL }, "", set_filter },
- { "get_filter", { NULL }, "", get_filter },
- { "del_filter", { NULL }, "", del_filter },
- { "set_trafficlimit", { NULL }, "", set_trafficlimit },
- { "get_trafficlimit", { NULL }, "", get_trafficlimit },
- { "del_trafficlimit", { NULL }, "", del_trafficlimit },
- { "get_space", { NULL }, "", get_space },
- { "get_rlimit", { NULL }, "", get_rlimit },
- { "get_image", { NULL }, "", get_image },
- { "get_uptime", { NULL }, "", get_uptime },
- { "get_mark", { NULL }, "", get_mark },
- { "get_load", { NULL }, "", get_load },
- { "set_rlimit", { NULL }, "", set_rlimit },
- { "add_flag", { NULL }, "", set_flag_add },
- { "remove_flag", { NULL }, "", set_flag_remove },
- { "set_schedule", { NULL }, "", set_schedule },
- { "add_iface", { NULL }, "", add_ip },
- { "remove_iface", { NULL }, "", remove_ip },
- { "set_space", { NULL }, "", set_space },
- { "set_rootpw", { NULL }, "", set_rootpw },
- { "set_hostname" , { NULL }, "", set_hostname },
- { "set_mark" , { NULL }, "", set_mark },
- { "set_bandwidth", { NULL }, "", set_bandwidth },
- { "get_bandwidth", { NULL }, "", get_bandwidth },
- { "del_bandwidth", { NULL }, "", del_bandwidth },
- { "remove", { NULL }, "", vserver_remove },
- { "traffic", { NULL }, "", vserver_traffic },
- { "traffic_total", { NULL }, "", vserver_traffic_total },
- { "traffic_hour", { NULL }, "", vserver_traffic_hour },
- { "start", { NULL }, "", vserver_control_start },
- { "stop", { NULL }, "", vserver_control_stop },
- { "get_resources", { NULL }, "", get_resources },
- { "resources_hour", { NULL }, "", vserver_resources_hour },
- { "rescue", { NULL }, "", vserver_rescue },
- { "get_userbackups", { NULL }, "", get_userbackups },
- { "create_userbackups", { NULL }, "", create_userbackups },
- { "restore_userbackups", { NULL }, "", restore_userbackups },
- { "delete_userbackups", { NULL }, "", delete_userbackups },
- { "refresh_userbackups", { NULL }, "", refresh_userbackups },
- { NULL, {NULL}, NULL, NULL }
-};
-struct ovcp_method ovcp_node_methods[] =
-{
- { "version", { NULL }, "", node_version },
- { "halt", { NULL }, "", node_halt },
- { "reboot", { NULL }, "", node_reboot },
- { "stat", { NULL }, "", node_stat },
- { "get_interfaces", { NULL }, "", node_get_interfaces },
- { "get_images", { NULL }, "", node_get_images },
- { "traffic", { NULL }, "", node_get_traffic },
- { "traffic_total", { NULL }, "", node_get_traffic_total },
- { "traffic_hour", { NULL }, "", node_get_traffic_hour },
- { "get_uptime", { NULL }, "", node_get_uptime },
- { "get_load", { NULL }, "", node_get_load },
- { "get_mem", { NULL }, "", node_get_memory },
- { "get_space", { NULL }, "", node_get_space },
- { "guest_list", { NULL }, "", vserver_list },
- { NULL, {NULL}, NULL, NULL }
-};
-
-
-struct ovcp_method ovcp_setup_methods[] =
-{
- { "vserver_config", { NULL }, "", vserver_setup_config },
- { "vserver_image", { NULL }, "", vserver_setup_image },
- { NULL, {NULL}, NULL, NULL }
-};
-
-
-struct ovcp_method ovcp_system_methods[] =
-{
- { "listMethods", { "array", NULL } , "Enumerate the methods implemented by the server", system_list_methods},
- { "methodSignature", { "array", "string", NULL }, "This method takes one parameter, the name of a method implemented by the server.\n\nIt returns the signature for the method. A signature is an array of types. The first of these types is the return type of the method, the rest are parameters.\n\nA signature is restricted to the top level parameters expected by a method. For instance if a method expects one array of structs as a parameter, and it returns a string, its signature is simply \"string, array\". If it expects three integers, its signature is \"string, int, int, int\".\n\nIf no signature is defined for the method, a none-array value is returned.", system_method_signature },
- { "methodHelp",{ "string", "string", NULL }, "This method takes one parameter, the name of a method implemented by the server.\n\nIt returns a documentation string describing the use of that method. If no such string is available, an empty string is returned.\n\nThe documentation string may contain HTML markup.", system_method_help },
- { "getAPIVersion", { "string", NULL }, "This method returns the version of the XML-RPC API used by the server.\n\nIt might be a good idea to check that the version is what the client expects.", system_get_api_version },
- { NULL, {NULL}, NULL, NULL }
-};
-*/
-
struct ovcp_response_st *system_list_methods(struct ovcp_request_st *request)
{
char buf[BUF_SIZE];
@@ -269,7 +189,7 @@
arg0 = ovcp_request_get_arg(request, 0);
method_string = (char *)ovcp_data_get(arg0);
- if(!ovcp_data_is_string(arg0) || method == NULL)
+ if(!ovcp_data_is_string(arg0) || method_string == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
response = NULL;
@@ -331,7 +251,7 @@
arg0 = ovcp_request_get_arg(request, 0);
method_string = (char *)ovcp_data_get(arg0);
- if(!ovcp_data_is_string(arg0) || method == NULL)
+ if(!ovcp_data_is_string(arg0) || method_string == NULL)
return ovcp_response_error(OVCP_ERROR_ARGMISS, OVCP_ERROR_ARGMISS_DESC);
response = NULL;
Modified: trunk/daemon/src/request.h
===================================================================
--- trunk/daemon/src/request.h 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/request.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -28,7 +28,7 @@
#include "get.h"
#include "traffic.h"
#include "setup.h"
- #include "xml.h"
+ #include "ovcpxml.h"
#include "bandwidth.h"
#include "userbackup.h"
Modified: trunk/daemon/src/set.h
===================================================================
--- trunk/daemon/src/set.h 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/set.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-#include "xml.h"
+#include "ovcpxml.h"
#ifndef SET_H
#define SET_H
Modified: trunk/daemon/src/traffic.c
===================================================================
--- trunk/daemon/src/traffic.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/traffic.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -35,12 +35,14 @@
#include "misc.h"
#include "config.h"
#include "filter.h"
+#include "bandwidth.h"
+#include "trafficlimit.h"
struct traffic_st *parse_day_traffic(int month, int day, double *day_in, double *day_out, double *day_total, int *entry_num);
static int get_vserver_traffic(sqlite3 *openvcp_db, int day, int month, int year, char *ip, char *name, long long int *in, long long int *out, long long int *total);
static int get_node_traffic(sqlite3 *openvcp_db, int day, int month, int year, long long int *in, long long int *out, long long int *total);
-static void segv_handle();
+static void segv_handle(int sig);
@@ -702,7 +704,7 @@
}
-static void segv_handle()
+static void segv_handle(int sig)
{
ovcp_log(OVCP_ERROR, "traffic daemon process [%d] received signal 'Segmentation fault'", getpid());
exit(-1);
Modified: trunk/daemon/src/trafficlimit.c
===================================================================
--- trunk/daemon/src/trafficlimit.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/trafficlimit.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -94,7 +94,7 @@
struct ovcp_response_st *response;
struct ovcp_data_st *arg0;
- char *name, *type;
+ char *name;
char sql_query[BUF_SIZE];
char *sql_error, **sql_result;
int i, ret, nrow, ncolumn;
@@ -149,8 +149,8 @@
struct ovcp_data_st *arg0, *arg1;
char *name, *type;
char sql_query[BUF_SIZE];
- char *sql_error, **sql_result;
- int i, ret, nrow, ncolumn;
+ char *sql_error;
+ int ret;
arg0 = ovcp_request_get_arg(request, 0);
Modified: trunk/daemon/src/userbackup.c
===================================================================
--- trunk/daemon/src/userbackup.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/userbackup.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -22,6 +22,7 @@
#include <sys/types.h>
#include <dirent.h>
#include <time.h>
+#include <unistd.h>
#include "strings.h"
@@ -101,7 +102,7 @@
struct ovcp_response_st *response;
char *name, *homedir, *userbackupdir, *backupname;
- char *min, *hour, *day, *month, *year, *output, *size;
+ char *min, *hour, *day, *month, *year, *size = NULL;
char *rsyncoutput, **tmpargv, **tmpargv2;
int i = 0;
@@ -201,8 +202,8 @@
free(backupname);
free(userbackupdir);
free(homedir);
- free(output);
+
return response;
}
@@ -214,7 +215,7 @@
char path[BUF_SIZE+1];
char cachepath[BUF_SIZE];
- char *name, *homedir, *backupdir, *userbackupdir, *backupname, *context;
+ char *name, *homedir, *backupdir, *userbackupdir, *backupname, *context=NULL;
int ret = 0;
@@ -280,7 +281,7 @@
}
execb_cmd("rm", "rm", "-rf", backupdir, NULL);
free(backupdir);
- free(context);
+ if(context != NULL) free(context);
free(userbackupdir);
free(homedir);
return response;
@@ -293,8 +294,8 @@
struct ovcp_response_st *response;
char *name, *homedir, *userbackupdir, *backupname;
- char *backupnamenew, *userbackupdirnew, *output, *filename, *size;
- char *rsyncoutput, **tmpargv, **tmpargv2;
+ char *backupnamenew, *userbackupdirnew, *filename, *size=NULL;
+ char *rsyncoutput = NULL, **tmpargv, **tmpargv2;
int ret=0, i = 0;
unsigned int tmpargc, tmpargc2;
@@ -399,8 +400,9 @@
free(userbackupdirnew);
free(backupnamenew);
free(homedir);
- free(output);
free(filename);
+ if(rsyncoutput != NULL) free(rsyncoutput);
+
return response;
}
Deleted: trunk/daemon/src/xml.c
===================================================================
--- trunk/daemon/src/xml.c 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/xml.c 2009-12-29 20:45:59 UTC (rev 683)
@@ -1,1507 +0,0 @@
-/* OpenVCP
- * Copyright (C) 2006 Gerrit Wyen <gerrit at t4a.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-#include <libxml/encoding.h>
-#include <libxml/xmlwriter.h>
-#include <libxml/xmlreader.h>
-
-#include "xml.h"
-
-
-
-#ifdef DEBUG_XML
- #define XML_DEBUG(args) printf args
-#else
- #define XML_DEBUG(...)
-#endif
-
-
-
-
-/* XML Writing */
-
-struct ovcp_response_st *ovcp_response_new(void)
-{
- int rc;
- struct ovcp_response_st *response;
-
- response = (struct ovcp_response_st *)malloc(sizeof(struct ovcp_response_st));
-
-
- response->buf = xmlBufferCreate();
- if (response->buf == NULL)
- {
- XML_DEBUG(("testXmlwriterMemory: Error creating the xml buffer\n"));
- free(response);
- return NULL;
- }
-
- response->writer = xmlNewTextWriterMemory(response->buf, 0);
- if (response->writer == NULL)
- {
- XML_DEBUG(("testXmlwriterMemory: Error creating the xml writer\n"));
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
-
- rc = xmlTextWriterStartDocument(response->writer, NULL, "utf-8", NULL);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n"));
- xmlFreeTextWriter(response->writer);
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "methodResponse");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- xmlFreeTextWriter(response->writer);
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "params");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- xmlFreeTextWriter(response->writer);
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
- return response;
-}
-
-int ovcp_response_array_new(struct ovcp_response_st *response)
-{
- int rc;
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "array");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "data");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_array_add_string(struct ovcp_response_st *response, char *string)
-{
- int rc;
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "string", BAD_CAST string);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_array_add_int(struct ovcp_response_st *response, int value)
-{
- int rc;
- char value_str[12];
-
- snprintf(value_str, 12, "%d", value);
-
-
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "int", BAD_CAST value_str);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_array_end(struct ovcp_response_st *response)
-{
- int rc;
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_struct_new(struct ovcp_response_st *response)
-{
- int rc;
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "struct");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_struct_end(struct ovcp_response_st *response)
-{
- int rc;
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_struct_add_string(struct ovcp_response_st *response, char *name, char *string)
-{
- int rc;
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "member");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "name", BAD_CAST name);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "string", BAD_CAST string);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_struct_add_int(struct ovcp_response_st *response, char *name, int value)
-{
- int rc;
- char value_str[12];
-
- snprintf(value_str, 12, "%d", value);
-
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "member");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "name", BAD_CAST name);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "int", BAD_CAST value_str);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return rc;
-}
-
-int ovcp_response_struct_add_boolean(struct ovcp_response_st *response, char *name, int value)
-{
- int rc;
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "member");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "name", BAD_CAST name);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- if(value == 1)
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "boolean", BAD_CAST "1");
- else
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "boolean", BAD_CAST "0");
-
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return rc;
-}
-
-int ovcp_response_struct_add_double(struct ovcp_response_st *response, char *name, double value)
-{
- int rc;
- char value_str[20];
-
- snprintf(value_str, 20, "%lf", value);
-
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "member");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "name", BAD_CAST name);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "double", BAD_CAST value_str);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_add_string(struct ovcp_response_st *response, char *string)
-{
- int rc;
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "string", BAD_CAST string);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_add_int(struct ovcp_response_st *response, int value)
-{
- int rc;
- char value_str[12];
-
- snprintf(value_str, 12, "%d", value);
-
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "int", BAD_CAST value_str);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_add_double(struct ovcp_response_st *response, double value)
-{
- int rc;
- char value_str[20];
-
- snprintf(value_str, 20, "%lf", value);
-
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "double", BAD_CAST value_str);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-int ovcp_response_add_boolean(struct ovcp_response_st *response, int value)
-{
- int rc;
-
-
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "param");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- return -1;
- }
-
- if(value == 1)
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "boolean", BAD_CAST "1");
- else
- rc = xmlTextWriterWriteElement(response->writer, BAD_CAST "boolean", BAD_CAST "0");
-
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterWriteElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- rc = xmlTextWriterEndElement(response->writer);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndElement\n"));
- return -1;
- }
-
- return 0;
-}
-
-struct ovcp_response_st *ovcp_response_error(int code, char *desc)
-{
- int rc;
- struct ovcp_response_st *response;
-
- response = (struct ovcp_response_st *)malloc(sizeof(struct ovcp_response_st));
-
-
- response->buf = xmlBufferCreate();
- if (response->buf == NULL)
- {
- XML_DEBUG(("testXmlwriterMemory: Error creating the xml buffer\n"));
- free(response);
- return NULL;
- }
-
- response->writer = xmlNewTextWriterMemory(response->buf, 0);
- if (response->writer == NULL)
- {
- XML_DEBUG(("testXmlwriterMemory: Error creating the xml writer\n"));
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
-
- rc = xmlTextWriterStartDocument(response->writer, NULL, "ISO-8859-1", NULL);
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartDocument\n"));
- xmlFreeTextWriter(response->writer);
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "methodResponse");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- xmlFreeTextWriter(response->writer);
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "fault");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- xmlFreeTextWriter(response->writer);
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
- rc = xmlTextWriterStartElement(response->writer, BAD_CAST "value");
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterStartElement\n"));
- xmlFreeTextWriter(response->writer);
- xmlBufferFree(response->buf);
- free(response);
- return NULL;
- }
-
- ovcp_response_struct_new(response);
- ovcp_response_struct_add_int(response, "faultCode", code);
- ovcp_response_struct_add_string(response, "faultString", desc);
- ovcp_response_struct_end(response);
-
- return response;
-}
-
-
-char *ovcp_response_finalize(struct ovcp_response_st *response)
-{
- int rc;
- char *xml_string;
-
- rc = xmlTextWriterEndDocument(response->writer);
-
- if (rc < 0)
- {
- XML_DEBUG(("testXmlwriterMemory: Error at xmlTextWriterEndDocument\n"));
- return NULL;
- }
-
- xmlFreeTextWriter(response->writer);
-
- xml_string = strdup((char *)response->buf->content);
-
- xmlBufferFree(response->buf);
-
- free(response);
-
- return xml_string;
-}
-
-
-
-
-
-
-
-/* XML Reading */
-
-
-static struct ovcp_data_st *xml_parse_values(xmlTextReaderPtr reader);
-static struct ovcp_data_st *xml_parse_struct(xmlTextReaderPtr reader);
-static struct ovcp_data_st *xml_parse_array(xmlTextReaderPtr reader);
-static struct ovcp_data_st *xml_parse_param(xmlTextReaderPtr reader);
-static int ovcp_free_data(struct ovcp_data_st *data);
-
-
-struct ovcp_data_st *ovcp_request_get_arg(struct ovcp_request_st *request, int id)
-{
- int i = 0;
- struct ovcp_data_st *tmpdata;
-
- tmpdata = request->data;
-
- while(tmpdata != NULL)
- {
- if(i == id)
- break;
-
- tmpdata = tmpdata->next;
- i++;
- }
-
- return tmpdata;
-}
-
-struct ovcp_data_st *ovcp_array_get_element(struct ovcp_data_st *array, int id)
-{
- int i = 0;
- struct ovcp_data_st *tmpdata;
-
- tmpdata = array->sub;
-
- while(tmpdata != NULL)
- {
- if(i == id)
- break;
-
- tmpdata = tmpdata->next;
- i++;
- }
-
- return tmpdata;
-}
-
-struct ovcp_data_st *ovcp_struct_get_element(struct ovcp_data_st *structure, char *name)
-{
- struct ovcp_data_st *data;
-
- data = ovcp_struct_get_member(structure, name);
-
- if(data != NULL)
- return data->sub;
-
- return NULL;
-}
-
-struct ovcp_data_st *ovcp_struct_get_member(struct ovcp_data_st *structure, char *name)
-{
- struct ovcp_data_st *tmpdata;
-
- if(structure->sub == NULL)
- return NULL;
-
- tmpdata = structure->sub;
-
- while(tmpdata != NULL)
- {
- if(strcmp(tmpdata->data, name) == 0)
- break;
-
- tmpdata = tmpdata->next;
- }
-
-
- if(tmpdata == NULL)
- return NULL;
- else
- return tmpdata;
-}
-
-inline void *ovcp_data_get(struct ovcp_data_st *data)
-{
- return (data != NULL) ? data->data : NULL;
-}
-
-inline void *ovcp_member_get(struct ovcp_data_st *data)
-{
- return (data != NULL) ? data->sub : NULL;
-}
-
-inline int ovcp_data_is_array(struct ovcp_data_st *data)
-{
- return (data != NULL) ? (data->type == OVCP_XML_ARRAY) : 0;
-}
-
-int ovcp_data_is_struct(struct ovcp_data_st *data)
-{
- return (data != NULL) ? (data->type == OVCP_XML_STRUCT) : 0;
-}
-
-inline int ovcp_data_is_int(struct ovcp_data_st *data)
-{
- return (data != NULL) ? (data->type == OVCP_XML_INT) : 0;
-}
-
-inline int ovcp_data_is_double(struct ovcp_data_st *data)
-{
- return (data != NULL) ? (data->type == OVCP_XML_DOUBLE) : 0;
-}
-
-inline int ovcp_data_is_boolean(struct ovcp_data_st *data)
-{
- return (data != NULL) ? (data->type == OVCP_XML_BOOLEAN) : 0;
-}
-
-inline int ovcp_data_is_string(struct ovcp_data_st *data)
-{
- return (data != NULL) ? (data->type == OVCP_XML_STRING) : 0;
-}
-
-static int ovcp_free_data(struct ovcp_data_st *data)
-{
-
- if(data->data != NULL)
- free(data->data);
-
- if(data->next != NULL)
- ovcp_free_data(data->next);
- if(data->sub != NULL)
- ovcp_free_data(data->sub);
-
-
- free(data);
-
- return 0;
-}
-
-
-int ovcp_free_request(struct ovcp_request_st *request)
-{
- if(request->methodname != NULL)
- free(request->methodname);
-
- if(request->data != NULL)
- ovcp_free_data(request->data);
-
-
- free(request);
-
-
- return 0;
-}
-
-
-struct ovcp_request_st *ovcp_parse_request(char *xmlstr)
-{
- if(xmlstr == NULL) return NULL;
- if(strlen(xmlstr) <= 0) return NULL;
-
- xmlTextReaderPtr reader;
- struct ovcp_request_st *request;
- struct ovcp_data_st *tmpdata = NULL;
- char *p;
-
- request = (struct ovcp_request_st *) malloc(sizeof(struct ovcp_request_st));
- memset(request, 0, sizeof(struct ovcp_request_st));
-
- reader = xmlReaderForMemory(xmlstr, strlen(xmlstr), NULL, NULL, 0);
-
- if (reader == NULL)
- {
- XML_DEBUG(("Unable to open buffer\n"));
- ovcp_free_request(request);
- return NULL;
- }
-
- xmlTextReaderRead(reader);
-
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
- if(strcmp(p, "methodCall") == 0)
- {
- xmlTextReaderRead(reader);
-
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
- if(strcmp(p, "methodName") == 0)
- {
- xmlTextReaderRead(reader);
-
- p = (char *) xmlTextReaderConstValue(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error: methodName missing\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
- request->methodname = strdup(p);
-
-
- xmlTextReaderRead(reader);
-
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
- if(strcmp(p,"methodName") != 0)
- {
- XML_DEBUG(("Parsing Error: methodName not terminated\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
-
- xmlTextReaderRead(reader);
-
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parse Error\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
- if(strcmp(p, "params") != 0)
- {
- XML_DEBUG(("Parsing Error: params not found\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
-
- while(1)
- {
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
- if(strcmp(p, "param") != 0)
- break;
-
- if(request->data == NULL)
- {
- request->data = xml_parse_param(reader);
- tmpdata = request->data;
- }
- else
- {
- tmpdata->next = xml_parse_param(reader);
- tmpdata = tmpdata->next;
- }
-
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
-
- if(strcmp(p, "param") != 0)
- {
- XML_DEBUG(("Parsing Error: param tag not terminated [%s]\n", p));
- ovcp_free_request(request);
- xmlFreeTextReader(reader);
- return NULL;
- }
- }
- }
-
- }
-
-
-
- xmlFreeTextReader(reader);
-
-
- xmlCleanupParser();
-
-
- xmlMemoryDump();
-
- return request;
-}
-
-static struct ovcp_data_st *xml_parse_param(xmlTextReaderPtr reader)
-{
- struct ovcp_data_st *data = NULL;
- char *p, *type;
-
- xmlTextReaderRead(reader);
- p = (char *)xmlTextReaderConstName(reader);
-
- XML_DEBUG(("Param Type: %s\n", p));
-
-
- if(strcmp(p, "value") == 0)
- {
-
- xmlTextReaderRead(reader);
-
-
- type = (char *)xmlTextReaderConstName(reader);
-
-
- if(strcmp(type, "struct") == 0)
- {
- data = xml_parse_struct(reader);
- }
- else if(strcmp(type, "array") == 0)
- {
- data = xml_parse_array(reader);
- }
- else
- {
- data = xml_parse_values(reader);
- }
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- return NULL;
- }
-
- if(strcmp(p, "value") != 0)
- {
- XML_DEBUG(("Parsing Error: value not terminated [%s]\n", p));
- return NULL;
- }
-
- }
-
-
- return data;
-}
-
-static struct ovcp_data_st *xml_parse_array(xmlTextReaderPtr reader)
-{
-
- struct ovcp_data_st *data, *tmpdata = NULL;
- char *p;
-
-
- data = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
- memset(data, 0, sizeof(struct ovcp_data_st));
-
- data->type = OVCP_XML_ARRAY;
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "data") != 0)
- {
- XML_DEBUG(("Parsing Error: data tag not found\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
-
- while(1)
- {
-
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "data") == 0)
- break;
-
- if(strcmp(p, "value") != 0)
- {
- XML_DEBUG(("Parsing Error: value Tag not found [%s]\n", p));
- ovcp_free_data(data);
- return NULL;
- }
-
- xmlTextReaderRead(reader);
-
- if(data->sub == NULL)
- {
- data->sub = xml_parse_values(reader);
- tmpdata = data->sub;
- }
- else
- {
- tmpdata->next = xml_parse_values(reader);
- tmpdata = tmpdata->next;
- }
-
-
-
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error: Read Failed\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "value") != 0)
- {
- XML_DEBUG(("Parsing Error: Tag not terminated [%s]\n", p));
- ovcp_free_data(data);
- return NULL;
- }
-
-
- }
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "array") != 0)
- {
- XML_DEBUG(("Parsing Error: array tag not terminated [%s]\n", p));
- ovcp_free_data(data);
- return NULL;
- }
-
- return data;
-}
-
-static struct ovcp_data_st *xml_parse_struct(xmlTextReaderPtr reader)
-{
- struct ovcp_data_st *data, *tmpdata = NULL;
- char *p;
-
- data = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
- memset(data, 0, sizeof(struct ovcp_data_st));
-
- data->type = OVCP_XML_STRUCT;
-
- while(1)
- {
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "struct") == 0)
- break;
-
-
- if(strcmp(p, "member") != 0)
- {
- XML_DEBUG(("Parsing Error: member Tag not found\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "name") != 0)
- {
- XML_DEBUG(("Parsing Error: Name Tag not found\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstValue(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error: name tag empty\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(data->sub == NULL)
- {
- data->sub = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
- tmpdata = data->sub;
- }
- else
- {
- tmpdata->next = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
- tmpdata = tmpdata->next;
- }
-
- memset(tmpdata, 0, sizeof(struct ovcp_data_st));
- tmpdata->type = OVCP_XML_STRUCT_ELEMENT;
- tmpdata->data = strdup(p);
-
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "name") != 0)
- {
- XML_DEBUG(("Parsing Error: Name Tag not found [%s]\n", p));
- ovcp_free_data(data);
- return NULL;
- }
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "value") != 0)
- {
- XML_DEBUG(("Parsing Error: Value Tag not found [%s]\n", p));
- ovcp_free_data(data);
- return NULL;
- }
-
- xmlTextReaderRead(reader);
- tmpdata->sub = xml_parse_values(reader);
-
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error: Read Failed\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "value") != 0)
- {
- XML_DEBUG(("Parsing Error: Tag not terminated [%s]\n", p));
- ovcp_free_data(data);
- return NULL;
- }
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error: Read Failed\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, "member") != 0)
- {
- XML_DEBUG(("Parsing Error: Tag not terminated [%s]\n", p));
- ovcp_free_data(data);
- return NULL;
- }
- }
-
- return data;
-}
-
-
-static struct ovcp_data_st *xml_parse_values(xmlTextReaderPtr reader)
-{
- struct ovcp_data_st *data;
- char *type, *value;
- char *p;
-
-
- data = (struct ovcp_data_st *)malloc(sizeof(struct ovcp_data_st));
- memset(data, 0, sizeof(struct ovcp_data_st));
-
- type = (char *)xmlTextReaderConstName(reader);
- xmlTextReaderRead(reader);
- value = (char *)xmlTextReaderConstValue(reader);
-
- if(type == NULL || value == NULL)
- {
- XML_DEBUG(("Parsing Error [%s] [%s]\n", type, value));
- ovcp_free_data(data);
- return NULL;
- }
-
- XML_DEBUG(("Data Type: %s Value: %s\n", type, value));
-
- if(strcmp(type, "int") == 0 || strcmp(type, "i4") == 0)
- {
- data->type = OVCP_XML_INT;
- data->data = malloc(sizeof(int));
- *(int *)data->data = atoi(value);
- }
- else if(strcmp(type, "boolean") == 0)
- {
- data->type = OVCP_XML_BOOLEAN;
- data->data = malloc(sizeof(int));
-
- if(strcmp(value, "1") == 0)
- *(int *)data->data = 1;
- else
- *(int *)data->data = 0;
- }
- else if(strcmp(type, "string") == 0)
- {
- data->type = OVCP_XML_STRING;
- data->data = malloc(strlen(value)+1);
- strcpy(data->data, value);
- }
- else if(strcmp(type, "double") == 0)
- {
- data->type = OVCP_XML_DOUBLE;
- data->data = malloc(sizeof(double));
- *(double *)data->data = strtod(value, NULL);
- }
-
- xmlTextReaderRead(reader);
- p = (char *) xmlTextReaderConstName(reader);
-
-
- if(p == NULL)
- {
- XML_DEBUG(("Parsing Error: Read Failed\n"));
- ovcp_free_data(data);
- return NULL;
- }
-
- if(strcmp(p, type) != 0)
- {
- XML_DEBUG(("Parsing Error: %s tag not terminated [%s]\n", type, p));
- ovcp_free_data(data);
- return NULL;
- }
-
-
-
- return data;
-}
Deleted: trunk/daemon/src/xml.h
===================================================================
--- trunk/daemon/src/xml.h 2009-12-19 23:44:33 UTC (rev 682)
+++ trunk/daemon/src/xml.h 2009-12-29 20:45:59 UTC (rev 683)
@@ -1,87 +0,0 @@
-/* OpenVCP
- * Copyright (C) 2006 Gerrit Wyen <gerrit at t4a.net>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-
-#ifndef XML_H
- #define XML_H
-
-
- #include <libxml/encoding.h>
- #include <libxml/xmlwriter.h>
-
- enum ovcp_xml_datatypes {OVCP_XML_STRUCT, OVCP_XML_STRUCT_ELEMENT, OVCP_XML_ARRAY, OVCP_XML_INT, OVCP_XML_BOOLEAN, OVCP_XML_STRING, OVCP_XML_DOUBLE};
-
- #ifndef TRUE
- #define TRUE 1
- #define FALSE 0
- #endif
-
- struct ovcp_response_st
- {
- xmlTextWriterPtr writer;
- xmlBufferPtr buf;
- };
-
- struct ovcp_request_st
- {
- char *methodname;
- struct ovcp_data_st *data;
- };
-
- struct ovcp_data_st
- {
- int type;
- void *data;
-
- struct ovcp_data_st *next, *sub;
- };
-
- struct ovcp_response_st *ovcp_response_new(void);
- int ovcp_response_array_new(struct ovcp_response_st *response);
- int ovcp_response_array_add_string(struct ovcp_response_st *response, char *string);
- int ovcp_response_array_add_int(struct ovcp_response_st *response, int value);
- int ovcp_response_array_end(struct ovcp_response_st *response);
- int ovcp_response_struct_new(struct ovcp_response_st *response);
- int ovcp_response_struct_end(struct ovcp_response_st *response);
- int ovcp_response_struct_add_string(struct ovcp_response_st *response, char *name, char *string);
- int ovcp_response_struct_add_int(struct ovcp_response_st *response, char *name, int value);
- int ovcp_response_struct_add_double(struct ovcp_response_st *response, char *name, double value);
- int ovcp_response_struct_add_boolean(struct ovcp_response_st *response, char *name, int value);
- int ovcp_response_add_string(struct ovcp_response_st *response, char *string);
- int ovcp_response_add_int(struct ovcp_response_st *response, int value);
- int ovcp_response_add_double(struct ovcp_response_st *response, double value);
- int ovcp_response_add_boolean(struct ovcp_response_st *response, int value);
- struct ovcp_response_st *ovcp_response_error(int code, char *desc);
- char *ovcp_response_finalize(struct ovcp_response_st *response);
-
- struct ovcp_request_st *ovcp_parse_request(char *xmlstr);
- struct ovcp_data_st *ovcp_request_get_arg(struct ovcp_request_st *request, int id);
- struct ovcp_data_st *ovcp_array_get_element(struct ovcp_data_st *array, int id);
- struct ovcp_data_st *ovcp_struct_get_element(struct ovcp_data_st *structure, char *name);
- struct ovcp_data_st *ovcp_struct_get_member(struct ovcp_data_st *structure, char *name);
- inline void *ovcp_data_get(struct ovcp_data_st *data);
- inline void *ovcp_member_get(struct ovcp_data_st *data);
- inline int ovcp_data_is_array(struct ovcp_data_st *data);
- inline int ovcp_data_is_struct(struct ovcp_data_st *data);
- inline int ovcp_data_is_int(struct ovcp_data_st *data);
- inline int ovcp_data_is_double(struct ovcp_data_st *data);
- inline int ovcp_data_is_boolean(struct ovcp_data_st *data);
- inline int ovcp_data_is_string(struct ovcp_data_st *data);
- int ovcp_free_request(struct ovcp_request_st *request);
-
-#endif
More information about the Commits
mailing list