[Expat-discuss] XMLParserBuffer returns no element found!!!
Shishir.Rawat at rds.co.nz
Shishir.Rawat at rds.co.nz
Wed Aug 23 03:57:50 CEST 2006
Hello all,
I am using DOMC 0.8.0 along with Expat 2.0.0 and crosscompiling it for ARM
using arm-linux-g++ 3.3.2.
I am observing some problem with DOM_DocumentLS_load() API which in turn
calls XMLParserBuffer() of Expat.
The API is returning me error code as no element found - line 1. Which i
presume an error code of Expat rather then DOMC.
All of this happens as soon as i fork my parent process and try to call
this API from child process.
When i am not forking the process i get results as expected.
so when i say "make debug" it compiles without the source within #ifndef
CONSOLE_ONLY in turn the forking stuff in main function.
This works fine and returns me appropriate results.
But when i say "make" it compiles with all the forking stuff as mentioned
in main function.
The API returns with error "no element found: line 1".
even if i call the function function() before forking is done it returns
me correct results.
Can anyone help me with this problem and let me know where exactly i m
goin wrong?
The source code/makefile and xml files are as follows:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <locale.h>
#include <domc.h>
#define HAVE_VARMACRO 1
#include <mba/msgno.h>
bool gRunningFlag = true ;
bool gErrorFlag = false ;
int function(void);
void signal_handler(int sig) /* signal handler function */
{
switch(sig){
case SIGHUP:
/* rehash the server */
syslog(LOG_USER | LOG_DEBUG, "Caught SIGHUP, reloading
configuration?") ;
break;
case SIGTERM:
/* finalize the server */
syslog(LOG_USER | LOG_DEBUG, "Caught SIGTERM, shutting down") ;
gErrorFlag = true ;
//exit(0) ;
break;
case SIGINT:
syslog(LOG_USER | LOG_DEBUG, "Caught SIGINT, shutting down") ;
gErrorFlag = true ;
break ;
}
}
int main(int argc, char *argv[])
{
function();
#ifndef CONSOLE_ONLY
/* Our process ID and Session ID */
pid_t pid, sid;
/* Fork off the parent process */
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
* we can exit the parent process. */
if (pid > 0) {
exit(EXIT_SUCCESS);
}
/* Change the file mode mask */
umask(0);
/* Open any logs here */
/* Create a new SID for the child process */
sid = setsid();
if (sid < 0) {
/* Log the failure */
exit(EXIT_FAILURE);
}
/* Change the current working directory */
if ((chdir("/")) < 0) {
/* Log the failure */
exit(EXIT_FAILURE);
}
/* Close out the standard file descriptors */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
#endif
/* install signal handlers, so we can be a well-behaved unix daemon */
signal(SIGHUP, signal_handler); /* hangup signal */
signal(SIGTERM, signal_handler); /* software termination signal from
kill */
signal(SIGINT, signal_handler) ; /* Control-c or Control-Break from
keyboard */
while (!gErrorFlag)
{
function();
/* The Big Loop */
while (!gErrorFlag)
{
usleep(1000); /* wait 1 millisecond */
}
sleep(5) ;
}
exit(EXIT_SUCCESS);
}
int
function(void)
{
DOM_Document *doc;
DOM_Element *root;
DOM_Node *node;
if (!setlocale(LC_CTYPE, "")) {
syslog(LOG_USER | LOG_DEBUG, "Can't set the specified locale! "
"Check LANG, LC_CTYPE, LC_ALL.\n");
return 0;
}
doc = DOM_Implementation_createDocument(NULL, NULL, NULL);
if (DOM_DocumentLS_load(doc, "xmlfile.xml") == -1) {
MMSG("test xmlfile.xml load failed DOM_Exception");
syslog(LOG_USER | LOG_DEBUG, "Error trying to load XML file \n");
return 0;
}
root = doc->u.Document.documentElement;
for (node = root->firstChild;
node && node->nodeType != DOM_ELEMENT_NODE;
node = node->nextSibling) {
;
}
if (node == NULL) {
syslog(LOG_USER | LOG_DEBUG, "The document has no element
children\n");
return 0;
}
DOM_NodeList * entry =
DOM_Document_getElementsByTagName(doc,"builddate");
for (int i = 0 ; i < entry->length ; i++){
DOM_Node * node = DOM_NodeList_item(entry,i);
syslog(LOG_USER | LOG_DEBUG, "Data tag : %s :: %s", node->nodeName,
node->firstChild->nodeValue);
}
DOM_Document_destroyNodeList(doc, entry, 0);
DOM_Document_destroyNode(doc, doc);
return 1;
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
The makefile contains
PREFIX = /home/shishir/arm
INCLUDE = $(PREFIX)/include
LIB = $(PREFIX)/lib
CXX = arm-linux-g++
CXX_LIBS = -L/usr/local/arm/3.3.2/lib -L$(LIB) -pthread -ldl -lm
-ldomc -lmba -lexpat
CXXFLAGS = -Wall -I$(INCLUDE)
SOURCES = testdomc.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=test
.SUFFIXES: .o .cpp
.cpp.o :
$(CXX) -c $(CXXFLAGS) $(DEBUGFLAG) -o $@ $<
all: $(EXECUTABLE)
debug: DEBUGFLAG = -DCONSOLE_ONLY
debug: clean all
$(EXECUTABLE):$(OBJECTS)
$(CXX) -o $(EXECUTABLE) $(OBJECTS) $(CXX_LIBS)
arm-linux-strip $(EXECUTABLE)
clean:
rm -f $(OBJECTS)
rm -f $(EXECUTABLE)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
xmlfile.xml contains
<config>
<builddate>2006-11-23</builddate>
</config>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
More information about the Expat-discuss
mailing list