This commit was manufactured by cvs2svn to create tag 'glite-lb-glite- glite-lb-glite-LB_R_3_2_1_1
authorcvs2svn <admin@example.com>
Thu, 15 Apr 2010 14:34:43 +0000 (14:34 +0000)
committercvs2svn <admin@example.com>
Thu, 15 Apr 2010 14:34:43 +0000 (14:34 +0000)
LB_R_3_2_1_1'.

Sprout from branch_4006 2010-04-15 14:34:42 UTC František Dvořák <valtri@civ.zcu.cz> 'The most recent version copied. Do not modify this instance (RW in ./org.glite.lb).'
Delete:
    org.glite.lb.logger/.cvsignore
    org.glite.lb.logger/LICENSE
    org.glite.lb.logger/Makefile
    org.glite.lb.logger/build.xml
    org.glite.lb.logger/config/glite-lb-logger.config.xml
    org.glite.lb.logger/config/glite-lb-logger.default-properties
    org.glite.lb.logger/config/startup
    org.glite.lb.logger/configure
    org.glite.lb.logger/doc/glite-lb-interlogd.8
    org.glite.lb.logger/doc/glite-lb-logd.8
    org.glite.lb.logger/project/ChangeLog
    org.glite.lb.logger/project/build.number
    org.glite.lb.logger/project/build.properties
    org.glite.lb.logger/project/configure.properties.xml
    org.glite.lb.logger/project/package.description
    org.glite.lb.logger/project/package.summary
    org.glite.lb.logger/project/properties.xml
    org.glite.lb.logger/project/tar_exclude
    org.glite.lb.logger/project/version.properties
    org.glite.lb.logger/src-nt/Connection.H
    org.glite.lb.logger/src-nt/Connection.cpp
    org.glite.lb.logger/src-nt/EventManager.H
    org.glite.lb.logger/src-nt/EventManager.cpp
    org.glite.lb.logger/src-nt/Exception.H
    org.glite.lb.logger/src-nt/HTTPTransport.H
    org.glite.lb.logger/src-nt/HTTPTransport.cpp
    org.glite.lb.logger/src-nt/InputChannel.H
    org.glite.lb.logger/src-nt/InputChannel.cpp
    org.glite.lb.logger/src-nt/Makefile
    org.glite.lb.logger/src-nt/Message.H
    org.glite.lb.logger/src-nt/MessageStore.H
    org.glite.lb.logger/src-nt/MessageStore.cpp
    org.glite.lb.logger/src-nt/PlainConnection.H
    org.glite.lb.logger/src-nt/PlainConnection.cpp
    org.glite.lb.logger/src-nt/PluginManager.H
    org.glite.lb.logger/src-nt/PluginManager.cpp
    org.glite.lb.logger/src-nt/Properties.H
    org.glite.lb.logger/src-nt/Singleton.H
    org.glite.lb.logger/src-nt/SocketInput.H
    org.glite.lb.logger/src-nt/SocketInput.cpp
    org.glite.lb.logger/src-nt/ThreadPool.H
    org.glite.lb.logger/src-nt/ThreadPool.cpp
    org.glite.lb.logger/src-nt/Transport.H
    org.glite.lb.logger/src-nt/Transport.cpp
    org.glite.lb.logger/src-nt/main.cpp
    org.glite.lb.logger/src-nt/test/EventManagerTest.cpp
    org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp
    org.glite.lb.logger/src-nt/test/SingletonTest.cpp
    org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp
    org.glite.lb.logger/src-nt/test/test_main.cpp
    org.glite.lb.logger/src/event_queue.c
    org.glite.lb.logger/src/event_store.c
    org.glite.lb.logger/src/event_store_http.c
    org.glite.lb.logger/src/http.c
    org.glite.lb.logger/src/il_error.c
    org.glite.lb.logger/src/il_error.h
    org.glite.lb.logger/src/il_master.c
    org.glite.lb.logger/src/input_queue_socket.c
    org.glite.lb.logger/src/input_queue_socket_http.c
    org.glite.lb.logger/src/interlogd.c
    org.glite.lb.logger/src/interlogd.h
    org.glite.lb.logger/src/logd.c
    org.glite.lb.logger/src/logd_proto.c
    org.glite.lb.logger/src/logd_proto.h
    org.glite.lb.logger/src/perftest_il.sh
    org.glite.lb.logger/src/perftest_ll.sh
    org.glite.lb.logger/src/queue_mgr.c
    org.glite.lb.logger/src/queue_mgr_http.c
    org.glite.lb.logger/src/queue_thread.c
    org.glite.lb.logger/src/recover.c
    org.glite.lb.logger/src/send_event.c
    org.glite.lb.logger/src/send_event_http.c
    org.glite.lb.logger/src/server_msg.c
    org.glite.lb.logger/src/server_msg_http.c
    org.glite.lb.logger/test/IlTestBase.cpp
    org.glite.lb.logger/test/IlTestBase.h
    org.glite.lb.logger/test/event_queueTest.cpp
    org.glite.lb.logger/test/event_storeTest.cpp
    org.glite.lb.logger/test/il_test.cpp
    org.glite.lb.logger/test/input_queue_socketTest.cpp
    org.glite.lb.logger/test/ll_test.cpp
    org.glite.lb.logger/test/logd_proto_test.c
    org.glite.lb.logger/test/server_msgTest.cpp
    org.glite.lb.server/.cvsignore
    org.glite.lb.server/LICENSE
    org.glite.lb.server/Makefile
    org.glite.lb.server/build.xml
    org.glite.lb.server/config/glite-lb-dbsetup.sql
    org.glite.lb.server/config/glite-lb-index.conf.template
    org.glite.lb.server/config/glite-lb-migrate_db2version20
    org.glite.lb.server/config/startup
    org.glite.lb.server/configure
    org.glite.lb.server/doc/glite-lb-bkindex.8
    org.glite.lb.server/doc/glite-lb-bkserverd.8
    org.glite.lb.server/doc/glite-lb-mon-db.1
    org.glite.lb.server/examples/stdsoap2_2.6.0.c
    org.glite.lb.server/examples/stdsoap2_2.6.2.c
    org.glite.lb.server/examples/stdsoap2_2.7.0c.c
    org.glite.lb.server/examples/stdsoap2_2.7.0d.c
    org.glite.lb.server/interface/index.h
    org.glite.lb.server/interface/lb_authz.h
    org.glite.lb.server/interface/pretty_print_wrapper.h
    org.glite.lb.server/interface/query.h
    org.glite.lb.server/interface/srv_perf.h
    org.glite.lb.server/interface/store.h
    org.glite.lb.server/project/.cvsignore
    org.glite.lb.server/project/ChangeLog
    org.glite.lb.server/project/build.number
    org.glite.lb.server/project/build.properties
    org.glite.lb.server/project/configure.properties.xml
    org.glite.lb.server/project/package.description
    org.glite.lb.server/project/package.summary
    org.glite.lb.server/project/properties.xml
    org.glite.lb.server/project/tar_exclude
    org.glite.lb.server/project/version.properties
    org.glite.lb.server/src/bkindex.c
    org.glite.lb.server/src/bkserverd.c
    org.glite.lb.server/src/cond_dump.c
    org.glite.lb.server/src/cond_dump.h
    org.glite.lb.server/src/db_calls.c
    org.glite.lb.server/src/db_calls.h
    org.glite.lb.server/src/db_store.c
    org.glite.lb.server/src/db_supp.c
    org.glite.lb.server/src/db_supp.h
    org.glite.lb.server/src/dump.c
    org.glite.lb.server/src/get_events.c.T
    org.glite.lb.server/src/get_events.h
    org.glite.lb.server/src/il_lbproxy.c
    org.glite.lb.server/src/il_lbproxy.h
    org.glite.lb.server/src/il_notification.c
    org.glite.lb.server/src/il_notification.h
    org.glite.lb.server/src/index.c.T
    org.glite.lb.server/src/index_lex.l
    org.glite.lb.server/src/index_parse.y
    org.glite.lb.server/src/jobstat.c
    org.glite.lb.server/src/jobstat.h
    org.glite.lb.server/src/jobstat_supp.c
    org.glite.lb.server/src/lb_authz.c
    org.glite.lb.server/src/lb_html.c
    org.glite.lb.server/src/lb_html.h
    org.glite.lb.server/src/lb_http.c
    org.glite.lb.server/src/lb_http.h
    org.glite.lb.server/src/lb_proto.c
    org.glite.lb.server/src/lb_proto.h
    org.glite.lb.server/src/lb_rss.c
    org.glite.lb.server/src/lb_rss.h
    org.glite.lb.server/src/lb_text.c
    org.glite.lb.server/src/lb_text.h
    org.glite.lb.server/src/lb_xml_parse.c.T
    org.glite.lb.server/src/lb_xml_parse.h
    org.glite.lb.server/src/lb_xml_parse_V21.c.T
    org.glite.lb.server/src/lb_xml_parse_V21.h
    org.glite.lb.server/src/lcas_lb.c
    org.glite.lb.server/src/load.c
    org.glite.lb.server/src/mon-db.c
    org.glite.lb.server/src/notif_match.c
    org.glite.lb.server/src/notification.c
    org.glite.lb.server/src/openserver.c
    org.glite.lb.server/src/openserver.h
    org.glite.lb.server/src/perftest_proxy.sh
    org.glite.lb.server/src/pretty_print_wrapper.cpp
    org.glite.lb.server/src/purge.h
    org.glite.lb.server/src/query.c
    org.glite.lb.server/src/request.c
    org.glite.lb.server/src/seqcode.c
    org.glite.lb.server/src/server_state.c
    org.glite.lb.server/src/server_state.h
    org.glite.lb.server/src/srv_purge.c
    org.glite.lb.server/src/stats.c
    org.glite.lb.server/src/stats.h
    org.glite.lb.server/src/store.c.T
    org.glite.lb.server/src/stored_master.c
    org.glite.lb.server/src/userjobs.c
    org.glite.lb.server/src/write2rgma.c
    org.glite.lb.server/src/ws_fault.c
    org.glite.lb.server/src/ws_fault.h
    org.glite.lb.server/src/ws_query.c
    org.glite.lb.server/src/ws_typemap.dat
    org.glite.lb.server/src/ws_typemap.h
    org.glite.lb.server/src/ws_typeref.c.T
    org.glite.lb.server/src/ws_typeref.h
    org.glite.lb.server/test/oneJob.qry
    org.glite.lb.server/test/test_query_events.cpp
    org.glite.lb.server/test/test_soap_conv.cpp
    org.glite.lb.server/test/test_trans.sh
    org.glite.lb.server/test/test_xml.cpp.T
    org.glite.lb/.cvsignore
    org.glite.lb/LICENSE
    org.glite.lb/build.xml
    org.glite.lb/configure
    org.glite.lb/deployment/README
    org.glite.lb/deployment/deploy_all.diff
    org.glite.lb/deployment/deploy_jp.diff
    org.glite.lb/deployment/deploy_lb.diff
    org.glite.lb/doc/README.lb4vdt
    org.glite.lb/doc/perf_clear_proxy
    org.glite.lb/doc/perf_purge
    org.glite.lb/doc/perf_reg_jobs
    org.glite.lb/doc/perf_results/il_sci_09062006.txt
    org.glite.lb/doc/perf_results/il_sci_09062006_01.txt
    org.glite.lb/doc/perf_results/il_sci_12062006.txt
    org.glite.lb/doc/perf_results/ll_michal_21062006.txt
    org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt
    org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt
    org.glite.lb/doc/perf_results/proxy_sci_09062006.txt
    org.glite.lb/doc/perf_run_interlogd
    org.glite.lb/doc/perf_run_proxy
    org.glite.lb/doc/perf_run_server
    org.glite.lb/doc/perf_run_test
    org.glite.lb/etics-tag-consistency.pl
    org.glite.lb/etics-tag-with-subsystems.pl
    org.glite.lb/etics-tag.pl
    org.glite.lb/lb4vdt/LB_install.sh
    org.glite.lb/lb4vdt/Makefile.inc
    org.glite.lb/lb4vdt/scripts/org.gridsite.core.build
    org.glite.lb/project/build.number
    org.glite.lb/project/build.properties
    org.glite.lb/project/glite.lb.csf.xml
    org.glite.lb/project/package.description
    org.glite.lb/project/package.summary
    org.glite.lb/project/properties.xml
    org.glite.lb/project/run-workspace
    org.glite.lb/project/taskdefs.xml
    org.glite.lb/project/version.properties

224 files changed:
org.glite.lb.logger/.cvsignore [deleted file]
org.glite.lb.logger/LICENSE [deleted file]
org.glite.lb.logger/Makefile [deleted file]
org.glite.lb.logger/build.xml [deleted file]
org.glite.lb.logger/config/glite-lb-logger.config.xml [deleted file]
org.glite.lb.logger/config/glite-lb-logger.default-properties [deleted file]
org.glite.lb.logger/config/startup [deleted file]
org.glite.lb.logger/configure [deleted file]
org.glite.lb.logger/doc/glite-lb-interlogd.8 [deleted file]
org.glite.lb.logger/doc/glite-lb-logd.8 [deleted file]
org.glite.lb.logger/project/ChangeLog [deleted file]
org.glite.lb.logger/project/build.number [deleted file]
org.glite.lb.logger/project/build.properties [deleted file]
org.glite.lb.logger/project/configure.properties.xml [deleted file]
org.glite.lb.logger/project/package.description [deleted file]
org.glite.lb.logger/project/package.summary [deleted file]
org.glite.lb.logger/project/properties.xml [deleted file]
org.glite.lb.logger/project/tar_exclude [deleted file]
org.glite.lb.logger/project/version.properties [deleted file]
org.glite.lb.logger/src-nt/Connection.H [deleted file]
org.glite.lb.logger/src-nt/Connection.cpp [deleted file]
org.glite.lb.logger/src-nt/EventManager.H [deleted file]
org.glite.lb.logger/src-nt/EventManager.cpp [deleted file]
org.glite.lb.logger/src-nt/Exception.H [deleted file]
org.glite.lb.logger/src-nt/HTTPTransport.H [deleted file]
org.glite.lb.logger/src-nt/HTTPTransport.cpp [deleted file]
org.glite.lb.logger/src-nt/InputChannel.H [deleted file]
org.glite.lb.logger/src-nt/InputChannel.cpp [deleted file]
org.glite.lb.logger/src-nt/Makefile [deleted file]
org.glite.lb.logger/src-nt/Message.H [deleted file]
org.glite.lb.logger/src-nt/MessageStore.H [deleted file]
org.glite.lb.logger/src-nt/MessageStore.cpp [deleted file]
org.glite.lb.logger/src-nt/PlainConnection.H [deleted file]
org.glite.lb.logger/src-nt/PlainConnection.cpp [deleted file]
org.glite.lb.logger/src-nt/PluginManager.H [deleted file]
org.glite.lb.logger/src-nt/PluginManager.cpp [deleted file]
org.glite.lb.logger/src-nt/Properties.H [deleted file]
org.glite.lb.logger/src-nt/Singleton.H [deleted file]
org.glite.lb.logger/src-nt/SocketInput.H [deleted file]
org.glite.lb.logger/src-nt/SocketInput.cpp [deleted file]
org.glite.lb.logger/src-nt/ThreadPool.H [deleted file]
org.glite.lb.logger/src-nt/ThreadPool.cpp [deleted file]
org.glite.lb.logger/src-nt/Transport.H [deleted file]
org.glite.lb.logger/src-nt/Transport.cpp [deleted file]
org.glite.lb.logger/src-nt/main.cpp [deleted file]
org.glite.lb.logger/src-nt/test/EventManagerTest.cpp [deleted file]
org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp [deleted file]
org.glite.lb.logger/src-nt/test/SingletonTest.cpp [deleted file]
org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp [deleted file]
org.glite.lb.logger/src-nt/test/test_main.cpp [deleted file]
org.glite.lb.logger/src/event_queue.c [deleted file]
org.glite.lb.logger/src/event_store.c [deleted file]
org.glite.lb.logger/src/event_store_http.c [deleted file]
org.glite.lb.logger/src/http.c [deleted file]
org.glite.lb.logger/src/il_error.c [deleted file]
org.glite.lb.logger/src/il_error.h [deleted file]
org.glite.lb.logger/src/il_master.c [deleted file]
org.glite.lb.logger/src/input_queue_socket.c [deleted file]
org.glite.lb.logger/src/input_queue_socket_http.c [deleted file]
org.glite.lb.logger/src/interlogd.c [deleted file]
org.glite.lb.logger/src/interlogd.h [deleted file]
org.glite.lb.logger/src/logd.c [deleted file]
org.glite.lb.logger/src/logd_proto.c [deleted file]
org.glite.lb.logger/src/logd_proto.h [deleted file]
org.glite.lb.logger/src/perftest_il.sh [deleted file]
org.glite.lb.logger/src/perftest_ll.sh [deleted file]
org.glite.lb.logger/src/queue_mgr.c [deleted file]
org.glite.lb.logger/src/queue_mgr_http.c [deleted file]
org.glite.lb.logger/src/queue_thread.c [deleted file]
org.glite.lb.logger/src/recover.c [deleted file]
org.glite.lb.logger/src/send_event.c [deleted file]
org.glite.lb.logger/src/send_event_http.c [deleted file]
org.glite.lb.logger/src/server_msg.c [deleted file]
org.glite.lb.logger/src/server_msg_http.c [deleted file]
org.glite.lb.logger/test/IlTestBase.cpp [deleted file]
org.glite.lb.logger/test/IlTestBase.h [deleted file]
org.glite.lb.logger/test/event_queueTest.cpp [deleted file]
org.glite.lb.logger/test/event_storeTest.cpp [deleted file]
org.glite.lb.logger/test/il_test.cpp [deleted file]
org.glite.lb.logger/test/input_queue_socketTest.cpp [deleted file]
org.glite.lb.logger/test/ll_test.cpp [deleted file]
org.glite.lb.logger/test/logd_proto_test.c [deleted file]
org.glite.lb.logger/test/server_msgTest.cpp [deleted file]
org.glite.lb.server/.cvsignore [deleted file]
org.glite.lb.server/LICENSE [deleted file]
org.glite.lb.server/Makefile [deleted file]
org.glite.lb.server/build.xml [deleted file]
org.glite.lb.server/config/glite-lb-dbsetup.sql [deleted file]
org.glite.lb.server/config/glite-lb-index.conf.template [deleted file]
org.glite.lb.server/config/glite-lb-migrate_db2version20 [deleted file]
org.glite.lb.server/config/startup [deleted file]
org.glite.lb.server/configure [deleted file]
org.glite.lb.server/doc/glite-lb-bkindex.8 [deleted file]
org.glite.lb.server/doc/glite-lb-bkserverd.8 [deleted file]
org.glite.lb.server/doc/glite-lb-mon-db.1 [deleted file]
org.glite.lb.server/examples/stdsoap2_2.6.0.c [deleted file]
org.glite.lb.server/examples/stdsoap2_2.6.2.c [deleted file]
org.glite.lb.server/examples/stdsoap2_2.7.0c.c [deleted file]
org.glite.lb.server/examples/stdsoap2_2.7.0d.c [deleted file]
org.glite.lb.server/interface/index.h [deleted file]
org.glite.lb.server/interface/lb_authz.h [deleted file]
org.glite.lb.server/interface/pretty_print_wrapper.h [deleted file]
org.glite.lb.server/interface/query.h [deleted file]
org.glite.lb.server/interface/srv_perf.h [deleted file]
org.glite.lb.server/interface/store.h [deleted file]
org.glite.lb.server/project/.cvsignore [deleted file]
org.glite.lb.server/project/ChangeLog [deleted file]
org.glite.lb.server/project/build.number [deleted file]
org.glite.lb.server/project/build.properties [deleted file]
org.glite.lb.server/project/configure.properties.xml [deleted file]
org.glite.lb.server/project/package.description [deleted file]
org.glite.lb.server/project/package.summary [deleted file]
org.glite.lb.server/project/properties.xml [deleted file]
org.glite.lb.server/project/tar_exclude [deleted file]
org.glite.lb.server/project/version.properties [deleted file]
org.glite.lb.server/src/bkindex.c [deleted file]
org.glite.lb.server/src/bkserverd.c [deleted file]
org.glite.lb.server/src/cond_dump.c [deleted file]
org.glite.lb.server/src/cond_dump.h [deleted file]
org.glite.lb.server/src/db_calls.c [deleted file]
org.glite.lb.server/src/db_calls.h [deleted file]
org.glite.lb.server/src/db_store.c [deleted file]
org.glite.lb.server/src/db_supp.c [deleted file]
org.glite.lb.server/src/db_supp.h [deleted file]
org.glite.lb.server/src/dump.c [deleted file]
org.glite.lb.server/src/get_events.c.T [deleted file]
org.glite.lb.server/src/get_events.h [deleted file]
org.glite.lb.server/src/il_lbproxy.c [deleted file]
org.glite.lb.server/src/il_lbproxy.h [deleted file]
org.glite.lb.server/src/il_notification.c [deleted file]
org.glite.lb.server/src/il_notification.h [deleted file]
org.glite.lb.server/src/index.c.T [deleted file]
org.glite.lb.server/src/index_lex.l [deleted file]
org.glite.lb.server/src/index_parse.y [deleted file]
org.glite.lb.server/src/jobstat.c [deleted file]
org.glite.lb.server/src/jobstat.h [deleted file]
org.glite.lb.server/src/jobstat_supp.c [deleted file]
org.glite.lb.server/src/lb_authz.c [deleted file]
org.glite.lb.server/src/lb_html.c [deleted file]
org.glite.lb.server/src/lb_html.h [deleted file]
org.glite.lb.server/src/lb_http.c [deleted file]
org.glite.lb.server/src/lb_http.h [deleted file]
org.glite.lb.server/src/lb_proto.c [deleted file]
org.glite.lb.server/src/lb_proto.h [deleted file]
org.glite.lb.server/src/lb_rss.c [deleted file]
org.glite.lb.server/src/lb_rss.h [deleted file]
org.glite.lb.server/src/lb_text.c [deleted file]
org.glite.lb.server/src/lb_text.h [deleted file]
org.glite.lb.server/src/lb_xml_parse.c.T [deleted file]
org.glite.lb.server/src/lb_xml_parse.h [deleted file]
org.glite.lb.server/src/lb_xml_parse_V21.c.T [deleted file]
org.glite.lb.server/src/lb_xml_parse_V21.h [deleted file]
org.glite.lb.server/src/lcas_lb.c [deleted file]
org.glite.lb.server/src/load.c [deleted file]
org.glite.lb.server/src/mon-db.c [deleted file]
org.glite.lb.server/src/notif_match.c [deleted file]
org.glite.lb.server/src/notification.c [deleted file]
org.glite.lb.server/src/openserver.c [deleted file]
org.glite.lb.server/src/openserver.h [deleted file]
org.glite.lb.server/src/perftest_proxy.sh [deleted file]
org.glite.lb.server/src/pretty_print_wrapper.cpp [deleted file]
org.glite.lb.server/src/purge.h [deleted file]
org.glite.lb.server/src/query.c [deleted file]
org.glite.lb.server/src/request.c [deleted file]
org.glite.lb.server/src/seqcode.c [deleted file]
org.glite.lb.server/src/server_state.c [deleted file]
org.glite.lb.server/src/server_state.h [deleted file]
org.glite.lb.server/src/srv_purge.c [deleted file]
org.glite.lb.server/src/stats.c [deleted file]
org.glite.lb.server/src/stats.h [deleted file]
org.glite.lb.server/src/store.c.T [deleted file]
org.glite.lb.server/src/stored_master.c [deleted file]
org.glite.lb.server/src/userjobs.c [deleted file]
org.glite.lb.server/src/write2rgma.c [deleted file]
org.glite.lb.server/src/ws_fault.c [deleted file]
org.glite.lb.server/src/ws_fault.h [deleted file]
org.glite.lb.server/src/ws_query.c [deleted file]
org.glite.lb.server/src/ws_typemap.dat [deleted file]
org.glite.lb.server/src/ws_typemap.h [deleted file]
org.glite.lb.server/src/ws_typeref.c.T [deleted file]
org.glite.lb.server/src/ws_typeref.h [deleted file]
org.glite.lb.server/test/oneJob.qry [deleted file]
org.glite.lb.server/test/test_query_events.cpp [deleted file]
org.glite.lb.server/test/test_soap_conv.cpp [deleted file]
org.glite.lb.server/test/test_trans.sh [deleted file]
org.glite.lb.server/test/test_xml.cpp.T [deleted file]
org.glite.lb/.cvsignore [deleted file]
org.glite.lb/LICENSE [deleted file]
org.glite.lb/build.xml [deleted file]
org.glite.lb/configure [deleted file]
org.glite.lb/deployment/README [deleted file]
org.glite.lb/deployment/deploy_all.diff [deleted file]
org.glite.lb/deployment/deploy_jp.diff [deleted file]
org.glite.lb/deployment/deploy_lb.diff [deleted file]
org.glite.lb/doc/README.lb4vdt [deleted file]
org.glite.lb/doc/perf_clear_proxy [deleted file]
org.glite.lb/doc/perf_purge [deleted file]
org.glite.lb/doc/perf_reg_jobs [deleted file]
org.glite.lb/doc/perf_results/il_sci_09062006.txt [deleted file]
org.glite.lb/doc/perf_results/il_sci_09062006_01.txt [deleted file]
org.glite.lb/doc/perf_results/il_sci_12062006.txt [deleted file]
org.glite.lb/doc/perf_results/ll_michal_21062006.txt [deleted file]
org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt [deleted file]
org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt [deleted file]
org.glite.lb/doc/perf_results/proxy_sci_09062006.txt [deleted file]
org.glite.lb/doc/perf_run_interlogd [deleted file]
org.glite.lb/doc/perf_run_proxy [deleted file]
org.glite.lb/doc/perf_run_server [deleted file]
org.glite.lb/doc/perf_run_test [deleted file]
org.glite.lb/etics-tag-consistency.pl [deleted file]
org.glite.lb/etics-tag-with-subsystems.pl [deleted file]
org.glite.lb/etics-tag.pl [deleted file]
org.glite.lb/lb4vdt/LB_install.sh [deleted file]
org.glite.lb/lb4vdt/Makefile.inc [deleted file]
org.glite.lb/lb4vdt/scripts/org.gridsite.core.build [deleted file]
org.glite.lb/project/build.number [deleted file]
org.glite.lb/project/build.properties [deleted file]
org.glite.lb/project/glite.lb.csf.xml [deleted file]
org.glite.lb/project/package.description [deleted file]
org.glite.lb/project/package.summary [deleted file]
org.glite.lb/project/properties.xml [deleted file]
org.glite.lb/project/run-workspace [deleted file]
org.glite.lb/project/taskdefs.xml [deleted file]
org.glite.lb/project/version.properties [deleted file]

diff --git a/org.glite.lb.logger/.cvsignore b/org.glite.lb.logger/.cvsignore
deleted file mode 100644 (file)
index 1df717b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-.project
-.cdtproject
\ No newline at end of file
diff --git a/org.glite.lb.logger/LICENSE b/org.glite.lb.logger/LICENSE
deleted file mode 100644 (file)
index 259a91f..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
diff --git a/org.glite.lb.logger/Makefile b/org.glite.lb.logger/Makefile
deleted file mode 100644 (file)
index 40cd218..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-# defaults
-top_srcdir=..
-stagedir=.
-globalprefix=glite
-lbprefix=lb
-package=glite-lb-client
-version=0.0.0
-PREFIX=/opt/glite
-
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-
--include Makefile.inc
--include ../project/version.properties
-
-version=${module.version}
-
-CC=gcc
-
-VPATH:=${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/doc
-
-VERSION=-DVERSION=\"GLite-${version}\"
-
-SUFFIXES=.no
-
-ifdef LB_STANDALONE
-       LB_STANDALONE_FLAGS:=-DLB_STANDALONE
-endif
-
-ifdef LB_PERF
-       LOGD:=glite-lb-logd-perf glite-lb-logd-perf-nofile
-       INTERLOGD:=glite-lb-interlogd-perf \
-                  glite-lb-interlogd-perf-empty 
-#                 glite-lb-interlogd-perf-inline-empty
-       NOTIF_INTERLOGD:=glite-lb-notif-interlogd
-       LB_PERF_FLAGS:=-DLB_PERF
-else
-       LOGD:=glite-lb-logd
-       INTERLOGD:=glite-lb-interlogd
-       NOTIF_INTERLOGD:=glite-lb-notif-interlogd
-       WS_INTERLOGD:=glite-lb-ws-interlogd
-endif
-
-DEBUG:=-g -O0
-CFLAGS:=${DEBUG} \
-       -I${stagedir}/include -I${top_srcdir}/src \
-       -D_GNU_SOURCE \
-       ${COVERAGE_FLAGS} \
-       ${VERSION} ${LB_STANDALONE_FLAGS} ${LB_PERF_FLAGS} 
-
-LDFLAGS:=-L${stagedir}/${libdir} \
-       ${COVERAGE_FLAGS} 
-LINK:=libtool --mode=link ${CC} ${LDFLAGS}
-LINKXX:=libtool --mode=link ${CXX} -rpath ${stagedir}/${libdir} ${LDFLAGS} 
-INSTALL:=libtool --mode=install install
-
-#ifneq (${expat_prefix},/usr)
-#      EXPAT_LIBS:=-L${expat_prefix}/lib
-#endif
-#EXPAT_LIBS:=${EXPAT_LIBS} -lexpat
-#
-#EXT_LIBS:= ${EXPAT_LIBS}
-
-COMMON_LIB:=-lglite_lb_common
-
-TRIO_LIB:=-lglite_lbu_trio
-
-GLITE_GSS_LIB:=-lglite_security_gss
-
-TEST_LIBS:=-L${cppunit_prefix}/lib -lcppunit
-TEST_INC:=-I${cppunit_prefix}/include
-
-LOGD_OBJS:= logd_proto.o logd.o
-
-LOGD_NOBJS:=${LOGD_OBJS:.o=.no}
-
-INTERLOG_OBJS:=il_error.o input_queue_socket.o \
-       recover.o send_event.o \
-       event_queue.o event_store.o il_master.o interlogd.o \
-       queue_mgr.o server_msg.o queue_thread.o
-
-WS_INTERLOG_OBJS:=il_error.o input_queue_socket_http.o \
-       recover.o http.o send_event_http.o \
-       event_queue.o event_store_http.o il_master.o interlogd.o \
-       queue_mgr_http.o server_msg_http.o queue_thread.o
-
-INTERLOG_NOBJS:=${INTERLOG_OBJS:.o=.no}
-INTERLOG_WOBJS:=${WS_INTERLOG_OBJS:.o=.wo}
-INTERLOG_PERF_OBJS:=${INTERLOG_OBJS:.o=.perf.o}
-INTERLOG_EMPTY_OBJS:=${INTERLOG_OBJS:.o=.empty.o}
-#INTERLOG_INLINE_EMPTY_OBJS:=${INTERLOG_OBJS:.o=.io}
-
-INTERLOG_TEST_OBJS:= \
-       il_error.o \
-       server_msg.o \
-       server_msgTest.o \
-       queue_thread.o \
-       event_store.o \
-       event_storeTest.o \
-       queue_mgr.o \
-       il_master.o \
-       input_queue_socket.o \
-       input_queue_socketTest.o \
-       send_event.o \
-       event_queue.o \
-       event_queueTest.o \
-       IlTestBase.o \
-       il_test.o 
-
-MAN_GZ:=glite-lb-interlogd.8.gz glite-lb-logd.8.gz
-MAN = $(MAN_GZ:.gz=)
-
-default: all 
-
-all compile: $(LOGD) $(INTERLOGD) $(NOTIF_INTERLOGD) ${MAN_GZ}
-
-glite-lb-logd: ${LOGD_OBJS}
-       ${LINK} -o $@ ${LOGD_OBJS} ${COMMON_LIB}_${nothrflavour} ${TRIO_LIB}
-
-glite-lb-logd-perf: ${LOGD_OBJS}
-       ${LINK} -o $@ ${LOGD_OBJS} ${COMMON_LIB}_${nothrflavour} ${TRIO_LIB}
-
-glite-lb-logd-nofile: ${LOGD_NOBJS}
-       ${LINK} -o $@ ${LOGD_NOBJS} ${COMMON_LIB}_${nothrflavour} 
-
-glite-lb-logd-perf-nofile: ${LOGD_NOBJS}
-       ${LINK} -o $@ ${LOGD_NOBJS} ${COMMON_LIB}_${nothrflavour} 
-
-glite-lb-interlogd: ${INTERLOG_OBJS}
-       ${LINK} -o $@ ${INTERLOG_OBJS} ${COMMON_LIB}_${thrflavour} 
-
-glite-lb-notif-interlogd: ${INTERLOG_NOBJS}
-       ${LINK} -o $@ ${INTERLOG_NOBJS} ${COMMON_LIB}_${thrflavour}
-
-glite-lb-interlogd-perf: ${INTERLOG_PERF_OBJS}
-       ${LINK} -o $@ ${INTERLOG_PERF_OBJS} ${COMMON_LIB}_${thrflavour}
-
-glite-lb-interlogd-perf-empty: ${INTERLOG_EMPTY_OBJS}
-       ${LINK} -o $@ ${INTERLOG_EMPTY_OBJS} ${COMMON_LIB}_${thrflavour}
-
-glite-lb-ws-interlogd: ${INTERLOG_WOBJS}
-       ${LINK} -o $@ ${INTERLOG_WOBJS} ${COMMON_LIB}_${thrflavour}
-
-#glite-lb-interlogd-perf-inline-empty: ${INTERLOG_INLINE_EMPTY_OBJS}
-#      ${LINK} -o $@ ${INTERLOG_INLINE_EMPTY_OBJS} \
-#              ${COMMON_LIB}_${thrflavour}
-
-${MAN_GZ}: ${MAN}
-       rm -f ${MAN_GZ} ${MAN}
-       cp $? .
-       gzip -f $(notdir $?)
-
-man: ${MAN_GZ}
-
-stage: compile
-       $(MAKE) install PREFIX=${stagedir} 
-
-check: 
-# do nothing until test/ is really added to CVS
-# check.ll check.il
-
-#check.ll: logd_proto_test.o ll_test.o
-#      ${LINKXX} -o $@ ${COMMON_LIB}_${nothrflavour} ${EXT_LIBS} ${TEST_LIBS} $+
-#      ./check.ll
-
-check.ll:
-       -echo commented out -- fix needed
-
-check.il: ${INTERLOG_TEST_OBJS}
-       ${LINKXX} -o $@ ${COMMON_LIB}_${thrflavour} ${GLITE_GSS_LIB}_${nothrflavour} ${TEST_LIBS} -lpthread $+
-
-install:
-       -mkdir -p ${PREFIX}/bin
-       -mkdir -p ${PREFIX}/etc/init.d
-       -mkdir -p ${PREFIX}/share/doc/${package}-${version}
-       -mkdir -p ${PREFIX}/share/man/man8
-       ${INSTALL} -m 755 ${LOGD} ${PREFIX}/bin
-       ${INSTALL} -m 755 ${INTERLOGD} ${PREFIX}/bin
-       ${INSTALL} -m 755 ${NOTIF_INTERLOGD} ${PREFIX}/bin
-ifdef LB_PERF
-       -mkdir -p ${PREFIX}/sbin
-       ${INSTALL} -m 755 ${top_srcdir}/src/perftest_ll.sh ${PREFIX}/sbin
-endif
-       ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-lb-locallogger
-       ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
-       ( cd ${top_srcdir}/project && ${INSTALL} -m 644 ChangeLog package.description package.summary ${PREFIX}/share/doc/${package}-${version} )
-       ${INSTALL} -m 644 ${MAN_GZ} ${PREFIX}/share/man/man8
-
-${INTERLOG_NOBJS}: %.no: %.c
-       ${CC} ${CFLAGS} -DIL_NOTIFICATIONS -c $< -o $@
-
-${INTERLOG_OBJS}: %.o: %.c
-       ${CC} ${CFLAGS} -c $< -o $@
-
-${INTERLOG_WOBJS}: %.wo: %.c
-       ${CC} ${CFLAGS} -DIL_WS -c $< -o $@
-
-${INTERLOG_EMPTY_OBJS}: %.empty.o: %.c
-       ${CC} ${CFLAGS} -DPERF_EMPTY -c $< -o $@
-
-${INTERLOG_PERF_OBJS}: %.perf.o: %.c
-       ${CC} ${CFLAGS} -c $< -o $@
-
-#${INTERLOG_INLINE_EMPTY_OBJS}: %.io: %.c
-#      ${CC} ${CFLAGS} -DLB_PERF -DPERF_EMPTY -DPERF_EVENTS_INLINE -c $< -o $@
-
-${LOGD_NOBJS}: %.no: %.c
-       ${CC} ${CFLAGS} -DLOGD_NOFILE -c $< -o $@
-
-${LOGD_OBJS}: %.o: %.c
-       ${CC} ${CFLAGS} -c $< -o $@
-
-logd_proto_test.o: %.o: %.c
-       ${CC} ${CFLAGS} -c $< -o $@
-
-ll_test.o: %.o: %.cpp
-       ${CXX} ${CFLAGS} ${TEST_INC} -c $< -o $@
-
-il_test.o IlTestBase.o server_msgTest.o event_queueTest.o input_queue_socketTest.o event_storeTest.o: %.o: %.cpp
-       ${CXX} ${CFLAGS} ${TEST_INC} -c $< -o $@
-
-clean:
-       rm -rvf .libs/ *.o *.no ${LOGD} ${INTERLOGD} ${NOTIF_INTERLOGD} ${MAN_GZ}
-       rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
diff --git a/org.glite.lb.logger/build.xml b/org.glite.lb.logger/build.xml
deleted file mode 100755 (executable)
index e5382ce..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Build file for the GLite LB Client module
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-       Version info: $Id$
-       Release: $Name$
-
-       Revision history:
-       $Log$
-       Revision 1.5  2005/05/26 15:13:49  zurek
-       inserted module.build.file
-       
-       Revision 1.4.2.1  2005/02/12 01:39:10  glbuild
-       Changed start time
-       
-       Revision 1.4  2004/10/18 19:16:09  zsalvet
-       RPM descriptions
-       
-       Revision 1.3  2004/07/29 23:21:51  dimeglio
-       Changed default target from compile to dist
-       
-       Revision 1.2  2004/07/07 09:24:57  akrenek
-       thr/nonthr flavours used correctly
-       
-       Revision 1.3  2004/07/06 17:45:30  flammer
-       Update of classpath definitions, targets & configure file.
-       
-       Revision 1.2  2004/06/23 00:29:33  dimeglio
-       Added standard comments and handling of support files
-       
--->
-
-<project name="logger" default="dist">
-       
-       <!-- =========================================
-                Builds the GLite LB Client Module
-            ========================================= -->
-       
-       <!-- =========================================
-            Import properties (order is important)
-            ========================================= -->
-
-       <!-- import baseline & user properties -->
-       <import file="../org.glite/project/baseline.properties.xml" />
-
-       <!-- import component build properties,
-                       component properties &
-                       component common properties -->
-       <import file="./project/properties.xml"/>
-       
-       <!-- import subsystem build properties,
-                       subsystem properties &
-                       subsystem common properties -->
-       <import file="${subsystem.properties.file}"/>
-
-       <!-- import global build properties &
-                       global properties -->
-       <import file="${global.properties.file}" />
-               
-       <!-- =========================================
-                Load dependency property files (order is important)
-            ========================================= -->
-       <property file="${user.dependencies.file}"/>
-       <property file="${component.dependencies.file}" />
-       <property file="${subsystem.dependencies.file}" />
-       <property file="${global.dependencies.file}"/>
-       
-       <!-- =========================================
-                Load configure options (order is important)
-            ========================================= -->
-       <import file="${global.configure.options.file}"/>
-       <import file="${component.configure.options.file}"/>
-
-       <!-- =========================================
-                Import task definitions (order is important)
-            ========================================= -->
-       <import file="${subsystem.taskdefs.file}" />
-       <import file="${global.taskdefs.file}" />
-                       
-       <!-- =========================================
-                Load common targets
-            ========================================= -->
-       <import file="${global.targets-simple_make.file}" />
-
-       <!-- =========================================
-                Load version file 
-            ========================================= -->
-       <property file="${module.version.file}"/>
-       <property file="${module.build.file}"/>
-               
-       <!-- ==============================================
-                Local private targets
-            ============================================== -->
-       
-       <target name="localinit"
-               description="Module specific initialization tasks">
-               <antcall target="lbmakefiles" />
-       </target>
-               
-       <target name="localcompile"
-               description="Module specific compile tasks">
-       </target>
-       
-       <target name="localclean"
-               description="Module specific cleaning tasks">
-       </target>
-       
-       <!-- =========================================
-            RPM settings
-            ========================================= -->
-
-       <property name="build.package.summary" value="L&amp;B local logger" />
-       <property name="build.package.description" value="
-Daemons installed on any EGEE machine producing Logging &amp; Bookkeeping
-(L&amp;B)&#xA;events. They are responsible for non-blocking accept of
-an event, persistent&#xA;storage, and reliable transfer to bookkeeping server." />
-
-</project>             
diff --git a/org.glite.lb.logger/config/glite-lb-logger.config.xml b/org.glite.lb.logger/config/glite-lb-logger.config.xml
deleted file mode 100644 (file)
index 897975f..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<service name="glite-lb-logger">
- <components>
-
-  <component name="locallogger">
-   <config-template>
-    <description>glite_lb_logd daemon</description>
-    <init>
-     <param name="port" mandatory="false" type="int" advanced="false">
-      <description>port to listen</description>
-     </param>
-     <param name="file-prefix" mandatory="false" type="string" advanced="false">
-      <description>path and prefix for event files</description>
-     </param>
-     <param name="socket" mandatory="false" type="string" advanced="false">
-      <description>path to local socket</description>
-     </param>
-     <param name="cert" mandatory="false" type="string" advanced="false">
-      <description>location of server certificate</description>
-     </param>
-     <param name="key" mandatory="false" type="string" advanced="false">
-      <description>location of server private key</description>
-     </param>
-     <param name="CAdir" mandatory="false" type="string" advanced="false">
-      <description>"directory containing CA certificates"</description>
-     </param>
-    </init>
-   </config-template>
-  </component>
-
-  <component name="interlogger">
-   <config-template>
-    <description>glite_lb_interlogd daemon</description>
-    <init>
-     <param name="file-prefix" mandatory="false" type="string" advanced="false">
-      <description>path and prefix for event files</description>
-     </param>
-     <param name="socket" mandatory="false" type="string" advanced="false">
-      <description>path to local socket</description>
-     </param>
-     <param name="cert" mandatory="false" type="string" advanced="false">
-      <description>location of server certificate</description>
-     </param>
-     <param name="key" mandatory="false" type="string" advanced="false">
-      <description>location of server private key</description>
-     </param>
-     <param name="CAdir" mandatory="false" type="string" advanced="false">
-      <description>"directory containing CA certificates"</description>
-     </param>
-    </init>
-   </config-template>
-  </component>
-
-  <component name="notification-interlogger">
-   <config-template>
-    <description>glite_lb_notif_interlogd daemon</description>
-    <init>
-     <param name="file-prefix" mandatory="false" type="string" advanced="false">
-      <description>path and prefix for event files</description>
-     </param>
-     <param name="socket" mandatory="false" type="string" advanced="false">
-      <description>path to local socket</description>
-     </param>
-     <param name="cert" mandatory="false" type="string" advanced="false">
-      <description>location of server certificate</description>
-     </param>
-     <param name="key" mandatory="false" type="string" advanced="false">
-      <description>location of server private key</description>
-     </param>
-     <param name="CAdir" mandatory="false" type="string" advanced="false">
-      <description>"directory containing CA certificates"</description>
-     </param>
-    </init>
-   </config-template>
-  </component>
-
- </components>
-</service>
diff --git a/org.glite.lb.logger/config/glite-lb-logger.default-properties b/org.glite.lb.logger/config/glite-lb-logger.default-properties
deleted file mode 100644 (file)
index 202f5aa..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-locallogger.port = 9002
-locallogger.file-prefix = /var/glite/log/dglogd.log
-locallogger.socket = /tmp/interlogger.sock
-locallogger.cert = /etc/grid-security/hostcert.pem
-locallogger.key = /etc/grid-security/hostkey.pem
-locallogger.CAdir = /etc/grid-security/certificates
-interlogger.file-prefix = /var/glite/log/dglogd.log
-interlogger.socket = /tmp/interlogger.sock
-interlogger.cert = /etc/grid-security/hostcert.pem
-interlogger.key = /etc/grid-security/hostkey.pem
-interlogger.CAdir = /etc/grid-security/certificates
-notification-interlogger.file-prefix = /tmp/notif_events
-notification-interlogger.socket = /tmp/notif_interlogger.sock
-notification-interlogger.cert = /etc/grid-security/hostcert.pem
-notification-interlogger.key = /etc/grid-security/hostkey.pem
-notification-interlogger.CAdir = /etc/grid-security/certificates
-log.Priority = DEBUG
-log.fileName = /var/glite/log/glite-lb-logger.log
diff --git a/org.glite.lb.logger/config/startup b/org.glite.lb.logger/config/startup
deleted file mode 100755 (executable)
index c48d52a..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/sh
-# chkconfig: 345 76 24
-
-GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
-GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-$GLITE_LOCATION/var}
-
-[ -f /etc/glite.conf ] && . /etc/glite.conf
-[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
-
-[ -f $GLITE_LOCATION/etc/lb.conf ] && . $GLITE_LOCATION/etc/lb.conf
-[ -f $GLITE_LOCATION_VAR/etc/lb.conf ] && . $GLITE_LOCATION_VAR/etc/lb.conf
-
-[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
-
-unset creds port
-
-start()
-{
-       case "$GLITE_LB_TYPE" in
-       proxy)
-               echo 'Not starting logd and interlogger, proxy only instance (GLITE_LB_TYPE=proxy).'
-               return 0
-       esac
-
-       if test -z "$GLITE_USER" ;then
-               echo 'Error: GLITE_USER is not set'
-               echo FAILED
-               return 1
-       fi
-
-       [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] &&
-               creds="-c $GLITE_HOST_CERT -k $GLITE_HOST_KEY"
-
-       if test -z "$creds"; then
-               if su - $GLITE_USER -c "test -r /etc/grid-security/hostkey.pem -a -r /etc/grid-security/hostcert.pem"; then
-                       echo "$0: WARNING: /etc/grid-security/hostkey.pem readable by $GLITE_USER"
-                       creds="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
-               fi
-       fi
-
-       [ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
-
-       [ -n "$GLITE_LB_LOGGER_PORT" ] && port="--port $GLITE_LB_LOGGER_PORT"
-       [ -n "$GLITE_LB_IL_SOCK" ] && sock="--socket $GLITE_LB_IL_SOCK"
-       [ -n "$GLITE_LB_IL_FPREFIX" ] && fprefix="--file-prefix $GLITE_LB_IL_FPREFIX"
-
-       mkdir -p /var/glite/log 
-       chown $GLITE_USER /var/glite/log
-       echo -n Starting glite-lb-logd ...
-        (cd /tmp && ls -f /tmp |grep ^dglogd_sock_ |xargs rm -f)
-       su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-logd \
-               $creds $port $sock $fprefix" && echo " done" || echo " FAILED"
-
-       echo -n Starting glite-lb-interlogd ...
-       su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-interlogd \
-               $creds $sock $fprefix" && echo " done" || echo " FAILED"
-}
-
-stop()
-{
-               echo -n Stopping glite-lb-logd ...
-               killall glite-lb-logd
-               echo " done"
-               echo -n Stopping glite-lb-interlogd ...
-               killall glite-lb-interlogd
-               echo " done"
-}
-
-status()
-{
-       LC_ALL=C
-       if netstat -an --inet | grep "^tcp .* 0.0.0.0:${GLITE_LB_LOGGER_PORT:-9002} .*LISTEN" >/dev/null 2>&1 ;then
-       echo glite-lb-logd running
-       else
-       echo glite-lb-logd not running
-       return 1
-       fi
-       if netstat -an --unix | grep "^unix .* LISTEN.* ${GLITE_LB_IL_SOCK:-/tmp/interlogger.sock}$" >/dev/null 2>&1 ;then
-       echo glite-lb-interlogd running
-       else
-       echo glite-lb-interlogd not running
-       return 1
-       fi
-}
-
-case x$1 in
-       xstart) start;;
-       xstop)  stop;;
-       xrestart) stop; start;;
-       xstatus) status;;
-       x*)     echo usage: $0 start,stop,restart,status >&2
-               exit 1;;
-esac
diff --git a/org.glite.lb.logger/configure b/org.glite.lb.logger/configure
deleted file mode 100755 (executable)
index 89fdb6e..0000000
+++ /dev/null
@@ -1,714 +0,0 @@
-#!/usr/bin/perl
-
-# WARNING: Don't edit this file unless it is the master copy in org.glite.lb
-#
-# For the purpose of standalone builds of lb/jobid/lbjp-common components
-# it is copied on tagging 
-
-# $Header$
-
-use Getopt::Long;
-
-my $pwd = `pwd`; chomp $pwd;
-my $prefix = $pwd.'/stage';
-my $stagedir;
-my $staged;
-my $module;
-my $thrflavour = 'gcc64dbgpthr';
-my $nothrflavour = 'gcc64dbg';
-my $mode = 'build';
-my $help = 0;
-my $listmodules;
-my $version;
-my $output;
-my $lb_tag = '';
-my $lbjp_tag = '';
-my $jp_tag = '';
-my $sec_tag = '';
-my $jobid_tag = '';
-my $libdir = 'lib';
-
-my @nodes = qw/client server logger utils doc ws-test db jpprimary jpindex jpclient/;
-my %enable_nodes;
-my %disable_nodes;
-
-my %extern_prefix = (
-       cares => '/opt/c-ares',
-       classads => '/opt/classads',
-       cppunit => '/usr',
-       expat => '/usr',
-       globus => '/opt/globus',
-       jglobus => '/opt/globus',
-       gsoap => '/usr',
-       mysql => '/usr',
-       'mysql-devel' => '',
-       'mysql-server' => '',
-       voms => '/opt/glite',
-       gridsite => '/opt/glite',
-       lcas => '/opt/glite',
-       ant => '/usr',
-       jdk => '/usr',
-       libtar => '/usr',
-);
-
-my %jar = (
-       'commons-codec' => '/usr/share/java/commons-codec-1.3.jar',
-);
-
-
-my %glite_prefix;
-my %need_externs;
-my %need_externs_type;
-my %need_jars;
-my %extrafull;
-my %extranodmod;
-my %deps;
-my %deps_type;
-my %topbuild;
-
-my %lbmodules = (
-       'lb' => [ qw/client common doc logger server state-machine types utils ws-interface ws-test glite-LB/], 
-       'security' => [qw/gss gsoap-plugin/],
-       'lbjp-common' => [qw/db maildir server-bones trio jp-interface/],
-       'jobid' => [qw/api-c api-cpp/],
-       'jp' => [ qw/client doc index primary server-common ws-interface/ ],
-       );
-
-
-my @opts = (
-       'prefix=s' => \$prefix,
-       'staged=s' => \$staged,
-       'module=s' => \$module,
-       'thrflavour=s' => \$thrflavour,
-       'nothrflavour=s' => \$nothrflavour,
-       'mode=s' => \$mode,
-       'listmodules=s' => \$listmodules,
-       'version=s' => \$version,
-       'output=s' => \$output,
-       'stage=s' => \$stagedir,
-       'lb-tag=s' => \$lb_tag,
-       'lbjp-common-tag=s' => \$lbjp_tag,
-       'jp-tag=s' => \$jp_tag,
-       'security-tag=s' => \$sec_tag,
-       'jobid-tag=s' => \$jobid_tag,
-       'help' => \$help,
-       'libdir=s' => \$libdir,
-);
-
-for (@nodes) {
-       $enable_nodes{$_} = 0;
-       $disable_nodes{$_} = 0;
-       
-       push @opts,"disable-$_",\$disable_nodes{$_};
-       push @opts,"enable-$_",\$enable_nodes{$_};
-}
-
-push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix;
-push @opts,"with-$_=s",\$jar{$_} for keys %jar;
-
-my @keeparg = @ARGV;
-
-GetOptions @opts or die "Errors parsing command line\n";
-
-$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq '';
-$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq '';
-
-if ($help) { usage(); exit 0; }
-
-if ($listmodules) {
-       my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}};
-       print "@m\n";
-       exit 0;
-}
-
-warn "$0: --version and --output make sense only in --mode=etics\n"
-       if ($version || $output) && $mode ne 'etics';
-
-my $en;
-for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; }
-
-my $dis;
-for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; }
-
-die "--enable-* and --disable-* are mutually exclusive\n"
-       if $en && $dis;
-
-die "--module cannot be used with --enable-* or --disable-*\n"
-       if $module && ($en || $dis);
-
-die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}};
-
-if ($dis) {
-       for (@nodes) {
-               $enable_nodes{$_} = 1 unless $disable_nodes{$_};
-       }
-}
-
-if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ;
-
-for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; }
-
-$stagedir = $prefix unless $stagedir;
-
-if ($mode eq 'build') {
-       print "Writing config.status\n";
-       open CONF,">config.status" or die "config.status: $!\n";
-       print CONF "$0 @keeparg\n";
-       close CONF;
-}
-
-
-my @modules;
-my %aux;
-
-if ($module) {
-#      push @modules,split(/[,.]+/,$module);
-       push @modules,$module;
-}
-else {
-       @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes));
-       
-       my $n;
-
-       do {
-               local $"="\n";
-               $n = $#modules;
-               push @modules,(map @{$deps{$_}},@modules);
-
-               undef %aux; @aux{@modules} = (1) x ($#modules+1);
-               @modules = keys %aux;
-       } while ($#modules > $n);
-}
-
-@aux{@modules} = (1) x ($#modules+1);
-delete $aux{$_} for (split /,/,$staged);
-@modules = keys %aux;
-
-mode_build() if $mode eq 'build';
-mode_checkout() if $mode eq 'checkout';
-mode_etics($module) if $mode eq 'etics';
-
-sub mode_build {
-       print "\nBuilding modules: @modules\n";
-       
-       my @ext = map @{$need_externs{$_}},@modules;
-       my @myjars = map @{$need_jars{$_}},@modules;
-       undef %aux; @aux{@ext} = 1;
-       @ext = keys %aux;
-       undef %aux; @aux{@myjars} = (1) x ($#myjars+1);
-       @myjars = keys %aux;
-       
-       print "\nRequired externals:\n";
-       print "\t$_: $extern_prefix{$_}\n" for @ext;
-       print "\t$_: $jar{$_}\n" for @myjars;
-       print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n";
-       
-       mkinc($_) for @modules;
-       
-       print "Creating Makefile\n";
-       
-       open MAK,">Makefile" or die "Makefile: $!\n";
-       
-       print MAK "all: @modules\n\nclean:\n";
-       
-       for (@modules) {
-               my $full = full($_);
-               my $build = $topbuild{$_} ? '': '/build';
-               print MAK "\tcd $full$build && \${MAKE} clean\n"
-       }
-       
-       print MAK "\ndistclean:\n";
-       
-       for (@modules) {
-               my $full = full($_);
-               print MAK $topbuild{$_} ?
-                       "\tcd $full$build && \${MAKE} distclean\n" :
-                       "\trm -rf $full$build\n"
-       }
-       
-       print MAK "\n";
-       
-       for (@modules) {
-               my %ldeps; undef %ldeps;  
-               @ldeps{@{$deps{$_}}} = 1;
-               for my $x (split /,/,$staged) { delete $ldeps{$x}; }
-               my @dnames = $module ? () : keys %ldeps;
-       
-               my $full = full($_);
-               my $build = $topbuild{$_} ? '': '/build';
-       
-               print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n";
-       }
-       
-       close MAK;
-}
-       
-sub mode_checkout() {
-       for (@modules) {
-               my $module = $_;
-               my $tag = "";
-               if ($lb_tag){
-                       for (@{$lbmodules{lb}}){
-                               if ("lb.".$_ eq $module){
-                                       $tag = '-r '.$lb_tag;
-                               }
-                       }       
-               }
-               if ($lbjp_tag){
-                       for (@{$lbmodules{'lbjp-common'}}){
-                               if ("lbjp-common.".$_ eq $module){
-                                        $tag = '-r '.$lbjp_tag;
-                                }
-                       }
-               }
-               if ($jp_tag){
-                       for (@{$lbmodules{'jp'}}){
-                               if ("jp.".$_ eq $module){
-                                        $tag = '-r '.$jp_tag;
-                               }
-                        }
-               }
-               if ($sec_tag){
-                       for (@{$lbmodules{security}}){
-                               if ("security.".$_ eq $module){
-                                        $tag = '-r '.$sec_tag;
-                                }
-                       }
-               }
-               if ($jobid_tag){
-                       for (@{$lbmodules{jobid}}){
-                               if ("jobid.".$_ eq $module){
-                                        $tag = '-r '.$jobid_tag;
-                                }
-                       }
-               }
-               #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){
-               #       print "found";
-               #}
-               $_ = full($_);
-               print "\n*** Checking out $_\n";
-               system("cvs checkout  $tag $_") == 0 or die "cvs checkout $tag $_: $?\n";
-       }
-}
-
-BEGIN{
-%need_externs_aux = (
-       'lb.client' => [ qw/cppunit:B classads/ ],
-       'lb.client-java' => [ qw/ant:B jglobus jdk:B/ ],
-       'lb.common' => [ qw/expat cppunit:B classads/ ],
-       'lb.doc' => [],
-       'lb.logger' => [ qw/cppunit:B/ ],
-       'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ],
-       'lb.state-machine' => [ qw/classads/ ],
-       'lb.utils' => [ qw/cppunit:B/ ],
-       'lb.ws-interface' => [],
-       'lb.ws-test' => [ qw/gsoap:B/ ],
-       'lb.types' => [ qw// ],
-       'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R yaim:R/ ],
-       'lbjp-common.db' => [ qw/mysql:R mysql-devel:B/ ],
-       'lbjp-common.maildir' => [ qw// ],
-       'lbjp-common.server-bones' => [ qw// ],
-       'lbjp-common.trio' => [ qw/cppunit:B/ ],
-       'lbjp-common.jp-interface' => [ qw/cppunit:B/ ],
-       'security.gss' =>  [ qw/globus_essentials:R globus:B cares cppunit:B/ ],
-       'security.gsoap-plugin' =>  [ qw/cppunit:B globus_essentials:R globus:B cares gsoap:B/ ],
-       'jobid.api-c' =>  [ qw/cppunit:B/ ],
-       'jobid.api-cpp' =>  [ qw/cppunit:B/ ],
-       'jobid.api-java' =>  [ qw/ant:B jdk:B/ ],
-       'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ],
-        'jp.doc' => [],
-        'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ],
-        'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ],
-        'jp.server-common' => [],
-        'jp.ws-interface' => [],
-);
-
-for my $ext (keys %need_externs_aux) {
-       for (@{$need_externs_aux{$ext}}) {
-               /([^:]*)(?::(.*))?/;
-               push @{$need_externs{$ext}},$1;
-               my $type = $2 ? $2 : 'BR';
-               $need_externs_type{$ext}->{$1} = $type;
-       }
-}
-
-%need_jars = (
-       'jobid.api-java' => [ qw/commons-codec/ ],
-);
-
-for my $jar (keys %need_jars) {
-       for (@{$need_jars{$jar}}) {
-               $need_externs_type{$jar}->{$_} = 'BR';  # XXX
-       }
-}
-
-%deps_aux = (
-       'lb.client' => [ qw/
-               lb.types:B lb.common
-               lbjp-common.trio
-               jobid.api-cpp:B jobid.api-c
-               security.gss
-       / ],
-       'lb.client-java' => [ qw/
-               lb.types:B
-               jobid.api-java
-       / ],
-       'lb.common' => [ qw/
-               jobid.api-cpp:B jobid.api-c
-               lb.types:B lbjp-common.trio security.gss
-       / ],
-       'lb.doc' => [ qw/lb.types:B/ ],
-       'lb.logger' => [ qw/
-               lbjp-common.trio
-               jobid.api-c
-               lb.common
-               security.gss
-       / ],
-       'lb.server' => [ qw/
-               lb.ws-interface lb.types:B lb.common lb.state-machine
-               lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir
-               jobid.api-c
-               security.gsoap-plugin security.gss
-       / ],
-       'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ],
-       'lb.utils' => [ qw/
-               lbjp-common.jp-interface
-               jobid.api-c
-               lbjp-common.trio lbjp-common.maildir
-               lb.client lb.state-machine
-       / ],
-       'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ],
-       'lb.ws-interface' => [ qw/lb.types:B/ ],
-       'lb.types' => [ qw// ],
-       'lb.glite-LB' => [ qw/
-               lb.logger:R lb.server:R lb.utils:R lb.doc:R
-               lb.ws-test:R
-       / ],
-       'lbjp-common.db' => [ qw/lbjp-common.trio/ ],
-       'lbjp-common.maildir' => [ qw// ],
-       'lbjp-common.server-bones' => [ qw// ],
-       'lbjp-common.trio' => [ qw// ],
-       'security.gss' =>  [ qw// ],
-       'security.gsoap-plugin' =>  [ qw/security.gss/ ],
-       'jobid.api-c' =>  [ qw// ],
-       'jobid.api-cpp' =>  [ qw/jobid.api-c/ ],
-       'jobid.api-java' =>  [ qw// ],
-
-       'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ],
-
-       'jp.client' => [ qw/
-                jp.ws-interface
-                lbjp-common.jp-interface lbjp-common.maildir
-                jobid.api-c
-                security.gsoap-plugin
-        / ],
-       'jp.doc' => [ qw// ],
-       'jp.index' => [ qw/
-                jp.server-common jp.ws-interface
-                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
-                security.gsoap-plugin
-        / ],
-       'jp.primary' => [ qw/
-                jobid.api-c
-                jp.server-common jp.ws-interface
-                lb.state-machine
-                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
-                security.gsoap-plugin
-        / ],
-       'jp.server-common' => [ qw/ 
-                lbjp-common.jp-interface lbjp-common.db
-        / ],
-       'jp.ws-interface' => [ qw// ],
-);
-
-for my $ext (keys %deps_aux) {
-       for (@{$deps_aux{$ext}}) {
-               /([^:]*)(?::(.*))?/;
-               push @{$deps{$ext}},$1;
-               my $type = $2 ? $2 : 'BR';
-               $deps_type{$ext}->{$1} = $type;
-       }
-}
-
-
-%extrafull = ( gridsite=>'org.gridsite.core');
-
-#( java => 'client-java' );
-%extranodmod = (
-       db => 'lbjp-common.db',
-       jpprimary => 'jp.primary',
-       jpindex => 'jp.index',
-       jpclient => 'jp.client',
-);
-
-my @t = qw/lb.client-java jobid.api-java lb.types/;
-@topbuild{@t} = (1) x ($#t+1);
-}
-
-sub full
-{
-       my $short = shift;
-       return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short;
-}
-
-sub mkinc
-{
-       my %aux;
-       undef %aux;
-       my @m=qw/
-lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java
-security.gss security.gsoap-plugin
-jobid.api-c jobid.api-cpp jobid.api-java
-lbjp-common.db lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface
-jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface
-/;
-       @aux{@m} = (1) x ($#m+1);
-
-       my $short = shift;
-       my $full = full $short;
-
-       unless ($aux{$short}) {
-               print "Makefile.inc not needed in $full\n";
-               return;
-       }
-
-       my $build = '';
-       
-       unless ($topbuild{$_}) {
-               $build = '/build';
-               unless (-d "$full/build") {
-                       mkdir "$full/build" or die "mkdir $full/build: $!\n";
-               }
-               unlink "$full/build/Makefile";
-               symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n";
-       }
-
-       open MKINC,">$full$build/Makefile.inc"
-               or die "$full$build/Makefile.inc: $!\n";
-
-       print "Creating $full$build/Makefile.inc\n";
-
-       print MKINC qq{
-PREFIX = $prefix
-stagedir = $stagedir
-thrflavour = $thrflavour
-nothrflavour = $nothrflavour
-libdir = $libdir
-};
-
-       for (@{$need_externs{$short}}) {
-               print MKINC "${_}_prefix = $extern_prefix{$_}\n"
-       }
-
-       for (@{$need_jars{$short}}) {
-               print MKINC "${_}_jar = $jar{$_}\n"
-       }
-
-       my $need_gsoap = 0;
-       for (@{$need_externs{$short}})  { $need_gsoap = 1 if $_ eq 'gsoap'; }
-
-       print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
-
-       close MKINC;
-}
-
-my %etics_externs;
-my %etics_projects;
-BEGIN{
-       %etics_externs = (
-               globus_essentials=>'vdt_globus_essentials',
-               globus=>'globus',
-               cares=>'c-ares',
-               voms=>'org.glite.security.voms-api-cpp',
-               gridsite=>'org.gridsite.shared',
-               lcas=>'org.glite.security.lcas',
-               trustmanager=>'org.glite.security.trustmanager',
-               utiljava=>'org.glite.security.util-java',
-               yaim=>'org.glite.yaim.lb',
-               gpt=>'gpt',
-               fetchcrl=>'fetch-crl',
-               gip_release=>'glite-info-provider-release',
-               gip_service=>'glite-info-provider-service',
-               bdii=>'bdii',
-               glite_version=>'glite-version',
-               glite_info_templates=>'glite-info-templates',
-               glue_schema=>'glue-schema',
-       );
-       %etics_projects = (
-               vdt=>[qw/globus globus_essentials/],
-               'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim/],
-       );
-};
-
-sub mode_etics {
-       $fmod = shift;
-
-       die "$0: --module required with --etics\n" unless $fmod;
-       
-       my ($subsys,$module) = split /\./,$fmod;
-
-       my ($major,$minor,$rev,$age);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               open V,"org.glite.$subsys.$module/project/version.properties"
-                       or die "org.glite.$subsys.$module/project/version.properties: $!\n";
-       
-               while ($_ = <V>) {
-                       chomp;
-                       ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/;
-                       $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/;
-               }
-               close V;
-       }
-
-       my @copts = ();
-       my %ge;
-       @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1);
-
-       for (@{$need_externs{"$subsys.$module"}}) {
-           if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-               push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}";
-           }
-       }
-
-       for (@{$need_jars{"$subsys.$module"}}) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-
-               push @copts,"--with-$_ \${$eext.location}/$_*.jar";
-       }
-
-
-       my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}";
-       my $file = $output ? $output : "$conf.ini";
-       open C,">$file" or die "$file: $!\n";
-
-       my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build\n";
-
-       my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..';
-
-       print STDERR "Writing $file\n";
-       print C qq{
-[Configuration-$conf]
-profile = None
-moduleName = org.glite.$subsys.$module
-displayName = $conf
-description = org.glite.$subsys.$module
-projectName = org.glite
-age = $age
-deploymentType = None
-tag = $conf
-version = $major.$minor.$rev
-path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz
-
-[Platform-default:VcsCommand]
-displayName = None
-description = None
-tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName}
-branch = None
-commit = None
-checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName}
-
-[Platform-default:BuildCommand]
-postpublish = None
-packaging = None
-displayName = None
-description = None
-doc = None
-prepublish = None
-publish = None
-compile = make
-init = None
-install = make install
-clean = make clean
-test = make check
-configure = cd $confdir && \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts
-checkstyle = None
-
-[Platform-default:Property]
-$buildroot
-
-[Platform-default:DynamicDependency]
-
-};
-       for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-
-               my $proj = 'externals';
-               for my $p (keys %etics_projects) {
-                       for $m (@{$etics_projects{$p}}) {
-                               $proj = $p if $m eq $_;
-                       }
-               }
-
-               my $type = $need_externs_type{"$subsys.$module"}->{$_};
-               print C "$proj|$eext = $type\n";
-       }
-
-       for (@{$deps{"$subsys.$module"}}) {
-               my $type = $deps_type{"$subsys.$module"}->{$_};
-               print C "org.glite|org.glite.$_ = $type\n";
-       }
-
-       close C;
-}
-
-sub gsoap_version {
-       local $_;
-       my $gsoap_version;
-       open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n";
-
-       while ($_ = <S>) {
-               chomp;
-
-               $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/;
-       }
-       close S;
-       return $gsoap_version;
-}
-
-
-sub usage {
-       my @ext = keys %extern_prefix;
-       my @myjars, keys %jar;
-
-       print STDERR qq{
-usage: $0 options
-
-General options (defaults in []):
-  --prefix=PREFIX              destination directory [./stage]
-  --staged=module,module,...   what is already in PREFIX (specify without org.glite.)
-  --thrflavour=flavour
-  --nothrflavour=flavour       threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg]
-  --listmodules=subsys          list modules of a subsystem
-  --libdir=libdir              typically [lib,lib64] postfix
-  
-Mode of operation:
-  --mode={checkout|build|etics}        what to do [build]
-  
-What to build:
-  --module=module              build this module only (mostly in-Etics operation)
-  --enable-NODE                        build this "node" (set of modules) only. Available nodes are
-                                       @{$lbmodules{lb}},@{$lbmodules{security}}
-  --disable-NODE               don't build this node
-  --lb-tag=tag                 checkout LB modules with specific tag
-  --jp-tag=tag                 checkout JP modules with specific tag
-  --lbjp-common-tag=tag         checkout lbjp-common modules with specific tag
-  --security-tag=tag           checkout security modules with specific tag
-  --jobid-tag=tag              checkout jobid modules with specific tag
-
-Dependencies:
-  --with-EXTERNAL=PATH         where to look for an external. Required externals
-                               (not all for all modules) are:
-                                       @ext
-  --with-JAR=JAR               where to look for jars. Required jars are:
-                                       @myjars
-                               Summary of what will be used is always printed
-
-};
-
-}
diff --git a/org.glite.lb.logger/doc/glite-lb-interlogd.8 b/org.glite.lb.logger/doc/glite-lb-interlogd.8
deleted file mode 100644 (file)
index d294ec7..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-.TH GLITE-LB-INTERLOGD 8 "April 2008" "EU EGEE Project" "Logging&Bookkeeping"
-
-.SH NAME
-glite-lb-interlogd - interlogger daemon
-
-.SH SYNOPSIS
-.B glite-lb-interlogd
-.RI [ options ]
-.br
-
-.SH DESCRIPTION
-.B glite-lb-interlogd 
-takes over L&B events from glite-lb-logd and 
-it is responsible for reliable transfer to their target storage -
-bookkeeping and logging servers.
-Interlogger maintains message queues for each target server 
-and implements reliable handling in environment with possible communication
-failures.
-
-On startup (and then periodically during operation) interlogger checks the
-event files (created by glite-lb-logd, see also the -f option),
-spawns a thread for each target server, and populates the queues
-with events read from the files.
-Then it starts listening for further incoming events on the UNIX socket
-(see the -s option).
-
-The queue threads periodically attempt to contact the destination servers
-and to deliver the pending events.
-
-Eventually, when all events from a file are delivered the file is removed
-after a certain timeout by a clean-up thread.
-Possible race conditions wrt. glite-lb-logd are prevented by 
-locking the files appropriately.
-
-.SH OPTIONS
-.TP
-.B "-b\fR,\fP --book 
-Send events only to bookkeeping server. This option has effect only if
-the logging server address is specified through the -l option. There is no
-implementation of logging server currently.
-.TP
-.BI \-c " FILE" "\fR,\fP --cert " FILE
-Get certificate from
-.I FILE\fR.\fP
-This option overrides the
-.B \fR$\fPX509_USER_CERT
-environment variable.
-
-.TP
-.BI \-k " FILE" "\fR,\fP --key " FILE
-Get server private key from
-.I FILE\fR.\fP
-This option overrides the
-.B \fR$\fPX509_USER_KEY
-environment variable.
-
-.TP
-.BI \-C " DIR" "\fR,\fP --CAdir " DIR
-Look for trusted CA's certificates in
-.I DIR\fR.\fP
-This option overrides the
-.B \fR$\fPX509_CERT_DIR
-environment variable.
-
-.TP
-.B "-d\fR,\fP --debug"
-Don't run as daemon (do not fork and put itself into background).
-
-.TP
-.BI \-f " PREFIX" "\fR,\fP --file-prefix " PREFIX
-.I PREFIX 
-is path prefix of the event files.
-
-For each job (jobid) a specific file is created that stores all events
-associated with this job.
-The job filename is constructed by stripping the
-protocol+server prefix from the jobid and appending the rest to this
-.I PREFIX.
-
-.I PREFIX
-defaults to /tmp/dglogd.log.
-
-On startup, interlogger checks all files matching the pattern
-.I PREFIX*.
-
-The value has to be same as used in the cooperating glite-lb-logd.
-
-.TP
-.BI \-k " FILE" "\fR,\fP --key " FILE
-Get private key from
-.I FILE\fR.\fP
-This option overrides the
-.B \fR$\fPX509_USER_KEY
-environment variable.
-
-.TP
-.BI -l " HOST" "\fR,\fP --log-server " HOST
-Use 
-.I HOST
-as address of logging server.
-As the logging is not implemented yet this option should not be used.
-
-.TP
-.BI -s " PATH" "\fR,\fP --socket " PATH
-Listen for events sent by glite-lb-logd at the UNIX socket
-.I PATH.
-
-.TP
-.B "-v\fR,\fP --verbose"
-Print extensive debug output.
-
-.TP
-.B "-V\fR,\fP --version"
-Print version and exit.
-
-.TP
-.BI -L " TIMEOUT" "\fR,\fP --lazy " TIMEOUT
-Be lazy when closing connections to servers (default, 
-.I TIMEOUT\fR
-==0 means turn lazy off).
-
-.TP
-.BI "-h\fR,\fP --help"
-Print help and exit.
-
-.\".SH USAGE
-.\" Add any additional description here
-
-.PP
-
-.SH FILES
-.TP
-.I /tmp/interlogger.sock
-Default name of local socket.
-.TP
-.I /tmp/dglogd.log*
-Default location of event files.
-
-.I /tmp/dglogd.log*.ctl
-Interlogger's control files keeping the information on status of
-the corresponding event file wrt. delivery to the target server.
-
-.TP
-No configuration files needed.
-
-.SH ENVIRONMENT
-.TP
-.B X509_USER_KEY
-If
-.B \fR$\fPX509_USER_KEY
-is set, it is used to locate private key file.
-
-.TP
-.B X509_USER_CERT
-If
-.B \fR$\fPX509_USER_CERT
-is set, it is used to locate certificate file.
-
-.TP
-.B X509_CERT_DIR
-If
-.B \fR$\fPX509_CERT_DIR
-is set, it is used to locate the trusted CA's certificates and ca-signing-policy files.
-
-.TP
-.B X509_USER_PROXY
-If
-.B \fR$\fPX509USER_PROXY
-is set, it is used to locate proxy certificate file.
-
-.SH REPORTING BUGS
-Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch
-
-.SH SEE ALSO
-.B te-lb-bkserverd\fR(8),\fP glite-lb-logd\fR(8),\fP glite-lb-logevent\fR(1),\fP
-
-.SH AUTHOR
-EU EGEE, JRA1.
diff --git a/org.glite.lb.logger/doc/glite-lb-logd.8 b/org.glite.lb.logger/doc/glite-lb-logd.8
deleted file mode 100644 (file)
index a28529a..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-.TH GLITE-LB-LOGD 8 "April 2008" "EU EGEE Project" "Logging&Bookkeeping"
-
-.SH NAME
-glite-lb-logd - local logger daemon
-
-.SH SYNOPSIS
-.B glite-lb-logd
-.RI [ options ]
-.br
-
-.SH DESCRIPTION
-.B glite-lb-logd 
-accepts the L&B events from their sources (via the producer L&B API).
-It is responsible for fast acceptance of the events and their reliable storage
-in local files.
-
-Under normal conditions, the events are forwared to the 
-.B glite-lb-interlogd
-immediately.
-The file storage allows the interlogger crash recovery.
-
-.SH OPTIONS
-.TP
-.BI \-c " FILE" "\fR,\fP --cert " FILE
-Get certificate from
-.I FILE\fR.\fP
-This option overrides the
-.B \fR$\fPX509_USER_CERT
-environment variable.
-
-.TP
-.BI \-C " DIR" "\fR,\fP --CAdir " DIR
-Look for trusted CA's certificates in
-.I DIR\fR.\fP
-This option overrides the
-.B \fR$\fPX509_CERT_DIR
-environment variable.
-
-.TP
-.B "-d\fR,\fP --debug"
-Don't run as daemon, print additional diagnostics.
-
-.TP
-.B "-v\fR,\fP --verbose"
-Print extensive debug output.
-
-.TP
-.BI \-p " NUM" "\fR,\fP --port " NUM
-Listen on the port
-.I NUM\fR.\fP
-
-.TP
-.BI \-f " PREFIX" "\fR,\fP --file-prefix " PREFIX
-.I PREFIX 
-is a path prefix of the event files.
-
-For each job (jobid) a specific file is created that stores all events
-associated with this job.
-The job filename is constructed by stripping the
-protocol+server prefix from the jobid and appending the rest to this
-.I PREFIX. 
-
-.I PREFIX 
-defaults to /tmp/dglogd.log.
-
-The value has to be same as used in the cooperating glite-lb-logd.
-
-.TP
-.BI \-k " FILE" "\fR,\fP --key " FILE
-Get private key from
-.I FILE\fR.\fP
-This option overrides the
-.B \fR$\fPX509_USER_KEY
-environment variable.
-
-
-.TP
-.BI -s " PATH" "\fR,\fP --socket " PATH
-Send the messages to interlogger through the UNIX socket  
-.I PATH\fR.\fP
-
-The value has to be same as used in the cooperating glite-lb-interlogd.
-
-.TP
-.B "-V\fR,\fP --version"
-Print version and exit.
-
-.TP
-.B "-h\fR,\fP --help"
-Print help and exit.
-
-.TP
-.B --noAuth
-Don't require valid X509 credentials to run the daemon.
-Used for debugging only.
-
-.TP
-.B --noIPC
-Don't send messages to interlogger.
-
-.TP
-.B --noParse
-Don't parse messages for correctness.
-Dangerous, for debugging only! Don't use at all.
-
-
-.\".SH USAGE
-.\" Add any additional description here
-
-.PP
-
-.SH FILES
-.TP
-.I /tmp/interlogger.sock
-Default name of local socket.
-
-.TP
-.I /tmp/dglogd.log*
-Default location of the event storage files.
-.TP
-No configuration files needed.
-
-.SH ENVIRONMENT
-.TP
-.B X509_USER_KEY
-If
-.B \fR$\fPX509_USER_KEY
-is set, it is used to locate private key file.
-
-.TP
-.B X509_USER_CERT
-If
-.B \fR$\fPX509_USER_CERT
-is set, it is used to locate certificate file.
-
-.TP
-.B X509_CERT_DIR
-If
-.B \fR$\fPX509_CERT_DIR
-is set, it is used to locate the trusted CA's certificates and ca-signing-policy files.
-
-.TP
-.B X509_USER_PROXY
-If
-.B \fR$\fPX509USER_PROXY
-is set, it is used to locate proxy certificate file.
-
-
-.SH SIGNALS
-.TP
-.B USR1
-Increase verbosity of the program.
-
-.TP
-.B USR2
-Decrease verbosity of the program.
-
-
-.SH REPORTING BUGS
-Please, report all bugs to EGEE Bug Tracking System located at https://savannah.cern.ch
-
-.SH SEE ALSO
-.B glite-lb-bkserverd\fR(8),\fP glite-lb-interlogd\fR(8),\fP glite-lb-logevent\fR(1),\fP
-
-.SH AUTHOR
-EU EGEE, JRA1.
diff --git a/org.glite.lb.logger/project/ChangeLog b/org.glite.lb.logger/project/ChangeLog
deleted file mode 100644 (file)
index 17d0727..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-1.4.6-1 (lb-1.7.0-1)
-- let empty notification message get through the output queue to keep
-  event_store commits in sync
-- don't keep event queue mutex while sleeping on error
-
-1.4.7-1 (lb-1.7.1-1)
-- support for message expiration
-
-1.4.8-1 (lb-1.7.2-1)
-- support for notification expiration
-
-1.4.9-1 (lb-1.7.3-1)
-- treat zero event expiration time as "never"
-
-1.4.9-2 (lb-1.7.4-1)
-- rebuild wrt. downgraded security 3.1.57-1
-
-1.4.9-3 (lb-1.8.0-1)
-- startup script: use grep with ^ rather than fgrep
-
-1.4.10-1
-- fixed sending empty events
-- do not syslog "error reading server reply" unnecessarily
-
-2.0.0-1
-- LB 2.0 release
-
-2.0.0-2
-- fixed configure to work in etics
-
-2.0.0-3
-- Fixed typos in the Makefile
-
-2.0.0-4
-- configure script update (globus flavors added to configure call)
-
-2.0.1-1
-- (from 1.4.11-1) Support chconfig in startup scripts (#27055)
-- (from 1.4.11-1) Proper kill signal handling (#36470)
-
-2.0.2-1
-- implemented multi-file event store, avoiding ever-growing files
-  in the case of heavy traffic notifications
-
-2.0.3-1
-- Fixed handling messages with destination not set
-- Additional logging output
-
-2.0.4-1
-- Man page update
-
-2.0.4-2
-- install libraries into $libdir
-
-2.0.5-1
-- Starting proxy support
-
diff --git a/org.glite.lb.logger/project/build.number b/org.glite.lb.logger/project/build.number
deleted file mode 100644 (file)
index 6dd2f97..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#Fri Aug 18 12:30:51 CEST 2006
-module.build=0243
diff --git a/org.glite.lb.logger/project/build.properties b/org.glite.lb.logger/project/build.properties
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/org.glite.lb.logger/project/configure.properties.xml b/org.glite.lb.logger/project/configure.properties.xml
deleted file mode 100644 (file)
index 3279d84..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Configuration options for the GLite LB Client module
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-       Version info: $Id$
-       Release: $Name$
-
-       Revision history:
-       $Log$
-       Revision 1.3  2006/03/15 18:25:31  akrenek
-       cares
-
-       Revision 1.2  2004/08/31 13:44:44  mvocu
-       * added cppunit
-       
-       Revision 1.1  2004/07/07 12:08:47  akrenek
-       *** empty log message ***
-       
-       Revision 1.2  2004/07/06 20:47:11  flammer
-       Moved to configure.properties.xml
-       
-       
--->
-
-       <!-- ======================================================
-         Define extra properties here ...
-         ====================================================== -->
-        
-       <project name="LB Client configuration options">                                                                        
-               <target name="lbmakefiles">
-                       <exec executable="ln" failonerror="true">
-                               <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
-                       </exec>
-                       <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-cppunit_prefix=${with.cppunit.prefix}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
-                       </echo>
-           </target>
-       </project>
diff --git a/org.glite.lb.logger/project/package.description b/org.glite.lb.logger/project/package.description
deleted file mode 100644 (file)
index cd0621b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-glite-lb-logger is the gLite LB local-logger and inter-logger. This package contains the local-logger (glite-lb-logd), inter-logger (glite-lb-interlogd) and notification inter-logger (glite-lb-notif-interlogd) daemons.
diff --git a/org.glite.lb.logger/project/package.summary b/org.glite.lb.logger/project/package.summary
deleted file mode 100644 (file)
index 089b630..0000000
+++ /dev/null
@@ -1 +0,0 @@
-gLite Logging and Bookkeeping local-logger and inter-logger
diff --git a/org.glite.lb.logger/project/properties.xml b/org.glite.lb.logger/project/properties.xml
deleted file mode 100755 (executable)
index 44827cf..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Common build properties file for the Glite LB Logger component
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-       Version info: $Id$
-       Release: $Name$ 
-       
-       Revision history:
-       $Log$
--->
-
-<project name="LB Logger component common properties">
-
-       <!-- Include build properties to allow overwriting 
-            of properties for subsystem                    -->
-       <property file="project/build.properties" />    
-
-       <!-- ======================================================
-          Define corresponding subsystem properties
-                ====================================================== -->
-
-       <!-- Subsystem name -->
-       <property name="subsystem.name" value="${lb.subsystem.name}"/>
-               
-       <!-- Subsystem prefix -->
-       <property name="subsystem.prefix" value="${lb.subsystem.prefix}"/>
-
-       <!-- ======================================================
-          Define component properties
-                ====================================================== -->
-                               
-       <!-- Component name prefix -->
-       <property name="component.prefix" value="logger" />
-                       
-       <!-- ======================================================
-          Define general component properties
-                ====================================================== -->
-       
-       <import file="${component.general.properties.file}" />
-                                               
-       <!-- ======================================================
-                Define extra properties here ...
-                ====================================================== -->
-                
-                                                               
-</project>
diff --git a/org.glite.lb.logger/project/tar_exclude b/org.glite.lb.logger/project/tar_exclude
deleted file mode 100644 (file)
index e1fcd1a..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
diff --git a/org.glite.lb.logger/project/version.properties b/org.glite.lb.logger/project/version.properties
deleted file mode 100644 (file)
index a83fffc..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-# $Header$
-module.version=2.0.5
-module.age=1
diff --git a/org.glite.lb.logger/src-nt/Connection.H b/org.glite.lb.logger/src-nt/Connection.H
deleted file mode 100644 (file)
index 808b788..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef _CONNECTION_H
-#define _CONNECTION_H
-
-
-class Connection {
-public:
-       class Factory {
-       public:
-               virtual Connection *newConnection(int fd) const = 0;
-               virtual Connection *accept(int fd) const = 0;
-
-               virtual ~Factory() {}
-       };
-
-       class Endpoint {
-       };
-
-       Connection(int a_fd) : fd(a_fd)
-               {}
-
-       virtual ~Connection() 
-               {}
-
-       virtual int getFD() const 
-               { return fd; }
-
-       virtual int read(char *buf, unsigned int len) = 0;
-       virtual int write(char *buf, unsigned int len) = 0;
-
-protected:
-       int fd;
-};
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/Connection.cpp b/org.glite.lb.logger/src-nt/Connection.cpp
deleted file mode 100644 (file)
index 7cac943..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "Connection.H"
-
-Connection::Factory::~Factory() {
-}
diff --git a/org.glite.lb.logger/src-nt/EventManager.H b/org.glite.lb.logger/src-nt/EventManager.H
deleted file mode 100644 (file)
index b1f16ee..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-#ifndef _EVENT_MANAGER_H
-#define _EVENT_MANAGER_H
-
-#include <list>
-
-
-// interface
-
-/**
- * Base class of event hierarchy.
- */
-class Event {
-public:
-    virtual ~Event() {}
-};
-
-
-/**
- * Base class for event handler address.
- */
-class EventHandler {
-public:
-    // constants for event handler return codes
-    static const int NOT_HANDLED = 0;
-    static const int HANDLED = 1;
-    static const int HANDLED_FINAL = 2;
-    static const int HANDLED_NEW = 3;
-
-    virtual int handleEvent(Event* &e) { return NOT_HANDLED; }
-    virtual ~EventHandler() {}
-};
-
-
-/**
- * Holds addres of event handler, ie. pointer to member function of T 
- * that takes E* & as an argument.
- */
-template<class T, class E>
-class TypedEventHandler: public EventHandler {
-public:
-    typedef int (T::*handlerType)(E* &);
-    
-    TypedEventHandler(T *handler, handlerType method) 
-       : m_handler(handler), m_handleEvent(method) {
-    }
-
-    virtual int handleEvent(Event* &e) {
-       E *ne = dynamic_cast<E*>(e);
-       int result = EventHandler::NOT_HANDLED;
-       if(ne) {
-           result = (m_handler->*m_handleEvent)(ne);
-           if((result == EventHandler::HANDLED_NEW) && 
-              !(ne == e)) {
-               delete e;
-               e = ne;
-           }
-       }
-       return result;
-    }
-    
-private:
-    T *m_handler;
-    handlerType m_handleEvent;
-};
-
-
-class EventManager {
-public:
-    
-    int postEvent(Event* &event);
-    
-    template<class T, class E>
-    EventHandler& registerHandler(T *handler, int (T::*method)(E* &)) {
-       EventHandler *h = new TypedEventHandler<T,E>(handler, method);
-       addHandler(h);
-       return *h;
-    }
-    
-    template<class T>
-    EventHandler& registerHandler(T *handler) {
-       return registerHandler(handler, &T::handleEvent);
-    }
-
-private:
-    std::list<EventHandler*> handlers;
-
-    void addHandler(EventHandler*);
-    void removeHandler(EventHandler *);
-};
-
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/EventManager.cpp b/org.glite.lb.logger/src-nt/EventManager.cpp
deleted file mode 100644 (file)
index 91efb12..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#include "EventManager.H"
-
-int
-EventManager::postEvent(Event* &e)
-{
-  for(std::list<EventHandler*>::iterator i = handlers.begin();
-      i != handlers.end();
-      i++) {
-    (*i)->handleEvent(e);
-  }
-  return 0;
-}
-
-void
-EventManager::addHandler(EventHandler *handler)
-{
-  handlers.push_back(handler);
-}
-
-void
-EventManager::removeHandler(EventHandler *handler)
-{
-}
diff --git a/org.glite.lb.logger/src-nt/Exception.H b/org.glite.lb.logger/src-nt/Exception.H
deleted file mode 100644 (file)
index a2c921d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _EXCEPTION_H
-#define _EXCEPTION_H
-
-class Exception {
-};
-
-class FatalException {
-};
-
-
-#define E_ASSERT(a) if(!(a)) { throw new FatalException; }
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/HTTPTransport.H b/org.glite.lb.logger/src-nt/HTTPTransport.H
deleted file mode 100644 (file)
index 05e928b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef _HTTP_TRANSPORT_H
-#define _HTTP_TRANSPORT_H
-
-#include "ThreadPool.H"
-#include "Transport.H"
-#include "Singleton.H"
-
-#include <string>
-
-class HTTPTransport: 
-       public Transport
-{
-public:
-
-       // factory class
-       class Factory: public Transport::Factory, 
-                      public Singleton<HTTPTransport::Factory>  {
-       public:
-               virtual Transport *newTransport() const {
-                       return(new HTTPTransport());
-               }
-       };
-
-       HTTPTransport() 
-               : Transport(),
-                 state(NONE),
-                 request(), headers(), body(NULL), pos(NULL),
-                 content_length(0)
-               {}
-
-       virtual ~HTTPTransport();
-
-       virtual int receive(Connection *conn, Message* &msg);
-       virtual int send(Connection *conn, Message* msg);
-       virtual void reset();
-
-private:
-       enum { NONE, 
-              IN_REQUEST,
-              IN_HEADERS,
-              IN_BODY } state;
-       std::string request;
-       std::string headers;
-       char *body;
-       char buffer[256];
-       char *pos;
-       unsigned int content_length;
-
-       int parseHeader(const char *s, unsigned int len);
-       void serializeHeaders(Message *msg);
-};
-
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/HTTPTransport.cpp b/org.glite.lb.logger/src-nt/HTTPTransport.cpp
deleted file mode 100644 (file)
index 9ed4e16..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-#include "HTTPTransport.H"
-#include "Exception.H"
-#include "EventManager.H"
-
-#include <iostream>
-#include <string.h>
-
-
-HTTPTransport::~HTTPTransport()
-{
-       if(body) free(body);
-}
-
-
-// read what is available and parse what can be parsed
-// returns the result of read operation of the underlying connection,
-// ie. the number of bytes read or error code
-int
-HTTPTransport::receive(Connection *conn, Message* &msg)
-{
-       int len;
-
-       switch(state) {
-       case NONE:
-               state = IN_REQUEST;
-               pos = buffer;
-
-       case IN_REQUEST:
-       case IN_HEADERS:
-               len = conn->read(pos, sizeof(buffer) - (pos - buffer));
-               if(len < 0) {
-                       // error during request
-                       // state = NONE;
-                       return len;
-               } else if(len == 0) {
-                       // other side closed connection
-                       // state = NONE;
-                       return len;
-               } else {
-                       char *cr = NULL, *p = buffer, *s = buffer;
-                       bool crlf_seen = false;
-
-                       // parse buffer, look for CRLFs
-                       //   s - start scan position
-                       //   p - start of current token
-                       //   cr - current CRLF position
-                       //   crlf_seen <=> previous block ends with CRLF
-                       while((state != IN_BODY) &&
-                             (s < buffer + len) && 
-                             (cr = (char*)memchr(s, '\r', len - (s - buffer)))) {
-                               if((cr < buffer + len - 1) && 
-                                  (cr[1] == '\n')) {
-                                       // found CRLF
-                                       if(state == IN_REQUEST) {
-                                               // found end of request
-                                               request.append(p, cr - p);
-                                               // change state
-                                               state = IN_HEADERS;
-                                               // start new tokens
-                                               p = cr + 2;
-                                       } else {
-                                               // headers continue. parse the current one
-                                               *cr = 0;
-                                               parseHeader(s, cr - s);
-                                               *cr = '\r';
-                                       }
-                                       if(crlf_seen && (s == cr)) {
-                                               // found CRLFCRLF
-                                               state = IN_BODY;
-                                       } 
-                                       // next scan starts after CRLF
-                                       s = cr + 2; 
-                                       // we have seen CRLF
-                                       crlf_seen = true;
-                               } else {
-                                       if(crlf_seen && (s == cr)) {
-                                               if(cr < buffer + len - 1) {
-                                                       // found CRLFCRx
-                                                       // continue scan behind this
-                                                       s = cr + 2;
-                                               } else {
-                                                       // found CRLFCR at the end of buffer
-                                                       // s points behind buffer => scan ends
-                                                       s = cr + 1;
-                                                       // cr points at the CRLFCR => it will be left for next pass
-                                                       cr = cr - 2;
-                                               }
-                                       } else {
-                                               // single '\r'  - skip it, 
-                                               // or '\r' at the end of buffer - skip it, that ends scanning
-                                               s = cr + 1;
-                                       }       
-                                       crlf_seen = false;
-                               }
-                       }
-                       // copy the current token into appropriate variable,
-                       // but leave the trailing \r[\n] in buffer
-                       if(!cr) cr = buffer + len;
-                       if(state == IN_REQUEST) 
-                               request.append(p, cr - p);
-                       else 
-                               headers.append(p, cr - p);
-                       if(state == IN_BODY) {
-                               // we found body
-                               // content-length should be set at the moment
-                               if(content_length > 0) {
-                                       body = (char*)malloc(content_length);
-                                       if(body == NULL) {
-                                               // chyba alokace
-                                       }
-                                       // move rest of buffer to body
-                                       if(s < buffer + len) {
-                                               memmove(body, s, buffer + len - s);
-                                               pos = body + (buffer + len - s);
-                                       } else {
-                                               pos = body;
-                                       }
-                               } else {
-                                       // report error
-                                       // XXX - this may happen, do not handle using exceptions
-                                       std::cout << "Wrong content length" << std::endl;
-                                       throw new Exception();
-                               }
-                       } else {
-                               // move the trailing characters to the front
-                               if(cr < buffer + len) 
-                                       memmove(buffer, cr, buffer + len - cr);
-                               // and set pos to point at the first free place
-                               pos = buffer + (buffer + len - cr);
-                       }
-               }
-               break;
-
-       case IN_BODY:
-               len = conn->read(pos, content_length - (pos - body));
-               if(len < 0) {
-                       // error reading
-                       // state = NONE;
-                       return len;
-               } else if(len == 0) {
-                       // no more data
-                       // state = NONE;
-                       return len;
-               } else {
-                       pos += len;
-                       if(pos == content_length + body) {
-                               // finished reading
-                               state = NONE;
-                       }
-               }
-               break;
-       }
-
-       if(state != NONE) 
-               msg = NULL;
-       else {
-               // we have a new message
-               // XXX - or we have an error, must handle it
-               msg = new Message(body, content_length);
-               msg->setProperties(
-       }
-       return len;
-}
-
-
-int
-HTTPTransport::parseHeader(const char *s, unsigned int len)
-{
-       char *p;
-
-       p = (char*)memccpy((void*)s, (void*)s, ':', len);
-       
-       if(!strncasecmp(s, "Content-Length", 14)) {
-               content_length = p ? atoi(p) : 0 ;
-       }
-       return(0);
-}
-
-
-int
-HTTPTransport::send(Connection *conn, Message* msg)
-{
-       int len;
-       switch(state) {
-       case NONE:
-               state = IN_REQUEST;
-               request = "POST " + msg->path() + "HTTP/1.1\r\n";
-               pos = request.c_str();
-               content_length = msg->getContent(body);
-
-       case IN_REQUEST:
-               len = conn->send(pos, request.length() - pos + request.c_str());
-               if(len < 0) {
-                       return len;
-               }
-               pos += len;
-               if(request.c_str() + request.length() == pos) {
-                       state = IN_HEADERS;
-                       prepareHeaders(msg);
-                       pos = headers.c_str();
-               } else {
-                       break;
-               }
-
-       case IN_HEADERS:
-               len = conn->send(pos, headers.length() - pos + headers.c_str());
-               if(len < 0) {
-                       return len;
-               }
-               pos += len;
-               if(headers.c_str() + headers.length() == pos) {
-                       state = IN_BODY;
-                       pos = body;
-               } else {
-                       break;
-               }
-
-       case IN_BODY:
-               len = conn->send(pos, body, content_length - pos + body);
-               if(len < 0) {
-                       return len;
-               }
-               pos += len;
-               if(body + content_length == pos) {
-                       state = NONE;
-                       return 0;
-               }
-               break;
-               
-       default:
-       }
-       return len;
-}
-
-
-void 
-HTTPTransport::reset()
-{
-       state = NONE;
-       request.clear();
-       headers.clear();
-       if(body) {
-               free(body);
-               body = NULL;
-       }
-       content_length = 0;
-       pos = buffer;
-}
-       
-
-void
-HTTPTransport::serializeHeaders(Message *msg);
-{
-       for(Properties::iterator i = msg->
-}
diff --git a/org.glite.lb.logger/src-nt/InputChannel.H b/org.glite.lb.logger/src-nt/InputChannel.H
deleted file mode 100644 (file)
index 2bac262..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _INPUT_CHANNEL_H_
-#define _INPUT_CHANNEL_H_
-
-#include "ThreadPool.H"
-#include "Connection.H"
-#include "Transport.H"
-
-class InputChannel 
-       : public ThreadPool::WorkDescription {
-public:
-       
-       InputChannel(Connection *conn, Transport *trans)
-               :  ThreadPool::WorkDescription(conn->getFD()),
-                  m_connection(conn), m_transport(trans)
-               {}
-
-       void start();
-
-protected:
-       virtual void onReady();
-       virtual void onTimeout();
-       virtual void onError();
-
-private:
-       Connection *m_connection;
-       Transport  *m_transport;
-};
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/InputChannel.cpp b/org.glite.lb.logger/src-nt/InputChannel.cpp
deleted file mode 100644 (file)
index e3ac9c8..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "InputChannel.H"
-#include "ThreadPool.H"
-#include "EventManager.H"
-
-extern EventManager theEventManager;
-
-void
-InputChannel::start()
-{
-       ThreadPool::instance()->queueWorkRead(this);
-}
-
-void
-InputChannel::onReady()
-{
-       Transport::Message *msg = NULL;
-       int ret = m_transport->receive(m_connection, msg);
-       if(ret <= 0) {
-               // no new data read
-       } else if(msg) {
-               // we have a new message
-               
-       } else {
-               // still need more data
-               ThreadPool::instance()->queueWorkRead(this);
-       }
-}
-
-void
-InputChannel::onTimeout()
-{
-}
-
-void
-InputChannel::onError()
-{
-}
diff --git a/org.glite.lb.logger/src-nt/Makefile b/org.glite.lb.logger/src-nt/Makefile
deleted file mode 100644 (file)
index 8ebe707..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-
-CXX = c++
-CC = gcc
-
-CFLAGS = -g -Wall
-
-COMPILEPP = $(CXX) $(CXXFLAGS) $(CFLAGS)
-COMPILE = $(CC) $(CFLAGS)
-LINK = libtool --mode=link g++ $(LDFLAGS)
-
-THREAD_LIB = -lpthread
-
-CPPUNIT_ROOT = 
-CPPUNIT_LIB = -lcppunit -ldl
-CPPUNIT_INCLUDE = 
-
-TEST_OBJS= \
-       test/ThreadPoolTest.o \
-       test/PluginManagerTest.o \
-       test/EventManagerTest.o \
-       test/SingletonTest.o \
-       test/test_main.o
-
-OBJS = \
-       PluginManager.o \
-       SocketInput.o \
-       Connection.o \
-       PlainConnection.o \
-       Transport.o \
-       HTTPTransport.o \
-       ThreadPool.o \
-       EventManager.o \
-       InputChannel.cpp 
-
-plain: main.o $(OBJS)
-       $(LINK) -o $@ $+ $(THREAD_LIB)
-
-utest: ThreadPool.o PluginManager.o EventManager.o $(TEST_OBJS)
-       $(LINK) -o $@ $+ $(CPPUNIT_LIB) $(THREAD_LIB)
-
-stest: EventManager.o test/EventManagerTest.o test/test_main.o
-       $(LINK) -o $@ $+ $(CPPUNIT_LIB) $(THREAD_LIB)
-
-$(TEST_OBJS): %.o: %.cpp
-       $(COMPILEPP) -I. $(CPPUNIT_INCLUDE) -o $@ -c $<
-
-%.o: %.cpp
-       $(COMPILEPP) -o $@ -c $<
-
-%.o: %.c
-       $(COMPILE) -o $@ -c $<
\ No newline at end of file
diff --git a/org.glite.lb.logger/src-nt/Message.H b/org.glite.lb.logger/src-nt/Message.H
deleted file mode 100644 (file)
index 725966a..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef _MESSAGE_H_
-#define _MESSAGE_H
-
-#include "Properties.H"
-#include "MessageStore.H"
-
-#include <string>
-
-class Message: public MessageStore::Storable {
-public:
-       
-       /** class that holds message state
-        *
-        */
-       class State : public MessageStore::Storable {
-       public:
-
-               /** Get size needed for storage (from Storable).
-                */
-               virtual int getStorageSize() const;
-
-               /** Save State (from Storable)
-                */
-               virtual int save(void* data, int len) const;
-
-               /** Load State (from Storable)
-                */
-               virtual int load(void* data, int len);
-       };
-
-
-       Message();
-
-       Message(void * data, unsigned int length) 
-               : m_length(length), 
-                 m_data(data)
-               {}
-
-
-       int getContent(void* &data) const
-               { data = m_data; return m_length; }
-
-       int getContentLength() const 
-               { return m_length; }
-
-       std::string getProperty(const std::string &name, std::string &val)
-               { return m_properties.getProperty(name); }
-       
-       void setProperty(const std::string &name, std::string &val) 
-               { m_properties.setProperty(name, val); }
-       
-       Properties& getProperties() 
-               { return m_properties; }
-       
-       void setProperties(Properties &)
-               {}
-
-private:
-       MessageStore::ID        m_id;
-       unsigned int            m_length;
-       void *                  m_data;
-       Properties              m_properties;
-};
-
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/MessageStore.H b/org.glite.lb.logger/src-nt/MessageStore.H
deleted file mode 100644 (file)
index ff03a9b..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef _MESSAGE_STORE_H_
-#define _MESSAGE_STORE_H_
-
-#include <pthread.h>
-
-/** Permanent storage for messages and their states.
- */
-
-class MessageStore {
-public:
-
-       /** Base class for everything that can be stored here.
-        */
-       class Storable {
-       public:
-               /** Get size needed for object storage.
-                */
-               virtual int getStorageSize() const = 0;
-               
-               /** Save state of object into binary data.
-                */
-               virtual int save(void* data, int len) const = 0;
-
-               /** Load state of object from binary data.
-                */
-               virtual int load(void* data, int len) = 0;
-
-               virtual ~Storable() {}
-       };
-
-
-       /** Class that uniquely identifies stored content.
-        */
-       class ID: public Storable {
-       public:
-               /** Default constructor.
-                *
-                * Creates new unique ID.
-                */
-               ID();
-
-               /** Copy constructor.
-                */
-               ID(const ID& src);
-
-               /** Destructor.
-                */
-               ~ID() {};
-
-               /** Assignment operator.
-                */
-               ID& operator=(const ID& src);
-
-               /** Return the string suitable for printing.
-                */
-               std::string toString() const;
-
-               /** Comparison operator
-                */
-               int operator==(const ID& second);
-
-               /** Get size needed for storage (from Storable).
-                */
-               virtual int getStorageSize() const;
-
-               /** Save ID (from Storable)
-                */
-               virtual int save(void* data, int len) const;
-
-               /** Load ID (from Storable)
-                */
-               virtual int load(void* data, int len);
-
-       protected:
-               unsigned long long getID() {return id;}
-
-       private:
-               static pthread_mutex_t counterLock;
-               static unsigned counter;
-               unsigned long long id;
-       };
-};
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/MessageStore.cpp b/org.glite.lb.logger/src-nt/MessageStore.cpp
deleted file mode 100644 (file)
index eb9de7a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <pthread.h>
-#include <sys/time.h>
-#include <sstream>
-
-#include "MessageStore.H"
-
-pthread_mutex_t MessageStore::ID::counterLock = PTHREAD_MUTEX_INITIALIZER;
-unsigned MessageStore::ID::counter = 0;
-
-MessageStore::ID::ID(){
-       time_t t;
-       time(&t);
-       pthread_mutex_lock(&counterLock);
-       counter++;
-       id = ((unsigned long long) counter << 32) + t;
-       pthread_mutex_unlock(&counterLock);
-}
-
-std::string MessageStore::ID::toString() const{
-       std::ostringstream oss;
-       oss << id;
-       return oss.str();
-}
-
diff --git a/org.glite.lb.logger/src-nt/PlainConnection.H b/org.glite.lb.logger/src-nt/PlainConnection.H
deleted file mode 100644 (file)
index 5536095..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef _PLAIN_CONNECTION_H
-#define _PLAIN_CONNECTION_H
-
-#include "Connection.H"
-#include "Singleton.H"
-
-class PlainConnection: 
-       public Connection
-{
-public:
-       class Factory: public Connection::Factory, 
-                      public Singleton<PlainConnection::Factory> {
-       public:
-               virtual Connection *newConnection(int fd) const {
-                       return new PlainConnection(fd);
-               }
-
-               virtual Connection *accept(int fd) const;
-
-               virtual ~Factory() {}
-       };
-
-       PlainConnection(int a_fd): Connection(a_fd)
-               {}
-
-       virtual ~PlainConnection();
-
-       // from Connection
-       virtual int read(char *buf, unsigned int len);
-       virtual int write(char *buf, unsigned int len);
-
-};
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/PlainConnection.cpp b/org.glite.lb.logger/src-nt/PlainConnection.cpp
deleted file mode 100644 (file)
index 31ce792..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#include "PlainConnection.H"
-#include "ThreadPool.H"
-
-#include <sys/types.h>
-#include <sys/socket.h>
-
-PlainConnection::~PlainConnection()
-{
-}
-
-
-Connection *
-PlainConnection::Factory::accept(int fd) const
-{
-       int nfd;
-
-       nfd = ::accept(fd, NULL, NULL);
-       return newConnection(nfd);
-}
-
-
-int
-PlainConnection::read(char *buf, unsigned int len)
-{
-       int ret;
-
-       ret = ::recv(fd, buf, len, MSG_NOSIGNAL);
-       return ret;
-}
-
-
-int 
-PlainConnection::write(char *buf, unsigned int len)
-{
-       int ret;
-
-       ret = ::write(fd, buf, len);
-       return ret;
-}
diff --git a/org.glite.lb.logger/src-nt/PluginManager.H b/org.glite.lb.logger/src-nt/PluginManager.H
deleted file mode 100644 (file)
index 1840536..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef _PLUGIN_MANAGER_H
-#define _PLUGIN_MANAGER_H
-
-#include <list>
-#include <iostream>
-
-#include "Singleton.H"
-
-class PluginManager: public Singleton<PluginManager> {
-       friend class Singleton<PluginManager>;
-public:
-       
-       // base class for plugins
-       class Plugin {
-       public:
-               const char *name;
-
-               Plugin(const char *aname) : name(aname) { 
-                       PluginManager::instance()->registerPlugin(this, aname); 
-               }
-
-               virtual bool initialize() = 0;
-               virtual bool cleanup () = 0;
-
-               virtual ~Plugin();
-       };
-
-       // add plugin with given name to the list of registered plugins
-       void registerPlugin(Plugin *plugin, const char *name) { 
-               pluginList.push_front(plugin);
-       }
-
-       // remove plugin from the list
-       void removePlugin();
-
-       // initialize all plugins on list
-       void initialize() {
-               for(std::list<Plugin *>::iterator i = pluginList.begin();
-                   i != pluginList.end();
-                   i++) {
-                       (*i)->initialize();
-               }
-               
-       }
-
-       // cleanup all plugins on list
-       void cleanup() {
-               for(std::list<Plugin *>::iterator i = pluginList.begin();
-                   i != pluginList.end();
-                   i++) {
-                       (*i)->cleanup();
-               }
-               
-       }
-               
-
-protected:
-       //  default constructor
-       PluginManager() : pluginList()
-               {};
-
-private:
-       // list of registered plugins
-       std::list<Plugin *> pluginList;
-
-};
-
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/PluginManager.cpp b/org.glite.lb.logger/src-nt/PluginManager.cpp
deleted file mode 100644 (file)
index 0200737..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "PluginManager.H"
-
-PluginManager::Plugin::~Plugin() {
-}
-
-
diff --git a/org.glite.lb.logger/src-nt/Properties.H b/org.glite.lb.logger/src-nt/Properties.H
deleted file mode 100644 (file)
index 77d216d..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef _PROPERTIES_H_
-#define _PROPERTIES_H_
-
-#include <map>
-#include <string>
-
-class Properties {
-public:
-
-       // default constructor
-       Properties() 
-               : properties()
-               {}
-
-       // accessors
-       std::string& getProperty(const std::string &key) 
-               { return properties[key]; }
-
-       void setProperty(const std::string &key, std::string &val) 
-               { properties[key] = val; }
-
-       // iterators
-       typedef std::map<std::string,std::string>::iterator  iterator;
-
-       iterator begin() 
-               { return properties.begin(); }
-
-       iterator end()
-               { return properties.end(); }
-
-       
-private:
-       std::map<std::string,std::string> properties;
-};
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/Singleton.H b/org.glite.lb.logger/src-nt/Singleton.H
deleted file mode 100644 (file)
index ce03525..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef _SINGLETON_H
-#define _SINGLETON_H
-
-#include <pthread.h>
-
-#include "Exception.H"
-
-template <class T>
-class Singleton {
-public:
-       // obtain the singleton object
-       static T* instance() {
-               // XXX - is this really thread safe?
-               static pthread_mutex_t instance_lock = PTHREAD_MUTEX_INITIALIZER;
-
-               pthread_mutex_lock(&instance_lock);
-               if(theInstance == NULL) {
-                       theInstance = new T;
-               }
-               pthread_mutex_unlock(&instance_lock);
-               return(theInstance);
-       }
-
-protected:
-       // prevent other's from messing with the instance
-       Singleton()  {}
-       Singleton(const Singleton &) {}
-       Singleton& operator=(const Singleton &) {}
-       ~Singleton() {}
-       
-private:
-       static T *theInstance;
-};
-
-template<class T>
-T *Singleton<T>::theInstance = NULL;
-
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/SocketInput.H b/org.glite.lb.logger/src-nt/SocketInput.H
deleted file mode 100644 (file)
index 0021816..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef _SOCKET_INPUT_H
-#define _SOCKET_INPUT_H
-
-#include "ThreadPool.H"
-#include "Connection.H"
-#include "Transport.H"
-
-#include "sys/un.h"
-
-
-class SocketInput: public ThreadPool::WorkDescription
-{
-public:
-       SocketInput(const char *path, 
-                   const Connection::Factory *a_cfactory,
-                   const Transport::Factory *a_tfactory);
-       virtual ~SocketInput();
-
-       // from WorkDescription
-       virtual void onReady();
-       virtual void onTimeout();
-       virtual void onError();
-
-private:
-       static const int SOCK_QUEUE_MAX = 5;
-
-       struct sockaddr_un saddr;
-       const Connection::Factory *cFactory;
-       const Transport::Factory *tFactory;
-};
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/SocketInput.cpp b/org.glite.lb.logger/src-nt/SocketInput.cpp
deleted file mode 100644 (file)
index e553ec8..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
-#include <errno.h>
-
-#include "ThreadPool.H"
-#include "SocketInput.H"
-#include "InputChannel.H"
-#include "Exception.H"
-
-
-// create unix domain socket for input
-SocketInput::SocketInput(const char *path, 
-                        const Connection::Factory *a_cfactory,
-                        const Transport::Factory *a_tfactory)
-       : ThreadPool::WorkDescription(0),
-         cFactory(a_cfactory),
-         tFactory(a_tfactory)
-{
-       memset(&saddr, 0, sizeof(saddr));
-       saddr.sun_family = AF_UNIX;
-       strcpy(saddr.sun_path, path);
-       fd = socket(PF_UNIX, SOCK_STREAM, 0);
-       if(fd < 0) throw new Exception;
-       if(connect(fd, (struct sockaddr*)&saddr, sizeof(saddr.sun_path)) < 0) {
-               if(errno == ECONNREFUSED) {
-                       unlink(saddr.sun_path);
-               }
-       } else {
-               // another instance running
-               // throw new Exception
-       }
-       if(bind(fd, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) 
-               throw new Exception;
-       if(listen(fd, SOCK_QUEUE_MAX) < 0)
-               throw new Exception;
-}
-
-
-// remove the socket
-SocketInput::~SocketInput()
-{
-       if(fd >= 0)
-               close(fd);
-       unlink(saddr.sun_path);
-}
-
-
-void
-SocketInput::onReady()
-{
-       Connection *conn = cFactory->accept(fd);
-       Transport  *trans = tFactory->newTransport();
-       InputChannel *channel = new InputChannel(conn, trans);
-       channel->start();
-}
-
-
-void
-SocketInput::onTimeout()
-{
-       // nothing special, just sit around
-}
-
-
-void
-SocketInput::onError()
-{
-       // should report an error?
-}
diff --git a/org.glite.lb.logger/src-nt/ThreadPool.H b/org.glite.lb.logger/src-nt/ThreadPool.H
deleted file mode 100644 (file)
index 1a3b43c..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-#ifndef _THREAD_POOL_H
-#define _THREAD_POOL_H
-
-#include <pthread.h>
-#include <poll.h>
-#include <time.h>
-
-#include <list>
-
-#include "Singleton.H"
-
-class ThreadPool : public Singleton<ThreadPool> {
-       friend class Singleton<ThreadPool>;
-public:
-       const static int default_timeout = 5;
-
-       class WorkDescription {
-               friend class ThreadPool;
-       public:
-               int fd;
-               
-               WorkDescription(int afd) 
-                       : fd(afd), event(NONE) {}
-
-
-               virtual ~WorkDescription();
-
-       protected:
-               enum Event { NONE, READY, TIMEOUT, ERROR } event;
-               void doWork();
-
-               virtual void onReady() 
-                       {}
-
-               virtual void onTimeout() 
-                       {}
-
-               virtual void onError() 
-                       {}
-       };
-
-public:
-       void startWorkers(unsigned int n);
-       void stopWorkers();
-
-       void postWork(WorkDescription *work_unit);
-
-       void queueWorkAccept(WorkDescription *work_unit);
-       void queueWorkRead(WorkDescription *work_unit);
-       void queueWorkWrite(WorkDescription *work_unit);
-       void queueWorkTimeout(WorkDescription *work_unit);
-       void queueWorkConnect(WorkDescription *work_unit);
-
-       void setWorkAccept(WorkDescription *work_unit);
-       void setWorkRead(WorkDescription *work_unit);
-       void setWorkWrite(WorkDescription *work_unit);
-       void setWorkTimeout(WorkDescription *work_unit);
-
-       void run();
-       void exit() 
-               { f_exit = true; pthread_cond_signal(&wait_queue_cond_ready); }
-
-protected:
-       ThreadPool();
-       ~ThreadPool();
-
-       WorkDescription *getWork();
-
-private:
-       class WaitDesc {
-       public:
-               WorkDescription *wd;
-               short event;
-               bool f_permanent;
-               struct timeval timeout;
-
-               WaitDesc(WorkDescription *w, short e, 
-                        bool permanent = false, int t = default_timeout) 
-                       : wd(w), event(e), f_permanent(permanent) {
-                       timeout.tv_sec = t;
-                       timeout.tv_usec = 0;
-               }
-               
-               int get_fd() { return wd->fd; };
-               void adjustTimeout(const struct timeval &delta);
-               int timeoutExpired() { return((timeout.tv_sec < 0) ||
-                                             (timeout.tv_sec == 0 && timeout.tv_usec == 0)); }
-       };
-
-private:
-       bool f_exit;
-       int num_workers;
-       pthread_t *workers;
-       int work_count;
-       int wait_count;
-       int ufds_size;
-       std::list<WorkDescription *> work_queue;
-       std::list<WaitDesc *> wait_queue;
-       pthread_mutex_t work_queue_mutex;
-       pthread_cond_t work_queue_cond_ready;
-       pthread_cond_t work_queue_cond_full;
-       pthread_mutex_t wait_queue_mutex;
-       pthread_cond_t wait_queue_cond_ready;
-       struct pollfd *ufds;
-       int pd[2];
-       struct timeval min_timeout;
-
-       void prepareDescriptorArray();
-       void removeWaitDesc(std::list<WaitDesc *>::iterator &i);
-       void removeWorkDesc();
-       void queueWork(WaitDesc *);
-
-       static void *threadMain(void *);
-       static void threadCleanup(void *);
-};
-
-#endif
diff --git a/org.glite.lb.logger/src-nt/ThreadPool.cpp b/org.glite.lb.logger/src-nt/ThreadPool.cpp
deleted file mode 100644 (file)
index be4045c..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-#include <time.h>
-#include <pthread.h>
-#include <poll.h>
-#include <sys/time.h>
-#include <time.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#include <iostream>
-
-#include "ThreadPool.H"
-#include "Exception.H"
-
-
-static inline
-void
-tv_sub(struct timeval &a, const struct timeval &b) {
-        a.tv_usec -= b.tv_usec;                
-        a.tv_sec -= b.tv_sec;
-        if (a.tv_usec < 0) {
-                a.tv_sec--;
-                a.tv_usec += 1000000;
-        }
-}
-
-
-static inline
-int 
-tv_cmp(const struct timeval &a, const struct timeval &b) {
-       if(a.tv_sec < b.tv_sec) {
-               return -1;
-       } else  if(a.tv_sec > b.tv_sec) {
-               return 1;
-       } else {
-               if (a.tv_usec < b.tv_usec) {
-                       return -1;
-               } else if(a.tv_usec > b.tv_usec) {
-                       return 1;
-               } else {
-                       return 0;
-               }
-       } 
-}
-
-
-inline
-void 
-ThreadPool::WorkDescription::doWork() {
-       switch(event) {
-       case READY:
-               onReady();
-               break;
-       case TIMEOUT:
-               onTimeout();
-               break;
-       case ERROR:
-               onError();
-               break;
-       default:
-               break;
-       }
-}
-
-
-inline
-void
-ThreadPool::WaitDesc::adjustTimeout(const struct timeval &delta)
-{
-       tv_sub(timeout, delta);
-}
-
-
-ThreadPool::WorkDescription::~WorkDescription() {
-}
-
-
-ThreadPool::ThreadPool() 
-       : f_exit(false), work_count(0), wait_count(0), ufds_size(0), ufds(NULL) 
-{
-       pthread_mutex_init(&wait_queue_mutex, NULL);
-       pthread_mutex_init(&work_queue_mutex, NULL);
-       pthread_cond_init(&work_queue_cond_ready, NULL);
-       pthread_cond_init(&work_queue_cond_full, NULL);
-       pthread_cond_init(&wait_queue_cond_ready, NULL);
-       pipe(pd);
-       ufds = static_cast<struct pollfd *>(malloc(sizeof(struct pollfd)));
-       if(ufds == NULL) {
-               throw new Exception;
-       }
-       ufds->fd = pd[0];
-       ufds->events = POLLIN;
-       ufds_size = 1;
-}
-
-
-ThreadPool::~ThreadPool()
-{
-       pthread_cond_destroy(&work_queue_cond_full);
-       pthread_cond_destroy(&work_queue_cond_ready);
-       pthread_cond_destroy(&wait_queue_cond_ready);
-       pthread_mutex_destroy(&work_queue_mutex);
-       pthread_mutex_destroy(&wait_queue_mutex);
-}
-
-
-void
-ThreadPool::startWorkers(unsigned int n) 
-{
-       workers = new pthread_t[n];
-
-       num_workers = n;
-       for(unsigned int i = 0; i < n; i++) {
-               // XXX check return 
-               pthread_create(&workers[i], NULL, ThreadPool::threadMain, NULL);
-       }
-}
-
-
-void 
-ThreadPool::stopWorkers()
-{
-       for(int i = 0; i < num_workers; i++) {
-               pthread_cancel(workers[i]);
-               pthread_join(workers[i], NULL);
-       }
-       delete[] workers;
-}
-
-
-void 
-ThreadPool::postWork(WorkDescription *work_unit)
-{
-       E_ASSERT(pthread_mutex_lock(&work_queue_mutex) >= 0);
-       work_queue.push_back(work_unit);
-       work_count++;
-       E_ASSERT(pthread_cond_signal(&work_queue_cond_ready) >= 0);
-       E_ASSERT(pthread_mutex_unlock(&work_queue_mutex) >= 0);
-}
-
-
-inline
-void 
-ThreadPool::queueWork(WaitDesc *wd)
-{
-       E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
-       wait_queue.push_back(wd);
-       wait_count++;
-       E_ASSERT(pthread_cond_signal(&wait_queue_cond_ready) >= 0);
-       E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
-       if(write(pd[1], "1", 1) != 1) {
-               throw new Exception;
-       }
-}
-
-
-void 
-ThreadPool::queueWorkAccept(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, POLLIN));
-}
-       
-
-void 
-ThreadPool::queueWorkRead(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, POLLIN));
-}
-
-
-void
-ThreadPool::queueWorkWrite(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, POLLOUT));
-}
-       
-
-void 
-ThreadPool::queueWorkTimeout(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, 0));
-}
-
-
-void 
-ThreadPool::queueWorkConnect(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, POLLIN));
-}
-
-
-void 
-ThreadPool::setWorkAccept(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, POLLIN, true));
-}
-       
-
-void 
-ThreadPool::setWorkRead(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, POLLIN, true));
-}
-
-
-void
-ThreadPool::setWorkWrite(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, POLLOUT, true));
-}
-       
-
-void 
-ThreadPool::setWorkTimeout(WorkDescription *work_unit) 
-{
-       queueWork(new WaitDesc(work_unit, 0, true));
-}
-
-
-ThreadPool::WorkDescription *
-ThreadPool::getWork()
-{
-       WorkDescription *work_unit = NULL;
-       struct timespec timeout;
-
-       E_ASSERT(pthread_mutex_lock(&work_queue_mutex) >= 0);
-       if(work_count == 0) {
-               timeout.tv_sec = 1;
-               timeout.tv_nsec = 0;
-//             pthread_cond_timedwait(&work_queue_cond_ready, &work_queue_mutex, &timeout);
-               E_ASSERT(pthread_cond_wait(&work_queue_cond_ready, &work_queue_mutex) == 0);
-       }
-       if(work_count > 0) {
-               work_count--;
-               work_unit = work_queue.front();
-               work_queue.pop_front();
-       }
-       E_ASSERT(pthread_mutex_unlock(&work_queue_mutex) >= 0);
-       return work_unit;
-}
-
-void
-ThreadPool::threadCleanup(void *data)
-{
-       ThreadPool *pool = ThreadPool::instance();
-
-       E_ASSERT(pthread_mutex_unlock(&(pool->work_queue_mutex)) >= 0);
-}
-
-
-void *
-ThreadPool::threadMain(void *data)
-{
-       ThreadPool *pool  = ThreadPool::instance();
-       WorkDescription *work_unit;
-
-       pthread_cleanup_push(ThreadPool::threadCleanup, NULL); 
-       while(true) {
-
-               work_unit = pool->getWork();
-               if(work_unit) {
-                       // something to work on
-                       work_unit->doWork();
-               } else {
-                       // timed out waiting for work
-               }
-       }
-       pthread_cleanup_pop(1);
-}
-
-
-void 
-ThreadPool::removeWaitDesc(std::list<WaitDesc *>::iterator &i)
-{
-       std::list<WaitDesc *>::iterator j = i;
-       
-       // actually this is safe even for the first element
-       E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
-       j--;
-       wait_queue.erase(i);
-       wait_count--;
-       i = j;
-       E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
-}
-
-
-void
-ThreadPool::prepareDescriptorArray()
-{
-       std::list<WaitDesc *>::iterator theIterator;
-       struct pollfd *p;
-
-       E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
-       if(wait_count == 0) {
-               E_ASSERT(pthread_cond_wait(&wait_queue_cond_ready, &wait_queue_mutex) != 0);
-       }
-       if(wait_count == 0) {
-               E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
-               return;
-       }
-       if(ufds_size != wait_count + 1) {
-               ufds = static_cast<struct pollfd *>(realloc(ufds, (1 + wait_count) * sizeof(struct pollfd)));
-               if(ufds == NULL) {
-                       throw new Exception();
-               }
-               ufds_size = wait_count + 1;
-       }
-       min_timeout.tv_sec = default_timeout;
-       min_timeout.tv_usec = 0;
-       for(theIterator = wait_queue.begin(), p = ufds + 1;
-           theIterator != wait_queue.end(); 
-           theIterator++, p++) {
-               WaitDesc *w = *theIterator;
-               p->fd = w->get_fd();
-               p->events = w->event;
-               if(tv_cmp(min_timeout, w->timeout) > 0) {
-                       min_timeout = w->timeout;
-               }
-       }
-       E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
-}
-
-
-void
-ThreadPool::run()
-{
-       f_exit = false;
-       while(!f_exit) {
-               struct pollfd *p;
-               struct timeval before, after;
-               int ret;
-
-               // may block waiting for new work
-               prepareDescriptorArray();
-
-               gettimeofday(&before, NULL);
-               ret = poll(ufds, ufds_size, 1000*min_timeout.tv_sec + min_timeout.tv_usec/1000);
-               gettimeofday(&after, NULL);
-               tv_sub(after, before);
-
-               if((ret >= 0) || // ready or timeout
-                  ((ret < 0) && (errno == EINTR))) { // interrupted 
-                       std::list<WaitDesc *>::iterator i;
-                       WaitDesc *w;
-
-                       // handle the pipe
-                       if(ufds->revents & POLLIN) {
-                               char discard[1];
-                               read(ufds->fd, discard, 1);
-                       }
-
-                       // at least we have to adjust timeouts
-                       E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
-                       i = wait_queue.begin();
-                       E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
-                       // the wait queue mutex is unlocked inside the loop
-                       // to allow handlers to add queue new
-                       // WorkDescriptions - these are added at the
-                       // end of the list so we should be safe 
-                       for(p = ufds + 1; p - ufds < ufds_size; p++) {
-                               enum WorkDescription::Event event = WorkDescription::NONE;
-                               
-                               w = *i;
-                               // check for consistency
-                               if(p->fd != w->get_fd()) {
-                                       // mismatch, what shall we do?
-                                       throw new Exception;
-                               }
-
-                               // subtract the time passed from timeout
-                               w->adjustTimeout(after);
-
-                               // see what happened
-                               if(ret <= 0) {
-                                       // timeout or interrupted
-                                       if(w->timeoutExpired()) {
-                                               event = WorkDescription::TIMEOUT;
-                                       }
-                               } else {
-                                       // ready or error
-                                       if(p->revents & POLLERR) {
-                                               event = WorkDescription::ERROR;
-                                       } else if(p->revents & w->event) {
-                                               event = WorkDescription::READY;
-                                       } else if(w->timeoutExpired()) {
-                                               event = WorkDescription::TIMEOUT;
-                                       }
-                               }
-                               if(event != WorkDescription::NONE) {
-                                       WorkDescription *wd;
-                                       wd = w->wd;
-                                       wd->event = event;
-                                       if(!w->f_permanent) {
-                                               postWork(wd);
-                                               removeWaitDesc(i);
-                                               delete w;
-                                       } else {
-                                               w->wd->doWork();
-                                               // we have to reset the timeout
-                                               w->timeout.tv_sec = default_timeout;
-                                               w->timeout.tv_usec = 0;
-                                       }
-                               }
-                               E_ASSERT(pthread_mutex_lock(&wait_queue_mutex) >= 0);
-                               i++;
-                               E_ASSERT(pthread_mutex_unlock(&wait_queue_mutex) >= 0);
-                       }
-               } else {
-                       // some nasty error
-                       throw new Exception;
-               }
-       }
-}
-
diff --git a/org.glite.lb.logger/src-nt/Transport.H b/org.glite.lb.logger/src-nt/Transport.H
deleted file mode 100644 (file)
index 1b6516d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef _TRANSPORT_H
-#define _TRANSPORT_H
-
-#include "Connection.H"
-#include "Message.H"
-
-// Transport implements transport protocol 
-//  - reads/writes messages using Connection interface
-//  - 
-class Transport {
-public:
-
-       // 
-       class Factory {
-       public:
-               virtual Transport *newTransport() const = 0;
-
-               virtual ~Factory() 
-                       {}
-       };
-
-       //
-       Transport() 
-               {}
-
-       virtual ~Transport();
-
-       // 
-       virtual int receive(Connection *conn, Message* &msg) = 0;
-       virtual int send(Connection *conn, Message* msg) = 0;
-       virtual void reset() = 0;
-};
-#endif
diff --git a/org.glite.lb.logger/src-nt/Transport.cpp b/org.glite.lb.logger/src-nt/Transport.cpp
deleted file mode 100644 (file)
index 2544997..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "Transport.H"
-
-Transport::~Transport()
-{
-}
diff --git a/org.glite.lb.logger/src-nt/main.cpp b/org.glite.lb.logger/src-nt/main.cpp
deleted file mode 100644 (file)
index b2fed11..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "PluginManager.H"
-#include "ThreadPool.H"
-#include "SocketInput.H"
-#include "PlainConnection.H"
-#include "HTTPTransport.H"
-#include "EventManager.H"
-
-const int num_threads = 2;
-const char *sock_path = "/tmp/il_sock";
-
-EventManager theEventManager();
-
-int main(int argc, char *argv[])
-{
-       SocketInput *input;
-       
-       // initialize plugins
-       PluginManager::instance()->initialize();
-
-       // create unix socket with plain IO and HTTP transport
-       input = new SocketInput(sock_path, 
-                               PlainConnection::Factory::instance(), 
-                               HTTPTransport::Factory::instance());
-       // and add the socket to pool
-       ThreadPool::instance()->setWorkAccept(input);
-
-       // start worker threads
-       ThreadPool::instance()->startWorkers(num_threads);
-
-       // run the main loop
-       ThreadPool::instance()->run();
-
-       // cleanup & exit
-       delete input;
-       PluginManager::instance()->cleanup();
-
-       return 0;
-}
diff --git a/org.glite.lb.logger/src-nt/test/EventManagerTest.cpp b/org.glite.lb.logger/src-nt/test/EventManagerTest.cpp
deleted file mode 100644 (file)
index 2d55586..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "EventManager.H"
-
-class EventA : public Event {
-};
-
-class EventB : public Event {
-};
-
-class EventAA : public EventA {
-};
-
-
-class EventManagerTest: public CppUnit::TestFixture {
-       CPPUNIT_TEST_SUITE(EventManagerTest);
-       CPPUNIT_TEST(handleEventTest);
-       CPPUNIT_TEST_SUITE_END();
-public:
-       
-       void setUp() {
-               handled = false;
-               manager.registerHandler(this);
-       }
-
-       void tearDown() {
-       }
-
-       void handleEventTest() {
-               Event *e = new EventAA();
-               manager.postEvent(e);
-               CPPUNIT_ASSERT(handled);
-       }
-
-       int handleEvent(EventA* &e) {
-               handled = true;
-               return 0;
-       }
-
-private:
-       EventManager manager;
-       bool handled;
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION( EventManagerTest );
diff --git a/org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp b/org.glite.lb.logger/src-nt/test/PluginManagerTest.cpp
deleted file mode 100644 (file)
index 629bbcb..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "PluginManager.H"
-
-class TestPlugin : public PluginManager::Plugin {
-public:
-       bool inited, cleaned;
-
-       virtual bool initialize() {
-               inited = true;
-       }
-
-       virtual bool cleanup() {
-               cleaned = true;
-       }
-
-       static TestPlugin theTestPlugin;
-
-private:
-       TestPlugin() : PluginManager::Plugin("test plugin"),
-                      inited(false),
-                      cleaned(false) 
-               {}
-
-
-
-};
-
-
-class PluginManagerTest : public CppUnit::TestFixture 
-{
-       CPPUNIT_TEST_SUITE(PluginManagerTest);
-       CPPUNIT_TEST(testInit);
-       CPPUNIT_TEST(testClean);
-       CPPUNIT_TEST_SUITE_END();
-       
-public:
-       void setUp() {
-       }
-
-       void tearDown() {
-       }
-
-       void testInit() {
-               PluginManager::instance()->initialize();
-               CPPUNIT_ASSERT(TestPlugin::theTestPlugin.inited);
-       }
-       
-       void testClean() {
-               PluginManager::instance()->cleanup();
-               CPPUNIT_ASSERT(TestPlugin::theTestPlugin.cleaned);
-       }
-};
-
-
-TestPlugin TestPlugin::theTestPlugin;
-
-CPPUNIT_TEST_SUITE_REGISTRATION( PluginManagerTest );
diff --git a/org.glite.lb.logger/src-nt/test/SingletonTest.cpp b/org.glite.lb.logger/src-nt/test/SingletonTest.cpp
deleted file mode 100644 (file)
index 734db17..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <cppunit/extensions/HelperMacros.h>
-
-#include "Singleton.H"
-
-class one : public Singleton<one> {
-       friend class Singleton<one>;
-};
-
-class two : public Singleton<two> {
-       friend class Singleton<two>;
-};
-
-class SingletonTest: public CppUnit::TestFixture {
-       CPPUNIT_TEST_SUITE(SingletonTest);
-       CPPUNIT_TEST(getInstance);
-       CPPUNIT_TEST(pair);
-       CPPUNIT_TEST(noCreate);
-       CPPUNIT_TEST_SUITE_END();
-public:
-       
-       void setUp() {
-       }
-
-       void tearDown() {
-       }
-
-       void getInstance() {
-               one *p;
-               one *q;
-
-               p = one::instance();
-               q = one::instance();
-               CPPUNIT_ASSERT(p != NULL);
-               CPPUNIT_ASSERT(q != NULL);
-               CPPUNIT_ASSERT(p == q);
-       }
-
-       void pair() {
-               one *p;
-               two *q;
-
-               p = one::instance();
-               q = two::instance();
-               CPPUNIT_ASSERT(p != NULL);
-               CPPUNIT_ASSERT(q != NULL);
-               CPPUNIT_ASSERT((void*)p != (void*)q);
-       }
-
-       void noCreate() {
-               one *p = new one;
-
-       }
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION( SingletonTest );
diff --git a/org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp b/org.glite.lb.logger/src-nt/test/ThreadPoolTest.cpp
deleted file mode 100644 (file)
index 4a205ec..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-#include <cppunit/extensions/HelperMacros.h>
-#include <unistd.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
-
-#include <iostream>
-
-#include "ThreadPool.H"
-
-class TestWork : public ThreadPool::WorkDescription {
-public:
-       int done;
-       
-       TestWork(int fd) : ThreadPool::WorkDescription(fd), done(0) {};
-
-       virtual void onReady() {
-               done++;
-       }
-       
-};
-
-
-class TestConsumer : public ThreadPool::WorkDescription {
-public:
-       char buf[2];
-
-       TestConsumer(int fd) : ThreadPool::WorkDescription(fd) {};
-
-       virtual void onReady() {
-               int r;
-               
-               r = read(fd, buf, 1);
-               buf[1] = 0;
-               ThreadPool::instance()->exit();
-       }
-
-       virtual void onTimeout() {
-       }
-
-};
-
-
-class TestProducer : public ThreadPool::WorkDescription {
-public:
-       TestProducer(int fd) : ThreadPool::WorkDescription(fd) {};
-
-       virtual void onReady() {
-               write(fd, "a", 1);
-       }
-       
-       virtual void onTimeout() {
-       }
-
-};
-
-
-class TestSocketRead: public ThreadPool::WorkDescription {
-public:
-       char buffer[10];
-
-       TestSocketRead(int fd) : ThreadPool::WorkDescription(fd) {
-       }
-
-       virtual void onReady() {
-               
-               int len = recv(fd, buffer, sizeof(buffer), MSG_NOSIGNAL);
-               ThreadPool::instance()->exit();
-       }
-
-       virtual void onError() {
-       }
-};
-
-
-class TestSocketWrite: public ThreadPool::WorkDescription {
-public:
-       static char buffer[];
-
-       TestSocketWrite(const char *name) 
-               : ThreadPool::WorkDescription(0) {
-               struct sockaddr_un saddr;
-               int ret;
-               fd = socket(PF_UNIX, SOCK_STREAM, 0);
-               memset(&saddr, 0, sizeof(saddr));
-               saddr.sun_family = AF_UNIX;
-               strcpy(saddr.sun_path, name);
-               if((ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr))) < 0) {
-               }
-       }
-
-       virtual void onReady() {
-               int ret;
-
-               ret = send(fd, buffer, strlen(buffer)+1, MSG_NOSIGNAL);
-               close(fd);
-       }
-
-};
-
-char TestSocketWrite::buffer[] = "ahoj";
-
-class TestSocketAccept : public ThreadPool::WorkDescription {
-public:
-       TestSocketRead *reader;
-
-       TestSocketAccept(const char *name) 
-               : ThreadPool::WorkDescription(0) {
-               struct sockaddr_un saddr;
-
-               fd = socket(PF_UNIX, SOCK_STREAM, 0);
-               memset(&saddr, 0, sizeof(saddr));
-               saddr.sun_family = AF_UNIX;
-               strcpy(saddr.sun_path, name);
-               bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
-               listen(fd, 1);
-       }
-
-       virtual void onReady() {
-               int nfd;
-
-               nfd = accept(fd, NULL, NULL);
-               if(nfd < 0) { 
-               } else {
-                       ThreadPool *pool = ThreadPool::instance();
-
-                       reader  = new TestSocketRead(nfd);
-                       pool->queueWorkRead(reader);
-               }
-       }
-};
-
-
-class ThreadPoolTest: public CppUnit::TestFixture
-{
-       CPPUNIT_TEST_SUITE( ThreadPoolTest );
-       CPPUNIT_TEST( testWorkQueue );
-       CPPUNIT_TEST( testPoll );
-       CPPUNIT_TEST( testAccept );
-       CPPUNIT_TEST_SUITE_END();
-
-public:
-       void setUp() {
-               pool = ThreadPool::instance();
-               unlink("/tmp/smazat.sock");
-               pool->startWorkers(2);
-       }
-
-       void tearDown() {
-               pool->stopWorkers();
-       }
-
-       void testWorkQueue() {
-               TestWork *work_unit = new TestWork(0);
-               pool->postWork(work_unit);
-       }
-
-       void testPoll() {
-               int fd[2];
-               TestProducer *p = new TestProducer(0);
-               TestConsumer *c = new TestConsumer(0);
-
-               pipe(fd);
-               c->fd = fd[0];
-               p->fd = fd[1];
-               pool->queueWorkRead(c);
-               pool->queueWorkWrite(p);
-               pool->run();
-               CPPUNIT_ASSERT(c->buf[0] == 'a');
-               CPPUNIT_ASSERT(c->buf[1] == 0);
-       }
-
-       void testAccept() {
-               TestSocketAccept *consumer = new TestSocketAccept("/tmp/smazat.sock");
-               TestSocketWrite *producer;
-
-               pool->queueWorkAccept(consumer);
-               producer = new TestSocketWrite("/tmp/smazat.sock");
-               ThreadPool::instance()->queueWorkWrite(producer);
-               pool->run();
-               CPPUNIT_ASSERT(consumer->reader != NULL);
-               CPPUNIT_ASSERT(strcmp(consumer->reader->buffer, TestSocketWrite::buffer) == 0);
-       }
-
-private:
-       ThreadPool *pool;
-};
-
-
-CPPUNIT_TEST_SUITE_REGISTRATION( ThreadPoolTest );
diff --git a/org.glite.lb.logger/src-nt/test/test_main.cpp b/org.glite.lb.logger/src-nt/test/test_main.cpp
deleted file mode 100644 (file)
index 1ae6d6a..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#include <assert.h>
-#include <fstream>
-
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/CompilerOutputter.h>
-//#include <cppunit/XmlOutputter.h>
-#include <cppunit/TestRunner.h>
-#include <cppunit/TestResult.h>
-#include <cppunit/TestResultCollector.h>
-
-int main (int argc,const char *argv[])
-{
-        CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-
-//        assert(argc == 2);
-//        std::ofstream   xml(argv[1]);
-
-        CppUnit::TestResult controller;
-        CppUnit::TestResultCollector result;
-        controller.addListener( &result );
-
-        CppUnit::TestRunner runner;
-        runner.addTest(suite);
-        runner.run(controller);
-
-//        CppUnit::XmlOutputter xout( &result, xml );
-        CppUnit::CompilerOutputter tout( &result, std::cout);
-//        xout.write();
-        tout.write();
-
-        return result.wasSuccessful() ? 0 : 1 ;
-}
diff --git a/org.glite.lb.logger/src/event_queue.c b/org.glite.lb.logger/src/event_queue.c
deleted file mode 100644 (file)
index 9ce47f6..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-#ident "$Header$"
-
-/* 
- *   - general queue handling routines (insert, get)
- */
-
-#include <netdb.h>
-#include <sys/socket.h>
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "glite/jobid/cjobid.h"
-
-#include "interlogd.h"
-
-struct event_queue_msg {
-  struct server_msg *msg;
-  struct event_queue_msg *prev;
-};
-
-struct event_queue *
-event_queue_create(char *server_name)
-{
-  struct event_queue *eq;
-  char *p;
-
-  p = strchr(server_name, ':');
-  
-  if(p) 
-    *p++ = 0;
-
-  if((eq = malloc(sizeof(*eq))) == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "event_queue_create: error allocating event queue");
-    return(NULL);
-  }
-
-  memset(eq, 0, sizeof(*eq));
-
-  eq->dest_name = strdup(server_name);
-
-  if(p)
-    *(p-1) = ':';
-  
-#if defined(IL_NOTIFICATIONS) || defined(IL_WS)
-  eq->dest_port = atoi(p);
-#else
-  eq->dest_port = p ? atoi(p)+1 : GLITE_JOBID_DEFAULT_PORT+1;
-#endif
-  /* create all necessary locks */
-  if(pthread_rwlock_init(&eq->update_lock, NULL)) {
-    set_error(IL_SYS, errno, "event_queue_create: error creating update lock");
-    free(eq);
-    return(NULL);
-  }
-  if(pthread_mutex_init(&eq->cond_lock, NULL)) {
-    set_error(IL_SYS, errno, "event_queue_create: error creating cond mutex");
-    free(eq);
-    return(NULL);
-  }
-  if(pthread_cond_init(&eq->ready_cond, NULL)) {
-    set_error(IL_SYS, errno, "event_queue_create: error creating cond variable");
-    free(eq);
-    return(NULL);
-  }
-
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-  if(pthread_cond_init(&eq->flush_cond, NULL)) {
-    set_error(IL_SYS, errno, "event_queue_create: error creating cond variable");
-    free(eq);
-    return(NULL);
-  }
-#endif
-
-  return(eq);
-}
-
-
-int
-event_queue_free(struct event_queue *eq)
-{
-  assert(eq != NULL);
-
-  if(!event_queue_empty(eq))
-    return(-1);
-
-  if(eq->thread_id)
-    pthread_cancel(eq->thread_id);
-
-
-  pthread_rwlock_destroy(&eq->update_lock);
-  pthread_mutex_destroy(&eq->cond_lock);
-  pthread_cond_destroy(&eq->ready_cond);
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-  pthread_cond_destroy(&eq->flush_cond);
-#endif
-  free(eq);
-
-  return(0);
-}
-
-
-int
-event_queue_empty(struct event_queue *eq)
-{
-  int ret;
-
-  assert(eq != NULL);
-
-  event_queue_lock_ro(eq);
-  ret = (eq->head == NULL);
-  event_queue_unlock(eq);
-
-  return(ret);
-}
-
-
-int
-event_queue_insert(struct event_queue *eq, struct server_msg *msg)
-{
-  struct event_queue_msg *el;
-#if defined(INTERLOGD_EMS)
-  struct event_queue_msg *tail;
-#endif
-  
-  assert(eq != NULL);
-
-  if((el = malloc(sizeof(*el))) == NULL) 
-    return(set_error(IL_NOMEM, ENOMEM, "event_queue_insert: not enough room for queue element"));
-
-  el->msg = server_msg_copy(msg);
-  if(el->msg == NULL) {
-    free(el);
-    return(-1);
-  };
-
-  /* this is critical section */
-  event_queue_lock(eq);
-#if defined(INTERLOGD_EMS)
-  if(server_msg_is_priority(msg)) {
-    /* priority messages go first */
-    tail = eq->tail_ems;
-    if(tail) {
-      el->prev = tail->prev;
-      tail->prev = el;
-      if (tail == eq->tail)
-       eq->tail = el;
-    } else {
-      el->prev = eq->head;
-      eq->head = el;
-      if(eq->tail == NULL)
-       eq->tail = el;
-    }
-    eq->tail_ems = el;
-  } else 
-#endif
-  { 
-    /* normal messages */
-    if(eq->tail)
-      eq->tail->prev = el;
-    else
-      eq->head = el;
-    eq->tail = el;
-    el->prev = NULL;
-  }
-#if defined(INTERLOGD_EMS)
-  /* if we are inserting message between mark_prev and mark_this,
-     we have to adjust mark_prev accordingly */
-  if(eq->mark_this && (el->prev == eq->mark_this)) 
-    eq->mark_prev = el;
-#endif
-
-  if(++eq->cur_len > eq->max_len)
-         eq->max_len = eq->cur_len;
-
-  event_queue_unlock(eq);
-  /* end of critical section */
-
-  return(0);
-}
-
-
-int
-event_queue_get(struct event_queue *eq, struct server_msg **msg)
-{
-  struct event_queue_msg *el;
-
-  assert(eq != NULL);
-  assert(msg != NULL);
-  
-  event_queue_lock(eq);
-  el = eq->head;
-#if defined(INTERLOGD_EMS)
-  /* this message is marked for removal, it is first on the queue */
-  eq->mark_this = el;
-  eq->mark_prev = NULL;
-#endif
-  event_queue_unlock(eq);
-
-  if(el == NULL)
-    return(-1);
-
-  *msg = el->msg;
-
-  return(0);
-}
-
-
-int 
-event_queue_remove(struct event_queue *eq)
-{
-  struct event_queue_msg *el;
-#if defined(INTERLOGD_EMS)
-  struct event_queue_msg *prev;
-#endif
-
-  assert(eq != NULL);
-
-  /* this is critical section */
-  event_queue_lock(eq);
-#if defined(INTERLOGD_EMS)
-  el = eq->mark_this;
-  prev = eq->mark_prev;
-
-  if(el == NULL) {
-    event_queue_unlock(eq);
-    return(-1);
-  }
-
-  if(prev == NULL) {
-    /* removing from head of the queue */
-    eq->head = el->prev;
-  } else {
-    /* removing from middle of the queue */
-    prev->prev = el->prev;
-  }
-  if(el == eq->tail) {
-    /* we are removing the last message */
-    eq->tail = prev;
-  }
-  if(el == eq->tail_ems) {
-    /* we are removing last priority message */
-    eq->tail_ems = prev;
-  }
-
-  eq->mark_this = NULL;
-  eq->mark_prev = NULL;
-#else
-  el = eq->head;
-  if(el == NULL) {
-         event_queue_unlock(eq);
-         return(-1);
-  }
-  eq->head = el->prev;
-  if(el == eq->tail) {
-         eq->tail = NULL;
-  }
-#endif
-  if(--eq->cur_len == 0) 
-         eq->times_empty++;
-
-  event_queue_unlock(eq);
-  /* end of critical section */
-    
-  server_msg_free(el->msg);
-  free(el);
-
-  return(0);
-}
-
-int
-event_queue_move_events(struct event_queue *eq_s, 
-                       struct event_queue *eq_d, 
-                       int (*cmp_func)(struct server_msg *, void *), 
-                       void *data)
-{
-       struct event_queue_msg *p, **source_prev, **dest_tail;
-
-       assert(eq_s != NULL);
-
-       event_queue_lock(eq_s);
-       if(eq_d) {
-               event_queue_lock(eq_d);
-               /* dest tail is set to point to the last (NULL) pointer in the list */
-               dest_tail = (eq_d->head == NULL) ? &(eq_d->head) : &(eq_d->tail->prev);
-       }
-       source_prev = &(eq_s->head);
-       p = *source_prev;
-       eq_s->tail = NULL;
-       while(p) {
-         if((*cmp_func)(p->msg, data)) {
-                       il_log(LOG_DEBUG, "  moving event at offset %d(%d) from %s:%d to %s:%d\n",
-                              p->msg->offset, p->msg->generation, eq_s->dest_name, eq_s->dest_port, 
-                              eq_d ? eq_d->dest_name : "trash", eq_d ? eq_d->dest_port : -1);
-                       /* il_log(LOG_DEBUG, "  current: %x, next: %x\n", p, p->prev); */
-                       /* remove the message from the source list */
-                       *source_prev = p->prev;
-                       if(eq_d) {
-                               /* append the message at the end of destination list */
-                               p->prev = NULL;
-                               *dest_tail = p;
-                               dest_tail = &(p->prev);
-                               eq_d->tail = p;
-                       } else {
-                               /* signal that the message was 'delivered' */
-                               event_store_commit(p->msg->es, p->msg->ev_len, queue_list_is_log(eq_s),
-                                                  p->msg->generation);
-                               /* free the message */
-                               server_msg_free(p->msg);
-                               free(p);
-                       }
-               } else {
-                       /* message stays */
-                       source_prev = &(p->prev);
-                       eq_s->tail = p;
-               }
-               p = *source_prev;
-       }
-       if(eq_d) event_queue_unlock(eq_d);
-       event_queue_unlock(eq_s);
-       return(0);
-}
-
diff --git a/org.glite.lb.logger/src/event_store.c b/org.glite.lb.logger/src/event_store.c
deleted file mode 100644 (file)
index e584e89..0000000
+++ /dev/null
@@ -1,1532 +0,0 @@
-#ident "$Header$"
-
-#include <assert.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <sys/param.h>
-
-#include "glite/lb/events_parse.h"
-
-#include "interlogd.h"
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-static char *file_prefix = NULL;
-
-
-struct event_store_list {
-       struct event_store *es;
-       struct event_store_list *next;                  // LL of event_store's
-       struct event_store_list *jobid_next;       /* double LL of rotated stores - forward */
-       struct event_store_list *jobid_prev;       /* double LL of rotated stores - backward */
-};
-
-
-static struct event_store_list *store_list;
-static pthread_rwlock_t store_list_lock = PTHREAD_RWLOCK_INITIALIZER;
-
-
-/* ----------------
- * helper functions
- * ----------------
- */
-static
-char *
-astrcat(const char *s1, const char *s2)
-{
-       char *s = malloc(strlen(s1) + strlen(s2) + 1);
-       if(s == NULL)
-               return NULL;
-       *s = 0;
-       strcat(s, s1);
-       strcat(s, s2);
-       return s;
-}
-
-
-static
-char *
-jobid2eventfile(IL_EVENT_ID_T job_id)
-{
-  char *buffer;
-  char *hash;
-
-  if(job_id) {
-    hash = IL_EVENT_GET_UNIQUE(job_id);
-    asprintf(&buffer, "%s.%s", file_prefix, hash);
-    free(hash);
-  } else
-    asprintf(&buffer, "%s.default", file_prefix);
-
-  return(buffer);
-}
-
-
-static
-char *
-jobid2controlfile(IL_EVENT_ID_T job_id)
-{
-  char buffer[256];
-  char *hash;
-
-  if(job_id) {
-    hash = IL_EVENT_GET_UNIQUE(job_id);
-    snprintf(buffer, 256, "%s.%s.ctl", file_prefix, hash);
-    free(hash);
-  } else
-    snprintf(buffer, 256, "%s.default.ctl", file_prefix);
-
-  return(strdup(buffer));
-}
-
-static
-long long
-fname2index(const char *filename)
-{
-       char *p = rindex(filename, '.');
-       char *s;
-       long long       ret;
-
-       if(p == NULL)
-               return 0;
-
-       for(s = p+1; *s != 0; s++) {
-               if(*s < '0' || *s > '9') {
-                       return 0;
-               }
-       }
-
-       sscanf(p+1,"%lld",&ret);
-       return ret+1;
-}
-
-
-static
-char *
-read_event_string(FILE *file)
-{
-  char *buffer, *p, *n;
-  int  len, c;
-
-  buffer=malloc(1024);
-  if(buffer == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "read_event_string: no room for event");
-    return(NULL);
-  }
-  p = buffer;
-  len = 1024;
-
-  while((c=fgetc(file)) != EOF) {
-
-    /* we have to have free room for one byte */
-    /* if(len - (p - buffer) < 1) */
-    if(p - buffer >= len) {
-      n = realloc(buffer, len + 8192);
-      if(n == NULL) {
-       free(buffer);
-       set_error(IL_NOMEM, ENOMEM, "read_event_string: no room for event");
-       return(NULL);
-      }
-      p = p - buffer + n;
-      buffer = n;
-      len += 8192;
-    }
-
-    if(c == EVENT_SEPARATOR) {
-      *p++ = 0;
-      break;
-    } else
-      *p++ = (char) c;
-  }
-
-  if(c != EVENT_SEPARATOR) {
-    free(buffer);
-    return(NULL);
-  }
-
-  return(buffer);
-}
-
-
-
-/* ------------------------------
- * event_store 'member' functions
- * ------------------------------
- */
-static
-int
-event_store_free(struct event_store *es)
-{
-  assert(es != NULL);
-
-  if(es->job_id_s) free(es->job_id_s);
-  if(es->event_file_name) free(es->event_file_name);
-  if(es->control_file_name) free(es->control_file_name);
-  pthread_rwlock_destroy(&es->use_lock);
-  pthread_rwlock_destroy(&es->commit_lock);
-  pthread_rwlock_destroy(&es->offset_lock);
-  free(es);
-
-  return(0);
-}
-
-
-static
-struct event_store *
-event_store_create(char *job_id_s, const char *filename)
-{
-  struct event_store *es;
-  IL_EVENT_ID_T job_id;
-
-  es = malloc(sizeof(*es));
-  if(es == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "event_store_create: error allocating room for structure");
-    return(NULL);
-  }
-
-  memset(es, 0, sizeof(*es));
-
-  job_id = NULL;
-  if(strcmp(job_id_s, "default") && IL_EVENT_ID_PARSE(job_id_s, &job_id)) {
-    set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "event_store_create: error parsing id");
-    free(es);
-    return(NULL);
-  }
-
-  es->job_id_s = strdup(job_id_s);
-  es->event_file_name = filename ? strdup(filename) : jobid2eventfile(job_id);
-  es->control_file_name = filename ? astrcat(filename, ".ctl") : jobid2controlfile(job_id);
-  es->rotate_index = filename ? fname2index(filename) : 0;
-  IL_EVENT_ID_FREE(job_id);
-
-  il_log(LOG_DEBUG, "  creating event store for id %s, filename %s, rotate index %lld\n",
-        job_id_s, es->event_file_name, es->rotate_index);
-
-  if(pthread_rwlock_init(&es->commit_lock, NULL))
-          abort();
-  if(pthread_rwlock_init(&es->offset_lock, NULL))
-          abort();
-  if(pthread_rwlock_init(&es->use_lock, NULL))
-         abort();
-
-  return(es);
-}
-
-
-static
-int
-event_store_lock_ro(struct event_store *es)
-{
-  assert(es != NULL);
-
-  if(pthread_rwlock_rdlock(&es->commit_lock))
-    abort();
-
-  return(0);
-}
-
-
-static
-int
-event_store_lock(struct event_store *es)
-{
-  assert(es != NULL);
-
-  if(pthread_rwlock_wrlock(&es->commit_lock))
-    abort();
-
-  return(0);
-}
-
-
-static
-int
-event_store_unlock(struct event_store *es)
-{
-  assert(es != NULL);
-
-  if(pthread_rwlock_unlock(&es->commit_lock))
-    abort();
-  return(0);
-}
-
-
-static
-int
-event_store_read_ctl(struct event_store *es)
-{
-  FILE *ctl_file;
-
-  assert(es != NULL);
-
-  event_store_lock(es);
-  if((ctl_file = fopen(es->control_file_name, "r")) == NULL) {
-    /* no control file, new event file */
-    es->last_committed_ls = 0;
-    es->last_committed_bs = 0;
-  } else {
-    /* read last seen and last committed counts */
-    fscanf(ctl_file, "%*s\n%ld\n%ld\n",
-          &es->last_committed_ls,
-          &es->last_committed_bs);
-    fclose(ctl_file);
-  }
-  event_store_unlock(es);
-
-  return(0);
-}
-
-
-static
-int
-event_store_write_ctl(struct event_store *es)
-{
-  FILE   *ctl;
-
-  assert(es != NULL);
-
-  ctl = fopen(es->control_file_name, "w");
-  if(ctl == NULL) {
-    set_error(IL_SYS, errno, "event_store_write_ctl: error opening control file");
-    return(-1);
-  }
-
-  if(fprintf(ctl, "%s\n%ld\n%ld\n",
-            es->job_id_s,
-            es->last_committed_ls,
-            es->last_committed_bs) < 0) {
-    set_error(IL_SYS, errno, "event_store_write_ctl: error writing control record");
-    return(-1);
-  }
-
-  if(fclose(ctl) < 0) {
-    set_error(IL_SYS, errno, "event_store_write_ctl: error closing control file");
-    return(-1);
-  }
-
-  return(0);
-}
-
-
-/*
- * event_store_qurantine()
- *   - rename damaged event store file
- *   - essentially does the same actions as cleanup, but the event store
- *     does not have to be empty
- * returns 0 on success, -1 on error
- */
-static
-int
-event_store_quarantine(struct event_store *es)
-{
-       // TODO enable cleanup of quarantined event_store struct
-       // TODO handle file rotation
-
-       int num;
-       char newname[MAXPATHLEN+1];
-
-       /* find available quarantine name */
-       /* we give it at most 1024 tries */
-       for(num = 0; num < 1024; num++) {
-               struct stat st;
-
-               snprintf(newname, MAXPATHLEN, "%s.quarantine.%d", es->event_file_name, num);
-               newname[MAXPATHLEN] = 0;
-               if(stat(newname, &st) < 0) {
-                       if(errno == ENOENT) {
-                               /* file not found */
-                               break;
-                       } else {
-                               /* some other error with name, probably permanent */
-                               set_error(IL_SYS, errno, "event_store_qurantine: error looking for quarantine filename");
-                               return(-1);
-
-                       }
-               } else {
-                       /* the filename is used already */
-               }
-       }
-       if(num >= 1024) {
-               /* new name not found */
-               /* XXX - is there more suitable error? */
-               set_error(IL_SYS, ENOSPC, "event_store_quarantine: exhausted number of retries looking for quarantine filename");
-               return(-1);
-       }
-
-       /* actually rename the file */
-       il_log(LOG_DEBUG, "    renaming damaged event file from %s to %s\n",
-              es->event_file_name, newname);
-       if(rename(es->event_file_name, newname) < 0) {
-               set_error(IL_SYS, errno, "event_store_quarantine: error renaming event file");
-               return(-1);
-       }
-
-       /* clear the counters */
-       es->last_committed_ls = 0;
-       es->last_committed_bs = 0;
-       es->offset = 0;
-
-       /* increase cleanup count, this will invalidate all commits from previous generation */
-       es->generation++;
-
-       return(0);
-}
-
-
-/*
- * event_store_rotate_file()
- * returns 0 on success, -1 on error
- */
-static
-int
-event_store_rotate_file(struct event_store *es)
-{
-       int num;
-       time_t timestamp = time(NULL);
-       char newname[MAXPATHLEN+1];
-
-       /* do not rotate already rotated files */
-       if(es->rotate_index > 0)
-               return 0;
-
-       /* find available name */
-       /* we give it at most 256 tries */
-       for(num = 0; num < 256; num++) {
-               struct stat st;
-
-               snprintf(newname, MAXPATHLEN, "%s.%d%03d", es->event_file_name, timestamp, num);
-               newname[MAXPATHLEN] = 0;
-               if(stat(newname, &st) < 0) {
-                       if(errno == ENOENT) {
-                               /* file not found */
-                               break;
-                       } else {
-                               /* some other error with name, probably permanent */
-                               set_error(IL_SYS, errno, "event_store_rotate_file: error looking for available filename");
-                               return(-1);
-
-                       }
-               } else {
-                       /* the filename is used already */
-               }
-       }
-       if(num >= 1024) {
-               /* new name not found */
-               /* XXX - is there more suitable error? */
-               set_error(IL_SYS, ENOSPC, "event_store_quarantine: exhausted number of retries looking for quarantine filename");
-               return(-1);
-       }
-
-       /* actually rename the file */
-       il_log(LOG_DEBUG, "    renaming too large event file from %s to %s\n",
-              es->event_file_name, newname);
-       if(rename(es->event_file_name, newname) < 0) {
-               set_error(IL_SYS, errno, "event_store_rotate_file: error renaming event file");
-               return(-1);
-       }
-
-       /* change names in event_store */
-       es->event_file_name = strdup(newname);
-       es->control_file_name = astrcat(newname, ".ctl");
-       es->rotate_index = 1000*timestamp + num + 1;
-
-       return(0);
-}
-
-
-/*
- * event_store_recover_jobid()
- *  - recover all event stores for given jobid
- */
-static
-int
-event_store_recover_jobid(struct event_store *es)
-{
-       // es is locked for use already
-       struct event_store_list *p = es->le;
-
-       do {
-               event_store_recover(p->es);
-               if(p != es->le ) {
-                       event_store_release(p->es);
-               }
-
-               if(pthread_rwlock_rdlock(&store_list_lock))
-                       abort();
-               p = p->jobid_next;
-               if(p != es->le) {
-                       if(pthread_rwlock_rdlock(&p->es->use_lock))
-                               abort();
-               }
-               if(pthread_rwlock_unlock(&store_list_lock))
-                       abort();
-
-
-       } while(p != es->le);
-
-       return 0;
-}
-
-
-/*
- * event_store_recover()
- *   - recover after restart or catch up when events missing in IPC
- *   - if offset > 0, read everything behind it
- *   - if offset == 0, read everything behind min(last_committed_bs, last_committed_es)
- */
-int
-event_store_recover(struct event_store *es)
-{
-  struct event_queue *eq_l = NULL, *eq_b = NULL;
-  struct server_msg *msg;
-  char *event_s;
-  int fd, ret;
-  long last;
-  FILE *ef;
-  struct flock efl;
-  char err_msg[128];
-  struct stat stbuf;
-
-  assert(es != NULL);
-
-#if defined(IL_NOTIFICATIONS)
-  /* destination queue has to be found for each message separately */
-#else
-  /* find bookkeeping server queue */
-  eq_b = queue_list_get(es->job_id_s);
-  if(eq_b == NULL)
-    return(-1);
-#endif
-
-#if !defined(IL_NOTIFICATIONS)
-  /* get log server queue */
-  eq_l = queue_list_get(NULL);
-#endif
-
-  /* lock the event_store and offset locks */
-  event_store_lock(es);
-  if(pthread_rwlock_wrlock(&es->offset_lock))
-         abort();
-
-  il_log(LOG_DEBUG, "  reading events from %s\n", es->event_file_name);
-
-  /* open event file */
-  ef = fopen(es->event_file_name, "r");
-  if(ef == NULL) {
-         snprintf(err_msg, sizeof(err_msg),
-                  "event_store_recover: error opening event file %s",
-                  es->event_file_name);
-         set_error(IL_SYS, errno, err_msg);
-         event_store_unlock(es);
-         if(pthread_rwlock_unlock(&es->offset_lock))
-                 abort();
-         return(-1);
-  }
-
-  /* lock the file for reading (we should not read while dglogd is writing) */
-  fd = fileno(ef);
-  efl.l_type = F_RDLCK;
-  efl.l_whence = SEEK_SET;
-  efl.l_start = 0;
-  efl.l_len = 0;
-  if(fcntl(fd, F_SETLKW, &efl) < 0) {
-         snprintf(err_msg, sizeof(err_msg),
-                  "event_store_recover: error locking event file %s",
-                  es->event_file_name);
-         set_error(IL_SYS, errno, err_msg);
-         event_store_unlock(es);
-         if(pthread_rwlock_unlock(&es->offset_lock))
-                 abort();
-         fclose(ef);
-         return(-1);
-  }
-
-  /* check the file modification time and size to avoid unnecessary operations */
-  memset(&stbuf, 0, sizeof(stbuf));
-  if(fstat(fd, &stbuf) < 0) {
-         il_log(LOG_ERR, "    could not stat event file %s: %s\n", es->event_file_name, strerror(errno));
-         fclose(ef);
-         event_store_unlock(es);
-         if(pthread_rwlock_unlock(&es->offset_lock))
-                 abort();
-         return -1;
-  } else {
-         if((es->offset == stbuf.st_size) && (es->last_modified == stbuf.st_mtime)) {
-                 il_log(LOG_DEBUG, "  event file not modified since last visit, skipping\n");
-                 fclose(ef);
-                 event_store_unlock(es);
-                 if(pthread_rwlock_unlock(&es->offset_lock))
-                         abort();
-                 return(0);
-         }
-  }
-
-  /* check the file size, rename it if it is bigger than max_store_size */
-  if(max_store_size > 0 && stbuf.st_size > max_store_size) {
-         event_store_rotate_file(es);
-  }
-
-  while(1) { /* try, try, try */
-
-         /* get the position in file to be sought */
-         if(es->offset)
-                 last = es->offset;
-         else {
-#if !defined(IL_NOTIFICATIONS)
-                 if(eq_b == eq_l)
-                         last = es->last_committed_ls;
-                 else
-#endif
-                         /* last = min(ls, bs) */
-                         /* I took the liberty to optimize this,
-                            since LS is not used. */
-                         /* last = (es->last_committed_bs <
-                            es->last_committed_ls) ? es->last_committed_bs :
-                            es->last_committed_ls; */
-                         last = es->last_committed_bs;
-         }
-
-         il_log(LOG_DEBUG, "    setting starting file position to  %ld\n", last);
-         il_log(LOG_DEBUG, "    bytes sent to logging server: %d\n", es->last_committed_ls);
-         il_log(LOG_DEBUG, "    bytes sent to bookkeeping server: %d\n", es->last_committed_bs);
-
-         if(last > 0) {
-                 int c;
-
-                 /* skip all committed or already enqueued events */
-                 /* be careful - check, if the offset really points to the
-                    beginning of event string */
-                 if(fseek(ef, last-1, SEEK_SET) < 0) {
-                         set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
-                         event_store_unlock(es);
-                         fclose(ef);
-                         if(pthread_rwlock_unlock(&es->offset_lock))
-                                 abort();
-                         return(-1);
-                 }
-                 /* the last enqueued event MUST end with EVENT_SEPARATOR,
-                    even if the offset points at EOF */
-                 if((c=fgetc(ef)) != EVENT_SEPARATOR) {
-                         /* Houston, we have got a problem */
-                         il_log(LOG_WARNING,
-                                "    file position %ld does not point at the beginning of event string, backing off!\n",
-                                last);
-                         /* now, where were we? */
-                         if(es->offset) {
-                                 /* next try will be with
-                                    last_commited_bs */
-                                 es->offset = 0;
-                         } else {
-                                 /* this is really weird... back off completely */
-                                 es->last_committed_ls = es->last_committed_bs = 0;
-                         }
-                 } else {
-                         /* OK, break out of the loop */
-                         break;
-                 }
-         } else {
-                 /* this breaks out of the loop, we are starting at
-                  * the beginning of file
-                  */
-                 if(fseek(ef, 0, SEEK_SET) < 0) {
-                         set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
-                         event_store_unlock(es);
-                         fclose(ef);
-                         if(pthread_rwlock_unlock(&es->offset_lock))
-                                 abort();
-                         return(-1);
-                 }
-                 break;
-         }
-  }
-
-  /* now we have:
-   *   - event file opened at position 'last'
-   *   - offset and last_committed_* potentially reset to zero
-   */
-
-  /* release lock on commits, offset remains locked;
-   * other threads are allowed to send/remove events, but not insert
-   */
-  event_store_unlock(es);
-
-  /* enqueue all remaining events */
-  ret = 1;
-  msg = NULL;
-  while((event_s=read_event_string(ef)) != NULL) {
-    long last_ls, last_bs;
-
-    /* last holds the starting position of event_s in file */
-    il_log(LOG_DEBUG, "    reading event at %ld\n", last);
-
-    last_ls = es->last_committed_ls;
-    last_bs = es->last_committed_bs;
-
-    /* break from now on means there was some error */
-    ret = -1;
-
-    /* create message for server */
-    {
-           il_octet_string_t e;
-
-           e.data = event_s;
-           e.len = strlen(event_s);
-           msg = server_msg_create(&e, last);
-           free(event_s);
-    }
-    if(msg == NULL) {
-           il_log(LOG_ALERT, "    event file corrupted! I will try to move it to quarantine (ie. rename it).\n");
-           /* actually do not bother if quarantine succeeded or not - we could not do more */
-           event_store_quarantine(es);
-           fclose(ef);
-           if(pthread_rwlock_unlock(&es->offset_lock))
-                   abort();
-           return(-1);
-    }
-    msg->es = es;
-    msg->generation = es->generation;
-
-    /* first enqueue to the LS */
-    if(!bs_only && (last >= last_ls)) {
-
-      il_log(LOG_DEBUG, "      queuing event at %ld to logging server\n", last);
-
-#if !defined(IL_NOTIFICATIONS)
-      if(enqueue_msg(eq_l, msg) < 0)
-       break;
-#endif
-    }
-
-#ifdef IL_NOTIFICATIONS
-    eq_b = queue_list_get(msg->dest);
-    /* if the message does not have destination itself, use destination cached for notification id */
-    if(eq_b == NULL) {
-       eq_b = notifid_map_get_dest(msg->job_id_s);
-       if(eq_b == NULL) {
-               /* message has no destination and no destination is known for notification id,
-                * commit it immediately
-                */
-               il_log(LOG_DEBUG, "    message has no known destination, will not be sent\n");
-                       event_store_commit(es, msg->ev_len, 0, msg->generation);
-               /* if the expiration changed, set new one now, message will be discarded soon */
-               if(msg->expires != notifid_map_get_expiration(msg->job_id_s)) {
-                       notifid_map_set_expiration(msg->job_id_s, msg->expires);
-               }
-       }
-    }
-#endif
-
-    /* now enqueue to the BS, if neccessary */
-    if((eq_b != eq_l) &&
-       (last >= last_bs)) {
-
-      il_log(LOG_DEBUG, "      queueing event at %ld to bookkeeping server\n", last);
-
-      if(enqueue_msg(eq_b, msg) < 0)
-         break;
-    }
-    server_msg_free(msg);
-    msg = NULL;
-
-    /* now last is also the offset behind the last successfully queued event */
-    last = ftell(ef);
-
-    /* ret == 0 means EOF or incomplete event found */
-    ret = 0;
-
-  } /* while */
-
-  es->offset = last;
-  es->last_modified = stbuf.st_mtime;
-  il_log(LOG_DEBUG, "  event store offset set to %ld\n", last);
-
-  if(msg)
-    server_msg_free(msg);
-
-  fclose(ef);
-  il_log(LOG_DEBUG, "  finished reading events with %d\n", ret);
-
-  if(pthread_rwlock_unlock(&es->offset_lock))
-         abort();
-
-  return(ret);
-}
-
-
-/*
- * event_store_sync()
- *   - check the position of event and fill holes from file
- *   - return 1 if the event is new,
- *            0 if it was seen before,
- *           -1 if there was an error
- */
-int
-event_store_sync(struct event_store *es, long offset)
-{
-  int ret;
-
-  assert(es != NULL);
-
-  /* Commented out due to the fact that offset as received on socket
-   * has little to do with the real event file at the moment. The
-   * event will be read from file, socket now serves only to notify
-   * about possible event file change.
-   */
-  ret = event_store_recover_jobid(es);
-  ret = (ret < 0) ? ret : 0;
-  return(ret);
-
-#if 0
-  event_store_lock_ro(es);
-  if(es->offset == offset)
-    /* we are up to date */
-    ret = 1;
-  else if(es->offset > offset)
-    /* we have already seen this event */
-    ret = 0;
-  else {
-    /* es->offset < offset, i.e. we have missed some events */
-    event_store_unlock(es);
-    ret = event_store_recover(es);
-    /* XXX possible room for intervention by another thread - is there
-     * any other thread messing with us?
-     * 1) After recover() es->offset is set at the end of file.
-     * 2) es->offset is set only by recover() and next().
-     * 3) Additional recover can not do much harm.
-     * 4) And next() is only called by the same thread as sync().
-     * 5) use_lock is in place, so no cleanup possible
-      * => no one is messing with us right now */
-    event_store_lock_ro(es);
-    if(ret < 0)
-      ret = -1;
-    else
-           if(es->offset <= offset) {
-                   /* Apparently there is something wrong - we are receiving an event
-                    * which is beyond the end of file. Someone must have removed the file
-                    * when we were not looking. The question is - what should we do with the event?
-                    * We have to send it, as this is the only one occasion when we see it.
-                    * However, we must not allow the es->offset to be set using this event,
-                    * as it would point after the end of file. Sort this out in event_store_next().
-                    */
-                   ret = 1;
-           } else if(es->offset > offset) {
-                   /* we have seen at least this event */
-                   ret = 0;
-           }
-  }
-  event_store_unlock(es);
-  return(ret);
-#endif
-}
-
-
-int
-event_store_next(struct event_store *es, long offset, int len)
-{
-  assert(es != NULL);
-
-  /* Commented out due to the fact that offset as received on socket
-   * has little to do with real event file at the moment. es->offset
-   * handling is left solely to the event_store_recover().
-   */
-
-#if 0
-  event_store_lock(es);
-  /* Whoa, be careful now. The es->offset points right after the last enqueued event,
-   * but it may not be the offset of the event WE have just enqueued, because:!
-   *  1) someone could have removed the event file behind our back
-   *  2) the file could have been recover()ed and more events read
-   * In either case the offset should not be moved.
-   */
-  if(es->offset == offset) {
-         es->offset += len;
-  }
-  event_store_unlock(es);
-#endif
-
-  return(0);
-}
-
-
-/*
- * event_store_commit()
- *
- */
-int
-event_store_commit(struct event_store *es, int len, int ls, int generation)
-{
-  assert(es != NULL);
-
-  /* do not move counters if event store with this message was cleaned up
-   * (this can happen only when moving to quarantine)
-   */
-  /* XXX - assume int access is atomic */
-  if(generation != es->generation)
-         return 0;
-
-  event_store_lock(es);
-
-  if(ls)
-    es->last_committed_ls += len;
-  else {
-    es->last_committed_bs += len;
-    if (bs_only) es->last_committed_ls += len;
-  }
-
-  if(event_store_write_ctl(es) < 0) {
-    event_store_unlock(es);
-    return(-1);
-  }
-
-  event_store_unlock(es);
-
-
-  return(0);
-}
-
-
-/*
- * event_store_clean()
- *  - remove the event files (event and ctl), if they are not needed anymore
- *  - returns 0 if event_store is in use, 1 if it was removed and -1 on error
- *
- * Q: How do we know that we can safely remove the files?
- * A: When all events from file have been committed both by LS and BS.
- */
-static
-int
-event_store_clean(struct event_store *es)
-{
-  long last;
-  int fd;
-  FILE *ef;
-  struct flock efl;
-
-  assert(es != NULL);
-
-  /* prevent sender threads from updating */
-  event_store_lock(es);
-
-  il_log(LOG_DEBUG, "  trying to cleanup event store %s\n", es->job_id_s);
-  il_log(LOG_DEBUG, "    bytes sent to logging server: %d\n", es->last_committed_ls);
-  il_log(LOG_DEBUG, "    bytes sent to bookkeeping server: %d\n", es->last_committed_bs);
-
-  /* preliminary check to avoid opening event file */
-  /* if the positions differ, some events still have to be sent */
-  if(es->last_committed_ls != es->last_committed_bs) {
-    event_store_unlock(es);
-    il_log(LOG_DEBUG, "  not all events sent, cleanup aborted\n");
-    return(0);
-  }
-
-  if(fd = pthread_rwlock_wrlock(&es->offset_lock)) {
-         fprintf(stderr, "Fatal locking error: %s\n", strerror(fd));
-         abort();
-  }
-
-  /* the file can only be removed when all the events were succesfully sent
-     (ie. committed both by LS and BS */
-  /* That also implies that the event queues are 'empty' at the moment. */
-  ef = fopen(es->event_file_name, "r+");
-  if(ef == NULL) {
-    /* if we can not open the event store, it is an error and the struct should be removed */
-    /* XXX - is it true? */
-    event_store_unlock(es);
-    if(pthread_rwlock_unlock(&es->offset_lock))
-           abort();
-    il_log(LOG_ERR,  "  event_store_clean: error opening event file: %s\n", strerror(errno));
-    return(1);
-  }
-
-  fd = fileno(ef);
-
-  /* prevent local-logger from writing into event file */
-  efl.l_type = F_WRLCK;
-  efl.l_whence = SEEK_SET;
-  efl.l_start = 0;
-  efl.l_len = 0;
-  if(fcntl(fd, F_SETLK, &efl) < 0) {
-    il_log(LOG_DEBUG, "    could not lock event file, cleanup aborted\n");
-    fclose(ef);
-    event_store_unlock(es);
-    if(pthread_rwlock_unlock(&es->offset_lock))
-           abort();
-    if(errno != EACCES &&
-       errno != EAGAIN) {
-      set_error(IL_SYS, errno, "event_store_clean: error locking event file");
-      return(-1);
-    }
-    return(0);
-  }
-
-  /* now the file should not contain partially written event, so it is safe
-     to get offset behind last event by seeking the end of file */
-  if(fseek(ef, 0, SEEK_END) < 0) {
-    set_error(IL_SYS, errno, "event_store_clean: error seeking the end of file");
-    event_store_unlock(es);
-    if(pthread_rwlock_unlock(&es->offset_lock))
-           abort();
-    fclose(ef);
-    return(-1);
-  }
-
-  last = ftell(ef);
-  il_log(LOG_DEBUG, "    total bytes in file: %d\n", last);
-
-  if(es->last_committed_ls < last) {
-    fclose(ef);
-    event_store_unlock(es);
-    if(pthread_rwlock_unlock(&es->offset_lock))
-           abort();
-    il_log(LOG_DEBUG, "    events still waiting in queue, cleanup aborted\n");
-    return(0);
-  } else if( es->last_committed_ls > last) {
-         il_log(LOG_WARNING, "  warning: event file seems to shrink!\n");
-         /* XXX - in that case we can not continue because there may be
-            some undelivered events referring to that event store */
-         fclose(ef);
-         event_store_unlock(es);
-         if(pthread_rwlock_unlock(&es->offset_lock))
-                 abort();
-         return(0);
-  }
-
-  /* now we are sure that all events were sent and the event queues are empty */
-  il_log(LOG_INFO, "    removing event file %s\n", es->event_file_name);
-
-  /* remove the event file */
-  unlink(es->event_file_name);
-  unlink(es->control_file_name);
-
-  /* clear the counters */
-  es->last_committed_ls = 0;
-  es->last_committed_bs = 0;
-  es->offset = 0;
-
-  /* increasing the generation count is rather pointless here, because there
-     are no messages waiting in the queue that would be invalidated */
-  /* es->generation++ */
-
-  /* unlock the event_store even if it is going to be removed */
-  event_store_unlock(es);
-  if(pthread_rwlock_unlock(&es->offset_lock))
-         abort();
-
-  /* close the event file (that unlocks it as well) */
-  fclose(ef);
-
-  /* indicate that it is safe to remove this event_store */
-  return(1);
-}
-
-
-/* --------------------------------
- * event store management functions
- * --------------------------------
- */
-struct event_store *
-event_store_find(char *job_id_s, const char *filename)
-{
-  struct event_store_list *q, *p, *d;
-  struct event_store *es;
-
-  if(pthread_rwlock_wrlock(&store_list_lock)) {
-         abort();
-  }
-
-  es = NULL;
-
-  d = NULL;
-  p = store_list;
-
-  while(p) {
-    if(strcmp(p->es->job_id_s, job_id_s) == 0) {
-           es = p->es;
-           d = p;
-       // if filename was given, compare it as well
-           if((filename == NULL && p->es->rotate_index == 0) ||
-              (filename != NULL && strcmp(p->es->event_file_name, filename) == 0)) {
-               if(pthread_rwlock_rdlock(&es->use_lock))
-                       abort();
-               if(pthread_rwlock_unlock(&store_list_lock))
-                       abort();
-               return(es);
-       }
-    }
-    p = p->next;
-  }
-
-  // event store for given jobid and filename was not found, create one
-  es = event_store_create(job_id_s, filename);
-  if(es == NULL) {
-         if(pthread_rwlock_unlock(&store_list_lock))
-                 abort();
-         return(NULL);
-  }
-
-  p = malloc(sizeof(*p));
-  if(p == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "event_store_find: no room for new event store");
-      if(pthread_rwlock_unlock(&store_list_lock))
-             abort();
-    return(NULL);
-  }
-  p->es = es;
-  p->jobid_next = p;
-  p->jobid_prev = p;
-  es->le = p;
-
-  if(filename != NULL && d != NULL) {
-         // there is another event store for this jobid;
-         //    d points to the last event store for this jobid in LL
-         // find proper place to insert new event store
-         if(p->es->rotate_index == 0) {
-                 // insert behind d in LL
-                 p->next = d->next;
-                 d->next = p;
-                 // insert behind d in jobid LL
-                 p->jobid_next = d->jobid_next;
-                 p->jobid_prev = d;
-                 d->jobid_next->jobid_prev = p;
-                 d->jobid_next = p;
-         } else {
-                 struct event_store_list *r;
-                 q = NULL;
-                 for(r = d->jobid_next; r != d->jobid_next; r = r->jobid_next) {
-                         if(p->es->rotate_index < r->es->rotate_index)
-                                 break;
-                         if(r->es->rotate_index > 0)
-                                 q = r;
-                 }
-                 // q has the last lesser non-zero index than p
-                 if(q == NULL) {
-                         p->next = store_list;
-                         store_list = p;
-                         // insert behind d
-                         p->jobid_next = d->jobid_next;
-                         p->jobid_prev = d;
-                         d->jobid_next->jobid_prev = p;
-                         d->jobid_next = p;
-                 } else {
-                         p->next = q->next;
-                         q->next = p;
-                         // insert behind q
-                         p->jobid_next = q->jobid_next;
-                         p->jobid_prev = q;
-                         q->jobid_next->jobid_prev = p;
-                         q->jobid_next = p;
-                 }
-         }
-  } else {
-         // insert at the beginning
-         p->next = store_list;
-         store_list = p;
-  }
-
-  if(pthread_rwlock_rdlock(&es->use_lock))
-         abort();
-
-  if(pthread_rwlock_unlock(&store_list_lock))
-         abort();
-
-  return(es);
-}
-
-
-int
-event_store_release(struct event_store *es)
-{
-       assert(es != NULL);
-
-       if(pthread_rwlock_unlock(&es->use_lock))
-               abort();
-       il_log(LOG_DEBUG, "  released lock on %s (%s)\n", es->job_id_s, es->event_file_name);
-       return(0);
-}
-
-
-static
-int
-event_store_from_file(char *filename)
-{
-       struct event_store *es;
-       FILE *event_file;
-       char *event_s, *job_id_s = NULL;
-       int ret;
-#if defined(IL_NOTIFICATIONS)
-       edg_wll_Event *notif_event;
-       edg_wll_Context context;
-       char *dest_name = NULL;
-
-#endif
-
-       il_log(LOG_INFO, "  attaching to event file: %s\n", filename);
-
-       if(strstr(filename, "quarantine") != NULL) {
-               il_log(LOG_INFO, "  file name belongs to quarantine, not touching that.\n");
-               return(0);
-       }
-
-       event_file = fopen(filename, "r");
-       if(event_file == NULL) {
-               set_error(IL_SYS, errno, "event_store_from_file: error opening event file");
-               return(-1);
-       }
-       event_s = read_event_string(event_file);
-       fclose(event_file);
-       if(event_s == NULL)
-               return(0);
-
-#if defined(IL_NOTIFICATIONS)
-       edg_wll_InitContext(&context);
-       ret=edg_wll_ParseNotifEvent(context, event_s, &notif_event);
-       edg_wll_FreeContext(context);
-       if(ret) {
-               set_error(IL_LBAPI, ret, "event_store_from_file: could not parse event");
-               ret = -1;
-               goto out;
-       }
-       if(notif_event->notification.notifId == NULL) {
-               set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM,
-                         "event_store_from_file: parse error - no notif id");
-               ret = -1;
-               goto out;
-       }
-       if((job_id_s = edg_wll_NotifIdUnparse(notif_event->notification.notifId)) == NULL) {
-               set_error(IL_SYS, ENOMEM, "event_store_from_file: could not copy id");
-               ret = -1;
-               goto out;
-       }
-       /*  XXX: what was that good for?
-       if(notif_event->notification.dest_host &&
-          (strlen(notif_event->notification.dest_host) > 0)) {
-               asprintf(&dest_name, "%s:%d", notif_event->notification.dest_host, notif_event->notification.dest_port);
-       }
-       */
-
-#else
-       job_id_s = edg_wll_GetJobId(event_s);
-#endif
-       il_log(LOG_DEBUG, "  event id: '%s'\n", job_id_s);
-       if(job_id_s == NULL) {
-               il_log(LOG_NOTICE, "  skipping file, could not parse event\n");
-               ret = 0;
-               goto out;
-       }
-
-       es = event_store_find(job_id_s, filename);
-
-       if(es == NULL) {
-               ret = -1;
-               goto out;
-       }
-
-       if((es->last_committed_ls == 0) &&
-          (es->last_committed_bs == 0) &&
-          (es->offset == 0)) {
-               ret = event_store_read_ctl(es);
-       } else
-               ret = 0;
-
-       event_store_release(es);
-
-out:
-#if defined(IL_NOTIFICATIONS)
-       if(notif_event) {
-               edg_wll_FreeEvent(notif_event);
-               free(notif_event);
-       }
-#endif
-       if(event_s) free(event_s);
-       if(job_id_s) free(job_id_s);
-       return(ret);
-}
-
-
-int
-event_store_init(char *prefix)
-{
-  if(file_prefix == NULL) {
-    file_prefix = strdup(prefix);
-    store_list = NULL;
-  }
-
-  /* read directory and get a list of event files */
-  {
-    int len;
-
-    char *p, *dir;
-    DIR *event_dir;
-    struct dirent *entry;
-
-
-    /* get directory name */
-    p = strrchr(file_prefix, '/');
-    if(p == NULL) {
-      dir = strdup(".");
-      p = "";
-      len = 0;
-    } else {
-      *p = '\0';
-      dir = strdup(file_prefix);
-      *p++ = '/';
-      len = strlen(p);
-    }
-
-    event_dir = opendir(dir);
-    if(event_dir == NULL) {
-      free(dir);
-      set_error(IL_SYS, errno, "event_store_init: error opening event directory");
-      return(-1);
-    }
-
-    while((entry=readdir(event_dir))) {
-      char *s;
-
-      /* skip all files that do not match prefix */
-      if(strncmp(entry->d_name, p, len) != 0)
-       continue;
-
-      /* skip all control files */
-      if((s=strstr(entry->d_name, ".ctl")) != NULL &&
-        s[4] == '\0')
-       continue;
-
-      s = malloc(strlen(dir) + strlen(entry->d_name) + 2);
-      if(s == NULL) {
-       free(dir);
-       set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for file name");
-       return(-1);
-      }
-
-      *s = '\0';
-      strcat(s, dir);
-      strcat(s, "/");
-      strcat(s, entry->d_name);
-
-      if(event_store_from_file(s) < 0) {
-       free(dir);
-       free(s);
-       closedir(event_dir);
-       return(-1);
-      }
-
-      free(s);
-    }
-    closedir(event_dir);
-
-    /* one more pass - this time remove stale .ctl files */
-    event_dir = opendir(dir);
-    if(event_dir == NULL) {
-      free(dir);
-      set_error(IL_SYS, errno, "event_store_init: error opening event directory");
-      return(-1);
-    }
-
-    while((entry=readdir(event_dir))) {
-      char *s;
-
-      /* skip all files that do not match prefix */
-      if(strncmp(entry->d_name, p, len) != 0)
-       continue;
-
-      /* find all control files */
-      if((s=strstr(entry->d_name, ".ctl")) != NULL &&
-        s[4] == '\0') {
-             char *ef;
-             struct stat st;
-
-             /* is there corresponding event file? */
-             ef = malloc(strlen(dir) + strlen(entry->d_name) + 2);
-             if(ef == NULL) {
-                     free(dir);
-                     set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for event file name");
-                     return(-1);
-             }
-
-             s[0] = 0;
-             *ef = '\0';
-             strcat(ef, dir);
-             strcat(ef, "/");
-             strcat(ef, entry->d_name);
-             s[0] = '.';
-
-             if(stat(ef, &st) == 0) {
-                     /* something is there */
-                     /* XXX - it could be something else than event file, but do not bother now */
-             } else {
-                     /* could not stat file, remove ctl */
-                     strcat(ef, s);
-                     il_log(LOG_DEBUG, "  removing stale file %s\n", ef);
-                     if(unlink(ef))
-                             il_log(LOG_ERR, "  could not remove file %s: %s\n", ef, strerror(errno));
-
-             }
-             free(ef);
-
-      }
-    }
-    closedir(event_dir);
-    free(dir);
-  }
-
-  return(0);
-}
-
-
-int
-event_store_recover_all()
-{
-  struct event_store_list *sl;
-
-
-  if(pthread_rwlock_rdlock(&store_list_lock))
-         abort();
-
-  /* recover all event stores */
-  sl = store_list;
-  while(sl != NULL) {
-
-         /* recover this event store */
-         /* no need to lock use_lock in event_store, the store_list_lock is in place */
-         if(event_store_recover(sl->es) < 0) {
-                 il_log(LOG_ERR, "  error recovering event store %s:\n    %s\n", sl->es->event_file_name, error_get_msg());
-                 clear_error();
-         }
-         sl = sl->next;
-  }
-
-  if(pthread_rwlock_unlock(&store_list_lock))
-         abort();
-
-  return(0);
-}
-
-
-#if 0
-int
-event_store_remove(struct event_store *es)
-{
-  struct event_store_list *p, **q;
-
-  assert(es != NULL);
-
-  switch(event_store_clean(es)) {
-  case 0:
-    il_log(LOG_DEBUG, "  event store not removed, still used\n");
-    return(0);
-
-  case 1:
-    if(pthread_rwlock_wrlock(&store_list_lock) < 0) {
-      set_error(IL_SYS, errno, "  event_store_remove: error locking event store list");
-      return(-1);
-    }
-
-    p = store_list;
-    q = &store_list;
-
-    while(p) {
-      if(p->es == es) {
-       (*q) = p->next;
-       event_store_free(es);
-       free(p);
-       break;
-      }
-      q = &(p->next);
-      p = p->next;
-    }
-
-    if(pthread_rwlock_unlock(&store_list_lock) < 0) {
-      set_error(IL_SYS, errno, "  event_store_remove: error unlocking event store list");
-      return(-1);
-    }
-    return(1);
-
-  default:
-    return(-1);
-  }
-  /* not reached */
-  return(0);
-}
-#endif
-
-int
-event_store_cleanup()
-{
-  struct event_store_list *sl;
-  struct event_store_list *slnext;
-  struct event_store_list **prev;
-
-  /* try to remove event files */
-
-  if(pthread_rwlock_wrlock(&store_list_lock))
-         abort();
-
-  sl = store_list;
-  prev = &store_list;
-
-  while(sl != NULL) {
-         int ret;
-
-         slnext = sl->next;
-
-         /* one event store at time */
-         ret = pthread_rwlock_trywrlock(&sl->es->use_lock);
-         if(ret == EBUSY) {
-                 il_log(LOG_DEBUG, "  event_store %s is in use by another thread\n",
-                        sl->es->job_id_s);
-                 sl = slnext;
-                 continue;
-         } else if (ret < 0)
-           abort();
-
-         switch(event_store_clean(sl->es)) {
-
-         case 1:
-                 /* remove this event store from LL */
-                 (*prev) = slnext;
-                 /* remove this event store from jobid's LL */
-                 if(sl->jobid_next != sl) {
-                         sl->jobid_prev->jobid_next = sl->jobid_next;
-                         sl->jobid_next->jobid_prev = sl->jobid_prev;
-                 }
-                 event_store_free(sl->es);
-                 free(sl);
-                 break;
-
-         case -1:
-                 il_log(LOG_ERR, "  error removing event store %s (file %s):\n    %s\n",
-                        sl->es->job_id_s, sl->es->event_file_name, error_get_msg());
-                 /* event_store_release(sl->es); */
-                 clear_error();
-                 /* go on to the next */
-
-         default:
-                 event_store_release(sl->es);
-                 prev = &(sl->next);
-                 break;
-         }
-
-         sl = slnext;
-  }
-
-  if(pthread_rwlock_unlock(&store_list_lock))
-         abort();
-
-  return(0);
-}
-
diff --git a/org.glite.lb.logger/src/event_store_http.c b/org.glite.lb.logger/src/event_store_http.c
deleted file mode 100644 (file)
index ebd5523..0000000
+++ /dev/null
@@ -1,1113 +0,0 @@
-#ident "$Header$"
-
-#include <assert.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <sys/param.h>
-
-#include "glite/lb/events_parse.h"
-
-#include "interlogd.h"
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-static char *file_prefix = NULL;
-
-
-struct event_store_list {
-       struct event_store *es;
-       struct event_store_list *next;
-};
-
-
-static struct event_store_list *store_list;
-static pthread_rwlock_t store_list_lock = PTHREAD_RWLOCK_INITIALIZER;
-
-
-/* ----------------
- * helper functions
- * ----------------
- */
-static
-char *
-jobid2eventfile(const char *job_id_s)
-{
-  char *buffer;
-
-  if(job_id_s) {
-    asprintf(&buffer, "%s.%s", file_prefix, job_id_s);
-  } else 
-    asprintf(&buffer, "%s.default", file_prefix);
-    
-  return(buffer);
-}
-
-
-static
-char *
-jobid2controlfile(char *job_id_s)
-{
-  char *buffer;
-  char *hash;
-
-  if(job_id_s) {
-    asprintf(&buffer, "%s.%s.ctl", file_prefix, job_id_s);
-  } else 
-    asprintf(&buffer, "%s.default.ctl", file_prefix);
-    
-  return(buffer);
-}
-
-static
-int
-file_reader(void *user_data, char *buffer, const int len)
-{
-       size_t ret = 0;
-       
-       if(len > 0) {
-               ret = fread(buffer, 1, len, (FILE*)user_data);
-               if(ret == 0 && ferror((FILE*)user_data)) {
-                       return -1;
-               } 
-       }
-       return ret;
-}
-
-
-static
-int
-read_event_string(FILE *file, il_http_message_t *msg)
-{
-       int  len, ret;
-       int fd = fileno(file);
-       long start;
-
-       /* remember the start position */
-       start = ftell(file);
-       ret = receive_http(file, file_reader, msg);
-       if(ret < 0) return ret;
-       /* seek at the end of message in case the reader read ahead */
-       len = fseek(file, start + msg->len, SEEK_SET);
-       len = fgetc(file);
-       if(len != '\n') {
-               il_log(LOG_ERR, "error reading event from file, missing terminator character at %d, found %c(%d))\n", 
-                      start+msg->len, len, len);
-               if(msg->data) { free(msg->data); msg->data = NULL; }
-               if(msg->host) { free(msg->host); msg->host = NULL; }
-               return EINVAL;
-       }
-       return ret;
-}
-
-
-
-/* ------------------------------
- * event_store 'member' functions
- * ------------------------------
- */
-static
-int
-event_store_free(struct event_store *es)
-{
-  assert(es != NULL);
-
-  if(es->job_id_s) free(es->job_id_s);
-  if(es->event_file_name) free(es->event_file_name);
-  if(es->control_file_name) free(es->control_file_name);
-  pthread_rwlock_destroy(&es->use_lock);
-  pthread_rwlock_destroy(&es->commit_lock);
-  free(es);
-
-  return(0);
-}
-
-
-static
-struct event_store *
-event_store_create(char *job_id_s)
-{
-  struct event_store *es;
-
-  es = malloc(sizeof(*es));
-  if(es == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "event_store_create: error allocating room for structure");
-    return(NULL);
-  }
-
-  memset(es, 0, sizeof(*es));
-
-  il_log(LOG_DEBUG, "  creating event store for id %s\n", job_id_s);
-
-  es->job_id_s = strdup(job_id_s);
-  es->event_file_name = jobid2eventfile(job_id_s);
-  es->control_file_name = jobid2controlfile(job_id_s);
-
-  if(pthread_rwlock_init(&es->commit_lock, NULL)) 
-          abort();
-  if(pthread_rwlock_init(&es->use_lock, NULL)) 
-         abort();
-
-  return(es);
-}
-
-
-static
-int
-event_store_lock_ro(struct event_store *es)
-{
-  assert(es != NULL);
-
-  if(pthread_rwlock_rdlock(&es->commit_lock)) 
-    abort();
-
-  return(0);
-}
-
-
-static
-int
-event_store_lock(struct event_store *es)
-{
-  assert(es != NULL);
-
-  if(pthread_rwlock_wrlock(&es->commit_lock)) 
-    abort();
-
-  return(0);
-}
-
-
-static
-int
-event_store_unlock(struct event_store *es)
-{
-  assert(es != NULL);
-
-  if(pthread_rwlock_unlock(&es->commit_lock)) 
-    abort();
-  return(0);
-}
-
-
-static
-int
-event_store_read_ctl(struct event_store *es)
-{
-  FILE *ctl_file;
-
-  assert(es != NULL);
-
-  event_store_lock(es);
-  if((ctl_file = fopen(es->control_file_name, "r")) == NULL) {
-    /* no control file, new event file */
-    es->last_committed_ls = 0;
-    es->last_committed_bs = 0;
-  } else {
-    /* read last seen and last committed counts */
-    fscanf(ctl_file, "%*s\n%ld\n%ld\n",
-          &es->last_committed_ls,
-          &es->last_committed_bs);
-    fclose(ctl_file);
-  }
-  event_store_unlock(es);
-
-  return(0);
-}
-
-
-static
-int
-event_store_write_ctl(struct event_store *es)
-{
-  FILE   *ctl;
-
-  assert(es != NULL);
-
-  ctl = fopen(es->control_file_name, "w");
-  if(ctl == NULL) {
-    set_error(IL_SYS, errno, "event_store_write_ctl: error opening control file");
-    return(-1);
-  }
-
-  if(fprintf(ctl, "%s\n%ld\n%ld\n", 
-            es->job_id_s, 
-            es->last_committed_ls,
-            es->last_committed_bs) < 0) {
-    set_error(IL_SYS, errno, "event_store_write_ctl: error writing control record");
-    return(-1);
-  }
-
-  if(fclose(ctl) < 0) {
-    set_error(IL_SYS, errno, "event_store_write_ctl: error closing control file");
-    return(-1);
-  }
-
-  return(0);
-}
-
-
-/*
- * event_store_qurantine() 
- *   - rename damaged event store file 
- *   - essentially does the same actions as cleanup, but the event store 
- *     does not have to be empty
- * returns 0 on success, -1 on error
- */
-static
-int
-event_store_quarantine(struct event_store *es) 
-{
-       int num;
-       char newname[MAXPATHLEN+1];
-
-       /* find available qurantine name */
-       /* we give it at most 1024 tries */
-       for(num = 0; num < 1024; num++) {
-               struct stat st;
-
-               snprintf(newname, MAXPATHLEN, "%s.quarantine.%d", es->event_file_name, num);
-               newname[MAXPATHLEN] = 0;
-               if(stat(newname, &st) < 0) {
-                       if(errno == ENOENT) {
-                               /* file not found */
-                               break;
-                       } else {
-                               /* some other error with name, probably permanent */
-                               set_error(IL_SYS, errno, "event_store_qurantine: error looking for qurantine filename");
-                               return(-1);
-                               
-                       }
-               } else {
-                       /* the filename is used already */
-               }
-       }
-       if(num >= 1024) {
-               /* new name not found */
-               /* XXX - is there more suitable error? */
-               set_error(IL_SYS, ENOSPC, "event_store_quarantine: exhausted number of retries looking for quarantine filename");
-               return(-1);
-       }
-
-       /* actually rename the file */
-       il_log(LOG_DEBUG, "    renaming damaged event file from %s to %s\n",
-              es->event_file_name, newname);
-       if(rename(es->event_file_name, newname) < 0) {
-               set_error(IL_SYS, errno, "event_store_quarantine: error renaming event file");
-               return(-1);
-       }
-
-       /* clear the counters */
-       es->last_committed_ls = 0;
-       es->last_committed_bs = 0;
-       es->offset = 0;
-
-       return(0);
-}
-
-
-/*
- * event_store_recover()
- *   - recover after restart or catch up when events missing in IPC
- *   - if offset > 0, read everything behind it
- *   - if offset == 0, read everything behind min(last_committed_bs, last_committed_es)
- */
-int
-event_store_recover(struct event_store *es)
-{
-  struct event_queue *eq_l = NULL, *eq_b = NULL;
-  struct server_msg *msg;
-  il_http_message_t hmsg;
-  char *event_s;
-  int fd, ret;
-  long last;
-  FILE *ef;
-  struct flock efl;
-  char err_msg[128];
-  struct stat stbuf;
-
-  assert(es != NULL);
-  
-#if defined(IL_NOTIFICATIONS)
-  /* destination queue has to be found for each message separately */
-#else
-  /* find bookkepping server queue */
-  eq_b = queue_list_get(es->job_id_s);
-  if(eq_b == NULL) 
-    return(-1);
-#endif
-
-#if !defined(IL_NOTIFICATIONS)
-  /* get log server queue */
-  eq_l = queue_list_get(NULL);
-#endif
-
-  event_store_lock(es);
-
-  il_log(LOG_DEBUG, "  reading events from %s\n", es->event_file_name);
-
-  /* open event file */
-  ef = fopen(es->event_file_name, "r");
-  if(ef == NULL) {
-         snprintf(err_msg, sizeof(err_msg), 
-                  "event_store_recover: error opening event file %s",
-                  es->event_file_name);
-         set_error(IL_SYS, errno, err_msg);
-         event_store_unlock(es);
-         return(-1);
-  }
-
-  /* lock the file for reading (we should not read while dglogd is writing) */
-  fd = fileno(ef);
-  efl.l_type = F_RDLCK;
-  efl.l_whence = SEEK_SET;
-  efl.l_start = 0;
-  efl.l_len = 0;
-  if(fcntl(fd, F_SETLKW, &efl) < 0) {
-         snprintf(err_msg, sizeof(err_msg), 
-                  "event_store_recover: error locking event file %s",
-                  es->event_file_name);
-         set_error(IL_SYS, errno, err_msg);
-         event_store_unlock(es);
-         fclose(ef);
-         return(-1);
-  }
-
-  /* check the file modification time and size to avoid unnecessary operations */
-  memset(&stbuf, 0, sizeof(stbuf));
-  if(fstat(fd, &stbuf) < 0) {
-         il_log(LOG_ERR, "    could not stat event file %s: %s\n", es->event_file_name, strerror(errno));
-         fclose(ef);
-         event_store_unlock(es);
-         return -1;
-  } else {
-         if((es->offset == stbuf.st_size) && (es->last_modified == stbuf.st_mtime)) {
-                 il_log(LOG_DEBUG, "  event file not modified since last visit, skipping\n");
-                 fclose(ef);
-                 event_store_unlock(es);
-                 return(0);
-         }
-  }
-
-  while(1) { /* try, try, try */
-
-         /* get the position in file to be sought */
-         if(es->offset)
-                 last = es->offset;
-         else {
-                 last = es->last_committed_bs;
-         }
-
-         il_log(LOG_DEBUG, "    setting starting file position to  %ld\n", last);
-         il_log(LOG_DEBUG, "    bytes sent to destination: %d\n", es->last_committed_bs);
-
-         if(last > 0) {
-                 int c;
-
-                 /* skip all committed or already enqueued events */
-                 /* be careful - check, if the offset really points to the
-                    beginning of event string */
-                 if(fseek(ef, last - 1, SEEK_SET) < 0) {
-                         set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
-                         event_store_unlock(es);
-                         fclose(ef);
-                         return(-1);
-                 }
-                 /* the last enqueued event MUST end with \n */
-                 if((c=fgetc(ef)) != '\n') {
-                         /* Houston, we have got a problem */
-                         il_log(LOG_WARNING, 
-                                "    file position %ld does not point at the beginning of event string, backing off!\n",
-                                last);
-                         /* now, where were we? */
-                         if(es->offset) {
-                                 /* next try will be with
-                                    last_commited_bs */
-                                 es->offset = 0;
-                         } else {
-                                 /* this is really weird... back off completely */
-                                 es->last_committed_ls = es->last_committed_bs = 0;
-                         }
-                 } else {
-                         /* OK, break out of the loop */
-                         break;
-                 }
-         } else {
-                 /* this breaks out of the loop, we are starting at
-                  * the beginning of file
-                  */
-                 if(fseek(ef, 0, SEEK_SET) < 0) {
-                         set_error(IL_SYS, errno, "event_store_recover: error setting position for read");
-                         event_store_unlock(es);
-                         fclose(ef);
-                         return(-1);
-                 }
-                 break;
-         }
-  }
-
-  /* enqueue all remaining events */
-  ret = 1;
-  msg = NULL;
-  while(read_event_string(ef, &hmsg) >= 0) {
-       
-    /* last holds the starting position of event_s in file */
-    il_log(LOG_DEBUG, "    reading event at %ld\n", last);
-
-    /* break from now on means there was some error */
-    ret = -1;
-
-    /* create message for server */
-    msg = server_msg_create((il_octet_string_t*)&hmsg, last);
-    if(msg == NULL) {
-           il_log(LOG_ALERT, "    event file corrupted! I will try to move it to quarantine (ie. rename it).\n");
-           /* actually do not bother if quarantine succeeded or not - we could not do more */
-           event_store_quarantine(es);
-           fclose(ef);
-           event_store_unlock(es);
-           return(-1);
-    }
-    msg->es = es;
-
-    /* first enqueue to the LS */
-    if(!bs_only && (last >= es->last_committed_ls)) {
-      
-           il_log(LOG_DEBUG, "      queueing event at %ld to server %s\n", last, eq_l->dest_name);
-
-#if !defined(IL_NOTIFICATIONS)
-      if(enqueue_msg(eq_l, msg) < 0)
-       break;
-#endif
-      }
-
-#ifdef IL_NOTIFICATIONS
-    eq_b = queue_list_get(msg->dest);
-#endif
-
-    /* now enqueue to the BS, if neccessary */
-    if((eq_b != eq_l) && 
-       (last >= es->last_committed_bs)) {
-      
-           il_log(LOG_DEBUG, "      queueing event at %ld to server %s\n", last, eq_b->dest_name);
-      
-      if(enqueue_msg(eq_b, msg) < 0)
-       break;
-    }
-    server_msg_free(msg);
-    msg = NULL;
-
-    /* now last is also the offset behind the last successfully queued event */
-    last = ftell(ef);
-
-    /* ret == 0 means EOF or incomplete event found */
-    ret = 0;
-
-  } /* while */
-
-  /* due to this little assignment we had to lock the event_store for writing */
-  es->offset = last;
-  es->last_modified = stbuf.st_mtime;
-  il_log(LOG_DEBUG, "  event store offset set to %ld\n", last);
-
-  if(msg) 
-    server_msg_free(msg);
-
-  fclose(ef);
-  il_log(LOG_DEBUG, "  finished reading events with %d\n", ret);
-
-  event_store_unlock(es);
-  return(ret);
-}
-
-
-/*
- * event_store_sync()
- *   - check the position of event and fill holes from file
- *   - return 1 if the event is new,
- *            0 if it was seen before,
- *           -1 if there was an error
- */
-int
-event_store_sync(struct event_store *es, long offset)
-{
-       int ret;
-
-       assert(es != NULL);
-
-       /* all events are actually read from file, the event on socket
-        * is ignored and serves just to notify us about file change
-        */
-       ret = event_store_recover(es);
-       ret = (ret < 0) ? ret : 0;
-       return(ret);
-}
-
-
-int
-event_store_next(struct event_store *es, long offset, int len)
-{
-       assert(es != NULL);
-  
-       /* offsets are good only to detect losses (differences between socket and file),
-          which is not possible now */
-       return 0;
-}
-
-
-/* 
- * event_store_commit()
- *
- */
-int
-event_store_commit(struct event_store *es, int len, int ls)
-{
-  assert(es != NULL);
-
-  event_store_lock(es);
-
-  if(ls)
-    es->last_committed_ls += len;
-  else {
-    es->last_committed_bs += len;
-    if (bs_only) es->last_committed_ls += len;
-  }
-
-  if(event_store_write_ctl(es) < 0) {
-    event_store_unlock(es);
-    return(-1);
-  }
-
-  event_store_unlock(es);
-
-
-  return(0);
-}
-
-
-/*
- * event_store_clean()
- *  - remove the event files (event and ctl), if they are not needed anymore
- *  - returns 0 if event_store is in use, 1 if it was removed and -1 on error
- *
- * Q: How do we know that we can safely remove the files?
- * A: When all events from file have been committed both by LS and BS.
- */
-static 
-int
-event_store_clean(struct event_store *es)
-{
-  long last;
-  int fd;
-  FILE *ef;
-  struct flock efl;
-
-  assert(es != NULL);
-
-  /* prevent sender threads from updating */
-  event_store_lock(es);
-  
-  il_log(LOG_DEBUG, "  trying to cleanup event store %s\n", es->job_id_s);
-  il_log(LOG_DEBUG, "    bytes sent to logging server: %d\n", es->last_committed_ls);
-  il_log(LOG_DEBUG, "    bytes sent to bookkeeping server: %d\n", es->last_committed_bs);
-
-  /* preliminary check to avoid opening event file */
-  /* if the positions differ, some events still have to be sent */
-  if(es->last_committed_ls != es->last_committed_bs) {
-    event_store_unlock(es);
-    il_log(LOG_DEBUG, "  not all events sent, cleanup aborted\n");
-    return(0);
-  }
-
-  /* the file can only be removed when all the events were succesfully sent 
-     (ie. committed both by LS and BS */
-  /* That also implies that the event queues are 'empty' at the moment. */
-  ef = fopen(es->event_file_name, "r+");
-  if(ef == NULL) {
-    /* if we can not open the event store, it is an error and the struct should be removed */
-    /* XXX - is it true? */
-    event_store_unlock(es);
-    il_log(LOG_ERR,  "  event_store_clean: error opening event file: %s\n", strerror(errno));
-    return(1);
-  }
-  
-  fd = fileno(ef);
-  
-  /* prevent local-logger from writing into event file */
-  efl.l_type = F_WRLCK;
-  efl.l_whence = SEEK_SET;
-  efl.l_start = 0;
-  efl.l_len = 0;
-  if(fcntl(fd, F_SETLK, &efl) < 0) {
-    il_log(LOG_DEBUG, "    could not lock event file, cleanup aborted\n");
-    fclose(ef);
-    event_store_unlock(es);
-    if(errno != EACCES &&
-       errno != EAGAIN) {
-      set_error(IL_SYS, errno, "event_store_clean: error locking event file");
-      return(-1);
-    }
-    return(0);
-  }
-  
-  /* now the file should not contain partially written event, so it is safe
-     to get offset behind last event by seeking the end of file */
-  if(fseek(ef, 0, SEEK_END) < 0) {
-    set_error(IL_SYS, errno, "event_store_clean: error seeking the end of file");
-    event_store_unlock(es);
-    fclose(ef);
-    return(-1);
-  }
-  
-  last = ftell(ef);
-  il_log(LOG_DEBUG, "    total bytes in file: %d\n", last);
-
-  if(es->last_committed_ls < last) {
-    fclose(ef);
-    event_store_unlock(es);
-    il_log(LOG_DEBUG, "    events still waiting in queue, cleanup aborted\n");
-    return(0);
-  } else if( es->last_committed_ls > last) {
-         il_log(LOG_WARNING, "  warning: event file seems to shrink!\n");
-         /* XXX - in that case we can not continue because there may be
-            some undelivered events referring to that event store */
-         fclose(ef);
-         event_store_unlock(es);
-         return(0);
-  }
-  
-  /* now we are sure that all events were sent and the event queues are empty */
-  il_log(LOG_INFO, "    removing event file %s\n", es->event_file_name);
-  
-  /* remove the event file */
-  unlink(es->event_file_name);
-  unlink(es->control_file_name);
-  
-  /* clear the counters */
-  es->last_committed_ls = 0;
-  es->last_committed_bs = 0;
-  es->offset = 0;
-
-  /* unlock the event_store even if it is going to be removed */
-  event_store_unlock(es);
-
-  /* close the event file (that unlocks it as well) */
-  fclose(ef);
-
-  /* indicate that it is safe to remove this event_store */
-  return(1);
-}
-
-
-/* --------------------------------
- * event store management functions
- * --------------------------------
- */
-struct event_store *
-event_store_find(char *job_id_s)
-{
-  struct event_store_list *q, *p;
-  struct event_store *es;
-
-  if(pthread_rwlock_wrlock(&store_list_lock)) {
-         abort();
-  }
-
-  es = NULL;
-  
-  q = NULL;
-  p = store_list;
-  
-  while(p) {
-    if(strcmp(p->es->job_id_s, job_id_s) == 0) {
-      es = p->es;
-      if(pthread_rwlock_rdlock(&es->use_lock))
-             abort();
-      if(pthread_rwlock_unlock(&store_list_lock)) 
-             abort();
-      return(es);
-    }
-
-    q = p;
-    p = p->next;
-  }
-
-  es = event_store_create(job_id_s);
-  if(es == NULL) {
-         if(pthread_rwlock_unlock(&store_list_lock)) 
-                 abort();
-         return(NULL);
-  }
-
-  p = malloc(sizeof(*p));
-  if(p == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "event_store_find: no room for new event store");
-      if(pthread_rwlock_unlock(&store_list_lock)) 
-             abort();
-    return(NULL);
-  }
-  
-  p->next = store_list;
-  store_list = p;
-    
-  p->es = es;
-
-  if(pthread_rwlock_rdlock(&es->use_lock))
-         abort();
-
-  if(pthread_rwlock_unlock(&store_list_lock)) 
-         abort();
-
-  return(es);
-}
-
-
-int
-event_store_release(struct event_store *es)
-{
-       assert(es != NULL);
-
-       if(pthread_rwlock_unlock(&es->use_lock))
-               abort();
-       il_log(LOG_DEBUG, "  released lock on %s\n", es->job_id_s);
-       return(0);
-}
-
-
-event_store_from_file(char *filename)
-{
-       struct event_store *es;
-       FILE *event_file;
-       char *job_id_s = NULL, *p;
-       il_http_message_t hmsg;
-       int ret;
-       
-       il_log(LOG_INFO, "  attaching to event file: %s\n", filename);
-       
-       if(strstr(filename, "quarantine") != NULL) {
-               il_log(LOG_INFO, "  file name belongs to quarantine, not touching that.\n");
-               return(0);
-       }
-
-       event_file = fopen(filename, "r");
-       if(event_file == NULL) {
-               set_error(IL_SYS, errno, "event_store_from_file: error opening event file");
-               return(-1);
-       }
-       ret = read_event_string(event_file, &hmsg);
-       fclose(event_file);
-       if(ret < 0) 
-               return(0);
-       
-       /* get id aka dest */
-       job_id_s = hmsg.host;
-
-       il_log(LOG_DEBUG, "  message dest: '%s'\n", job_id_s);
-       if(job_id_s == NULL) {
-               il_log(LOG_NOTICE, "  skipping file, could not parse event\n");
-               ret = 0;
-               goto out;
-       }
-       
-       es=event_store_find(job_id_s);
-       
-       if(es == NULL) {
-               ret = -1;
-               goto out;
-       }
-
-       if((es->last_committed_ls == 0) &&
-          (es->last_committed_bs == 0) &&
-          (es->offset == 0)) {
-               ret = event_store_read_ctl(es);
-       } else 
-               ret = 0;
-       
-       event_store_release(es);
-
-out:
-       if(hmsg.data) free(hmsg.data);
-       if(job_id_s) free(job_id_s);
-       return(ret);
-}
-
-
-int
-event_store_init(char *prefix)
-{
-  if(file_prefix == NULL) {
-    file_prefix = strdup(prefix);
-    store_list = NULL;
-  }
-
-  /* read directory and get a list of event files */
-  {
-    int len;
-
-    char *p, *dir;
-    DIR *event_dir;
-    struct dirent *entry;
-
-
-    /* get directory name */
-    p = strrchr(file_prefix, '/');
-    if(p == NULL) {
-      dir = strdup(".");
-      p = "";
-      len = 0;
-    } else {
-      *p = '\0';
-      dir = strdup(file_prefix);
-      *p++ = '/';
-      len = strlen(p);
-    }
-
-    event_dir = opendir(dir);
-    if(event_dir == NULL) {
-      free(dir);
-      set_error(IL_SYS, errno, "event_store_init: error opening event directory");
-      return(-1);
-    }
-    
-    while((entry=readdir(event_dir))) {
-      char *s;
-
-      /* skip all files that do not match prefix */
-      if(strncmp(entry->d_name, p, len) != 0) 
-       continue;
-
-      /* skip all control files */
-      if((s=strstr(entry->d_name, ".ctl")) != NULL &&
-        s[4] == '\0')
-       continue;
-
-      s = malloc(strlen(dir) + strlen(entry->d_name) + 2);
-      if(s == NULL) {
-       free(dir);
-       set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for file name");
-       return(-1);
-      }
-
-      *s = '\0';
-      strcat(s, dir);
-      strcat(s, "/");
-      strcat(s, entry->d_name);
-
-      if(event_store_from_file(s) < 0) {
-       free(dir);
-       free(s);
-       closedir(event_dir);
-       return(-1);
-      }
-
-      free(s);
-    }
-    closedir(event_dir);
-
-    /* one more pass - this time remove stale .ctl files */
-    event_dir = opendir(dir);
-    if(event_dir == NULL) {
-      free(dir);
-      set_error(IL_SYS, errno, "event_store_init: error opening event directory");
-      return(-1);
-    }
-    
-    while((entry=readdir(event_dir))) {
-      char *s;
-
-      /* skip all files that do not match prefix */
-      if(strncmp(entry->d_name, p, len) != 0) 
-       continue;
-
-      /* find all control files */
-      if((s=strstr(entry->d_name, ".ctl")) != NULL &&
-        s[4] == '\0') {
-             char *ef;
-             struct stat st;
-
-             /* is there corresponding event file? */
-             ef = malloc(strlen(dir) + strlen(entry->d_name) + 2);
-             if(ef == NULL) {
-                     free(dir);
-                     set_error(IL_NOMEM, ENOMEM, "event_store_init: no room for event file name");
-                     return(-1);
-             }
-
-             s[0] = 0;
-             *ef = '\0';
-             strcat(ef, dir);
-             strcat(ef, "/");
-             strcat(ef, entry->d_name);
-             s[0] = '.';
-
-             if(stat(ef, &st) == 0) {
-                     /* something is there */
-                     /* XXX - it could be something else than event file, but do not bother now */
-             } else {
-                     /* could not stat file, remove ctl */
-                     strcat(ef, s);
-                     il_log(LOG_DEBUG, "  removing stale file %s\n", ef);
-                     if(unlink(ef)) 
-                             il_log(LOG_ERR, "  could not remove file %s: %s\n", ef, strerror(errno));
-                     
-             }
-             free(ef);
-
-      }
-    }
-    closedir(event_dir);
-    free(dir);
-  }
-
-  return(0);
-}
-
-
-int
-event_store_recover_all()
-{
-  struct event_store_list *sl;
-
-
-  if(pthread_rwlock_rdlock(&store_list_lock)) 
-         abort();
-
-  /* recover all event stores */
-  sl = store_list;
-  while(sl != NULL) {
-
-         /* recover this event store */
-         /* no need to lock use_lock in event_store, the store_list_lock is in place */
-         if(event_store_recover(sl->es) < 0) {
-                 il_log(LOG_ERR, "  error recovering event store %s:\n    %s\n", sl->es->event_file_name, error_get_msg());
-                 clear_error();
-         }
-         sl = sl->next;
-  }
-  
-  if(pthread_rwlock_unlock(&store_list_lock)) 
-         abort();
-
-  return(0);
-}
-
-
-#if 0 
-int
-event_store_remove(struct event_store *es)
-{
-  struct event_store_list *p, **q;
-
-  assert(es != NULL);
-
-  switch(event_store_clean(es)) {
-  case 0:
-    il_log(LOG_DEBUG, "  event store not removed, still used\n");
-    return(0);
-    
-  case 1:
-    if(pthread_rwlock_wrlock(&store_list_lock) < 0) {
-      set_error(IL_SYS, errno, "  event_store_remove: error locking event store list");
-      return(-1);
-    }
-
-    p = store_list;
-    q = &store_list;
-
-    while(p) {
-      if(p->es == es) {
-       (*q) = p->next;
-       event_store_free(es);
-       free(p);
-       break;
-      }
-      q = &(p->next);
-      p = p->next;
-    }
-
-    if(pthread_rwlock_unlock(&store_list_lock) < 0) {
-      set_error(IL_SYS, errno, "  event_store_remove: error unlocking event store list");
-      return(-1);
-    }
-    return(1);
-
-  default:
-    return(-1);
-  }
-  /* not reached */
-  return(0);
-}
-#endif
-
-int
-event_store_cleanup()
-{
-  struct event_store_list *sl;
-  struct event_store_list *slnext;
-  struct event_store_list **prev;
-
-  /* try to remove event files */
-
-  if(pthread_rwlock_wrlock(&store_list_lock)) 
-         abort();
-
-  sl = store_list;
-  prev = &store_list;
-
-  while(sl != NULL) {
-         int ret;
-
-         slnext = sl->next;
-         
-         /* one event store at time */
-         ret = pthread_rwlock_trywrlock(&sl->es->use_lock);
-         if(ret == EBUSY) {
-                 il_log(LOG_DEBUG, "  event_store %s is in use by another thread\n", 
-                        sl->es->job_id_s);
-                 sl = slnext;
-                 continue;
-         } else if (ret < 0)
-           abort();
-
-         switch(event_store_clean(sl->es)) {
-                 
-         case 1:
-                 /* remove this event store */
-                 (*prev) = slnext;
-                 event_store_free(sl->es);
-                 free(sl);
-                 break;
-                 
-         case -1:
-                 il_log(LOG_ERR, "  error removing event store %s (file %s):\n    %s\n", 
-                        sl->es->job_id_s, sl->es->event_file_name, error_get_msg());
-                 /* event_store_release(sl->es); */
-                 clear_error();
-                 /* go on to the next */
-                 
-         default:
-                 event_store_release(sl->es);
-                 prev = &(sl->next);
-                 break;
-         }
-         
-         sl = slnext;
-  }
-  
-  if(pthread_rwlock_unlock(&store_list_lock)) 
-         abort();
-  
-  return(0);
-}
-
diff --git a/org.glite.lb.logger/src/http.c b/org.glite.lb.logger/src/http.c
deleted file mode 100644 (file)
index c9fb89b..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-#ident "$Header$"
-
-#include <string.h>
-#include <errno.h>
-
-#include "interlogd.h"
-
-
-int 
-parse_request(const char *s, il_http_message_t *msg)
-{
-       if(!strncasecmp(s, "HTTP", 4)) {
-               msg->msg_type = IL_HTTP_REPLY;
-       } else if(!strncasecmp(s, "POST", 4)) {
-               msg->msg_type = IL_HTTP_POST;
-       } else if(!strncasecmp(s, "GET", 3)) {
-               msg->msg_type = IL_HTTP_GET;
-       } else {
-               msg->msg_type = IL_HTTP_OTHER;
-       }
-       if(msg->msg_type == IL_HTTP_REPLY) {
-               char *p = strchr(s, ' ');
-
-               if(!p) goto parse_end;
-               p++;
-               msg->reply_code=atoi(p);
-               p = strchr(p, ' ');
-               if(!p) goto parse_end;
-               p++;
-               msg->reply_string = strdup(p);
-
-       parse_end:
-               ;
-       }
-}
-
-
-int
-parse_header(const char *s, il_http_message_t *msg)
-{
-       if(!strncasecmp(s, "Content-Length:", 15)) {
-               msg->content_length = atoi(s + 15);
-       } else if(!strncasecmp(s, "Host:", 5)) {
-               const char *p = s + 4;
-               while(*++p == ' '); /* skip spaces */
-               msg->host = strdup(p);
-       }
-       return(0);
-}
-
-
-#define DEFAULT_CHUNK_SIZE 1024
-
-// read what is available and parse what can be parsed
-// returns the result of read operation of the underlying connection,
-// ie. the number of bytes read or error code
-int
-receive_http(void *user_data, int (*reader)(void *, char *, const int), il_http_message_t *msg)
-{
-       static enum { NONE, IN_REQUEST, IN_HEADERS, IN_BODY } state = NONE;
-       int  len, alen, clen, i, buffer_free, min_buffer_free = DEFAULT_CHUNK_SIZE;
-       char *buffer, *p, *s, *cr;
-       
-       memset(msg, 0, sizeof(*msg));
-       // msg->data = NULL;
-       // msg->len = 0;
-       state = IN_REQUEST;
-       alen = 0;
-       buffer = NULL;
-       buffer_free = 0;
-       p = NULL;
-       s = NULL;
-
-       do {
-               /* p - first empty position in buffer
-                  alen - size of allocated buffer
-                  len - number of bytes received in last read
-                  s - points behind last scanned CRLF or at buffer start 
-                  buffer_free = alen - (p - buffer) 
-               */
-
-               /* prepare at least chunk_size bytes for next data */
-               if(buffer_free < min_buffer_free) {
-                       char *n;
-                       
-                       alen += min_buffer_free;
-                       n = realloc(buffer, alen);
-                       if(n == NULL) {
-                               free(buffer);
-                               set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
-                               return(-1);
-                       }
-                       buffer_free += min_buffer_free;
-                       p = n + (p - buffer);
-                       s = n + (s - buffer);
-                       buffer = n;
-               }
-
-               if(buffer_free > 0) {
-                       len = (*reader)(user_data, p, buffer_free); 
-                       if(len < 0) {
-                               // error
-                               free(buffer);
-                               // set_error(IL_SYS, errno, "receive_http: error reading data");
-                               return -1;
-                       } else if(len == 0) {
-                               // EOF
-                               free(buffer);
-                               set_error(IL_PROTO, errno, "receive_http: error reading data - premature EOF");
-                               return -1;
-                       }
-                       buffer_free -= len;
-                       p+= len;
-               }
-
-
-               switch(state) {
-
-                       // parse buffer, look for CRLFs
-                       //   s - start scan position
-                       //   p - start of current token
-                       //   cr - current CRLF position
-
-               case IN_REQUEST:
-                       if((s < p - 1) &&
-                          (cr = (char*)memchr(s, '\r', p - s - 1)) &&
-                          (cr[1] == '\n')) {
-                               *cr = 0;
-                               parse_request(s, msg);
-                               *cr = '\r';
-                               // change state
-                               state = IN_HEADERS;
-                               // start new tokens (cr < p - 1 -> s < p + 1 <-> s <= p)
-                               s = cr + 2;
-                       } else {
-                         break;
-                       }
-
-               case IN_HEADERS:  
-                       while((state != IN_BODY) &&
-                             (s < p - 1) && 
-                             (cr = (char*)memchr(s, '\r', p - s - 1)) &&
-                             (cr[1] == '\n')) {
-                               if(s == cr) { /* do not consider request starting with CRLF */
-                                       // found CRLFCRLF
-                                       state = IN_BODY;
-                               } else {
-                                       *cr = 0;
-                                       parse_header(s, msg);
-                                       *cr = '\r';
-                               }
-                               // next scan starts after CRLF
-                               s = cr + 2; 
-                       }
-                       if(state == IN_BODY) {
-                               // we found body
-                               // content-length should be set at the moment
-                               if(msg->content_length > 0) {
-                                       int need_free = msg->content_length - (p - s);
-                                       char *n;
-                       
-                                       alen += need_free - buffer_free + 1;
-                                       n = realloc(buffer, alen);
-                                       if(n == NULL) {
-                                               free(buffer);
-                                               set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
-                                               return(-1);
-                                       }
-                                       buffer_free = need_free;
-                                       min_buffer_free = 0;
-                                       p = n + (p - buffer);
-                                       s = n + (s - buffer);
-                                       buffer = n;
-                               } else {
-                                       // report error
-                                       free(buffer);
-                                       set_error(IL_PROTO, EINVAL, "receive_http: error reading data - no content length specified\n");
-                                       return -1;
-                               }
-                       }
-                       break;
-                       
-               case IN_BODY:
-                       if(buffer_free == 0) {
-                               // finished reading
-                               *p = 0;
-                               state = NONE;
-                       }
-                       break;
-               }
-       } while(state != NONE);
-       
-       msg->data = buffer;
-       msg->len = p - buffer;
-
-       return 0;
-}
diff --git a/org.glite.lb.logger/src/il_error.c b/org.glite.lb.logger/src/il_error.c
deleted file mode 100644 (file)
index 630bd75..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-#ident "$Header$"
-
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include <netdb.h>
-#include <assert.h>
-#include <pthread.h>
-#include <stdlib.h>
-
-#ifdef LB_PROF
-#include <sys/gmon.h>
-extern void _start (void), etext (void);
-#endif
-
-#include "glite/security/glite_gss.h"
-
-#include "il_error.h"
-
-
-extern int log_level;
-
-static pthread_key_t err_key;
-
-static int IL_ERR_MSG_LEN = 1024;
-
-static
-void
-error_key_delete(void *err)
-{
-  if(((struct error_inf*)err)->msg)
-    free(((struct error_inf*)err)->msg);
-  free(err);
-}
-
-static 
-void
-error_key_create()
-{
-  pthread_key_create(&err_key, error_key_delete);
-}
-
-static 
-struct error_inf *
-error_get_err ()
-{
-  struct error_inf *err;
-
-  /* get thread specific error structure */
-  err = (struct error_inf *)pthread_getspecific(err_key);
-  assert(err != NULL);
-
-  return(err);
-}
-
-
-int
-init_errors(int level)
-{
-  static pthread_once_t error_once = PTHREAD_ONCE_INIT;
-  struct error_inf *err;
-
-  /* create the key for thread specific error only once */
-  pthread_once(&error_once, error_key_create);
-  
-  /* there is no thread error yet, try to create one */
-  if((err = (struct error_inf *)malloc(sizeof(*err)))) {
-    /* allocation successfull, make it thread specific data */
-    if(pthread_setspecific(err_key, err)) {
-       free(err);
-       return(-1);
-    }
-  } else 
-    return(-1);
-
-  err->code_maj = 0;
-  err->code_min = 0;
-  err->msg = malloc(IL_ERR_MSG_LEN + 1);
-  if(err->msg == NULL) 
-         return(-1);
-
-  if(level)
-    log_level = level;
-
-#ifdef LB_PROF
-  monstartup((u_long)&_start, (u_long)&etext);
-#endif
-
-  return(0);
-}
-
-int 
-set_error(int code, long minor, char *msg)
-{
-  struct error_inf *err;
-
-  err = error_get_err();
-
-  err->code_maj = code;
-  err->code_min = minor;
-
-  switch(code) {
-
-  case IL_SYS:
-    snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, strerror(err->code_min));
-    break;
-
-  case IL_HOST:
-    snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, hstrerror(err->code_min));
-    break;
-
-  case IL_DGGSS:
-    switch(err->code_min) {
-
-    case EDG_WLL_GSS_ERROR_GSS:
-      snprintf(err->msg, IL_ERR_MSG_LEN, "%s", msg);
-      break;
-
-    case EDG_WLL_GSS_ERROR_TIMEOUT:
-      snprintf(err->msg, IL_ERR_MSG_LEN, "%s: Timeout in GSS connection.", msg);
-      break;
-
-    case EDG_WLL_GSS_ERROR_EOF:
-      snprintf(err->msg, IL_ERR_MSG_LEN, "%s: Connection lost.", msg);
-      break;
-
-    case EDG_WLL_GSS_ERROR_ERRNO:
-      snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, strerror(errno));
-      break;
-      
-    case EDG_WLL_GSS_ERROR_HERRNO:
-      snprintf(err->msg, IL_ERR_MSG_LEN, "%s: %s", msg, hstrerror(errno));
-      break;
-    }
-
-  default:
-         strncpy(err->msg, msg, IL_ERR_MSG_LEN);
-  }
-
-  err->msg[IL_ERR_MSG_LEN] = 0; /* OK, malloc()ed IL_ERR_MSG_LEN + 1 */
-
-  return(code);
-}
-
-
-int 
-clear_error() {
-  struct error_inf *err;
-
-  err = error_get_err();
-
-  err->code_maj = IL_OK;
-  err->code_min = 0;
-  *(err->msg) = 0;
-
-  return(0);
-} 
-
-
-int
-error_get_maj()
-{
-  struct error_inf *err;
-
-  err = error_get_err();
-
-  return(err->code_maj);
-}
-
-
-long
-error_get_min()
-{
-  struct error_inf *err;
-
-  err = error_get_err();
-
-  return(err->code_min);
-}
-
-
-char * 
-error_get_msg()
-{
-  struct error_inf *err;
-
-  err = error_get_err();
-
-  return(err->msg);
-}
diff --git a/org.glite.lb.logger/src/il_error.h b/org.glite.lb.logger/src/il_error.h
deleted file mode 100644 (file)
index 09c593e..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef IL_ERROR_H
-#define IL_ERROR_H
-
-#ident "$Header$"
-
-#include <syslog.h>
-
-enum err_code_maj { /* minor =                   */
-  IL_OK,            /*     0                     */
-  IL_SYS,           /*     errno                 */
-  IL_NOMEM,         /*     ENOMEM                */
-  IL_PROTO,         /*     LB_*                  */
-  IL_LBAPI,         /*     dgLBErrCode           */
-  IL_DGGSS,         /*     EDG_WLL_GSS_*         */
-  IL_HOST           /*     h_errno               */
-};
-
-struct error_inf {
-  int  code_maj;
-  long code_min;
-  char *msg;
-};
-
-int init_errors(int);
-int set_error(int, long, char *);
-int clear_error();
-int error_get_maj();
-long error_get_min();
-char *error_get_msg();
-
-int il_log(int, char *, ...);
-
-#endif
diff --git a/org.glite.lb.logger/src/il_master.c b/org.glite.lb.logger/src/il_master.c
deleted file mode 100644 (file)
index 384c89a..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-#ident "$Header$"
-
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lb/context.h"
-#include "glite/lb/events_parse.h"
-#include "glite/lb/il_string.h"
-
-#include "interlogd.h"
-
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#endif
-
-static
-int
-cmp_jobid(struct server_msg *msg, void *data) 
-{
-       char *job_id_s = (char*)data;
-       return strcmp(msg->job_id_s, job_id_s) == 0;
-}
-
-static
-int
-cmp_jobid_set_exp(struct server_msg *msg, void *data)
-{
-       struct server_msg *m = (struct server_msg *)data;
-
-       if(strcmp(msg->job_id_s, m->job_id_s) == 0) {
-               msg->expires = m->expires;
-       }
-       return 0;
-}
-
-
-int 
-enqueue_msg(struct event_queue *eq, struct server_msg *msg)
-{
-#if defined(IL_NOTIFICATIONS)
-       struct event_queue *eq_known;
-
-       /* now we have a new event with possibly changed destination,
-          so check for the already known destination and possibly move 
-          events from the original output queue to a new one */
-       eq_known = notifid_map_get_dest(msg->job_id_s);
-       if(eq != eq_known) {
-               /* client has changed delivery address for this notification */
-               if(notifid_map_set_dest(msg->job_id_s, eq) < 0) 
-                       return(-1);
-               /* move all events with this notif_id from eq_known to eq */
-               if(eq_known != NULL) {
-                       event_queue_move_events(eq_known, eq, cmp_jobid, msg->job_id_s);
-                       /* XXX - we should kill the old queue too */
-               }
-       }
-
-       /* if the expiration changed, set new one */
-       if(msg->expires != notifid_map_get_expiration(msg->job_id_s)) {
-               notifid_map_set_expiration(msg->job_id_s, msg->expires);
-               /* set expiration for all events with this notif id */
-               event_queue_move_events(eq, NULL, cmp_jobid_set_exp, msg);
-       }
-#endif
-
-       /* fire thread to take care of this queue */
-       if(event_queue_create_thread(eq) < 0) 
-               return(-1);
-       
-#if defined(IL_NOTIFICATIONS)
-       /* if there are no data to send, do not send anything 
-          (messsage was just to change the delivery address) */
-       /* CORRECTION - let the message pass through the output queue
-          to commit it properly and keep event_store in sync */
-       /* if(msg->len == 0) 
-               return(0);
-       */
-#endif
-       /* avoid losing signal to thread */
-       event_queue_cond_lock(eq);
-
-       /* insert new event */
-       if(event_queue_insert(eq, msg) < 0) {
-               event_queue_cond_unlock(eq);
-               return(-1);
-       }
-      
-       /* signal thread that we have a new message */
-       event_queue_signal(eq);
-
-       /* allow thread to continue */
-       event_queue_cond_unlock(eq);
-
-       return(0);
-}
-
-
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-pthread_mutex_t flush_lock = PTHREAD_MUTEX_INITIALIZER;
-pthread_cond_t flush_cond = PTHREAD_COND_INITIALIZER;
-#endif /* INTERLOGD_FLUSH */
-
-#ifdef INTERLOGD_HANDLE_CMD
-static 
-int
-parse_cmd(char *event, char **job_id_s, long *receipt, int *timeout)
-{
-       char *token, *r;
-       int ret;
-
-       if(strstr(event, "DG.TYPE=\"command\"") == NULL)
-               return(-1);
-
-       *job_id_s = NULL;
-       *timeout = 0;
-       *receipt = 0;
-       ret = 0;
-
-       for(token = strtok(event, " "); token != NULL; token = strtok(NULL, " ")) {
-               r = index(token, '=');
-               if(r == NULL) {
-                       ret = -1;
-                       continue;
-               }
-               if(strncmp(token, "DG.COMMAND", r - token) == 0) {
-#if defined(INTERLOGD_FLUSH)                   
-                       if(strcmp(++r, "\"flush\"")) {
-#endif
-                               il_log(LOG_WARNING, "  command %s not implemented\n", r);
-                               ret = -1;
-                               continue;
-#if defined(INTERLOGD_FLUSH)
-                       }
-#endif
-               } else if(strncmp(token, "DG.JOBID", r - token) == 0) {
-                       char  *p;
-      
-                       r += 2; /* skip =" */
-                       p = index(r, '"');
-                       if(p == NULL) { ret = -1; continue; }
-                       *job_id_s = strndup(r, p-r);
-
-               } else if(strncmp(token, "DG.TIMEOUT", r - token) == 0) {
-                       sscanf(++r, "\"%d\"", timeout);
-               } else if(strncmp(token, "DG.LLLID", r - token) == 0) {
-                       sscanf(++r, "%ld", receipt);
-               }
-    
-       }
-       return(0);
-}
-
-
-/* return value:
- *   0 - not command
- *   1 - success
- *  -1 - failure
- */
-
-static 
-int 
-handle_cmd(il_octet_string_t *event, long offset)
-{
-       char *job_id_s;
-       struct event_queue *eq;
-       int  num_replies, num_threads = 0;
-       int  timeout, result;
-       long receipt;
-       struct timespec endtime;
-       struct timeval  tv;
-
-       /* parse command */
-       if(parse_cmd(event->data, &job_id_s, &receipt, &timeout) < 0) 
-               return(0);
-
-#if defined(INTERLOGD_FLUSH)
-       il_log(LOG_DEBUG, "  received FLUSH command\n");
-
-       /* catchup with all neccessary event files */
-       if(job_id_s) {
-               struct event_store *es = event_store_find(job_id_s, NULL);
-
-               if(es == NULL) {
-                       goto cmd_error;
-               }
-               result = event_store_recover(es);
-               /* NOTE: if flush had been stored in file, there would have been
-                  no need to lock the event_store at all */
-               event_store_release(es);
-               if(result < 0) {
-                       il_log(LOG_ERR, "  error trying to catch up with event file: %s\n",
-                              error_get_msg());
-                       clear_error();
-               }
-       } else 
-         /* this call does not fail :-) */
-         event_store_recover_all();
-
-       il_log(LOG_DEBUG, "  alerting threads to report status\n");
-
-       /* prevent threads from reporting too early */
-       if(pthread_mutex_lock(&flush_lock) < 0) {
-               /*** this error is considered too serious to allow the program run anymore!
-                    set_error(IL_SYS, errno, "pthread_mutex_lock: error locking flush lock");
-                    goto cmd_error;
-               */
-               abort();
-       }
-
-       /* wake up all threads */
-       if(job_id_s) {
-               /* find appropriate queue */
-               eq = queue_list_get(job_id_s);
-               if(eq == NULL) goto cmd_error;
-               if(!event_queue_empty(eq) && !queue_list_is_log(eq)) {
-                       num_threads++;
-                       event_queue_cond_lock(eq);
-                       eq->flushing = 1;
-                       event_queue_wakeup(eq);
-                       event_queue_cond_unlock(eq);
-               }
-       } else {
-               /* iterate over event queues */
-               for(eq=queue_list_first(); eq != NULL; eq=queue_list_next()) {
-                       if(!event_queue_empty(eq) && !queue_list_is_log(eq)) {
-                               num_threads++;
-                               event_queue_cond_lock(eq);
-                               eq->flushing = 1;
-                               event_queue_wakeup(eq);
-                               event_queue_cond_unlock(eq);
-                       }
-               }
-       }
-       if(!bs_only) {
-               eq = queue_list_get(NULL);
-               if(eq == NULL) goto cmd_error;
-               if(!event_queue_empty(eq)) {
-                       num_threads++;
-                       event_queue_cond_lock(eq);
-                       eq->flushing = 1;
-                       event_queue_wakeup(eq);
-                       event_queue_cond_unlock(eq);
-               }
-       }
-
-       /* wait for thread replies */
-       num_replies = 0;
-       result = 1;
-       gettimeofday(&tv, NULL);
-       endtime.tv_sec = tv.tv_sec + timeout;
-       endtime.tv_nsec = 1000 * tv.tv_usec;
-       while(num_replies < num_threads) {
-               int ret;
-               if((ret=pthread_cond_timedwait(&flush_cond, &flush_lock, &endtime)) < 0) {
-                       il_log(LOG_ERR, "    error waiting for thread reply: %s\n", strerror(errno));
-                       result = (ret == ETIMEDOUT) ? 0 : -1;
-                       break;
-               }
-               
-               /* collect results from reporting threads */
-               if(job_id_s) {
-                       /* find appropriate queue */
-                       eq = queue_list_get(job_id_s);
-                       if(eq == NULL) goto cmd_error;
-                       if(!queue_list_is_log(eq)) {
-                               event_queue_cond_lock(eq);
-                               if(eq->flushing == 2) {
-                                       eq->flushing = 0;
-                                       num_replies++;
-                                       result = ((result == 1) || (eq->flush_result < 0))  ? 
-                                               eq->flush_result : result;
-                               }
-                               event_queue_cond_unlock(eq);
-                       }
-               } else {
-                       /* iterate over event queues */
-                       for(eq=queue_list_first(); eq != NULL; eq=queue_list_next()) {
-                               if(!queue_list_is_log(eq)) {
-                                       event_queue_cond_lock(eq);
-                                       if(eq->flushing == 2) {
-                                               eq->flushing = 0;
-                                               num_replies++;
-                                               il_log(LOG_DEBUG, "    thread reply: %d\n", eq->flush_result);
-                                               result = ((result == 1) || (eq->flush_result < 0))  ? 
-                                                       eq->flush_result : result;
-                                       }
-                                       event_queue_cond_unlock(eq);
-                               }
-                       }
-               }
-               if(!bs_only) {
-                       eq = queue_list_get(NULL);
-                       if(eq == NULL) goto cmd_error;
-                       event_queue_cond_lock(eq);
-                       if(eq->flushing == 2) {
-                               eq->flushing = 0;
-                               num_replies++;
-                               result = ((result == 1) || (eq->flush_result < 0))  ? 
-                                       eq->flush_result : result;
-                       }
-                       event_queue_cond_unlock(eq);
-               }
-       }
-
-       /* prevent deadlock in next flush */
-       if(pthread_mutex_unlock(&flush_lock) < 0) 
-               abort();
-
-
-       /* report back to local logger */
-       switch(result) {
-       case 1:
-               result = 0; break;
-       case 0:
-               result = EDG_WLL_IL_EVENTS_WAITING; break;
-       default:
-               result = EDG_WLL_IL_SYS; break;
-       }
-       if(job_id_s) free(job_id_s);
-       result = send_confirmation(receipt, result);
-       if(result <= 0) 
-               il_log(LOG_ERR, "handle_cmd: error sending status: %s\n", error_get_msg());
-       return(1);
-
-
-cmd_error:
-       if(job_id_s) free(job_id_s);
-       return(-1);
-#else
-       return(0);
-#endif /* INTERLOGD_FLUSH */
-}
-#endif /* INTERLOGD_HANDLE_CMD */
-
-
-static 
-int
-handle_msg(il_octet_string_t *event, long offset)
-{ 
-       struct server_msg *msg = NULL;
-#if !defined(IL_NOTIFICATIONS)
-       struct event_queue *eq_l;
-#endif
-       struct event_queue *eq_s;
-       struct event_store *es;
-
-       int ret;
-
-       /* convert event to message for server */
-       if((msg = server_msg_create(event, offset)) == NULL) {
-               il_log(LOG_ERR, "    handle_msg: error parsing event '%s':\n      %s\n", event, error_get_msg());
-               return(0);
-       }
-  
-       /* sync event store with IPC (if neccessary)
-        * This MUST be called before inserting event into output queue! */
-       if((es = event_store_find(msg->job_id_s, NULL)) == NULL) 
-               return(-1);
-       msg->es = es;
-       
-#ifdef LB_PERF
-       if(nosync) 
-               ret = 1;
-       else 
-#endif
-               ret = event_store_sync(es, offset);
-       /* no longer informative:
-       il_log(LOG_DEBUG, "  syncing event store at %d with event at %d, result %d\n", es->offset, offset, ret);
-       */
-       if(ret < 0) {
-               il_log(LOG_ERR, "    handle_msg: error syncing event store:\n      %s\n", error_get_msg());
-               /* XXX should error during event store recovery cause us to drop the message? */
-               /* Probably no, because the attempt to recover means we have missed some events,
-                  and delivery of this one will not move offset ahead. So try our best and deliver it
-                  even if it may cause duplicates on server. */
-               /* COMMENTED OUT: uncommented again */
-               server_msg_free(msg);
-               event_store_release(es);
-               return(0);
-               /* */
-       } else if(ret == 0) {
-               /* we have seen this event already */
-               server_msg_free(msg);
-               event_store_release(es);
-               return(1);
-       }
-
-       /* find apropriate queue for this event */
-#if defined(IL_NOTIFICATIONS)
-       eq_s = queue_list_get(msg->dest);
-#else
-       eq_s = queue_list_get(msg->job_id_s);
-#endif
-       if(eq_s == NULL) { 
-               il_log(LOG_ERR, "    handle_msg: apropriate queue not found: %s\n", error_get_msg());
-               clear_error();
-       } else {
-               if(enqueue_msg(eq_s, msg) < 0)
-                       goto err;
-       }
-
-#if !defined(IL_NOTIFICATIONS)
-       eq_l = queue_list_get(NULL);
-       if(!bs_only && eq_l != eq_s) {
-               /* send to default queue (logging server) as well */
-               if(enqueue_msg(eq_l, msg) < 0)
-                       goto err;
-       }
-#endif
-
-       /* if there was no error, set the next expected event offset */
-       event_store_next(es, offset, msg->ev_len);
-
-       /* allow cleanup thread to check on this event_store */
-       event_store_release(es);
-
-       /* free the message */
-       server_msg_free(msg);
-       return(1);
-
-err:
-       event_store_release(es);
-       server_msg_free(msg);
-       return(-1);
-}
-
-
-
-int 
-loop()
-{
-       /* receive events */
-       while(1) {
-               il_octet_string_t *msg;
-               long offset;
-               int ret;
-    
-               if(killflg)
-                       exit(0);
-
-               clear_error();
-               if((ret = input_queue_get(&msg, &offset, INPUT_TIMEOUT)) < 0) 
-               {
-                       if(error_get_maj() == IL_PROTO) {
-                               il_log(LOG_DEBUG, "  premature EOF while receiving event\n");
-                               /* problems with socket input, try to catch up from files */
-#ifndef PERF_EMPTY
-                               event_store_recover_all();
-#endif
-                               continue;
-                       } else 
-                               return(-1);
-               }
-               else if(ret == 0) {
-                       continue;
-               }
-
-#ifdef PERF_EMPTY
-               glite_wll_perftest_consumeEventString(msg->data);
-               free(msg->data);
-               continue;
-#endif
-
-#ifdef INTERLOGD_HANDLE_CMD            
-               ret = handle_cmd(msg, offset);
-               if(ret == 0)
-#endif
-                       ret = handle_msg(msg, offset);
-               if(msg->data) free(msg->data);
-               if(ret < 0)
-                       switch (error_get_maj()) {
-                               case IL_SYS:
-                               case IL_NOMEM:
-                                       return (ret);
-                                       break;
-                               default: 
-                                       il_log(LOG_ERR, "Error: %s\n", error_get_msg());
-                                       break;
-                       }
-       } /* while */
-}
diff --git a/org.glite.lb.logger/src/input_queue_socket.c b/org.glite.lb.logger/src/input_queue_socket.c
deleted file mode 100644 (file)
index 05a0034..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-#ident "$Header$"
-
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-#include "interlogd.h"
-
-
-static const int   SOCK_QUEUE_MAX = 50;
-extern char *socket_path;
-
-static int sock;
-static int accepted;
-
-int 
-input_queue_attach()
-{ 
-  struct sockaddr_un saddr;
-
-  if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
-    set_error(IL_SYS, errno, "input_queue_attach: error creating socket");
-    return(-1);
-  }
-
-  memset(&saddr, 0, sizeof(saddr));
-  saddr.sun_family = AF_UNIX;
-  strcpy(saddr.sun_path, socket_path);
-
-  /* test for the presence of the socket and another instance 
-     of interlogger listening */
-  if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
-         if(errno == ECONNREFUSED) {
-                 /* socket present, but no one at the other end; remove it */
-                 il_log(LOG_WARNING, "  removing stale input socket %s\n", socket_path);
-                 unlink(socket_path);
-         }
-         /* ignore other errors for now */
-  } else {
-         /* connection was successful, so bail out - there is 
-            another interlogger running */
-         set_error(IL_SYS, EADDRINUSE, "input_queue_attach: another instance of interlogger is running");
-         return(-1);
-  }
-  
-  if(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
-    set_error(IL_SYS, errno, "input_queue_attach: error binding socket");
-    return(-1);
-  }
-
-  if (listen(sock, SOCK_QUEUE_MAX)) {
-    set_error(IL_SYS, errno, "input_queue_attach: error listening on socket");
-    return -1;
-  }
-
-  return(0);
-}
-
-void input_queue_detach()
-{
-  if (sock >= 0)
-    close(sock);
-  unlink(socket_path);
-}
-
-
-#define DEFAULT_CHUNK_SIZE 1024
-
-static
-int
-read_event(int sock, long *offset, il_octet_string_t *msg)
-{
-  char *buffer, *p, *n;
-  int  len, alen, i, chunk_size = DEFAULT_CHUNK_SIZE;
-  static char buf[1024];
-
-  msg->data = NULL;
-  msg->len = 0;
-
-  /* receive offset */
-  len = recv(sock, offset, sizeof(*offset), MSG_NOSIGNAL);
-  if(len < sizeof(*offset)) {
-    set_error(IL_PROTO, errno, "read_event: error reading offset");
-    return(-1);
-  }
-  
-  /* receive event string */
-  buffer=malloc(8*chunk_size);
-  if(buffer == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
-    return(-1);
-  }
-  p = buffer;
-  alen = 8*chunk_size;
-
-  /* Variables used here:
-        - buffer points to allocated memory,
-       - alen is the allocated memory size,
-       - p points to the first free location in buffer,
-       - len is the amount actually read by recv,
-       - i is the amount of data belonging to the current event (including separator).
-       - n points to event separator or is NULL
-    Hence:
-         (p - buffer) gives the amount of valid data read so far,
-        (alen - (p - buffer)) is the free space,
-  */ 
-#if 1
-  /* Reading events - optimized version. Attempts to increase chunks read by recv
-   * when there are more data, reads directly into destination memory (instead of 
-   * copying from static buffer) etc.
-   *
-   * For some reason it is not much faster than the old variant.
-   */
-  do {
-         /* prepare at least chunk_size bytes for next data */
-         if(alen - (p - buffer) < chunk_size) {
-                 alen += (chunk_size < 8192) ? 8192 : 8*chunk_size;
-                 n = realloc(buffer, alen);
-                 if(n == NULL) {
-                         free(buffer);
-                         set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
-                         return(-1);
-                 }
-                 p = n + (p - buffer);
-                 buffer = n;
-         }
-
-         /* read chunk */
-         if((len=recv(sock, p, chunk_size, MSG_PEEK | MSG_NOSIGNAL)) > 0) {
-                 /* find the end of event, if any */
-                 /* faster (and dirty) way of doing strnchr (which is not in libc, anyway) */
-                 if((n=memccpy(p, p, EVENT_SEPARATOR, len)) != NULL) {
-                         i = n - p; /* length including separator */
-                 } else {
-                         i = len;
-                         /* long event, huh? try reading more data at once */
-                         chunk_size += 1024;
-                 }
-                 /* remove the relevant data from input */
-                 /* i > 0 */
-                 if(recv(sock, p, i, MSG_NOSIGNAL) != i) {
-                         set_error(IL_SYS, errno, "read_event: error reading data");
-                         free(buffer);
-                         return(-1);
-                 }
-                 /* move the pointer to the first free place, separator is considered free space */
-                 p = (n == NULL) ? p + len : n - 1;
-         }
-  } while ( (len > 0) && (n == NULL) );
-
-#else
-  /* Reading events - original version.
-   * Appears to behave quite good, anyway.
-   */
-  while((len=recv(sock, buf, sizeof(buf), MSG_PEEK | MSG_NOSIGNAL)) > 0) {
-
-    /* we have to be prepared for sizeof(buf) bytes */
-    if(alen - (p - buffer) < (int)sizeof(buf)) {
-      alen += 8192;
-      n = realloc(buffer, alen);
-      if(n == NULL) {
-       free(buffer);
-       set_error(IL_NOMEM, ENOMEM, "read_event: no room for event");
-       return(-1);
-      }
-      p = p - buffer + n;
-      buffer = n;
-    }
-
-    /* copy all relevant bytes from buffer */
-    n = (char*)memccpy(p, buf, EVENT_SEPARATOR, len);
-    if(n) {
-           /* separator found */
-           n--; /* but do not preserve it */
-           i = n - p;
-           p = n;
-    } else {
-           /* separator not found */
-           i = len;
-           p += len;
-    }
-   /* This was definitely slowing us down:
-    *    for(i=0; (i < len) && (buf[i] != EVENT_SEPARATOR); i++) 
-    *    *p++ = buf[i];
-    */
-
-    /* remove the data from queue */
-    if(i > 0) 
-      if(recv(sock, buf, i, MSG_NOSIGNAL) != i) {
-       set_error(IL_SYS, errno, "read_event: error reading data");
-       free(buffer);
-       return(-1);
-      }
-    if(i < len)
-      /* the event is complete */
-      break;
-  }
-#endif
-
-  /* terminate buffer */
-  *p = 0;
-
-  if(len < 0) {
-    set_error(IL_SYS, errno, "read_event: error reading data");
-    free(buffer);
-    return(-1);
-  }
-
-  /* if len == 0, we have not encountered EVENT_SEPARATOR and thus the event is not complete */
-  if(len == 0) {
-    set_error(IL_PROTO, errno, "read_event: error reading data - premature EOF");
-    free(buffer);
-    return(-1);
-  }
-
-#if 0
-  /* this is probably not necessary at all:
-     either len <=0, which was covered before,
-     or 0 <= i < len => p > buffer;
-     I would say this condition can not be satisfied.
-  */
-  if(p == buffer) {
-    set_error(IL_PROTO, errno, "read_event: error reading data - no data received");
-    free(buffer);
-    return(-1);
-  }
-#endif
-
-  msg->data = buffer;
-  msg->len = p - buffer;
-  return(msg->len);
-}
-
-
-/*
- * Returns: -1 on error, 0 if no message available, message length otherwise
- *
- */
-#ifdef PERF_EVENTS_INLINE
-int
-input_queue_get(il_octet_string **buffer, long *offset, int timeout)
-{
-       static long o = 0;
-       int len;
-       char *jobid;
-       static il_octet_string_t my_buffer;
-
-       assert(buffer != NULL);
-
-       *buffer = &my_buffer;
-
-       len = glite_wll_perftest_produceEventString(&my_buffer.data, &jobid);
-       my_buffer.len = len;
-       if(len) {
-               o += len;
-               *offset = o;
-       } else if (len == 0) {
-               sleep(timeout);
-       }
-       return(len);
-}
-#else
-int
-input_queue_get(il_octet_string_t **buffer, long *offset, int timeout)
-{
-  fd_set fds;
-  struct timeval tv;
-  int msg_len;
-  static il_octet_string_t my_buffer;
-
-  assert(buffer != NULL);
-
-  *buffer = &my_buffer;
-
-  FD_ZERO(&fds);
-  FD_SET(sock, &fds);
-  
-  tv.tv_sec = timeout;
-  tv.tv_usec = 0;
-  
-  msg_len = select(sock + 1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL);
-  switch(msg_len) {
-     
-  case 0: /* timeout */
-    return(0);
-    
-  case -1: /* error */
-         switch(errno) {
-         case EINTR:
-                 il_log(LOG_DEBUG, "  interrupted while waiting for event!\n");
-                 return(0);
-
-         default:
-                 set_error(IL_SYS, errno, "input_queue_get: error waiting for event");
-                 return(-1);
-         }
-  default:
-         break;
-  }
-  
-  if((accepted=accept(sock, NULL, NULL)) < 0) {
-    set_error(IL_SYS, errno, "input_queue_get: error accepting connection");
-    return(-1);
-  }
-
-  read_event(accepted, offset, &my_buffer);
-  close(accepted);
-
-  if(my_buffer.data == NULL) {
-    if(error_get_maj() != IL_OK)
-      return(-1);
-    else
-      return(0);
-  }
-    
-  return(my_buffer.len);
-}
-#endif
diff --git a/org.glite.lb.logger/src/input_queue_socket_http.c b/org.glite.lb.logger/src/input_queue_socket_http.c
deleted file mode 100644 (file)
index 939c45f..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-#ident "$Header$"
-
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "interlogd.h"
-
-static const int   SOCK_QUEUE_MAX = 50;
-extern char *socket_path;
-extern char *file_prefix;
-
-static int sock;
-static int accepted;
-
-static
-int plain_reader(void *user_data, char *buffer, const int len)
-{
-       return (recv(*(int*)user_data, buffer, len, MSG_NOSIGNAL));
-}
-
-                
-int 
-input_queue_attach()
-{ 
-  struct sockaddr_un saddr;
-
-  if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
-    set_error(IL_SYS, errno, "input_queue_attach: error creating socket");
-    return(-1);
-  }
-
-  memset(&saddr, 0, sizeof(saddr));
-  saddr.sun_family = AF_UNIX;
-  strcpy(saddr.sun_path, socket_path);
-
-  /* test for the presence of the socket and another instance 
-     of interlogger listening */
-  if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
-         if(errno == ECONNREFUSED) {
-                 /* socket present, but no one at the other end; remove it */
-                 il_log(LOG_WARNING, "  removing stale input socket %s\n", socket_path);
-                 unlink(socket_path);
-         }
-         /* ignore other errors for now */
-  } else {
-         /* connection was successful, so bail out - there is 
-            another interlogger running */
-         set_error(IL_SYS, EADDRINUSE, "input_queue_attach: another instance of interlogger is running");
-         return(-1);
-  }
-  
-  if(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
-    set_error(IL_SYS, errno, "input_queue_attach: error binding socket");
-    return(-1);
-  }
-
-  if (listen(sock, SOCK_QUEUE_MAX)) {
-    set_error(IL_SYS, errno, "input_queue_attach: error listening on socket");
-    return -1;
-  }
-
-  return(0);
-}
-
-
-void input_queue_detach()
-{
-  if (sock >= 0)
-    close(sock);
-  unlink(socket_path);
-}
-
-
-
-/*
- * Returns: -1 on error, 0 if no message available, message length otherwise
- *
- */
-#ifdef PERF_EVENTS_INLINE
-int
-input_queue_get(il_octet_string_t **buffer, long *offset, int timeout)
-{
-       static long o = 0;
-       int len;
-       char *jobid;
-       static il_octet_string_t my_buffer;
-       
-       assert(buffer != NULL);
-
-       *buffer = &my_buffer;
-
-       len = glite_wll_perftest_produceEventString(&my_buffer.data, &jobid);
-       my_buffer.len = len;
-       if(len) {
-               o += len;
-               *offset = o;
-       } else if (len == 0) {
-               sleep(timeout);
-       }
-       return(len);
-}
-#else
-int
-input_queue_get(il_octet_string_t **buffer, long *offset, int timeout)
-{
-  fd_set fds;
-  struct timeval tv;
-  int msg_len;
-  static il_http_message_t msg;
-
-  assert(buffer != NULL);
-
-  *buffer = (il_octet_string_t *)&msg;
-
-  FD_ZERO(&fds);
-  FD_SET(sock, &fds);
-  
-  tv.tv_sec = timeout;
-  tv.tv_usec = 0;
-  
-  msg_len = select(sock + 1, &fds, NULL, NULL, timeout >= 0 ? &tv : NULL);
-  switch(msg_len) {
-     
-  case 0: /* timeout */
-    return(0);
-    
-  case -1: /* error */
-         switch(errno) {
-         case EINTR:
-                 il_log(LOG_DEBUG, "  interrupted while waiting for event!\n");
-                 return(0);
-
-         default:
-                 set_error(IL_SYS, errno, "input_queue_get: error waiting for event");
-                 return(-1);
-         }
-  default:
-         break;
-  }
-  
-  if((accepted=accept(sock, NULL, NULL)) < 0) {
-    set_error(IL_SYS, errno, "input_queue_get: error accepting connection");
-    return(-1);
-  }
-
-  msg_len = receive_http(&accepted, plain_reader, &msg);
-
-  if(msg_len < 0) {
-         close(accepted);
-         if(error_get_maj() != IL_OK) 
-                 return -1;
-         else
-                 return 0;
-  }
-
-  close(accepted);
-  *offset = -1;
-  return(msg.len);
-}
-#endif
-
diff --git a/org.glite.lb.logger/src/interlogd.c b/org.glite.lb.logger/src/interlogd.c
deleted file mode 100644 (file)
index e6ebded..0000000
+++ /dev/null
@@ -1,405 +0,0 @@
-#ident "$Header$"
-
-/*
-   interlogger - collect events from local-logger and send them to logging and bookkeeping servers
-
-*/
-#include <stdio.h>
-#include <getopt.h>
-#include <string.h>
-#include <signal.h>
-#include <pthread.h>
-#include <errno.h>
-
-#include "interlogd.h"
-#include "glite/lb/log_proto.h"
-#include "glite/security/glite_gss.h"
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#endif
-
-#define EXIT_FAILURE 1
-#if defined(IL_NOTIFICATIONS)
-#define DEFAULT_PREFIX "/tmp/notif_events"
-#define DEFAULT_SOCKET "/tmp/notif_interlogger.sock"
-#else
-#define DEFAULT_PREFIX EDG_WLL_LOG_PREFIX_DEFAULT
-#define DEFAULT_SOCKET "/tmp/interlogger.sock"
-#endif
-
-
-/* The name the program was run with, stripped of any leading path. */
-char *program_name;
-int killflg = 0;
-
-int TIMEOUT = DEFAULT_TIMEOUT;
-
-cred_handle_t *cred_handle = NULL;
-pthread_mutex_t cred_handle_lock = PTHREAD_MUTEX_INITIALIZER;
-
-time_t key_mtime = 0, cert_mtime = 0;
-
-static void usage (int status)
-{
-       printf("%s - \n"
-              "  collect events from local-logger and send them to logging and bookkeeping servers\n"
-              "Usage: %s [OPTION]... [FILE]...\n"
-              "Options:\n"
-              "  -h, --help                 display this help and exit\n"
-              "  -V, --version              output version information and exit\n"
-              "  -d, --debug                do not run as daemon\n"
-              "  -v, --verbose              print extensive debug output\n"
-              "  -f, --file-prefix <prefix> path and prefix for event files\n"
-              "  -c, --cert <file>          location of server certificate\n"
-              "  -k, --key  <file>          location of server private key\n"
-              "  -C, --CAdir <dir>          directory containing CA certificates\n"
-              "  -b, --book                 send events to bookkeeping server only\n"
-              "  -l, --log-server <host>    specify address of log server\n"
-              "  -s, --socket <path>        non-default path of local socket\n"
-              "  -L, --lazy [<timeout>]     be lazy when closing connections to servers (default, timeout==0 means turn lazy off)\n"
-              "  -p, --parallel [<num>]     use <num> parallel streams to the same server\n"
-#ifdef LB_PERF
-              "  -n, --nosend               PERFTEST: consume events instead of sending\n"
-              "  -S, --nosync               PERFTEST: do not check logd files for lost events\n"
-              "  -R, --norecover            PERFTEST: do not start recovery thread\n"
-              "  -P, --noparse              PERFTEST: do not parse messages, use built-in server address\n"
-#ifdef PERF_EVENTS_INLINE
-              "  -e, --event_file <file>    PERFTEST: file to read test events from\n"
-              "  -j, --njobs <n>            PERFTEST: number of jobs to send\n"
-#endif
-#endif
-              , program_name, program_name);
-       exit(status);
-}
-
-
-/* Option flags and variables */
-static int debug;
-static int verbose = 0;
-char *file_prefix = DEFAULT_PREFIX;
-int bs_only = 0;
-int lazy_close = 1;
-int default_close_timeout;
-size_t max_store_size;
-int parallel = 0;
-#ifdef LB_PERF
-int nosend = 0, norecover=0, nosync=0, noparse=0;
-char *event_source = NULL;
-int njobs = 0;
-#endif
-
-char *cert_file = NULL;
-char *key_file  = NULL;
-char *CAcert_dir = NULL;
-char *log_server = NULL;
-char *socket_path = DEFAULT_SOCKET;
-
-static struct option const long_options[] =
-{
-  {"help", no_argument, 0, 'h'},
-  {"version", no_argument, 0, 'V'},
-  {"verbose", no_argument, 0, 'v'},
-  {"debug", no_argument, 0, 'd'},
-  {"file-prefix", required_argument, 0, 'f'},
-  {"cert", required_argument, 0, 'c'},
-  {"key", required_argument, 0, 'k'},
-  {"book", no_argument, 0, 'b'},
-  {"CAdir", required_argument, 0, 'C'},
-  {"log-server", required_argument, 0, 'l'},
-  {"socket", required_argument, 0, 's'},
-  {"lazy", optional_argument, 0, 'L'},
-  {"max-store", required_argument, 0, 'M'},
-  {"parallel", optional_argument, 0, 'p'},
-#ifdef LB_PERF
-  {"nosend", no_argument, 0, 'n'},
-  {"nosync", no_argument, 0, 'S'},
-  {"norecover", no_argument, 0, 'R'},
-  {"noparse", no_argument, 0, 'P'},
-#ifdef PERF_EVENTS_INLINE
-  {"event_file", required_argument, 0, 'e'},
-  {"njobs", required_argument, NULL, 'j'},
-#endif
-#endif
-  {NULL, 0, NULL, 0}
-};
-
-
-
-/* Set all the option flags according to the switches specified.
-   Return the index of the first non-option argument.  */
-static int
-decode_switches (int argc, char **argv)
-{
-  int c;
-
-  debug = 0;
-
-  while ((c = getopt_long (argc, argv,
-                          "f:"  /* file prefix */
-                          "h"  /* help */
-                          "V"  /* version */
-                          "v"  /* verbose */
-                          "c:"          /* certificate */
-                          "k:"          /* key */
-                          "C:"          /* CA dir */
-                          "b"  /* only bookeeping */
-               "l:" /* log server */
-                          "d" /* debug */
-                          "p" /* parallel */
-#ifdef LB_PERF
-                          "n" /* nosend */
-                          "S" /* nosync */
-                          "R" /* norecover */
-                          "P" /* noparse */
-#ifdef PERF_EVENTS_INLINE
-                          "e:" /* event file */
-                          "j:" /* num jobs */
-#endif
-#endif
-                          "L::" /* lazy */
-                          "s:" /* socket */
-                          "M:" /* max-store */,
-                          long_options, (int *) 0)) != EOF)
-    {
-      switch (c)
-       {
-       case 'V':
-         printf ("interlogger %s\n", VERSION);
-         exit (0);
-
-       case 'v':
-         verbose = 1;
-         break;
-
-       case 'h':
-         usage (0);
-
-       case 'd':
-         debug = 1;
-         break;
-
-       case 'f':
-         file_prefix = strdup(optarg);
-         break;
-
-       case 'c':
-         cert_file = strdup(optarg);
-         break;
-
-       case 'k':
-         key_file = strdup(optarg);
-         break;
-
-       case 'b':
-         bs_only = 1;
-         break;
-
-       case 'l':
-         log_server = strdup(optarg);
-         break;
-
-       case 'C':
-         CAcert_dir = strdup(optarg);
-         break;
-
-       case 's':
-         socket_path = strdup(optarg);
-         break;
-
-       case 'L':
-               lazy_close = 1;
-               if(optarg)
-                       default_close_timeout = atoi(optarg);
-                       if(default_close_timeout == 0) {
-                               default_close_timeout = TIMEOUT;
-                               lazy_close = 0;
-                       }
-               else
-                       default_close_timeout = TIMEOUT;
-               break;
-
-       case 'M':
-               max_store_size = atoi(optarg);
-               break;
-
-       case 'p':
-               if(optarg)
-                       parallel = atoi(optarg);
-               else
-                       parallel = 4;
-               break;
-
-#ifdef LB_PERF
-       case 'n':
-               nosend = 1;
-               break;
-
-       case 'R':
-               norecover = 1;
-               break;
-
-       case 'S':
-               nosync = 1;
-               break;
-
-       case 'P':
-               noparse = 1;
-               break;
-
-#ifdef PERF_EVENTS_INLINE
-       case 'e':
-               event_source = strdup(optarg);
-               break;
-
-       case 'j':
-               njobs = atoi(optarg);
-               break;
-#endif
-#endif
-
-       default:
-         usage (EXIT_FAILURE);
-       }
-    }
-
-  return optind;
-}
-
-
-void handle_signal(int num) {
-    il_log(LOG_DEBUG, "Received signal %d\n", num);
-    killflg++;
-}
-
-
-int
-main (int argc, char **argv)
-{
-  int i;
-  char *p;
-  edg_wll_GssStatus gss_stat;
-  int ret;
-
-  program_name = argv[0];
-
-  setlinebuf(stdout);
-  setlinebuf(stderr);
-
-  if ((p = getenv("EDG_WL_INTERLOG_TIMEOUT"))) TIMEOUT = atoi(p);
-
-  i = decode_switches (argc, argv);
-
-  /* force -b if we do not have log server */
-  if(log_server == NULL) {
-    log_server = strdup(DEFAULT_LOG_SERVER);
-    bs_only = 1;
-  }
-
-  if(init_errors(verbose ? LOG_DEBUG : LOG_WARNING)) {
-    fprintf(stderr, "Failed to initialize error message subsys. Exiting.\n");
-    exit(EXIT_FAILURE);
-  }
-
-  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR
-      || signal(SIGABRT, handle_signal) == SIG_ERR
-      || signal(SIGTERM, handle_signal) == SIG_ERR
-      || signal(SIGINT, handle_signal) == SIG_ERR) {
-    perror("signal");
-    exit(EXIT_FAILURE);
-  }
-
-  if(!debug &&
-     (daemon(0,0) < 0)) {
-    perror("daemon");
-    exit(EXIT_FAILURE);
-  }
-
-#ifdef LB_PERF
-  /* this must be called after installing signal handlers */
-  glite_wll_perftest_init(NULL, /* host */
-                         NULL, /* user */
-                         NULL, /* test name */
-                         event_source,
-                         njobs);
-#endif
-
-  il_log(LOG_INFO, "Initializing input queue...\n");
-  if(input_queue_attach() < 0) {
-    il_log(LOG_CRIT, "Failed to initialize input queue: %s\n", error_get_msg());
-    exit(EXIT_FAILURE);
-  }
-
-  /* initialize output queues */
-  il_log(LOG_INFO, "Initializing event queues...\n");
-  if(queue_list_init(log_server) < 0) {
-    il_log(LOG_CRIT, "Failed to initialize output event queues: %s\n", error_get_msg());
-    exit(EXIT_FAILURE);
-  }
-  if(lazy_close)
-         il_log(LOG_DEBUG, "  using lazy mode when closing connections, timeout %d\n",
-                default_close_timeout);
-
-  /* get credentials */
-  if (CAcert_dir)
-     setenv("X509_CERT_DIR", CAcert_dir, 1);
-  edg_wll_gss_watch_creds(cert_file,&cert_mtime);
-  cred_handle = malloc(sizeof(*cred_handle));
-  if(cred_handle == NULL) {
-         il_log(LOG_CRIT, "Failed to allocate structure for credentials.\n");
-         exit(EXIT_FAILURE);
-  }
-  cred_handle->creds = NULL;
-  cred_handle->counter = 0;
-  ret = edg_wll_gss_acquire_cred_gsi(cert_file, key_file, &cred_handle->creds, &gss_stat);
-  if (ret) {
-     char *gss_err = NULL;
-     char *str;
-
-     if (ret == EDG_WLL_GSS_ERROR_GSS)
-       edg_wll_gss_get_error(&gss_stat, "edg_wll_gss_acquire_cred_gsi()", &gss_err);
-     asprintf(&str, "Failed to load GSI credential: %s\n",
-             (gss_err) ? gss_err : "edg_wll_gss_acquire_cred_gsi() failed");
-     il_log(LOG_CRIT, str);
-     free(str);
-     if (gss_err)
-       free(gss_err);
-     exit(EXIT_FAILURE);
-  }
-
-#ifndef PERF_EMPTY
-  /* find all unsent events waiting in files */
-#ifdef LB_PERF
-  if(norecover) {
-         if(event_store_init(file_prefix) < 0) {
-                 il_log(LOG_CRIT, "Failed to init event stores: %s\n", error_get_msg());
-                 exit(EXIT_FAILURE);
-         }
-  } else
-#endif
-  {
-         pthread_t rid;
-
-         il_log(LOG_INFO, "Starting recovery thread...\n");
-         if(pthread_create(&rid, NULL, recover_thread, NULL) < 0) {
-                 il_log(LOG_CRIT, "Failed to start recovery thread: %s\n", strerror(errno));
-                 exit(EXIT_FAILURE);
-         }
-         pthread_detach(rid);
-  }
-#endif
-
-  il_log(LOG_INFO, "Entering main loop...\n");
-
-  /* do the work */
-  if(loop() < 0) {
-    il_log(LOG_CRIT, "Fatal error: %s\n", error_get_msg());
-    if (killflg) {
-      input_queue_detach();
-      exit(EXIT_FAILURE);
-    }
-  }
-  il_log(LOG_INFO, "Done!\n");
-  input_queue_detach();
-
-  exit (0);
-}
diff --git a/org.glite.lb.logger/src/interlogd.h b/org.glite.lb.logger/src/interlogd.h
deleted file mode 100644 (file)
index b2fdde4..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-#ifndef INTERLOGGER_P_H
-#define INTERLOGGER_P_H
-
-#ident "$Header$"
-
-#include "il_error.h"
-#include "glite/security/glite_gss.h"
-#include "glite/lb/il_msg.h"
-
-#include <pthread.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-#ifdef HAVE_DMALLOC_H
-#include <dmalloc.h>
-#endif
-
-#define INTERLOGD_HANDLE_CMD
-#define INTERLOGD_FLUSH
-#define INTERLOGD_EMS
-
-#define DEFAULT_USER "michal"
-#define DEFAULT_LOG_SERVER "localhost"
-#define DEFAULT_TIMEOUT 60
-
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#endif
-
-#if defined(IL_NOTIFICATIONS)
-
-#include "glite/lb/notifid.h"
-
-#undef INTERLOGD_HANDLE_CMD
-#undef INTERLOGD_FLUSH
-#undef INTERLOGD_EMS
-#define IL_EVENT_ID_T          edg_wll_NotifId
-#define IL_EVENT_GET_UNIQUE(a) edg_wll_NotifIdGetUnique((a))
-#define IL_EVENT_ID_FREE(a)    edg_wll_NotifIdFree((a))
-#define IL_EVENT_ID_PARSE(a,b) edg_wll_NotifIdParse((a),(b))
-
-#else
-
-#define INTERLOGD_HANDLE_CMD
-#define INTERLOGD_FLUSH
-#define INTERLOGD_EMS
-#define IL_EVENT_ID_T          edg_wlc_JobId
-#define IL_EVENT_GET_UNIQUE(a) edg_wlc_JobIdGetUnique((a))
-#define IL_EVENT_ID_FREE(a)    edg_wlc_JobIdFree((a))
-#define IL_EVENT_ID_PARSE(a,b) edg_wlc_JobIdParse((a),(b))
-
-#endif
-
-
-#define EVENT_SEPARATOR '\n'
-
-// #define TIMEOUT      5
-extern int TIMEOUT;
-#define INPUT_TIMEOUT (60)
-#define EXIT_TIMEOUT (1*60)
-
-typedef struct cred_handle {
-       edg_wll_GssCred creds;
-       int counter;
-} cred_handle_t;
-extern cred_handle_t *cred_handle;
-
-extern pthread_mutex_t cred_handle_lock;
-extern pthread_key_t cred_handle_key;
-extern char *cert_file;
-extern char *key_file;
-extern char *CAcert_dir;
-extern int bs_only;
-extern int killflg;
-extern int lazy_close;
-extern int default_close_timeout;
-extern size_t max_store_size;
-extern int parallel;
-#ifdef LB_PERF
-extern int nosend, nosync, norecover, noparse;
-#ifdef PERF_EVENTS_INLINE
-extern char *event_source;
-#endif
-#endif
-
-/* shared data for thread communication */
-#ifdef INTERLOGD_FLUSH
-extern pthread_mutex_t flush_lock;
-extern pthread_cond_t flush_cond;
-#endif
-
-typedef struct {
-       /* il_octet_string_t */
-       int       len;
-       char     *data;
-       /* http message specific */
-       enum { IL_HTTP_OTHER,
-              IL_HTTP_GET,
-              IL_HTTP_POST,
-              IL_HTTP_REPLY
-       } msg_type;
-       int       reply_code;
-       char      *reply_string;
-       size_t    content_length;
-       char     *host;
-} il_http_message_t;
-
-/* this struct can be passed instead of il_octet_string as parameter */
-typedef union {
-       il_octet_string_t bin_msg;
-       il_http_message_t http_msg;
-} il_message_t;
-
-
-struct event_store {
-       char     *event_file_name;         /* file with events from local logger */
-       char     *control_file_name;       /* file with control information */
-       char     *job_id_s;                /* string form of the job id */
-       long      last_committed_bs;       /* offset behind event that was last committed by BS */
-       long      last_committed_ls;       /*  -"-                                           LS */
-       long      offset;                  /* expected file position of next event */
-       time_t    last_modified;           /* time of the last file modification */
-       int       generation;              /* cleanup counter, scopes the offset */
-       long long                 rotate_index;                    /* rotation counter */
-       struct  event_store_list *le;      /* points back to the list */
-       pthread_rwlock_t commit_lock;      /* lock to prevent simultaneous updates to last_committed_* */
-       pthread_rwlock_t offset_lock;      /* lock to prevent simultaneous updates offset */
-       pthread_rwlock_t use_lock;         /* lock to prevent struct deallocation */
-#if defined(IL_NOTIFICATIONS)
-       char     *dest;                    /* host:port destination */
-#endif
-};
-
-
-struct server_msg {
-       char                   *job_id_s;       /* necessary for commit */
-       long                    offset;         /* just for printing more information to debug */
-       char                   *msg;
-       int                     len;
-       int                     ev_len;
-       struct event_store     *es;             /* cache for corresponding event store */
-       int                     generation;     /* event store genereation */
-       long                    receipt_to;     /* receiver (long local-logger id - LLLID) of delivery confirmation (for priority messages) */
-#if defined(IL_NOTIFICATIONS)
-       char                   *dest_name;
-       int                     dest_port;
-       char                   *dest;
-#endif
-       time_t                  expires;        /* time (in seconds from epoch) the message expires */
-};
-
-
-struct event_queue {
-       edg_wll_GssConnection   gss;            /* GSS connection */
-       char                   *dest_name;
-       int                     dest_port;
-       int                     timeout;        /* queue timeout */
-       struct event_queue_msg *tail;           /* last message in the queue */
-       struct event_queue_msg *head;           /* first message in the queue */
-#if defined(INTERLOGD_EMS)
-       struct event_queue_msg *tail_ems;       /* last priority message in the queue (or NULL) */
-       struct event_queue_msg *mark_this;      /* mark message for removal */
-       struct event_queue_msg *mark_prev;      /* predecessor of the marked message */
-#endif
-       pthread_t               thread_id;      /* id of associated thread */
-       pthread_rwlock_t        update_lock;    /* mutex for queue updates */
-       pthread_mutex_t         cond_lock;      /* mutex for condition variable */
-       pthread_cond_t          ready_cond;     /* condition variable for message arrival */
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-       int                     flushing;
-       int                     flush_result;   /* result of flush operation */
-       pthread_cond_t          flush_cond;     /* condition variable for flush operation */
-#endif
-       /* statistics */
-       int                     times_empty;    /* number of times the queue was emptied */
-       int                     max_len;        /* max queue length */
-       int                     cur_len;        /* current length */
-};
-
-
-/* credential destructor */
-void cred_handle_destroy(void *);
-
-/* server msg methods */
-struct server_msg *server_msg_create(il_octet_string_t *, long);
-struct server_msg *server_msg_copy(struct server_msg *);
-int server_msg_init(struct server_msg *, il_octet_string_t *);
-#if defined(INTERLOGD_EMS)
-int server_msg_is_priority(struct server_msg *);
-#endif
-int server_msg_free(struct server_msg *);
-
-/* general event queue methods */
-struct event_queue *event_queue_create(char *);
-int event_queue_free(struct event_queue *);
-int event_queue_empty(struct event_queue *);
-int event_queue_insert(struct event_queue *, struct server_msg *);
-int event_queue_get(struct event_queue *, struct server_msg **);
-int event_queue_remove(struct event_queue *);
-int event_queue_enqueue(struct event_queue *, char *);
-/* helper */
-int enqueue_msg(struct event_queue *, struct server_msg *);
-int event_queue_move_events(struct event_queue *, struct event_queue *, int (*)(struct server_msg *, void *), void *);
-
-/* protocol event queue methods */
-int event_queue_connect(struct event_queue *);
-int event_queue_send(struct event_queue *);
-int event_queue_close(struct event_queue *);
-int send_confirmation(long, int);
-
-/* thread event queue methods */
-int event_queue_create_thread(struct event_queue *);
-int event_queue_lock(struct event_queue *);
-int event_queue_unlock(struct event_queue *);
-int event_queue_lock_ro(struct event_queue *);
-int event_queue_signal(struct event_queue *);
-int event_queue_wait(struct event_queue *, int);
-int event_queue_sleep(struct event_queue *);
-int event_queue_wakeup(struct event_queue *);
-int event_queue_cond_lock(struct event_queue *);
-int event_queue_cond_unlock(struct event_queue *);
-
-/* input queue */
-int input_queue_attach();
-void input_queue_detach();
-int input_queue_get(il_octet_string_t **, long *, int);
-
-/* queue management functions */
-int queue_list_init(char *);
-struct event_queue *queue_list_get(char *);
-struct event_queue *queue_list_first();
-struct event_queue *queue_list_next();
-int queue_list_is_log(struct event_queue *);
-
-#if defined(IL_NOTIFICATIONS)
-struct event_queue *notifid_map_get_dest(const char *);
-int notifid_map_set_dest(const char *, struct event_queue *);
-time_t notifid_map_get_expiration(const char *);
-int notifid_map_set_expiration(const char *, time_t);
-#endif
-
-/* event store functions */
-int event_store_init(char *);
-int event_store_cleanup();
-int event_store_recover_all(void);
-struct event_store *event_store_find(char *, const char *);
-int event_store_sync(struct event_store *, long);
-int event_store_next(struct event_store *, long, int);
-int event_store_commit(struct event_store *, int, int, int);
-int event_store_recover(struct event_store *);
-int event_store_release(struct event_store *);
-/* int event_store_remove(struct event_store *); */
-
-#if defined(IL_WS)
-/* http functions */
-int parse_header(const char *, il_http_message_t *);
-int receive_http(void *, int (*)(void *, char *, const int), il_http_message_t *);
-#endif
-
-/* master main loop */
-int loop();
-
-/* recover thread */
-void *recover_thread(void*);
-
-#endif
diff --git a/org.glite.lb.logger/src/logd.c b/org.glite.lb.logger/src/logd.c
deleted file mode 100644 (file)
index 9197bad..0000000
+++ /dev/null
@@ -1,486 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <signal.h>
-#include <unistd.h> 
-#include <string.h>
-#include <getopt.h>
-#include <errno.h>
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/timeouts.h"
-#include "logd_proto.h"
-#include "glite/security/glite_gss.h"
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#endif
-
-static const char rcsid[] = "@(#)$Id$";
-static int verbose = 0;
-static int debug = 0;
-static int port = EDG_WLL_LOG_PORT_DEFAULT;
-static char *prefix = EDG_WLL_LOG_PREFIX_DEFAULT;
-static char *cert_file = NULL;
-static char *key_file = NULL;
-static char *CAcert_dir = NULL;
-static int noAuth = 0;
-static int noIPC = 0;
-static int noParse = 0;
-
-#define DEFAULT_SOCKET "/tmp/interlogger.sock"
-char *socket_path = DEFAULT_SOCKET;
-
-extern int confirm_sock;
-extern char confirm_sock_name[256];
-
-static struct option const long_options[] = {
-       { "help", no_argument, 0, 'h' },
-       { "version", no_argument, 0, 'V' },
-       { "verbose", no_argument, 0, 'v' },
-       { "debug", no_argument, 0, 'd' },
-       { "port", required_argument, 0, 'p' },
-       { "file-prefix", required_argument, 0, 'f' },
-       { "cert", required_argument, 0, 'c' },
-       { "key", required_argument, 0, 'k' },
-       { "CAdir", required_argument, 0, 'C' },
-       { "socket",required_argument, 0, 's' },
-       { "noAuth", no_argument, 0, 'x' },
-       { "noIPC", no_argument, 0, 'y' },
-       { "noParse", no_argument, 0, 'z' },
-       { NULL, 0, NULL, 0}
-};
-
-/*
- *----------------------------------------------------------------------
- *
- * usage - print usage
- *
- *----------------------------------------------------------------------
- */
-
-static void
-usage(char *program_name) {
-       fprintf(stdout,"%s\n"
-               "- collect events from logging API calls,\n"
-               "- save them to files and\n"
-               "- send them to inter-logger\n\n"
-               "Usage: %s [option]\n"
-               "-h, --help                 display this help and exit\n"
-               "-V, --version              output version information and exit\n"
-               "-d, --debug                do not run as daemon\n"
-               "-v, --verbose              print extensive debug output\n"
-               "-p, --port <num>           port to listen\n"
-               "-f, --file-prefix <prefix> path and prefix for event files\n"
-               "-c, --cert <file>          location of server certificate\n"
-               "-k, --key  <file>          location of server private key\n"
-               "-C, --CAdir <dir>          directory containing CA certificates\n"
-               "-s, --socket <dir>         interlogger's socket to send messages to\n"
-               "--noAuth                   do not check caller's identity\n"
-               "--noIPC                    do not send messages to inter-logger\n"
-               "--noParse                  do not parse messages for correctness\n",
-               program_name,program_name);
-}
-
-static sighandler_t mysignal(int num,sighandler_t handler)
-{
-       struct sigaction        sa,osa;
-
-       memset(&sa,0,sizeof(sa));
-       sa.sa_handler = handler;
-       sa.sa_flags = SA_RESTART;
-       return sigaction(num,&sa,&osa) ? SIG_ERR : osa.sa_handler;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * handle_signal -
- *     USR1 - increase the verbosity of the program
- *     USR2 - decrease the verbosity of the program
- *
- *----------------------------------------------------------------------
- */
-void handle_signal(int num) {
-       if (num != SIGCHLD) edg_wll_ll_log(LOG_NOTICE,"Received signal %d\n", num);
-       switch (num) {
-               case SIGUSR1:
-                       if (edg_wll_ll_log_level < LOG_DEBUG) edg_wll_ll_log_level++;
-                       edg_wll_ll_log(LOG_NOTICE,"Logging level is now %d\n", edg_wll_ll_log_level);
-                       break;
-               case SIGUSR2:
-                       if (edg_wll_ll_log_level > LOG_EMERG) edg_wll_ll_log_level--;
-                       edg_wll_ll_log(LOG_NOTICE,"Logging level is now %d\n", edg_wll_ll_log_level);
-                       break;
-               case SIGPIPE:
-                       edg_wll_ll_log(LOG_NOTICE,"Broken pipe, lost communication channel.\n");
-                       break;
-               case SIGCHLD:
-                       while (wait3(NULL,WNOHANG,NULL) > 0);
-                       break;
-               case SIGINT:
-               case SIGTERM:
-               case SIGQUIT:
-                       if (confirm_sock) {
-                               edg_wll_ll_log(LOG_NOTICE,"Closing confirmation socket.\n");
-                               close(confirm_sock);
-                               unlink(confirm_sock_name);
-                       }
-                       exit(1);
-                       break;
-               default: break;
-       }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * doit - do all the dirty work
- *
- *----------------------------------------------------------------------
- */
-static int
-doit(int socket, edg_wll_GssCred cred_handle, char *file_name_prefix, int noipc, int noparse)
-{
-    char       *subject;
-    int        ret,fd,count;
-    struct timeval timeout;
-    edg_wll_GssConnection      con;
-    edg_wll_GssStatus  gss_stat;
-    edg_wll_GssPrincipal client = NULL;
-    fd_set fdset;
-    struct sockaddr_in peer;
-    socklen_t  alen = sizeof peer;
-
-    ret = count = 0;
-    FD_ZERO(&fdset);
-
-    /* accept */
-    timeout.tv_sec = ACCEPT_TIMEOUT;
-    timeout.tv_usec = 0;
-    getpeername(socket,(struct sockaddr *) &peer,&alen);
-    edg_wll_ll_log(LOG_DEBUG,"Accepting connection (remaining timeout %d.%06d sec)\n",
-               (int)timeout.tv_sec, (int) timeout.tv_usec);
-    if ((ret = edg_wll_gss_accept(cred_handle,socket,&timeout,&con, &gss_stat)) < 0) {
-       edg_wll_ll_log(LOG_DEBUG,"timeout after gss_accept is %d.%06d sec\n",
-               (int)timeout.tv_sec, (int) timeout.tv_usec);
-        edg_wll_ll_log(LOG_ERR,"%s: edg_wll_gss_accept() failed\n",inet_ntoa(peer.sin_addr));
-       return edg_wll_log_proto_server_failure(ret,&gss_stat,"edg_wll_gss_accept() failed\n");
-    }
-
-    /* authenticate */
-    edg_wll_ll_log(LOG_INFO,"Processing authentication:\n");
-    ret = edg_wll_gss_get_client_conn(&con, &client, &gss_stat);
-    if (ret) {
-        char *gss_err;
-        edg_wll_gss_get_error(&gss_stat, "Cannot read client identification", &gss_err);
-        edg_wll_ll_log(LOG_WARNING, "%s: %s\n", inet_ntoa(peer.sin_addr),gss_err);
-        free(gss_err);
-    }
-
-    if (ret || client->flags & EDG_WLL_GSS_FLAG_ANON) {
-       edg_wll_ll_log(LOG_INFO,"  User not authenticated, setting as \"%s\". \n",EDG_WLL_LOG_USER_DEFAULT);
-       subject=strdup(EDG_WLL_LOG_USER_DEFAULT);
-    } else {
-       edg_wll_ll_log(LOG_INFO,"  User successfully authenticated as:\n");
-       edg_wll_ll_log(LOG_INFO, "   %s\n", client->name);
-       subject=strdup(client->name);
-    }
-    if (client)
-       edg_wll_gss_free_princ(client);
-
-    /* get and process the data */
-    timeout.tv_sec = CONNECTION_TIMEOUT;
-    timeout.tv_usec = 0;
-    
-    while (timeout.tv_sec > 0) {
-       count++;
-       edg_wll_ll_log(LOG_DEBUG,"Waiting for data delivery no. %d (remaining timeout %d.%06d sec)\n",
-               count, (int)timeout.tv_sec, (int) timeout.tv_usec);
-       FD_SET(con.sock,&fdset);
-       fd = select(con.sock+1,&fdset,NULL,NULL,&timeout);
-       switch (fd) {
-       case 0: /* timeout */
-               edg_wll_ll_log(LOG_DEBUG,"Connection timeout expired\n");
-               timeout.tv_sec = 0; 
-               break;
-       case -1: /* error */
-               switch(errno) {
-               case EINTR:
-                       edg_wll_ll_log(LOG_DEBUG,"XXX: Waking up (remaining timeout %d.%06d sec)\n",
-                               (int)timeout.tv_sec, (int) timeout.tv_usec);
-                       continue;
-               default:
-                       SYSTEM_ERROR("select");
-                       timeout.tv_sec = 0;
-                       break;
-               }
-               break;
-       default:
-               edg_wll_ll_log(LOG_DEBUG,"Waking up (remaining timeout %d.%06d sec)\n",
-                       (int)timeout.tv_sec, (int) timeout.tv_usec);
-               break;
-       }
-       if (FD_ISSET(con.sock,&fdset)) {
-               ret = edg_wll_log_proto_server(&con,&timeout,subject,file_name_prefix,noipc,noparse);
-               if (ret != 0) {
-                       edg_wll_ll_log(LOG_DEBUG,"timeout after edg_wll_log_proto_server is %d.%06d sec\n",
-                               (int)timeout.tv_sec, (int) timeout.tv_usec);
-                       if (ret != EDG_WLL_GSS_ERROR_EOF) 
-                               edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): Error\n");
-                       else if (count == 1)
-                               edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): Error. EOF occured.\n");
-                       timeout.tv_sec = 0;
-                       timeout.tv_usec = 0;
-                       break;
-               } else {
-                       timeout.tv_sec = CONNECTION_TIMEOUT;
-                       timeout.tv_usec = 0;
-               }
-       }
-
-    }
-
-doit_end:
-       edg_wll_ll_log(LOG_DEBUG, "Closing descriptor '%d'...",con.sock);
-       edg_wll_gss_close(&con, NULL);
-       if (con.sock == -1) 
-               edg_wll_ll_log(LOG_DEBUG, "o.k.\n");
-       if (subject) free(subject);
-       return ret;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Main -
- *
- *----------------------------------------------------------------------
- */
-int main(int argc, char *argv[])
-{
-   int ret;
-   int childpid;
-   int opt;
-
-   int listener_fd;
-   int client_fd;
-   struct sockaddr_in client_addr;
-   int client_addr_len;
-
-   time_t      cert_mtime = 0, key_mtime = 0;
-   edg_wll_GssStatus   gss_stat;
-   edg_wll_GssCred     cred = NULL;
-
-
-   setlinebuf(stdout);
-   setlinebuf(stderr);
-
-   /* welcome */
-   fprintf(stdout,"\
-This is LocalLogger, part of Workload Management System in EU DataGrid & EGEE.\n");
-
-   /* get arguments */
-   while ((opt = getopt_long(argc,argv,
-       "h"  /* help */
-       "V"  /* version */
-       "v"  /* verbose */
-       "d"  /* debug */
-       "p:" /* port */
-       "f:" /* file prefix */
-       "c:" /* certificate */
-       "k:" /* key */
-       "C:" /* CA dir */
-       "s:" /* socket */
-       "x"  /* noAuth */
-       "y"  /* noIPC */
-       "z",  /* noParse */
-       long_options, (int *) 0)) != EOF) {
-
-       switch (opt) {
-               case 'V': fprintf(stdout,"%s:\t%s\n",argv[0],rcsid); exit(0);
-               case 'v': verbose = 1; break;
-               case 'd': debug = 1; break;
-               case 'p': port = atoi(optarg); break;
-               case 'f': prefix = optarg; break;
-               case 'c': cert_file = optarg; break;
-               case 'k': key_file = optarg; break;
-               case 'C': CAcert_dir = optarg; break;
-               case 's': socket_path = optarg; break;
-               case 'x': noAuth = 1; break;
-               case 'y': noIPC = 1; break;
-               case 'z': noParse = 1; break;
-               case 'h':
-               default:
-                       usage(argv[0]); exit(0);
-       }
-   }
-#ifdef LB_PERF
-   edg_wll_ll_log_init(verbose ? LOG_INFO : LOG_ERR);
-#else
-   edg_wll_ll_log_init(verbose ? LOG_DEBUG : LOG_INFO);
-#endif
-   edg_wll_ll_log(LOG_INFO,"Initializing...\n");
-
-   /* check noParse */
-   if (noParse) {
-       edg_wll_ll_log(LOG_INFO,"Parse messages for correctness... [no]\n");
-   } else {
-       edg_wll_ll_log(LOG_INFO,"Parse messages for correctness... [yes]\n");
-   }
-
-   /* check noIPC */
-   if (noIPC) {
-       edg_wll_ll_log(LOG_INFO,"Send messages also to inter-logger... [no]\n");
-   } else {
-       edg_wll_ll_log(LOG_INFO,"Send messages also to inter-logger... [yes]\n");
-   }
-
-   /* check prefix correctness */
-   if (strlen(prefix) > FILENAME_MAX - 34) {
-       edg_wll_ll_log(LOG_CRIT,"Too long prefix (%s) for file names, would not be able to write to log files. Exiting.\n",prefix);
-       exit(1);
-   }
-   /* TODO: check for write permisions */
-   edg_wll_ll_log(LOG_INFO,"Messages will be stored with the filename prefix \"%s\".\n",prefix);
-
-   if (CAcert_dir)
-       setenv("X509_CERT_DIR", CAcert_dir, 1);
-
-   /* initialize signal handling */
-   if (mysignal(SIGUSR1, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
-   if (mysignal(SIGUSR2, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
-   if (mysignal(SIGPIPE, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
-   if (mysignal(SIGHUP,  SIG_DFL) == SIG_ERR) { perror("signal"); exit(1); }
-   if (mysignal(SIGINT,  handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
-   if (mysignal(SIGQUIT, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
-   if (mysignal(SIGTERM, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
-   if (mysignal(SIGCHLD, handle_signal) == SIG_ERR) { perror("signal"); exit(1); }
-
-#ifdef LB_PERF
-   glite_wll_perftest_init(NULL, NULL, NULL, NULL, 0);
-#endif
-   edg_wll_gss_watch_creds(cert_file,&cert_mtime);
-   /* XXX DK: support noAuth */
-   ret = edg_wll_gss_acquire_cred_gsi(cert_file, key_file, &cred, &gss_stat);
-   if (ret) {
-       /* XXX DK: call edg_wll_gss_get_error() */
-       edg_wll_ll_log(LOG_CRIT,"Failed to get GSI credentials. Exiting.\n");
-       exit(1);
-   }
-
-   if (cred->name!=NULL) {
-       edg_wll_ll_log(LOG_INFO,"Server running with certificate: %s\n",cred->name);
-   } else if (noAuth) {
-       edg_wll_ll_log(LOG_INFO,"Server running without certificate\n");
-   }
-
-   /* do listen */
-   edg_wll_ll_log(LOG_INFO,"Listening on port %d\n",port);
-   listener_fd = do_listen(port);
-   if (listener_fd == -1) {
-       edg_wll_ll_log(LOG_CRIT,"Failed to listen on port %d\n",port);
-       edg_wll_gss_release_cred(&cred, NULL);
-       exit(-1);
-   } else {
-       edg_wll_ll_log(LOG_DEBUG,"Listener's socket descriptor is '%d'\n",listener_fd);
-   }
-
-   client_addr_len = sizeof(client_addr);
-   bzero((char *) &client_addr, client_addr_len);
-
-   /* daemonize */
-   if (debug) {
-       edg_wll_ll_log(LOG_INFO,"Running as daemon... [no]\n");
-   } else {
-       edg_wll_ll_log(LOG_INFO,"Running as daemon... [yes]\n");
-       if (daemon(0,0) < 0) {
-               edg_wll_ll_log(LOG_CRIT,"Failed to run as daemon. Exiting.\n");
-               SYSTEM_ERROR("daemon");
-               exit(1);
-       }
-   }
-
-   /*
-    * Main loop
-    */
-   while (1) {
-        int opt;
-
-       edg_wll_ll_log(LOG_INFO,"Accepting incomming connections...\n");
-       client_fd = accept(listener_fd, (struct sockaddr *) &client_addr,
-                       &client_addr_len);
-       if (client_fd < 0) {
-               close(listener_fd);
-               edg_wll_ll_log(LOG_CRIT,"Failed to accept incomming connections\n");
-               SYSTEM_ERROR("accept");
-               edg_wll_gss_release_cred(&cred, NULL);
-               exit(-1);
-       } else {
-               edg_wll_ll_log(LOG_DEBUG,"Incomming connection on socket '%d'\n",client_fd);
-       }
-
-       opt = 0;
-       if (setsockopt(client_fd,IPPROTO_TCP,TCP_CORK,(const void *) &opt,sizeof opt)) {
-               edg_wll_ll_log(LOG_WARNING,"Can't reset TCP_CORK\n");
-       }
-       opt = 1;
-       if (setsockopt(client_fd,IPPROTO_TCP,TCP_NODELAY,(const void *) &opt,sizeof opt)) {
-               edg_wll_ll_log(LOG_WARNING,"Can't set TCP_NODELAY\n");
-       }
-
-       switch (edg_wll_gss_watch_creds(cert_file,&cert_mtime)) {
-       edg_wll_GssCred newcred;
-       case 0: break;
-       case 1:
-               ret = edg_wll_gss_acquire_cred_gsi(cert_file,key_file,&newcred,&gss_stat);
-               if (ret) {
-                       edg_wll_ll_log(LOG_WARNING,"Reloading credentials failed, continue with older\n");
-               } else {
-                       edg_wll_ll_log(LOG_DEBUG,"Reloading credentials succeeded\n");
-                       edg_wll_gss_release_cred(&cred, NULL);
-                       cred = newcred;
-               }
-               break;
-       case -1:
-               edg_wll_ll_log(LOG_WARNING,"edg_wll_gss_watch_creds failed\n");
-               break;
-       }
-
-       /* FORK - change next line if fork() is not needed (for debugging for example) */
-#if 1
-       if ((childpid = fork()) < 0) {
-               SYSTEM_ERROR("fork");
-               if (client_fd) close(client_fd);
-       }
-       if (childpid == 0) {
-               ret = doit(client_fd,cred,prefix,noIPC,noParse);
-               if (client_fd) close(client_fd);
-               edg_wll_ll_log(LOG_DEBUG,"Exiting.\n", 
-                       CONNECTION_TIMEOUT);
-               exit(0);
-       }
-       if (childpid > 0) {
-               edg_wll_ll_log(LOG_DEBUG,"Forked a new child with PID %d\n",childpid);
-               if (client_fd) close(client_fd);
-       }
-#else
-       ret = doit(client_fd,cred,prefix,noIPC,noParse);
-       if (client_fd) close(client_fd);
-
-#endif
-    } /* while */
-
-end:
-       if (listener_fd) close(listener_fd);
-       edg_wll_gss_release_cred(&cred, NULL);
-       exit(ret);
-}
diff --git a/org.glite.lb.logger/src/logd_proto.c b/org.glite.lb.logger/src/logd_proto.c
deleted file mode 100644 (file)
index 6c4015d..0000000
+++ /dev/null
@@ -1,661 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <signal.h>
-#include <string.h>
-#include <syslog.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <errno.h>
-
-#include "glite/lbu/escape.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/events_parse.h"
-
-#include "logd_proto.h"
-
-static const int one = 1;
-
-extern char* socket_path;
-
-int edg_wll_ll_log_level;
-
-#define tv_sub(a,b) {\
-       (a).tv_usec -= (b).tv_usec;\
-       (a).tv_sec -= (b).tv_sec;\
-       if ((a).tv_usec < 0) {\
-               (a).tv_sec--;\
-               (a).tv_usec += 1000000;\
-       }\
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * send_answer_back - 
- *                     
- *----------------------------------------------------------------------
- */
-static int send_answer_back(edg_wll_GssConnection *con, int answer, struct timeval *timeout) {
-       size_t count = 0;
-       int err = 0;
-       int ans = answer;
-       u_int8_t ans_end[4];
-       edg_wll_GssStatus       gss_stat;
-
-       edg_wll_ll_log(LOG_INFO,"Sending answer \"%d\" back to client...",answer);
-        ans_end[0] = ans & 0xff; ans >>= 8;
-        ans_end[1] = ans & 0xff; ans >>= 8;
-        ans_end[2] = ans & 0xff; ans >>= 8;
-        ans_end[3] = ans;
-       if ((err = edg_wll_gss_write_full(con,ans_end,4,timeout,&count, &gss_stat)) < 0 ) {
-               edg_wll_ll_log(LOG_INFO,"error.\n");
-               return edg_wll_log_proto_server_failure(err,&gss_stat,"Error sending answer");
-       } else {
-               edg_wll_ll_log(LOG_INFO,"o.k.\n");
-               return 0;
-       }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * wait_for_confirmation -
- *
- * Args:    timeout - number of seconds to wait, 0 => wait indefinitely
- *
- * Returns:  1 => OK, *code contains error code sent by interlogger
- *           0 => timeout expired before anything interesting happened
- *          -1 => some error (see errno for details)
- *
- *----------------------------------------------------------------------
- */
-int confirm_sock;
-char confirm_sock_name[256];
-
-static
-int init_confirmation()
-{
-       struct sockaddr_un saddr;
-
-       /* create socket */
-       if((confirm_sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
-               SYSTEM_ERROR("socket");
-               edg_wll_ll_log(LOG_ERR,"init_confirmation(): error creating socket\n");
-               return(-1);
-       }
-
-       /* set the socket parameters */
-       memset(&saddr, 0, sizeof(saddr));
-       saddr.sun_family = AF_UNIX;
-       strcpy(saddr.sun_path, confirm_sock_name);
-
-       /* bind the socket */
-       if(bind(confirm_sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
-               SYSTEM_ERROR("bind");
-               edg_wll_ll_log(LOG_ERR,"init_confirmation(): error binding socket\n");
-               close(confirm_sock);
-               unlink(confirm_sock_name);
-               return(-1);
-       }
-
-       /* and listen */
-       if(listen(confirm_sock, 5) < 0) {
-               SYSTEM_ERROR("listen");
-               edg_wll_ll_log(LOG_ERR,"init_confirmation(): error listening on socket\n");
-               close(confirm_sock);
-               unlink(confirm_sock_name);
-               return(-1);
-       }
-
-       return(0);
-}
-
-
-int wait_for_confirmation(struct timeval *timeout, int *code)
-{
-       fd_set fds;
-       struct timeval  to,before,after;
-       int ret = 0, tmp = 0;
-
-       *code = 0;
-
-       FD_ZERO(&fds);
-       FD_SET(confirm_sock, &fds);
-
-       /* set timeout */
-       if (timeout) {
-               memcpy(&to,timeout,sizeof to);
-               gettimeofday(&before,NULL);
-       }
-
-       /* wait for confirmation at most timeout seconds */
-       if ((tmp=select(confirm_sock+1, &fds, NULL, NULL, timeout?&to:NULL)) < 0) {
-               SYSTEM_ERROR("select");
-               edg_wll_ll_log(LOG_ERR,"wait_for_confirmation(): error selecting socket\n");
-               ret = -1;
-       } else {
-               if (tmp == 0)
-                       ret = 0;
-               else {
-                       int nsd = accept(confirm_sock, NULL, NULL);
-                       ret = 1;
-                       if(nsd < 0) {
-                               SYSTEM_ERROR("accept");
-                               edg_wll_ll_log(LOG_ERR,"wait_for_confirmation(): error accepting a connection on a socket\n");
-                               ret = -1;
-                       } else {
-                               if(recv(nsd, code, sizeof(*code), MSG_NOSIGNAL) < 0) {
-                                       SYSTEM_ERROR("recv");
-                                       edg_wll_ll_log(LOG_ERR,"wait_for_confirmation(): error receiving a message from a socket\n");
-                                       ret = -1;
-                               }
-                               close(nsd);
-                       }
-               }
-       }
-       close(confirm_sock);
-       unlink(confirm_sock_name);
-        if (timeout) {
-           gettimeofday(&after,NULL);
-           tv_sub(after,before);
-           tv_sub(*timeout,after);
-           if (timeout->tv_sec < 0) {
-                timeout->tv_sec = 0;
-                timeout->tv_usec = 0;
-           }
-       }
-       return ret;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * do_listen - listen on given port
- *
- * Returns: socket handle or -1 if something fails
- *
- * Calls: socket, bind, listen
- *
- * Algorithm:
- *
- *----------------------------------------------------------------------
- */
-int do_listen(int port)
-{
-       int                ret;
-       int                sock;
-       struct sockaddr_in my_addr;
-
-       memset(&my_addr, 0, sizeof(my_addr));
-       my_addr.sin_family = AF_INET;
-       my_addr.sin_addr.s_addr = INADDR_ANY;
-       my_addr.sin_port = htons(port);
-
-       sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
-       if (sock == -1) { 
-               SYSTEM_ERROR("socket"); 
-               edg_wll_ll_log(LOG_ERR,"do_listen(): error creating socket\n");
-               return -1; 
-       }
-
-       setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-       ret = bind(sock, (struct sockaddr *)&my_addr, sizeof(my_addr));
-       if (ret == -1) { 
-               SYSTEM_ERROR("bind"); 
-               edg_wll_ll_log(LOG_ERR,"do_listen(): error binding socket\n");
-               return -1; 
-       }
-
-       ret = listen(sock, 5);
-       if (ret == -1) { 
-               SYSTEM_ERROR("listen"); 
-               edg_wll_ll_log(LOG_ERR,"do_listen(): error listening on socket\n");
-               close(sock); 
-               return -1; 
-       }
-
-       return sock;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * edg_wll_log_proto_server - handle incoming data
- *
- * Returns: 0 if done properly or errno
- *
- * Calls:
- *
- * Algorithm:
- *
- *----------------------------------------------------------------------
- */
-int edg_wll_log_proto_server(edg_wll_GssConnection *con, struct timeval *timeout, char *name, char *prefix, int noipc, int noparse)
-{
-       char    *buf,*dglllid,*dguser,*jobId,*name_esc;
-       char    header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH+1];
-       char    outfilename[FILENAME_MAX];
-       size_t  count;
-       int     count_total,size;
-       u_int8_t size_end[4];
-       size_t  msg_size,dglllid_size,dguser_size;
-       int     i,answer,answer_sent;
-       int     msg_sock;
-       char    *msg,*msg_begin;
-       FILE    *outfile;
-       int     filedesc,filelock_status,flags;
-       long    filepos;
-       struct flock filelock;
-       int     priority;
-       long    lllid;
-       int     unique;
-       int     err;
-       edg_wll_Context context;
-       edg_wll_Event   *event;
-       edg_wlc_JobId   j;
-       edg_wll_GssStatus       gss_stat;
-                
-       errno = i = answer = answer_sent = size = msg_size = dglllid_size = dguser_size = count = count_total = msg_sock = filedesc = filelock_status = /* priority */ unique = err = 0;     
-        buf = dglllid = dguser = jobId = name_esc = msg = msg_begin = NULL;
-       event = NULL;
-
-       /* init */
-       if (edg_wll_InitContext(&context) != 0) {
-               edg_wll_ll_log(LOG_ERR,"edg_wll_InitContex(): error.\n");
-               answer = ENOMEM; 
-               goto edg_wll_log_proto_server_end; 
-       }
-       if (edg_wll_ResetError(context) != 0) { 
-               edg_wll_ll_log(LOG_ERR,"edg_wll_ResetError(): error.\n");
-               answer = ENOMEM; 
-               goto edg_wll_log_proto_server_end;
-       }
-
-       /* look for the unique unused long local-logger id (LLLID) */
-       lllid = 1000*getpid();
-       for (i=0; (i<1000)&&(!unique); i++) {
-               lllid += i;
-               snprintf(confirm_sock_name, sizeof(confirm_sock_name), "/tmp/dglogd_sock_%ld", lllid);
-               if ((filedesc = open(confirm_sock_name,O_CREAT)) == -1) {
-                       if (errno == EEXIST) {
-                               edg_wll_ll_log(LOG_WARNING,"Warning: LLLID %ld already in use.\n",lllid);
-                       } else {
-                               SYSTEM_ERROR("open");
-                       }
-               } else {
-                       unique = 1;
-                       close(filedesc); filedesc = 0;
-                       unlink(confirm_sock_name);
-               }
-       }
-       if (!unique) {
-               edg_wll_ll_log(LOG_ERR,"Cannot determine the unique long local-logger id (LLLID)!\n",lllid);
-               return EAGAIN;
-       }
-       edg_wll_ll_log(LOG_INFO,"Long local-logger id (LLLID): %ld\n",lllid);
-
-       /* receive socket header */
-       edg_wll_ll_log(LOG_INFO,"Reading socket header...");
-       memset(header, 0, EDG_WLL_LOG_SOCKET_HEADER_LENGTH+1);
-       if ((err = edg_wll_gss_read_full(con, header, EDG_WLL_LOG_SOCKET_HEADER_LENGTH, timeout, &count, &gss_stat)) < 0) {
-               if (err == EDG_WLL_GSS_ERROR_EOF) {
-                       edg_wll_ll_log(LOG_INFO,"no data available.\n");
-                       answer = err;
-                       answer_sent = 1; /* i.e. do not try to send answer back */
-               } else {
-                       edg_wll_ll_log(LOG_INFO,"error.\n");
-                       answer = edg_wll_log_proto_server_failure(err,&gss_stat,"Error receiving header");
-               }
-               goto edg_wll_log_proto_server_end;
-       } else {
-               edg_wll_ll_log(LOG_INFO,"o.k.\n");
-       }
-
-       edg_wll_ll_log(LOG_DEBUG,"Checking socket header...");
-       header[EDG_WLL_LOG_SOCKET_HEADER_LENGTH] = '\0';
-       if (strncmp(header,EDG_WLL_LOG_SOCKET_HEADER,EDG_WLL_LOG_SOCKET_HEADER_LENGTH)) {
-               /* not the proper socket header text */
-               edg_wll_ll_log(LOG_DEBUG,"error.\n");
-               edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): invalid socket header\n");
-               edg_wll_ll_log(LOG_DEBUG,"edg_wll_log_proto_server(): read header '%s' instead of '%s'\n",
-                               header,EDG_WLL_LOG_SOCKET_HEADER);
-               answer = EINVAL;
-               goto edg_wll_log_proto_server_end;
-       } else {
-               edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-       }
-
-/* XXX: obsolete
-       edg_wll_ll_log(LOG_DEBUG,"Reading message priority...");
-       count = 0;
-       if ((err = edg_wll_gss_read_full(con, &priority, sizeof(priority), timeout, &count, &gss_stat)) < 0) {
-               edg_wll_ll_log(LOG_DEBUG,"error.\n");
-               answer = edg_wll_log_proto_server_failure(err,&gss_stat,"Error receiving message priority");
-                goto edg_wll_log_proto_server_end;
-        } else {
-               edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-       }
-*/
-
-        edg_wll_ll_log(LOG_DEBUG,"Reading message size...");
-       count = 0;
-       if ((err = edg_wll_gss_read_full(con, size_end, 4, timeout, &count,&gss_stat)) < 0) {
-               edg_wll_ll_log(LOG_DEBUG,"error.\n");
-               answer = edg_wll_log_proto_server_failure(err,&gss_stat,"Error receiving message size");
-                goto edg_wll_log_proto_server_end;
-       } else {
-               edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-       }
-       size = size_end[3]; size <<=8; 
-       size |= size_end[2]; size <<=8; 
-       size |= size_end[1]; size <<=8; 
-       size |= size_end[0];
-        edg_wll_ll_log(LOG_DEBUG,"Checking message size...");
-       if (size <= 0) {
-               edg_wll_ll_log(LOG_DEBUG,"error.\n");
-               /* probably wrong size in the header or nothing to read */
-               edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): invalid size read from socket header\n");
-               edg_wll_ll_log(LOG_DEBUG,"Read size '%d'.\n",size);
-               answer = EINVAL;
-               goto edg_wll_log_proto_server_end;
-       } else {
-               edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-               edg_wll_ll_log(LOG_DEBUG,"- Size read from header: %d bytes.\n",size);
-       }
-
-       /* format the DG.LLLID string */
-       if (asprintf(&dglllid,"DG.LLLID=%ld ",lllid) == -1) {
-               SYSTEM_ERROR("asprintf");
-               edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): nomem for DG.LLLID\n");
-               answer = ENOMEM;
-               goto edg_wll_log_proto_server_end;
-       }
-       dglllid_size = strlen(dglllid);
-
-       /* format the DG.USER string */
-       name_esc = glite_lbu_EscapeULM(name);
-       if (asprintf(&dguser,"DG.USER=\"%s\" ",name_esc) == -1) {
-               SYSTEM_ERROR("asprintf");
-               edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): nomem for DG.USER\n");
-               answer = ENOMEM;
-               goto edg_wll_log_proto_server_end;
-       }
-       dguser_size = strlen(dguser);
-
-       /* allocate enough memory for all data */
-       msg_size = dglllid_size + dguser_size + size + 1;
-       if ((msg = malloc(msg_size)) == NULL) {
-               SYSTEM_ERROR("malloc");
-               edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): out of memory for allocating message\n");
-               answer = ENOMEM;
-               goto edg_wll_log_proto_server_end;
-       }
-       strncpy(msg,dglllid,dglllid_size);
-       msg_begin = msg + dglllid_size; // this is the "official" beginning of the message
-       strncpy(msg_begin,dguser,dguser_size);
-
-       /* receive message */
-       edg_wll_ll_log(LOG_INFO,"Reading message from socket...");
-       buf = msg_begin + dguser_size;
-       count = 0;
-       if ((err = edg_wll_gss_read_full(con, buf, size, timeout, &count, &gss_stat)) < 0) {
-               edg_wll_ll_log(LOG_INFO,"error.\n");
-               answer = edg_wll_log_proto_server_failure(err,&gss_stat,"Error receiving message");
-               goto edg_wll_log_proto_server_end;
-       } else {
-               edg_wll_ll_log(LOG_INFO,"o.k.\n");
-       }       
-
-       if (buf[count] != '\0') buf[count] = '\0';
-
-       /* parse message and get jobId and priority from it */
-       if (!noparse && strstr(msg, "DG.TYPE=\"command\"") == NULL) {
-               edg_wll_ll_log(LOG_INFO,"Parsing message for correctness...");
-               if (edg_wll_ParseEvent(context,msg_begin,&event) != 0) { 
-                       edg_wll_ll_log(LOG_INFO,"error.\n");
-                       edg_wll_ll_log(LOG_ERR,"edg_wll_log_proto_server(): edg_wll_ParseEvent error\n");
-                       edg_wll_ll_log(LOG_ERR,"edg_wll_ParseEvent(): %s\n",context->errDesc);
-                       answer = edg_wll_Error(context,NULL,NULL);
-                       goto edg_wll_log_proto_server_end;
-               } else {
-                       edg_wll_ll_log(LOG_INFO,"o.k.\n");
-               }
-               edg_wll_ll_log(LOG_DEBUG,"Getting jobId from message...");
-               jobId = edg_wlc_JobIdGetUnique(event->any.jobId);
-               priority = event->any.priority;
-               edg_wll_FreeEvent(event);
-               event->any.priority = priority;
-               edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-       } else {
-               if ((event = edg_wll_InitEvent(EDG_WLL_EVENT_UNDEF)) == NULL) {
-                       edg_wll_ll_log(LOG_ERR, "edg_wll_InitEvent(): out of memory\n");
-                       answer = ENOMEM;
-                       goto edg_wll_log_proto_server_end;
-               }
-               edg_wll_ll_log(LOG_DEBUG,"Getting jobId from message...");
-               jobId = edg_wll_GetJobId(msg);
-               if (!jobId || edg_wlc_JobIdParse(jobId,&j)) {
-                       edg_wll_ll_log(LOG_DEBUG,"error.\n");
-                       edg_wll_ll_log(LOG_ERR,"ParseJobId(%s)\n",jobId?jobId:"NULL");
-                       answer = EINVAL;
-                       goto edg_wll_log_proto_server_end;
-               } else {
-                       edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-               }
-               free(jobId);
-               jobId = edg_wlc_JobIdGetUnique(j);
-               edg_wlc_JobIdFree(j);
-
-/* TODO: get the priority from message some better way */
-               if (strstr(msg, "DG.PRIORITY=1") != NULL)
-                       event->any.priority = 1;
-               else event->any.priority = 0;
-       }
-
-
-       /* if not command, save message to file */
-       if(strstr(msg, "DG.TYPE=\"command\"") == NULL) {
-               /* compose the name of the log file */
-//             edg_wll_ll_log(LOG_DEBUG,"Composing filename from prefix \"%s\" and unique jobId \"%s\"...",prefix,jobId);
-               count = strlen(prefix);
-               strncpy(outfilename,prefix,count); count_total=count;
-               strncpy(outfilename+count_total,".",1); count_total+=1; count=strlen(jobId);
-               strncpy(outfilename+count_total,jobId,count); count_total+=count;
-               outfilename[count_total]='\0';
-//             edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-
-               /* fopen and properly handle the filelock */
-#ifdef LOGD_NOFILE
-               edg_wll_ll_log(LOG_NOTICE,"NOT writing message to \"%s\".\n",outfilename);
-               filepos = 0;
-#else
-               edg_wll_ll_log(LOG_INFO,"Writing message to \"%s\"...",outfilename);
-               if ( edg_wll_log_event_write(context, outfilename, msg, FCNTL_ATTEMPTS, FCNTL_TIMEOUT, &filepos) ) {
-                       char *errd;
-                       SYSTEM_ERROR("edg_wll_log_event_write");
-                       answer = edg_wll_Error(context, NULL, &errd);
-                       edg_wll_ll_log(LOG_ERR,"edg_wll_log_event_write error: %s\n",errd);
-                       free(errd);
-                       goto edg_wll_log_proto_server_end;
-               } else edg_wll_ll_log(LOG_INFO,"o.k.\n");
-#endif
-       } else {
-               filepos = 0;
-       }
-
-#ifdef LB_PERF
-       edg_wll_ll_log(LOG_INFO,"Calling perftest\n");
-       glite_wll_perftest_consumeEventString(msg);
-       edg_wll_ll_log(LOG_INFO,"o.k.\n");
-#endif
-
-       /* if not priority send now the answer back to client */
-       if (!(event->any.priority & (EDG_WLL_LOGFLAG_SYNC|EDG_WLL_LOGFLAG_SYNC_COMPAT))) {
-               if (!send_answer_back(con,answer,timeout)) { 
-                       answer_sent = 1;
-               }
-       } 
-
-       /* send message via IPC (UNIX socket) */
-       if (!noipc) {
-               if (event->any.priority & (EDG_WLL_LOGFLAG_SYNC|EDG_WLL_LOGFLAG_SYNC_COMPAT)) {
-                       edg_wll_ll_log(LOG_DEBUG,"Initializing 2nd UNIX socket (%s) for priority messages confirmation...",confirm_sock_name);
-                       if(init_confirmation() < 0) { 
-                               edg_wll_ll_log(LOG_DEBUG,"error.\n");
-                               answer = errno; 
-                               goto edg_wll_log_proto_server_end; 
-                       } else {
-                               edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-                       }
-               }         
-
-               edg_wll_ll_log(LOG_DEBUG,
-                       "Sending via IPC (UNIX socket \"%s\")\n\t"
-                       "the message position %ld (%d bytes)",
-                       socket_path, filepos, sizeof(filepos));
-               if ( edg_wll_log_event_send(context, socket_path, filepos, msg, msg_size, CONNECT_ATTEMPTS, timeout) ) {
-                       char *errd;
-                       SYSTEM_ERROR("edg_wll_log_event_send");
-                       answer = edg_wll_Error(context, NULL, &errd);
-                       edg_wll_ll_log(LOG_ERR,"edg_wll_log_event_send error: %s\n",errd);
-                       free(errd);
-                       goto edg_wll_log_proto_server_end_1;
-               } else edg_wll_ll_log(LOG_DEBUG,"o.k.\n");
-
-               if (event->any.priority & (EDG_WLL_LOGFLAG_SYNC|EDG_WLL_LOGFLAG_SYNC_COMPAT)) {
-                       edg_wll_ll_log(LOG_INFO,"Waiting for confirmation...");
-                       if ((count = wait_for_confirmation(timeout, &answer)) < 0) {
-                               edg_wll_ll_log(LOG_INFO,"error.\n");
-                               edg_wll_ll_log(LOG_ERR,"wait_for_confirmation(): error.\n"); 
-                               answer = errno;
-                       } else {
-                               edg_wll_ll_log(LOG_INFO,"o.k.\n");
-                               if (count == 0) {
-                                       edg_wll_ll_log(LOG_DEBUG,"Waking up, timeout expired.\n");
-                                       answer = EAGAIN;
-                               } else {
-                                       edg_wll_ll_log(LOG_DEBUG,"Confirmation received, waking up.\n");
-                               }
-                       }
-               }
-       } else {
-               edg_wll_ll_log(LOG_DEBUG,"NOT sending via IPC.\n");
-       }
-
-edg_wll_log_proto_server_end:
-       /* if not sent already, send the answer back to client */
-       if (!answer_sent) {
-               answer = send_answer_back(con,answer,timeout);
-       } 
-       /* clean */
-       edg_wll_FreeContext(context);
-       if (name_esc) free(name_esc);
-       if (dglllid) free(dglllid);
-       if (dguser) free(dguser);
-       if (jobId) free(jobId);
-       if (msg) free(msg);
-       if (event) free(event);
-
-//     edg_wll_ll_log(LOG_INFO,"Done.\n");
-
-       return answer;
-
-edg_wll_log_proto_server_end_1:
-       if (event->any.priority) {
-               close(confirm_sock);
-               unlink(confirm_sock_name);
-       }       
-       goto edg_wll_log_proto_server_end;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * edg_wll_log_proto_server_failure - handle protocol failures on the server side
- *
- * Returns: errno
- *
- *----------------------------------------------------------------------
- */
-int edg_wll_log_proto_server_failure(int code, edg_wll_GssStatus *gss_code, const char *text)
-{
-       const char      *func = "edg_wll_log_proto_server()";
-        int             ret = 0;
-
-       if(code>0) {
-                return(0);
-       }
-       switch(code) {
-               case EDG_WLL_GSS_ERROR_EOF: 
-                       edg_wll_ll_log(LOG_ERR,"%s: %s, EOF occured\n", func, text);    
-                       ret = EAGAIN;
-                       break;
-               case EDG_WLL_GSS_ERROR_TIMEOUT: 
-                       edg_wll_ll_log(LOG_ERR,"%s: %s, timeout expired\n", func, text);        
-                       ret = EAGAIN;
-                       break;
-               case EDG_WLL_GSS_ERROR_ERRNO: 
-                       SYSTEM_ERROR(func);
-                       edg_wll_ll_log(LOG_ERR,"%s: %s, system error occured\n", func, text);   
-                       ret = EAGAIN;
-                       break;
-               case EDG_WLL_GSS_ERROR_GSS:
-                       {
-                          char *gss_err;
-
-                          edg_wll_gss_get_error(gss_code, "GSS error occured", &gss_err);
-                          edg_wll_ll_log(LOG_ERR,"%s: %s, %s\n", func, text, gss_err);
-                          free(gss_err);
-                          ret = EAGAIN;
-                          break;
-                       }
-               default:
-                       edg_wll_ll_log(LOG_ERR,"%s: %s, unknown error occured\n");
-                       break;
-       }
-       return ret;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * edg_wll_ll_log_init - initialize the logging level
- *
- *----------------------------------------------------------------------
- */
-void edg_wll_ll_log_init(int level) {
-       edg_wll_ll_log_level = level;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * edg_wll_ll_log - print to stderr according to logging level
- *   serious messages are also written to syslog
- *
- *----------------------------------------------------------------------
- */
-void edg_wll_ll_log(int level, const char *fmt, ...) {
-       char *err_text;
-       va_list fmt_args;
-
-       va_start(fmt_args, fmt);
-       vasprintf(&err_text, fmt, fmt_args);
-       va_end(fmt_args);
-
-       if(level <= edg_wll_ll_log_level) 
-               fprintf(stderr, "[%d] %s", (int) getpid(), err_text);
-       if(level <= LOG_ERR) {
-               openlog(NULL, LOG_PID | LOG_CONS, LOG_DAEMON);
-               syslog(level, "%s", err_text);
-               closelog();
-       }
-
-       if (err_text) free(err_text);
-}
diff --git a/org.glite.lb.logger/src/logd_proto.h b/org.glite.lb.logger/src/logd_proto.h
deleted file mode 100644 (file)
index 2754e4a..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__
-#define __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__
-
-#ident "$Header$"
-
-/**
- * \file edg/workload/logging/locallogger/logd_proto.h
- * \brief server part of the logging protocol
- * \note private
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#include <syslog.h>
-
-#include "glite/lb/log_proto.h"
-#include "glite/security/glite_gss.h"
-
-int edg_wll_log_proto_server(edg_wll_GssConnection *con, struct timeval *timeout, char *name, char *prefix, int noipc, int noparse);
-int edg_wll_log_proto_server_failure(int code, edg_wll_GssStatus *gss_code, const char *text);
-
-#define SYSTEM_ERROR(my_err) { \
-       if (errno !=0 ) \
-               edg_wll_ll_log(LOG_ERR,"%s: %s\n",my_err,strerror(errno)); \
-       else \
-               edg_wll_ll_log(LOG_ERR,"%s\n",my_err); }
-
-/* locallogger daemon error handling */
-extern int edg_wll_ll_log_level;
-void edg_wll_ll_log_init(int level);
-void edg_wll_ll_log(int level, const char *fmt, ...);
-
-
-/* fcntl defaults */
-#define FCNTL_ATTEMPTS         5
-#define FCNTL_TIMEOUT          1
-
-/* connect defaults */
-#define CONNECT_ATTEMPTS       5
-
-/* accept defaults */
-#define ACCEPT_TIMEOUT         30
-
-/* connection defaults */
-#define CONNECTION_TIMEOUT     EDG_WLL_LOG_SYNC_TIMEOUT_MAX
-
-/* locallogger daemon listen and connect functions prototypes */
-int do_listen(int port);
-int do_connect(char *hostname, int port);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EDG_WORKLOAD_LOGGING_LOCALLOGGER_LOGD_PROTO_H__ */
diff --git a/org.glite.lb.logger/src/perftest_il.sh b/org.glite.lb.logger/src/perftest_il.sh
deleted file mode 100644 (file)
index e9d2ee5..0000000
+++ /dev/null
@@ -1,365 +0,0 @@
-#!/bin/bash
-
-numjobs=10
-
-# XXX - there must be better way to find stage
-if [ -z "${GLITE_LOCATION}" ]; then
-       STAGEDIR=/home/michal/shared/egee/jra1-head/stage
-else
-       STAGEDIR=${GLITE_LOCATION}
-fi
-
-. $STAGEDIR/sbin/perftest_common.sh
-
-DEBUG=${DEBUG:-0}
-# CONSUMER_ARGS=
-# PERFTEST_COMPONENT=
-# COMPONENT_ARGS=
-LOGJOBS_ARGS="-s /tmp/interlogger.perftest" 
-
-check_test_files || exit 1
-
-COMM_ARGS="-s /tmp/interlogger.perftest --file-prefix=/tmp/perftest.log"
-
-#TEST_GROUP=
-#TEST_VARIANT=
-
-SILENT=0
-while getopts "G:t:n:s" OPTION 
-do
-    case "$OPTION" in 
-    "G") TEST_GROUP=$OPTARG
-    ;;
-
-    "t") TEST_VARIANT=$OPTARG
-    ;;
-
-    "n") numjobs=$OPTARG
-    ;;
-
-    "s") SILENT=1
-    ;;
-
-    esac
-done
-
-
-group_a () 
-{
-if [[ $SILENT -eq 0 ]]
-then
-echo "-------------------------------------------"
-echo "Logging test:"
-echo "  - events sent through IPC and/or files"
-echo "  - events discarded by IL immediately"
-echo "-------------------------------------------"
-echo "a) events sent only by IPC"
-echo "b) events stored to files and sent by IPC"
-echo ""
-fi
-
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf-empty
-CONSUMER_ARGS="-d $COMM_ARGS"
-}
-
-group_a_test_a () 
-{
-    LOGJOBS_ARGS="--nofile $COMM_ARGS"
-    echo -n "a)"
-    run_test il $numjobs
-    print_result
-}
-
-group_a_test_b () {
-    LOGJOBS_ARGS=" $COMM_ARGS"
-    echo -n "b)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-
-
-# echo "--------------------------------"
-# echo "Interlogger test:"
-# echo "  - events sent through IPC only"
-# echo "  - events discarded in IL"
-# echo "--------------------------------"
-# echo "a) disabled event parsing, the server address (jobid) is hardcoded"
-# echo "b) disabled event synchronization from files"
-# echo "c) disabled recovery thread"
-# echo "d) lazy bkserver connection close"
-# echo "e) normal operation"
-# echo ""
-# echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-
-# PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf
-# LOGJOBS_ARGS="--nofile $COMM_ARGS"
-
-# CONSUMER_ARGS="-d --nosend --noparse $COMM_ARGS"
-# echo -n "a)"
-# run_test il $numjobs
-# print_result
-
-# CONSUMER_ARGS="-d --nosend --nosync $COMM_ARGS"
-# echo -n "b)"
-# run_test il $numjobs
-# print_result
-
-# CONSUMER_ARGS="-d --nosend --norecover $COMM_ARGS"
-# echo -n "c)"
-# run_test il $numjobs
-# print_result
-
-# echo "d)  this test is not yet implemented"
-
-# CONSUMER_ARGS="-d --nosend $COMM_ARGS"
-# echo -n "e)"
-# run_test il $numjobs
-# print_result
-
-
-group_b () {
-if [[ $SILENT -eq 0 ]]
-then
-echo "-----------------------------------"
-echo "Interlogger test:"
-echo "  - events sent through IPC & files"
-echo "  - events discarded in IL"
-echo "-----------------------------------"
-echo "a) disabled event parsing, the server address (jobid) is hardcoded"
-echo "b) disabled event synchronization from files"
-echo "c) disabled recovery thread"
-echo "x) disabled sync and recovery"
-echo "d) lazy bkserver connection close"
-echo "e) normal operation"
-echo ""
-fi
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf
-LOGJOBS_ARGS=" $COMM_ARGS"
-}
-
-group_b_test_a ()
-{
-    CONSUMER_ARGS="-d --nosend --noparse $COMM_ARGS"
-    echo -n "a)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_b_test_b () 
-{
-    CONSUMER_ARGS="-d --nosend --nosync $COMM_ARGS"
-    echo -n "b)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_b_test_c () 
-{
-    CONSUMER_ARGS="-d --nosend --norecover $COMM_ARGS"
-    echo -n "c)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_b_test_x ()
-{
-    CONSUMER_ARGS="-d --nosend --nosync --norecover $COMM_ARGS"
-    echo -n "x)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_b_test_d ()
-{
-    echo "d)  this test is not applicable"
-}
-
-group_b_test_e ()
-{
-    CONSUMER_ARGS="-d --nosend $COMM_ARGS"
-    echo -n "e)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-# echo "-------------------------------"
-# echo "Interlogger test:"
-# echo "  - events sent through IPC"
-# echo "  - events consumed by empty BS"
-# echo "-------------------------------"
-# echo "a) disabled event parsing, the server address (jobid) is hardcoded"
-# echo "b) disabled event synchronization from files"
-# echo "c) disabled recovery thread"
-# echo "d) lazy bkserver connection close"
-# echo "e) normal operation"
-# echo ""
-# echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-
-# PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-bkserverd
-# CONSUMER_ARGS="-d --perf-sink=1"
-# PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-interlogd-perf
-# LOGJOBS_ARGS="--nofile $COMM_ARGS"
-
-
-# COMPONENT_ARGS="-d  --noparse $COMM_ARGS"
-# echo -n "a)"
-# run_test il $numjobs
-# print_result
-# rm -f /tmp/perftest.log.*
-
-# COMPONENT_ARGS="-d  --nosync $COMM_ARGS"
-# echo -n "b)"
-# run_test il $numjobs
-# print_result
-# rm -f /tmp/perftest.log.*
-
-# COMPONENT_ARGS="-d  --norecover $COMM_ARGS"
-# echo -n "c)"
-# run_test il $numjobs
-# print_result
-# rm -f /tmp/perftest.log.*
-
-# echo "d) this test is not yet implemented"
-
-# COMPONENT_ARGS="-d $COMM_ARGS"
-# echo -n "e)"
-# run_test il $numjobs
-# print_result
-# rm -f /tmp/perftest.log.*
-
-
-group_c () 
-{
-if [[ $SILENT -eq 0 ]]
-then
-echo "-----------------------------------"
-echo "Interlogger test:"
-echo "  - events sent through IPC & files"
-echo "  - events consumed by empty BS"
-echo "-----------------------------------"
-echo "a) disabled event parsing, the server address (jobid) is hardcoded"
-echo "b) disabled event synchronization from files"
-echo "c) disabled recovery thread"
-echo "x) disabled sync and recovery"
-echo "d) lazy bkserver connection close"
-echo "e) normal operation"
-echo ""
-fi
-
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-bkserverd
-CONSUMER_ARGS="-d --perf-sink=1 -p 10500 -w 10503"
-PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-interlogd-perf
-LOGJOBS_ARGS=" -m localhost:10500 $COMM_ARGS"
-}
-
-group_c_test_a ()
-{
-    COMPONENT_ARGS="-d  --noparse $COMM_ARGS"
-    echo -n "a)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_c_test_b ()
-{
-    COMPONENT_ARGS="-d  --nosync $COMM_ARGS"
-    echo -n "b)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_c_test_c ()
-{
-    COMPONENT_ARGS="-d  --norecover $COMM_ARGS"
-    echo -n "c)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_c_test_x () 
-{
-    COMPONENT_ARGS="-d  --nosync --norecover $COMM_ARGS"
-    echo -n "x)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_c_test_d ()
-{
-    COMPONENT_ARGS="-d  --lazy=10 --nosync --norecover $COMM_ARGS"
-    echo -n "d)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-group_c_test_e ()
-{
-    COMPONENT_ARGS="-d $COMM_ARGS"
-    echo -n "e)"
-    run_test il $numjobs
-    print_result
-    rm -f /tmp/perftest.log.*
-}
-
-   
-if [[ $SILENT -eq 0 ]]
-then
-    while [[ -z $TEST_GROUP ]]
-    do
-       echo "Choose test group:"
-       echo "  a) logging source tests"
-       echo "  b) interlogger tests"
-       echo "  c) interlogger with external consumer tests"
-       echo -n "Your choice: "
-       read TEST_GROUP
-    done
-fi
-TEST_GROUP=`echo $TEST_GROUP | tr '[A-Z]' '[a-z]'`
-
-if [[ "x$TEST_GROUP" = "x*" ]]
-then
-    TEST_GROUP="a b c"
-fi
-
-for group in $TEST_GROUP
-do
-    group_$group
-
-    if [[ $SILENT -eq 0 ]]
-    then
-       while [[ -z $TEST_VARIANT ]]
-       do
-           echo -n "Your choice: "
-           read -e TEST_VARIANT
-       done
-       echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-    fi
-
-    if [[ "x$TEST_VARIANT" = "x*" ]]
-    then
-       case $TEST_GROUP in
-           "a") TEST_VARIANT="a b" ;;
-           *)   TEST_VARIANT="a b c x d e" ;;
-       esac
-    fi
-
-    for variant in $TEST_VARIANT
-    do
-       group_${group}_test_${variant}
-    done
-done
-
-exit;
-
diff --git a/org.glite.lb.logger/src/perftest_ll.sh b/org.glite.lb.logger/src/perftest_ll.sh
deleted file mode 100644 (file)
index d6fc67d..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/bin/bash
-
-numjobs=1
-
-# XXX - there must be better way to find stage
-if [ -z "${GLITE_LOCATION}" ]; then
-       STAGEDIR=/home/michal/shared/egee/jra1-head/stage
-else
-       STAGEDIR=${GLITE_LOCATION}
-fi
-
-. $STAGEDIR/sbin/perftest_common.sh
-
-SILENT=0
-while getopts "t:n:s" OPTION 
-do
-    case "$OPTION" in 
-    "t") TEST_VARIANT=$OPTARG
-    ;;
-
-    "n") numjobs=$OPTARG
-    ;;
-
-    "s") SILENT=1
-    ;;
-
-    esac
-done
-
-DEBUG=${DEBUG:-0}
-# CONSUMER_ARGS=
-# PERFTEST_COMPONENT=
-# COMPONENT_ARGS=
-# LOGJOBS_ARGS="" 
-COMM_ARGS="--file-prefix /tmp/perftest.log -p 45678"
-export EDG_WL_LOG_DESTINATION="localhost:45678"
-
-check_test_files || exit 1
-
-group_a () {
-echo "----------------
-Locallogger test
-----------------
-a) glite-lb-logd-perf-nofile --noParse --noIPC
-b) glite-lb-logd-perf-nofile --noIPC
-c) glite-lb-logd-perf --noIPC
-d) glite-lb-logd-perf
-
-Number of jobs: $numjobs
-"
-}
-
-
-# a)
-group_a_test_a ()
-{
-echo -n "a)"
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf-nofile
-CONSUMER_ARGS="-d --noIPC --noParse $COMM_ARGS"
-init_result
-run_test ll $numjobs
-#print_result_ev
-print_result
-}
-
-# b)
-group_a_test_b ()
-{
-echo -n "b)"
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf-nofile
-CONSUMER_ARGS="-d --noIPC $COMM_ARGS"
-init_result
-run_test ll $numjobs
-#print_result_ev
-print_result
-}
-
-# c)
-group_a_test_c () 
-{
-echo -n "c)"
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-logd-perf
-CONSUMER_ARGS="-d --noIPC $COMM_ARGS"
-init_result
-run_test ll $numjobs
-#print_result_ev
-print_result
-rm -f /tmp/perftest.log.*
-}
-
-# d)
-group_a_test_d ()
-{
-echo -n "d)"
-PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-interlogd-perf-empty
-CONSUMER_ARGS="-d -s /tmp/perftest.sock"
-PERFTEST_COMPONENT=$STAGEDIR/bin/glite-lb-logd-perf
-COMPONENT_ARGS="-d -s /tmp/perftest.sock $COMM_ARGS"
-init_result
-run_test ll $numjobs
-#print_result_ev
-print_result
-rm -f /tmp/perftest.log.*
-}
-
-group="a"
-
-group_$group
-
-if [[ $SILENT -eq 0 ]]
-then
-    while [[ -z $TEST_VARIANT ]]
-    do
-       echo -n "Your choice: "
-       read -e TEST_VARIANT
-    done
-    echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-fi
-
-if [[ "x$TEST_VARIANT" = "x*" ]]
-then
-   TEST_VARIANT="a b c d"
-fi
-
-for variant in $TEST_VARIANT
-do
-    group_${group}_test_${variant}
-done
diff --git a/org.glite.lb.logger/src/queue_mgr.c b/org.glite.lb.logger/src/queue_mgr.c
deleted file mode 100644 (file)
index 2879e14..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-#ident "$Header$"
-
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lb/context.h"
-
-#include "interlogd.h"
-
-struct queue_list {
-  struct event_queue *queue;
-  char   *dest;
-  struct queue_list *next;
-#if defined(IL_NOTIFICATIONS)
-  time_t expires;
-#endif
-};
-
-static struct event_queue *log_queue;
-static struct queue_list  *queues;
-
-
-static 
-int
-queue_list_create()
-{
-  queues = NULL;
-
-  return(0);
-}
-
-
-static
-int
-queue_list_find(struct queue_list *ql, const char *dest, struct queue_list **el, struct queue_list **prev)
-{
-  struct queue_list *q, *p;
-
-  assert(el != NULL);
-
-  *el = NULL;
-  if(prev)
-    *prev = NULL;
-
-  if(ql == NULL) 
-    return(0);
-
-  q = NULL;
-  p = ql;
-
-  while(p) {
-    if(strcmp(p->dest, dest) == 0) {
-      *el = p;
-      if(prev)
-       *prev = q;
-      return(1);
-    }
-
-    q = p;
-    p = p->next;
-  };
-
-  return(0);
-}
-
-
-static
-int
-queue_list_add(struct queue_list **ql, const char *dest, struct event_queue *eq)
-{
-  struct queue_list *el;
-  
-  assert(dest != NULL);
-  assert(eq != NULL);
-  assert(ql != NULL);
-
-  el = malloc(sizeof(*el));
-  if(el == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough room for new queue");
-    return(-1);
-  }
-
-  el->dest = strdup(dest);
-  if(el->dest == NULL) {
-    free(el);
-    set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough memory for new queue");
-    return(-1);
-  }
-  el->queue = eq;
-  el->next = *ql;
-  *ql = el;
-  return 0;
-}
-
-
-#if !defined(IL_NOTIFICATIONS)
-static
-char *
-jobid2dest(edg_wlc_JobId jobid)
-{
-  char *server_name,*out;
-  unsigned int server_port;
-
-  if (!jobid) {
-    set_error(IL_PROTO, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "jobid2dest: invalid job id");
-    return(NULL);
-  }
-  edg_wlc_JobIdGetServerParts(jobid,&server_name,&server_port);
-
-  asprintf(&out,"%s:%d",server_name,server_port);
-  free(server_name);
-  if(!out)
-    set_error(IL_SYS, ENOMEM, "jobid2dest: error creating server name");
-  return(out);
-}
-#endif
-
-struct event_queue *
-queue_list_get(char *job_id_s)
-{
-  char *dest;
-  struct queue_list *q;
-  struct event_queue *eq;
-#if !defined(IL_NOTIFICATIONS)
-  IL_EVENT_ID_T job_id;
-
-  if(job_id_s == NULL || strcmp(job_id_s, "default") == 0)
-    return(log_queue);
-
-  if(edg_wlc_JobIdParse(job_id_s, &job_id)) {
-    set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "queue_list_get: invalid job id");
-    return(NULL);
-  }
-
-  dest = jobid2dest(job_id);
-  edg_wlc_JobIdFree(job_id);
-#else
-  dest = job_id_s;
-#endif
-
-  if(dest == NULL) 
-    return(NULL);
-  
-  if(queue_list_find(queues, dest, &q, NULL)) {
-#if !defined(IL_NOTIFICATIONS)
-    free(dest);
-#endif
-    return(q->queue);
-  } else {
-    eq = event_queue_create(dest);
-    if(eq)
-      queue_list_add(&queues, dest, eq);
-#if !defined(IL_NOTIFICATIONS)
-    free(dest);
-#endif
-    return(eq);
-  }
-}
-
-
-int
-queue_list_is_log(struct event_queue *eq)
-{
-  return(eq == queue_list_get(NULL));
-}
-
-
-int
-queue_list_init(char *ls)
-{
-#if !defined(IL_NOTIFICATIONS)
-  /* create queue for log server */
-  log_queue = event_queue_create(ls);
-  if(log_queue == NULL)
-    return(-1);
-#endif
-
-  return(queue_list_create());
-}
-
-
-static struct queue_list *current;
-
-
-struct event_queue *
-queue_list_first()
-{
-  current = queues;
-  return(current ? current->queue : NULL);
-}
-
-
-struct event_queue *
-queue_list_next()
-{
-  current = current ? current->next : NULL;
-  return(current ? current->queue : NULL);
-}
-
-
-int
-queue_list_remove_queue(struct event_queue *eq)
-{
-  assert(eq != NULL);
-
-  free(eq);
-  return(1);
-}
-
-
-#if defined(IL_NOTIFICATIONS)
-
-static struct queue_list  *notifid_map = NULL;
-
-struct event_queue *
-notifid_map_get_dest(const char * notif_id)
-{
-       struct queue_list *q = NULL;
-
-       queue_list_find(notifid_map, notif_id, &q, NULL);
-       return(q ? q->queue : NULL);
-}
-
-
-/* returns 1 if mapping was changed, 0 if new one had to be created, -1 on error */
-int
-notifid_map_set_dest(const char *notif_id, struct event_queue *eq)
-{
-       struct queue_list *q;
-
-       if(queue_list_find(notifid_map, notif_id, &q, NULL)) {
-               q->queue = eq;
-               return(1);
-       } else {
-               return(queue_list_add(&notifid_map, notif_id, eq));
-       }
-}
-
-
-time_t
-notifid_map_get_expiration(const char * notif_id)
-{
-  struct queue_list *q;
-
-  queue_list_find(notifid_map, notif_id, &q, NULL);
-  return(q ? q->expires : 0);
-}
-
-
-int
-notifid_map_set_expiration(const char *notif_id, time_t exp)
-{
-  struct queue_list *q;
-
-  if(queue_list_find(notifid_map, notif_id, &q, NULL)) {
-    q->expires = exp;
-    return(1);
-  } else {
-    return(0);
-  }
-}
-
-#endif
-
-/* Local Variables:           */
-/* c-indentation-style: gnu   */
-/* End:                       */
diff --git a/org.glite.lb.logger/src/queue_mgr_http.c b/org.glite.lb.logger/src/queue_mgr_http.c
deleted file mode 100644 (file)
index 777e620..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-#ident "$Header$"
-
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lb/context.h"
-
-#include "interlogd.h"
-
-struct queue_list {
-  struct event_queue *queue;
-  char   *dest;
-  struct queue_list *next;
-  time_t expires;
-};
-
-static struct event_queue *log_queue;
-static struct queue_list  *queues;
-
-
-static 
-int
-queue_list_create()
-{
-  queues = NULL;
-
-  return(0);
-}
-
-
-static
-int
-queue_list_find(struct queue_list *ql, const char *dest, struct queue_list **el, struct queue_list **prev)
-{
-  struct queue_list *q, *p;
-
-  assert(el != NULL);
-
-  *el = NULL;
-  if(prev)
-    *prev = NULL;
-
-  if(ql == NULL) 
-    return(0);
-
-  q = NULL;
-  p = ql;
-
-  while(p) {
-    if(strcmp(p->dest, dest) == 0) {
-      *el = p;
-      if(prev)
-       *prev = q;
-      return(1);
-    }
-
-    q = p;
-    p = p->next;
-  };
-
-  return(0);
-}
-
-
-static
-int
-queue_list_add(struct queue_list **ql, const char *dest, struct event_queue *eq)
-{
-  struct queue_list *el;
-  
-  assert(dest != NULL);
-  assert(eq != NULL);
-  assert(ql != NULL);
-
-  el = malloc(sizeof(*el));
-  if(el == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough room for new queue");
-    return(-1);
-  }
-
-  el->dest = strdup(dest);
-  if(el->dest == NULL) {
-    free(el);
-    set_error(IL_NOMEM, ENOMEM, "queue_list_add: not enough memory for new queue");
-    return(-1);
-  }
-  el->queue = eq;
-  el->next = *ql;
-  *ql = el;
-  return 0;
-}
-
-
-struct event_queue *
-queue_list_get(char *job_id_s)
-{
-  char *dest;
-  struct queue_list *q;
-  struct event_queue *eq;
-  dest = job_id_s;
-
-  if(dest == NULL) 
-    return(NULL);
-  
-  if(queue_list_find(queues, dest, &q, NULL)) {
-    return(q->queue);
-  } else {
-    eq = event_queue_create(dest);
-    if(eq)
-      queue_list_add(&queues, dest, eq);
-    return(eq);
-  }
-}
-
-
-int
-queue_list_is_log(struct event_queue *eq)
-{
-  return(eq == queue_list_get(NULL));
-}
-
-
-int
-queue_list_init(char *ls)
-{
-  return(queue_list_create());
-}
-
-
-static struct queue_list *current;
-
-
-struct event_queue *
-queue_list_first()
-{
-  current = queues;
-  return(current ? current->queue : NULL);
-}
-
-
-struct event_queue *
-queue_list_next()
-{
-  current = current ? current->next : NULL;
-  return(current ? current->queue : NULL);
-}
-
-
-int
-queue_list_remove_queue(struct event_queue *eq)
-{
-  assert(eq != NULL);
-
-  free(eq);
-  return(1);
-}
-
-
-
-/* Local Variables:           */
-/* c-indentation-style: gnu   */
-/* End:                       */
diff --git a/org.glite.lb.logger/src/queue_thread.c b/org.glite.lb.logger/src/queue_thread.c
deleted file mode 100644 (file)
index 20c25e7..0000000
+++ /dev/null
@@ -1,426 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <assert.h>
-#include <errno.h>
-#include <signal.h>
-
-#include "interlogd.h"
-
-static 
-void 
-queue_thread_cleanup(void *q)
-{
-       struct event_queue *eq = (struct event_queue *)q;
-
-       il_log(LOG_WARNING, "thread %d exits\n", eq->thread_id);
-
-       /* unlock all held locks */
-       /* FIXME: check that the thread always exits when holding these locks;
-          unlock them at appropriate places if this condition is not met  
-          event_queue_unlock(eq);
-          event_queue_cond_unlock(eq);
-       */
-  
-       /* clear thread id */
-       eq->thread_id = 0;
-}
-
-
-static time_t now;
-
-static
-int
-cmp_expires(struct server_msg *msg, void *data)
-{
-  time_t *t = (time_t*)data;
-  return (msg->expires > 0) && (msg->expires < *t);
-}
-
-static
-void *
-queue_thread(void *q)
-{
-       struct event_queue *eq = (struct event_queue *)q;
-       int ret, exit;
-       int retrycnt;
-       int close_timeout = 0;
-       int exit_timeout = EXIT_TIMEOUT;
-
-       if(init_errors(0) < 0) {
-               il_log(LOG_ERR, "Error initializing thread specific data, exiting!");
-               pthread_exit(NULL);
-       }
-  
-       il_log(LOG_DEBUG, "  started new thread for delivery to %s:%d\n", eq->dest_name, eq->dest_port);
-
-       pthread_cleanup_push(queue_thread_cleanup, q); 
-
-       event_queue_cond_lock(eq);
-
-       exit = 0;
-       retrycnt = 0;
-       while(!exit) {
-    
-               clear_error();
-
-               /* if there are no events, wait for them */
-               ret = 0;
-               while (event_queue_empty(eq) 
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-                      && (eq->flushing != 1)
-#endif
-                       ) {
-                       if(lazy_close && close_timeout) {
-                               ret = event_queue_wait(eq, close_timeout);
-                               if(ret == 1) {/* timeout? */
-                                       event_queue_close(eq);
-                                       il_log(LOG_DEBUG, "  connection to %s:%d closed\n",
-                                              eq->dest_name, eq->dest_port);
-                               }
-                               close_timeout = 0;
-                       } else {
-                               ret = event_queue_wait(eq, exit_timeout);
-                               if(ret == 1) {
-                                       il_log(LOG_INFO, "  thread idle for more than %d seconds, exiting\n", exit_timeout);
-                                       event_queue_close(eq);
-                                       event_queue_cond_unlock(eq);
-                                       pthread_exit((void*)0);
-                               }
-                       }
-                       if(ret < 0) {
-                               /* error waiting */
-                               il_log(LOG_ERR, "queue_thread: %s\n", error_get_msg());
-                               event_queue_cond_unlock(eq);
-                               pthread_exit((void*)-1);
-                       }
-               }  /* END while(empty) */
-    
-
-               /* allow other threads to signal us, ie. insert new events while
-                * we are sending or request flush operation
-                */
-               event_queue_cond_unlock(eq);
-               
-               /* discard expired events */
-               il_log(LOG_DEBUG, "  discarding expired events\n");
-               now = time(NULL);
-               event_queue_move_events(eq, NULL, cmp_expires, &now);
-               if(!event_queue_empty(eq)) {
-
-                       /* deliver pending events */
-                       il_log(LOG_DEBUG, "  attempting delivery to %s:%d\n", eq->dest_name, eq->dest_port);
-                       /* connect to server */
-                       if((ret=event_queue_connect(eq)) == 0) {
-                               /* not connected */
-                               if(error_get_maj() != IL_OK)
-                                       il_log(LOG_ERR, "queue_thread: %s\n", error_get_msg());
-#if defined(IL_NOTIFICATIONS)
-                               il_log(LOG_INFO, "    could not connect to client %s, waiting for retry\n", eq->dest_name);
-#else
-                               il_log(LOG_INFO, "    could not connect to bookkeeping server %s, waiting for retry\n", eq->dest_name);
-#endif
-                               retrycnt++;
-                       } else {
-                               retrycnt = 0;
-                               /* connected, send events */
-                               switch(ret=event_queue_send(eq)) {
-                                       
-                               case 0:
-                                       /* there was an error and we still have events to send */
-                                       if(error_get_maj() != IL_OK)
-                                               il_log(LOG_ERR, "queue_thread: %s\n", error_get_msg());
-                                       il_log(LOG_DEBUG, "  events still waiting\n");
-                                       break;
-                                       
-                               case 1:
-                                       /* hey, we are done for now */
-                                       il_log(LOG_DEBUG, "  all events for %s sent\n", eq->dest_name);
-                                       break;
-                                       
-                               default:
-                                       /* internal error */
-                                       il_log(LOG_ERR, "queue_thread: %s\n", error_get_msg());
-                                       exit = 1;      
-                                       break;
-                                       
-                               } /* switch */
-                       
-                               /* we are done for now anyway, so close the queue */
-                               if((ret == 1) && lazy_close)
-                                       close_timeout = default_close_timeout;
-                               else {
-                                       event_queue_close(eq);
-                                       il_log(LOG_DEBUG, "  connection to %s:%d closed\n",
-                                              eq->dest_name, eq->dest_port);
-                               }
-                       }
-               } 
-
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-               if(pthread_mutex_lock(&flush_lock) < 0)
-                       abort();
-               event_queue_cond_lock(eq);
-
-               /* Check if we are flushing and if we are, report status to master */
-               if(eq->flushing == 1) {
-                       il_log(LOG_DEBUG, "    flushing mode detected, reporting status\n");
-                       /* 0 - events waiting, 1 - events sent, < 0 - some error */
-                       eq->flush_result = ret;
-                       eq->flushing = 2;
-                       if(pthread_cond_signal(&flush_cond) < 0)
-                               abort();
-               }
-               if(pthread_mutex_unlock(&flush_lock) < 0)
-                       abort();
-#else
-#endif
-
-               /* if there was some error with server, sleep for a while */
-               /* iff !event_queue_empty() */
-               /* also allow for one more try immediately after server disconnect,
-                  which may cure server kicking us out after given number of connections */
-#ifndef LB_PERF
-               if((ret == 0) && (retrycnt > 0)) {
-                       il_log(LOG_WARNING, "    sleeping\n");
-                       event_queue_sleep(eq);
-               }
-#endif
-
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-#else
-               event_queue_cond_lock(eq);
-#endif
-
-               if(exit) {
-                       /* we have to clean up before exiting */
-                       event_queue_cond_unlock(eq);
-               }
-    
-       } /* while */
-
-       pthread_cleanup_pop(1);
-
-       return(eq);
-}
-
-
-int
-event_queue_create_thread(struct event_queue *eq)
-{
-       assert(eq != NULL);
-
-       event_queue_lock(eq);
-
-       /* if there is a thread already, just return */
-       if(eq->thread_id > 0) {
-               event_queue_unlock(eq);
-               return(0);
-       }
-
-       /* create the thread itself */
-       if(pthread_create(&eq->thread_id, NULL, queue_thread, eq) < 0) {
-               eq->thread_id = 0;
-               set_error(IL_SYS, errno, "event_queue_create_thread: error creating new thread");
-               event_queue_unlock(eq);
-               return(-1);
-       }
-
-       /* the thread is never going to be joined */
-       pthread_detach(eq->thread_id);
-       
-       event_queue_unlock(eq);
-
-       return(1);
-}
-
-
-
-int
-event_queue_lock(struct event_queue *eq)
-{
-       assert(eq != NULL);
-
-       if(pthread_rwlock_wrlock(&eq->update_lock)) {
-               /*** abort instead, this is too serious
-               set_error(IL_SYS, errno, "event_queue_lock: error acquiring write lock");
-               return(-1);
-               */
-               abort();
-       }
-
-       return(0);
-}
-
-
-int
-event_queue_lock_ro(struct event_queue *eq)
-{
-       assert(eq != NULL);
-
-       if(pthread_rwlock_rdlock(&eq->update_lock)) {
-               /*** abort instead, this is too serious
-               set_error(IL_SYS, errno, "event_queue_lock_ro: error acquiring read lock");
-               return(-1);
-               */
-               abort();
-       }
-
-       return(0);
-}
-
-
-int
-event_queue_unlock(struct event_queue *eq)
-{
-       assert(eq != NULL);
-
-       if(pthread_rwlock_unlock(&eq->update_lock)) {
-               /*** abort instead, this is too serious
-               set_error(IL_SYS, errno, "event_queue_unlock: error releasing lock");
-               return(-1);
-               */
-               abort();
-       }
-
-       return(0);
-}
-
-
-int
-event_queue_signal(struct event_queue *eq)
-{
-       assert(eq != NULL);
-
-       if(pthread_cond_signal(&eq->ready_cond)) {
-               /*** abort instead, this is too serious
-               set_error(IL_SYS, errno, "event_queue_signal: error signaling queue thread");
-               return(-1);
-               */
-               abort();
-       }
-       return(0);
-}
-
-
-int
-event_queue_wait(struct event_queue *eq, int timeout)
-{
-       assert(eq != NULL);
-
-       if(timeout) {
-               struct timespec endtime;
-               int  ret = 0;
-
-               endtime.tv_sec = time(NULL) + timeout;
-               endtime.tv_nsec = 0;
-               
-               if((ret=pthread_cond_timedwait(&eq->ready_cond, &eq->cond_lock, &endtime))) {
-                       if(ret == ETIMEDOUT) 
-                               return(1);
-                       /*** abort instead, this is too serious
-                       set_error(IL_SYS, errno, "event_queue_wait: error waiting on condition variable");
-                       return(-1);
-                       */
-                       abort();
-               }
-       } else {
-               if(pthread_cond_wait(&eq->ready_cond, &eq->cond_lock)) {
-                       /*** abort instead, this is too serious
-                       set_error(IL_SYS, errno, "event_queue_wait: error waiting on condition variable");
-                       return(-1);
-                       */
-                       abort();
-               }
-       }
-       return(0);
-}
-
-
-int event_queue_sleep(struct event_queue *eq)
-{
-#if defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH)
-       struct timespec ts;
-       struct timeval tv;
-       int ret;
-
-       assert(eq != NULL);
-
-       gettimeofday(&tv, NULL);
-       ts.tv_sec = tv.tv_sec + eq->timeout;
-       ts.tv_nsec = 1000 * tv.tv_usec;
-       if((ret=pthread_cond_timedwait(&eq->flush_cond, &eq->cond_lock, &ts)) < 0) {
-               if(ret != ETIMEDOUT) {
-                       /*** abort instead, this is too serious
-                       set_error(IL_SYS, errno, "event_queue_sleep: error waiting on condition");
-                       return(-1);
-                       */
-                       abort();
-               }
-       }
-#else
-       sleep(eq->timeout);
-#endif
-       return(0);
-}
-
-
-#if defined(INTERLOGD_HANDLE_CMD)
-int event_queue_wakeup(struct event_queue *eq)
-{
-       assert(eq != NULL);
-
-       if(pthread_cond_signal(&eq->ready_cond)) {
-               /**
-               set_error(IL_SYS, errno, "event_queue_wakeup: error signaling queue thread");
-               return(-1);
-               */
-               abort();
-       }
-#if defined(INTERLOGD_FLUSH)
-       if(pthread_cond_signal(&eq->flush_cond)) {
-               /**
-               set_error(IL_SYS, errno, "event_queue_wakeup: error signaling queue thread");
-               return(-1);
-               */
-               abort();
-       }
-#endif
-       return(0);
-}
-#endif
-
-int event_queue_cond_lock(struct event_queue *eq)
-{
-       assert(eq != NULL);
-
-       if(pthread_mutex_lock(&eq->cond_lock)) {
-               /**
-               set_error(IL_SYS, errno, "event_queue_cond_lock: error locking condition mutex");
-               return(-1);
-               */
-               abort();
-       }
-
-       return(0);
-}
-
-
-int event_queue_cond_unlock(struct event_queue *eq)
-{
-       assert(eq != NULL);
-
-       if(pthread_mutex_unlock(&eq->cond_lock)) {
-               /**
-               set_error(IL_SYS, errno, "event_queue_cond_unlock: error locking condition mutex");
-               return(-1);
-               */
-               abort();
-       }
-
-       return(0);
-}
-
-/* Local Variables:           */
-/* c-indentation-style: linux */
-/* End:                       */
diff --git a/org.glite.lb.logger/src/recover.c b/org.glite.lb.logger/src/recover.c
deleted file mode 100644 (file)
index 18fc3b4..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <assert.h>
-#include <errno.h>
-
-#include "interlogd.h"
-
-extern char *file_prefix;
-
-extern time_t cert_mtime, key_mtime;
-
-void *
-recover_thread(void *q)
-{
-       if(init_errors(0) < 0) {
-               il_log(LOG_ERR, "Error initializing thread specific data, exiting!");
-               pthread_exit(NULL);
-       }
-
-       while(1) {
-               il_log(LOG_INFO, "Looking up event files...\n");
-               if(event_store_init(file_prefix) < 0) {
-                       il_log(LOG_ERR, "recover_thread: %s\n", error_get_msg());
-                       exit(1);
-               }
-               if(event_store_recover_all() < 0) {
-                       il_log(LOG_ERR, "recover_thread: %s\n", error_get_msg());
-                       exit(1);
-               }
-               if(event_store_cleanup() < 0) {
-                       il_log(LOG_ERR, "recover_thread: %s\n", error_get_msg());
-                       exit(1);
-               }
-               il_log(LOG_INFO, "Reloading certificate...\n");
-               if (edg_wll_gss_watch_creds(cert_file, &cert_mtime) > 0) {
-                       edg_wll_GssCred new_creds = NULL;
-                       int ret;
-
-                       ret = edg_wll_gss_acquire_cred_gsi(cert_file,key_file, 
-                               &new_creds, NULL);
-                       if (new_creds != NULL) {
-                               if(pthread_mutex_lock(&cred_handle_lock) < 0)
-                                       abort();
-                               /* if no one is using the old credentials, release them */
-                               if(cred_handle && cred_handle->counter == 0) {
-                                       edg_wll_gss_release_cred(&cred_handle->creds, NULL);
-                                       free(cred_handle);
-                                       il_log(LOG_DEBUG, "  freed old credentials\n");
-                               }
-                               cred_handle = malloc(sizeof(*cred_handle));
-                               if(cred_handle == NULL) {
-                                       il_log(LOG_CRIT, "Failed to allocate structure for credentials.\n");
-                                       exit(EXIT_FAILURE);
-                               }
-                               cred_handle->creds = new_creds;
-                               cred_handle->counter = 0;
-                               if(pthread_mutex_unlock(&cred_handle_lock) < 0)
-                                       abort();
-                               il_log(LOG_INFO, "New certificate found and deployed.\n");
-                       }
-               }
-               sleep(INPUT_TIMEOUT);
-       }
-}
diff --git a/org.glite.lb.logger/src/send_event.c b/org.glite.lb.logger/src/send_event.c
deleted file mode 100644 (file)
index 4796859..0000000
+++ /dev/null
@@ -1,365 +0,0 @@
-#ident "$Header$"
-
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-
-/*
- *   - L/B server protocol handling routines 
- */
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lb/il_string.h"
-#include "glite/lb/context.h"
-
-#include "interlogd.h"
-
-#if defined(INTERLOGD_EMS) || (defined(INTERLOGD_HANDLE_CMD) && defined(INTERLOGD_FLUSH))
-/* 
- * Send confirmation to client.
- *
- */
-int
-send_confirmation(long lllid, int code)
-{
-  struct sockaddr_un saddr;
-  char sname[256];
-  int  sock, ret;
-
-  if((sock=socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
-    set_error(IL_SYS, errno, "send_confirmation: error creating socket");
-    return(-1);
-  }
-
-  if(fcntl(sock, F_SETFL, O_NONBLOCK) < 0) {
-         set_error(IL_SYS, errno, "send_confirmation: error setting socket options");
-         return(-1);
-  }
-
-  ret = 0;
-  memset(&saddr, 0, sizeof(saddr));
-  saddr.sun_family = AF_UNIX;
-  snprintf(sname, sizeof(sname), "/tmp/dglogd_sock_%ld", lllid);
-  strcpy(saddr.sun_path, sname);
-  if(connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path)) < 0) {
-    set_error(IL_SYS, errno, "send_confirmation: error connecting socket");
-    goto out;
-  }
-
-  if(send(sock, &code, sizeof(code), MSG_NOSIGNAL) < 0) {
-    set_error(IL_SYS, errno, "send_confirmation: error sending data");
-    goto out;
-  }
-  ret = 1;
-
-  il_log(LOG_DEBUG, "  sent code %d back to client\n", code);
-
- out:
-  close(sock);
-  return(ret);
-}
-
-
-static 
-int
-confirm_msg(struct server_msg *msg, int code, int code_min)
-{
-       switch(code) {
-       case LB_OK:
-               code_min = 0;
-               break;
-       case LB_DBERR:
-               /* code_min already contains apropriate error code */
-               break;
-       case LB_PROTO:
-               code_min = EDG_WLL_IL_PROTO;
-               break;
-       default:
-               code_min = EDG_WLL_IL_SYS;
-               break;
-       }
-  
-       return(send_confirmation(msg->receipt_to, code_min));
-}
-#endif
-
-
-
-struct reader_data {
-       edg_wll_GssConnection *gss;
-       struct timeval *timeout;
-};
-
-
-static
-int
-gss_reader(void *user_data, char *buffer, int max_len)
-{
-  int ret;
-  size_t len;
-  struct reader_data *data = (struct reader_data *)user_data;
-  edg_wll_GssStatus gss_stat;
-
-  ret = edg_wll_gss_read_full(data->gss, buffer, max_len, data->timeout, &len, &gss_stat);
-  if(ret < 0) {
-    char *gss_err = NULL;
-
-    if(ret == EDG_WLL_GSS_ERROR_GSS) {
-      edg_wll_gss_get_error(&gss_stat, "get_reply", &gss_err);
-      set_error(IL_DGGSS, ret, gss_err);
-      free(gss_err);
-    } else 
-      set_error(IL_DGGSS, ret, "get_reply");
-  }
-  return(ret);
-}
-
-
-/*
- * Read reply from server.
- *  Returns: -1 - error reading message, 
- *         code > 0 - error code from server
- */
-static
-int 
-get_reply(struct event_queue *eq, char **buf, int *code_min)
-{
-  char *msg=NULL;
-  int ret, code;
-  int len, l;
-  struct timeval tv;
-  struct reader_data data;
-
-  tv.tv_sec = TIMEOUT;
-  tv.tv_usec = 0;
-  data.gss = &eq->gss;
-  data.timeout = &tv;
-  len = read_il_data(&data, &msg, gss_reader);
-  if(len < 0) {
-    set_error(IL_PROTO, LB_PROTO, "get_reply: error reading server reply");
-    return(-1);
-  }
-  ret = decode_il_reply(&code, code_min, buf, msg);
-  if(msg) free(msg);
-  if(ret < 0) {
-    set_error(IL_PROTO, LB_PROTO, "get_reply: error decoding server reply");
-    return(-1);
-  }
-  return(code);
-}
-
-
-
-/*
- *  Returns: 0 - not connected, timeout set, 1 - OK
- */
-int 
-event_queue_connect(struct event_queue *eq)
-{
-  int ret;
-  struct timeval tv;
-  edg_wll_GssStatus gss_stat;
-  cred_handle_t *local_cred_handle;
-
-  assert(eq != NULL);
-
-#ifdef LB_PERF
-  if(!nosend) {
-#endif
-
-  if(eq->gss.context == NULL) {
-
-    tv.tv_sec = TIMEOUT;
-    tv.tv_usec = 0;
-
-    /* get pointer to the credentials */
-    if(pthread_mutex_lock(&cred_handle_lock) < 0)
-           abort();
-    local_cred_handle = cred_handle;
-    local_cred_handle->counter++;
-    if(pthread_mutex_unlock(&cred_handle_lock) < 0)
-           abort();
-    
-    il_log(LOG_DEBUG, "    trying to connect to %s:%d\n", eq->dest_name, eq->dest_port);
-    ret = edg_wll_gss_connect(local_cred_handle->creds, eq->dest_name, eq->dest_port, &tv, &eq->gss, &gss_stat);
-    if(pthread_mutex_lock(&cred_handle_lock) < 0)
-           abort();
-    /* check if we need to release the credentials */
-    --local_cred_handle->counter;
-    if(local_cred_handle != cred_handle && local_cred_handle->counter == 0) {
-           edg_wll_gss_release_cred(&local_cred_handle->creds, NULL);
-           free(local_cred_handle);
-           il_log(LOG_DEBUG, "   freed credentials, not used anymore\n");
-    }
-    if(pthread_mutex_unlock(&cred_handle_lock) < 0) 
-           abort();
-
-    if(ret < 0) {
-      char *gss_err = NULL;
-
-      if (ret == EDG_WLL_GSS_ERROR_GSS)
-        edg_wll_gss_get_error(&gss_stat, "event_queue_connect: edg_wll_gss_connect", &gss_err);
-      set_error(IL_DGGSS, ret,
-               (ret == EDG_WLL_GSS_ERROR_GSS) ? gss_err : "event_queue_connect: edg_wll_gss_connect");
-      if (gss_err) free(gss_err);
-      eq->gss.context = NULL;
-      eq->timeout = TIMEOUT;
-      return(0);
-    }
-  }
-
-#ifdef LB_PERF
-  }
-#endif
-
-  return(1);
-}
-
-
-int
-event_queue_close(struct event_queue *eq)
-{
-  assert(eq != NULL);
-
-#ifdef LB_PERF
-  if(!nosend) {
-#endif
-
-  if(eq->gss.context != NULL) {
-    edg_wll_gss_close(&eq->gss, NULL);
-    eq->gss.context = NULL;
-  }
-#ifdef LB_PERF
-  }
-#endif
-  return(0);
-}
-
-
-/* 
- * Send all events from the queue.
- *   Returns: -1 - system error, 0 - not send, 1 - queue empty
- */
-int 
-event_queue_send(struct event_queue *eq)
-{
-  int events_sent = 0;
-  assert(eq != NULL);
-
-#ifdef LB_PERF
-  if(!nosend) {
-#endif
-  if(eq->gss.context == NULL)
-    return(0);
-#ifdef LB_PERF
-  }
-#endif
-
-  /* feed the server with events */
-  while (!event_queue_empty(eq)) {
-    struct server_msg *msg;
-    char *rep;
-    int  ret, code, code_min;
-    size_t bytes_sent;
-    struct timeval tv;
-    edg_wll_GssStatus gss_stat;
-
-    clear_error();
-
-    if(event_queue_get(eq, &msg) < 0) 
-      return(-1);
-
-    il_log(LOG_DEBUG, "    trying to deliver event at offset %d for job %s\n", msg->offset, msg->job_id_s);
-
-#ifdef LB_PERF
-    if(!nosend) {
-#endif
-       if (msg->len) {
-           tv.tv_sec = TIMEOUT;
-           tv.tv_usec = 0;
-           ret = edg_wll_gss_write_full(&eq->gss, msg->msg, msg->len, &tv, &bytes_sent, &gss_stat);
-           if(ret < 0) {
-             if (ret == EDG_WLL_GSS_ERROR_ERRNO && errno == EPIPE && events_sent > 0)
-               eq->timeout = 0;
-             else
-               eq->timeout = TIMEOUT;
-             return(0);
-           }
-           
-           if((code = get_reply(eq, &rep, &code_min)) < 0) {
-                   /* could not get the reply properly, so try again later */
-                   if (events_sent>0) {
-                       /* could be expected server connection preemption */
-                       clear_error();
-                       eq->timeout = 1;
-                   } else {
-                       eq->timeout = TIMEOUT;
-                       il_log(LOG_ERR, "  error reading server %s reply:\n    %s\n", eq->dest_name, error_get_msg());
-                    }
-                   return(0);
-           }
-       }
-       else { code = LB_OK; code_min = 0; rep = strdup("not sending empty message"); }
-#ifdef LB_PERF
-    } else {
-           glite_wll_perftest_consumeEventIlMsg(msg->msg+17);
-           code = LB_OK;
-           rep = strdup("OK");
-    }
-#endif
-    
-    il_log(LOG_DEBUG, "    event sent, server %s replied with %d, %s\n", eq->dest_name, code, rep);
-    free(rep);
-
-    /* the reply is back here */
-    switch(code) {
-      
-           /* NOT USED: case LB_TIME: */
-    case LB_NOMEM:
-           /* NOT USED: case LB_SYS:  */
-           /* NOT USED: case LB_AUTH: */
-      /* non fatal errors (for us) */
-      eq->timeout = TIMEOUT;
-      return(0);
-       
-    case LB_OK:
-      /* event succesfully delivered */
-      
-    default: /* LB_DBERR, LB_PROTO */
-      /* the event was not accepted by the server */
-      /* update the event pointer */
-        if(event_store_commit(msg->es, msg->ev_len, queue_list_is_log(eq), msg->generation) < 0)
-       /* failure committing message, this is bad */
-       return(-1);
-      /* if we have just delivered priority message from the queue, send confirmation */
-      ret = 1;
-#if defined(INTERLOGD_EMS)
-      if(server_msg_is_priority(msg) &&
-        ((ret=confirm_msg(msg, code, code_min)) < 0))
-       return(ret);
-#endif
-
-      if((ret == 0) &&
-        (error_get_maj() != IL_OK))
-         il_log(LOG_ERR, "send_event: %s\n", error_get_msg());
-       
-      event_queue_remove(eq);
-      events_sent++;
-      break;
-      
-    } /* switch */
-  } /* while */
-
-  return(1);
-
-} /* send_events */
-
-
diff --git a/org.glite.lb.logger/src/send_event_http.c b/org.glite.lb.logger/src/send_event_http.c
deleted file mode 100644 (file)
index 3c90562..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-#ident "$Header$"
-
-#include <assert.h>
-#include <errno.h>
-#include <stdio.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-
-/*
- *   - L/B server protocol handling routines 
- */
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lb/il_string.h"
-#include "glite/lb/context.h"
-
-#include "interlogd.h"
-
-struct reader_data {
-       edg_wll_GssConnection *gss;
-       struct timeval *timeout;
-};
-
-
-static
-int
-gss_reader(void *user_data, char *buffer, int max_len)
-{
-  int ret;
-  struct reader_data *data = (struct reader_data *)user_data;
-  edg_wll_GssStatus gss_stat;
-
-  ret = edg_wll_gss_read(data->gss, buffer, max_len, data->timeout, &gss_stat);
-  if(ret < 0) {
-    char *gss_err = NULL;
-
-    if(ret == EDG_WLL_GSS_ERROR_GSS) {
-      edg_wll_gss_get_error(&gss_stat, "get_reply", &gss_err);
-      set_error(IL_DGGSS, ret, gss_err);
-      free(gss_err);
-    } else 
-      set_error(IL_DGGSS, ret, "get_reply");
-  }
-  return(ret);
-}
-
-
-/*
- * Read reply from server.
- *  Returns: -1 - error reading message, 
- *         code > 0 - http status code from server
- */
-static
-int 
-get_reply(struct event_queue *eq, char **buf, int *code_min)
-{
-  int ret, code;
-  int len;
-  struct timeval tv;
-  struct reader_data data;
-  il_http_message_t msg;
-
-  tv.tv_sec = TIMEOUT;
-  tv.tv_usec = 0;
-  data.gss = &eq->gss;
-  data.timeout = &tv;
-  len = receive_http(&data, gss_reader, &msg);
-  if(len < 0) {
-    set_error(IL_PROTO, LB_PROTO, "get_reply: error reading server reply");
-    return(-1);
-  }
-  if(msg.data) free(msg.data);
-  if(msg.reply_string) *buf = msg.reply_string;
-  *code_min = 0; /* XXX fill in flag for fault */
-  return(msg.reply_code);
-}
-
-
-
-/*
- *  Returns: 0 - not connected, timeout set, 1 - OK
- */
-int 
-event_queue_connect(struct event_queue *eq)
-{
-  int ret;
-  struct timeval tv;
-  edg_wll_GssStatus gss_stat;
-  cred_handle_t *local_cred_handle;
-
-  assert(eq != NULL);
-
-#ifdef LB_PERF
-  if(!nosend) {
-#endif
-
-  if(eq->gss.context == NULL) {
-
-    tv.tv_sec = TIMEOUT;
-    tv.tv_usec = 0;
-
-    /* get pointer to the credentials */
-    if(pthread_mutex_lock(&cred_handle_lock) < 0)
-           abort();
-    local_cred_handle = cred_handle;
-    local_cred_handle->counter++;
-    if(pthread_mutex_unlock(&cred_handle_lock) < 0)
-           abort();
-    
-    il_log(LOG_DEBUG, "    trying to connect to %s:%d\n", eq->dest_name, eq->dest_port);
-    ret = edg_wll_gss_connect(local_cred_handle->creds, eq->dest_name, eq->dest_port, &tv, &eq->gss, &gss_stat);
-    if(pthread_mutex_lock(&cred_handle_lock) < 0)
-           abort();
-    /* check if we need to release the credentials */
-    --local_cred_handle->counter;
-    if(local_cred_handle != cred_handle && local_cred_handle->counter == 0) {
-           edg_wll_gss_release_cred(&local_cred_handle->creds, NULL);
-           free(local_cred_handle);
-           il_log(LOG_DEBUG, "   freed credentials, not used anymore\n");
-    }
-    if(pthread_mutex_unlock(&cred_handle_lock) < 0) 
-           abort();
-
-    if(ret < 0) {
-      char *gss_err = NULL;
-
-      if (ret == EDG_WLL_GSS_ERROR_GSS)
-        edg_wll_gss_get_error(&gss_stat, "event_queue_connect: edg_wll_gss_connect", &gss_err);
-      set_error(IL_DGGSS, ret,
-               (ret == EDG_WLL_GSS_ERROR_GSS) ? gss_err : "event_queue_connect: edg_wll_gss_connect");
-      if (gss_err) free(gss_err);
-      eq->gss.context = NULL;
-      eq->timeout = TIMEOUT;
-      return(0);
-    }
-  }
-
-#ifdef LB_PERF
-  }
-#endif
-
-  return(1);
-}
-
-
-int
-event_queue_close(struct event_queue *eq)
-{
-  assert(eq != NULL);
-
-#ifdef LB_PERF
-  if(!nosend) {
-#endif
-
-  if(eq->gss.context != NULL) {
-    edg_wll_gss_close(&eq->gss, NULL);
-    eq->gss.context = NULL;
-  }
-#ifdef LB_PERF
-  }
-#endif
-  return(0);
-}
-
-
-/* 
- * Send all events from the queue.
- *   Returns: -1 - system error, 0 - not sent, 1 - queue empty
- */
-int 
-event_queue_send(struct event_queue *eq)
-{
-  int events_sent = 0;
-  assert(eq != NULL);
-
-#ifdef LB_PERF
-  if(!nosend) {
-#endif
-  if(eq->gss.context == NULL)
-    return(0);
-#ifdef LB_PERF
-  }
-#endif
-
-  /* feed the server with events */
-  while (!event_queue_empty(eq)) {
-    struct server_msg *msg;
-    char *rep;
-    int  ret, code, code_min;
-    size_t bytes_sent;
-    struct timeval tv;
-    edg_wll_GssStatus gss_stat;
-
-    clear_error();
-
-    if(event_queue_get(eq, &msg) < 0) 
-      return(-1);
-
-    il_log(LOG_DEBUG, "    trying to deliver event at offset %d for job %s\n", msg->offset, msg->job_id_s);
-
-#ifdef LB_PERF
-    if(!nosend) {
-#endif
-        /* XXX: ljocha -- does it make sense to send empty messages ? */
-       if (msg->len) {
-           tv.tv_sec = TIMEOUT;
-           tv.tv_usec = 0;
-           ret = edg_wll_gss_write_full(&eq->gss, msg->msg, msg->len, &tv, &bytes_sent, &gss_stat);
-           if(ret < 0) {
-                   if (ret == EDG_WLL_GSS_ERROR_ERRNO && errno == EPIPE && events_sent > 0) {
-                           eq->timeout = 0;
-                   }  else {
-                           il_log(LOG_ERR, "send_event: %s\n", error_get_msg());
-                           eq->timeout = TIMEOUT;
-                   }
-                   return(0);
-           }
-           if((code = get_reply(eq, &rep, &code_min)) < 0) {
-                   /* could not get the reply properly, so try again later */
-                   if (events_sent>0) 
-                           eq->timeout = 1;
-                   else {
-                           eq->timeout = TIMEOUT;
-                           il_log(LOG_ERR, "  error reading server %s reply:\n    %s\n", eq->dest_name, error_get_msg());
-                   }
-                   return(0);
-           }
-       }
-       else { code = 200; code_min = 0; rep = strdup("not sending empty message"); }
-#ifdef LB_PERF
-    } else {
-           glite_wll_perftest_consumeEventIlMsg(msg->msg+17);
-           code = 200;
-           rep = strdup("OK");
-    }
-#endif
-    
-    il_log(LOG_DEBUG, "    event sent, server %s replied with %d, %s\n", eq->dest_name, code, rep);
-    free(rep);
-
-    /* the reply is back here, decide what to do with message */
-    /* HTTP error codes:
-       1xx - informational (eg. 100 Continue)
-       2xx - successful (eg. 200 OK)
-       3xx - redirection (eg. 301 Moved Permanently)
-       4xx - client error (eq. 400 Bad Request)
-       5xx - server error (eq. 500 Internal Server Error)
-    */
-    if(code >= 100 && code < 200) {
-
-           /* non fatal errors (for us), try to deliver later */
-           eq->timeout = TIMEOUT;
-           return(0);
-    }
-
-    /* the message was consumed (successfully or not) */
-    /* update the event pointer */
-    if(event_store_commit(msg->es, msg->ev_len, queue_list_is_log(eq)) < 0) 
-           /* failure committing message, this is bad */
-           return(-1);
-    
-    event_queue_remove(eq);
-    events_sent++;
-  } /* while */
-
-  return(1);
-
-} /* send_events */
-
-
-/* this is just not used */
-int
-send_confirmation(long lllid, int code)
-{
-       return 0;
-}
diff --git a/org.glite.lb.logger/src/server_msg.c b/org.glite.lb.logger/src/server_msg.c
deleted file mode 100644 (file)
index 84ae833..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-#ident "$Header$"
-
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-#include "interlogd.h"
-#include "glite/lb/il_msg.h" 
-#include "glite/lb/events_parse.h"
-#include "glite/lb/context.h"
-
-static
-int 
-create_msg(il_octet_string_t *ev, char **buffer, long *receipt, time_t *expires)
-{
-  char *p;  int  len;
-  char *event = ev->data;
-
-  *receipt = 0L;
-
-#if defined(INTERLOGD_EMS)
-  /* find DG.LLLID */
-  if(strncmp(event, "DG.LLLID",8) == 0 ||
-       strncmp(event, "DG.LLPID",8) == 0) { /* 8 == strlen("DG.LLLID") */
-
-    /* skip the key */
-    event += 9;  /* 9 = strlen("DG.LLLID=") */
-    *receipt = atol(event);
-    p = strchr(event, ' ');
-    if(!p) {
-      set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, 
-               "create_msg: error parsing locallogger PID");
-      return(-1);
-    }
-    /* skip the value */
-    event = p + 1;
-
-    /* find DG.PRIORITY */
-    p = strstr(event, "DG.PRIORITY");
-    if(p) {
-      int n;
-      
-      p += 12; /* skip the key and = */
-      n = atoi(p);
-      if((n & (EDG_WLL_LOGFLAG_SYNC|EDG_WLL_LOGFLAG_SYNC_COMPAT)) == 0) {
-       /* normal asynchronous message */
-             *receipt = 0L;
-      }
-    } else {
-      /* could not find priority key */
-      *receipt = 0L;
-    }
-    
-  } else {
-    /* could not find local logger PID, confirmation can not be sent */
-    *receipt = 0L;
-  }
-#endif
-
-  if(p = strstr(event, "DG.EXPIRES")) {
-         int n;
-
-         p += 11;
-         *expires = atoi(p);
-  }
-  len = encode_il_msg(buffer, ev);
-  if(len < 0) {
-    set_error(IL_NOMEM, ENOMEM, "create_msg: out of memory allocating message");
-    return(-1);
-  }
-  return(len);
-}
-
-
-struct server_msg *
-server_msg_create(il_octet_string_t *event, long offset)
-{
-  struct server_msg *msg;
-
-  msg = malloc(sizeof(*msg));
-  if(msg == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "server_msg_create: out of memory allocating message");
-    return(NULL);
-  }
-
-  if(server_msg_init(msg, event) < 0) {
-    server_msg_free(msg);
-    return(NULL);
-  }
-  msg->offset = offset;
-
-  return(msg);
-}
-
-
-struct server_msg *
-server_msg_copy(struct server_msg *src)
-{
-  struct server_msg *msg;
-
-  msg = malloc(sizeof(*msg));
-  if(msg == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating message");
-    return(NULL);
-  }
-  
-  msg->msg = malloc(src->len);
-  if(msg->msg == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating server message");
-    server_msg_free(msg);
-    return(NULL);
-  }
-  msg->len = src->len;
-  memcpy(msg->msg, src->msg, src->len);
-
-  msg->job_id_s = strdup(src->job_id_s);
-  msg->ev_len = src->ev_len;
-  msg->es = src->es;
-  msg->receipt_to = src->receipt_to;
-  msg->offset = src->offset;
-#if defined(IL_NOTIFICATIONS)
-  msg->dest_name = src->dest_name ? strdup(src->dest_name) : NULL;
-  msg->dest_port = src->dest_port;
-  msg->dest = src->dest ? strdup(src->dest) : NULL;
-#endif
-  msg->expires = src->expires;
-  msg->generation = src->generation;
-  return(msg);
-}
-
-
-int
-server_msg_init(struct server_msg *msg, il_octet_string_t *event)
-{
-#if defined(IL_NOTIFICATIONS)
-       edg_wll_Context context;
-       edg_wll_Event *notif_event;
-       int ret;
-#endif
-
-       assert(msg != NULL);
-       assert(event != NULL);
-
-       memset(msg, 0, sizeof(*msg));
-
-
-#if defined(IL_NOTIFICATIONS)
-
-       /* parse the notification event */
-       edg_wll_InitContext(&context);
-       ret=edg_wll_ParseNotifEvent(context, event->data, &notif_event);
-       edg_wll_FreeContext(context);
-       if(ret) {
-               set_error(IL_LBAPI, ret, "server_msg_init: error parsing notification event");
-               return(-1);
-       }
-
-       /* FIXME: check for allocation error */
-       if(notif_event->notification.dest_host && 
-          (strlen(notif_event->notification.dest_host) > 0)) {
-               msg->dest_name = strdup(notif_event->notification.dest_host);
-               msg->dest_port = notif_event->notification.dest_port;
-               asprintf(&msg->dest, "%s:%d", msg->dest_name, msg->dest_port);
-       }
-       msg->job_id_s = edg_wll_NotifIdUnparse(notif_event->notification.notifId);
-       if(notif_event->notification.jobstat && 
-          (strlen(notif_event->notification.jobstat) > 0)) {
-               msg->len = create_msg(event, &msg->msg, &msg->receipt_to, &msg->expires);
-       }
-       msg->expires = notif_event->notification.expires;
-       edg_wll_FreeEvent(notif_event);
-       free(notif_event);
-       if(msg->len < 0) {
-               return(-1);
-       }
-#else
-       msg->len = create_msg(event, &msg->msg, &msg->receipt_to, &msg->expires);
-       if(msg->len < 0) {
-               return(-1);
-       }
-#ifdef LB_PERF
-       if(noparse) {
-               msg->job_id_s = strdup("https://localhost:9000/not_so_unique_string");
-       } else 
-#endif
-               msg->job_id_s = edg_wll_GetJobId(event->data);
-#endif
-       /* remember to add event separator to the length */
-       msg->ev_len = event->len + 1;
-
-       if(msg->job_id_s == NULL) {
-               set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "server_msg_init: error getting id");
-               return(-1);
-       }
-       
-       return(0);
-}
-
-
-int
-server_msg_is_priority(struct server_msg *msg)
-{
-  assert(msg != NULL);
-
-  return(msg->receipt_to != 0);
-}
-
-
-int
-server_msg_free(struct server_msg *msg)
-{
-  assert(msg != NULL);
-
-  if(msg->msg) free(msg->msg);
-  if(msg->job_id_s) free(msg->job_id_s);
-#if defined(IL_NOTIFICATIONS)
-  if(msg->dest_name) free(msg->dest_name);
-  if(msg->dest) free(msg->dest);
-#endif
-  free(msg);
-  return 0;
-}
diff --git a/org.glite.lb.logger/src/server_msg_http.c b/org.glite.lb.logger/src/server_msg_http.c
deleted file mode 100644 (file)
index 8bd3623..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-#ident "$Header$"
-
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-#include "interlogd.h"
-#include "glite/lb/il_msg.h" 
-#include "glite/lb/events_parse.h"
-#include "glite/lb/context.h"
-
-static
-int 
-create_msg(il_http_message_t *ev, char **buffer, long *receipt, time_t *expires)
-{
-  char *event = ev->data;
-
-  *receipt = 0;
-  *expires = 0;
-
-  *buffer = ev->data;
-  return ev->len;;
-}
-
-
-struct server_msg *
-server_msg_create(il_octet_string_t *event, long offset)
-{
-  struct server_msg *msg;
-
-  msg = malloc(sizeof(*msg));
-  if(msg == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "server_msg_create: out of memory allocating message");
-    return(NULL);
-  }
-
-  if(server_msg_init(msg, event) < 0) {
-    server_msg_free(msg);
-    return(NULL);
-  }
-  msg->offset = offset;
-
-  return(msg);
-}
-
-
-struct server_msg *
-server_msg_copy(struct server_msg *src)
-{
-  struct server_msg *msg;
-
-  msg = malloc(sizeof(*msg));
-  if(msg == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating message");
-    return(NULL);
-  }
-  
-  msg->msg = malloc(src->len);
-  if(msg->msg == NULL) {
-    set_error(IL_NOMEM, ENOMEM, "server_msg_copy: out of memory allocating server message");
-    server_msg_free(msg);
-    return(NULL);
-  }
-  msg->len = src->len;
-  memcpy(msg->msg, src->msg, src->len);
-
-  msg->job_id_s = strdup(src->job_id_s);
-  msg->ev_len = src->ev_len;
-  msg->es = src->es;
-  msg->receipt_to = src->receipt_to;
-  msg->offset = src->offset;
-#if defined(IL_NOTIFICATIONS)
-  msg->dest_name = strdup(src->dest_name);
-  msg->dest_port = src->dest_port;
-  msg->dest = strdup(src->dest);
-#endif
-  msg->expires = src->expires;
-  return(msg);
-}
-
-
-int
-server_msg_init(struct server_msg *msg, il_octet_string_t *event)
-{
-       il_http_message_t *hmsg = (il_http_message_t *)event;
-
-       assert(msg != NULL);
-       assert(event != NULL);
-
-       memset(msg, 0, sizeof(*msg));
-
-
-       msg->job_id_s = hmsg->host;
-       if(msg->job_id_s == NULL) {
-               set_error(IL_LBAPI, EDG_WLL_ERROR_PARSE_BROKEN_ULM, "server_msg_init: error getting id");
-               return -1;
-       }
-       msg->len = create_msg(hmsg, &msg->msg, &msg->receipt_to, &msg->expires);
-       if(msg->len < 0)
-               return -1;
-       /* set this to indicate new data owner */
-       hmsg->data = NULL;
-       hmsg->host = NULL;
-       msg->ev_len = hmsg->len + 1; /* must add separator size too */
-       return 0;
-
-}
-
-
-int
-server_msg_is_priority(struct server_msg *msg)
-{
-  assert(msg != NULL);
-
-  return(msg->receipt_to != 0);
-}
-
-
-int
-server_msg_free(struct server_msg *msg)
-{
-  assert(msg != NULL);
-
-  if(msg->msg) free(msg->msg);
-  if(msg->job_id_s) free(msg->job_id_s);
-  free(msg);
-  return 0;
-}
diff --git a/org.glite.lb.logger/test/IlTestBase.cpp b/org.glite.lb.logger/test/IlTestBase.cpp
deleted file mode 100644 (file)
index a6b4624..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "IlTestBase.h"
-
-#include <string.h>
-
-const char *IlTestBase::msg = "DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.USER=\"/C=CZ/O=Cesnet/CN=Michal Vocu\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"";
-
-const char *IlTestBase::msg_enc = "             429\n6 michal\n415 DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.USER=\"/C=CZ/O=Cesnet/CN=Michal Vocu\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"\n";
-
-const struct server_msg IlTestBase::smsg = {
-       "https://some.host:1234/x67qr549qc",
-       (char*)IlTestBase::msg_enc,
-       strlen(IlTestBase::msg_enc),
-       strlen(IlTestBase::msg) + 1,
-       NULL
-};
diff --git a/org.glite.lb.logger/test/IlTestBase.h b/org.glite.lb.logger/test/IlTestBase.h
deleted file mode 100644 (file)
index 69bf347..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-extern "C" {
-#include "interlogd.h"
-}
-
-class IlTestBase {
-public:
-       static const char *msg;
-       static const char *msg_enc;
-       static const struct server_msg smsg;
-};
diff --git a/org.glite.lb.logger/test/event_queueTest.cpp b/org.glite.lb.logger/test/event_queueTest.cpp
deleted file mode 100644 (file)
index 86a6be1..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-#include <cppunit/extensions/HelperMacros.h>
-#include "IlTestBase.h"
-
-extern "C" {
-struct event_queue_msg {
-  struct server_msg *msg;
-  struct event_queue_msg *prev;
-};
-}
-
-#include <string>
-using namespace std;
-
-class event_queueTest: public CppUnit::TestFixture
-{
-       CPPUNIT_TEST_SUITE( event_queueTest );
-       CPPUNIT_TEST( testEventQueueCreate );
-       CPPUNIT_TEST( testEventQueueInsert );
-       CPPUNIT_TEST( testEventQueueGet );
-       CPPUNIT_TEST( testEventQueueRemove );
-       CPPUNIT_TEST_SUITE_END();
-
-public:
-       void setUp() {
-               server = strdup("localhost:8080");
-               eq = event_queue_create(server);
-               free(server);
-       }
-
-       void tearDown() {
-               struct event_queue_msg *mp;
-               struct server_msg *m;
-
-               for(mp = eq->head; mp != NULL; ) {
-                       struct event_queue_msg *mq;
-
-                       server_msg_free(mp->msg);
-                       mq = mp;
-                       mp = mp->prev;
-                       free(mq);
-               }
-               eq->head = NULL;
-               event_queue_free(eq);
-       }
-
-       void testEventQueueCreate() {
-               CPPUNIT_ASSERT( eq != NULL );
-               CPPUNIT_ASSERT_EQUAL( string(eq->dest_name), string("localhost") );
-               CPPUNIT_ASSERT_EQUAL( eq->dest_port, 8081 );
-               CPPUNIT_ASSERT( eq->tail == NULL );
-               CPPUNIT_ASSERT( eq->head == NULL );
-               CPPUNIT_ASSERT( eq->tail_ems == NULL );
-               CPPUNIT_ASSERT( eq->mark_this == NULL );
-               CPPUNIT_ASSERT( eq->mark_prev == NULL );
-               CPPUNIT_ASSERT( eq->thread_id == 0 );
-               CPPUNIT_ASSERT( eq->flushing == 0 );
-               CPPUNIT_ASSERT( eq->flush_result == 0 );
-       }
-
-       void testEventQueueInsert() {
-               struct event_queue_msg *mp;
-               struct server_msg *m;
-
-               doSomeInserts();
-               mp = eq->head;
-               m = mp->msg;
-               CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("2") );
-               CPPUNIT_ASSERT_EQUAL( mp, eq->tail_ems );
-               mp = mp->prev;
-               m = mp->msg;
-               CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("1") );
-               mp = mp->prev;
-               m = mp->msg;
-               CPPUNIT_ASSERT_EQUAL( string(m->job_id_s), string("3") );
-               CPPUNIT_ASSERT_EQUAL( mp, eq->tail );
-               CPPUNIT_ASSERT( mp->prev == NULL );
-       }
-
-       void testEventQueueGet() {
-               struct event_queue_msg *mp;
-               struct server_msg *m,sm;
-               int ret;
-
-               doSomeInserts();
-               mp = eq->head;
-               eq->head = mp->prev;
-               eq->tail_ems = NULL;
-               server_msg_free(mp->msg);
-               free(mp);
-               ret = event_queue_get(eq, &m);
-               CPPUNIT_ASSERT( ret == 0 );
-               CPPUNIT_ASSERT( eq->mark_this == eq->head );
-               CPPUNIT_ASSERT( eq->mark_prev == NULL );
-               CPPUNIT_ASSERT_EQUAL( string("1"), string(m->job_id_s) );
-               sm = IlTestBase::smsg;
-               sm.job_id_s = "4";
-               sm.receipt_to = 1;
-               ret = event_queue_insert(eq, &sm);
-               CPPUNIT_ASSERT( ret == 0 );
-               CPPUNIT_ASSERT( eq->mark_prev == eq->head );
-               CPPUNIT_ASSERT( eq->mark_this == eq->head->prev );
-               ret = event_queue_insert(eq, &sm);
-               CPPUNIT_ASSERT( ret == 0 );
-               CPPUNIT_ASSERT( eq->mark_prev == eq->head->prev );
-               CPPUNIT_ASSERT( eq->mark_this == eq->head->prev->prev );
-       }
-
-       void testEventQueueRemove() {
-               struct event_queue_msg *mp;
-               struct server_msg *m,sm;
-               int ret;
-
-               doSomeInserts();
-               ret = event_queue_get(eq, &m);
-               mp = eq->mark_this->prev;
-               sm = IlTestBase::smsg;
-               sm.job_id_s = "4";
-               sm.receipt_to = 1;
-               event_queue_insert(eq, &sm);
-               ret = event_queue_remove(eq);
-               CPPUNIT_ASSERT( eq->head->prev == mp );
-               CPPUNIT_ASSERT( eq->mark_this == NULL );
-               CPPUNIT_ASSERT( eq->mark_prev == NULL );
-       }
-
-protected:
-       char *server;
-       struct event_queue *eq;
-
-       void doSomeInserts() {
-               struct server_msg m = IlTestBase::smsg;
-
-               m.job_id_s = "1";
-               event_queue_insert(eq, &m);
-               m.receipt_to = 1;
-               m.job_id_s = "2";
-               event_queue_insert(eq, &m);
-               m.job_id_s = "3";
-               m.receipt_to = 0;
-               event_queue_insert(eq, &m);
-       }
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION( event_queueTest );
diff --git a/org.glite.lb.logger/test/event_storeTest.cpp b/org.glite.lb.logger/test/event_storeTest.cpp
deleted file mode 100644 (file)
index 8364cf4..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-#include <cppunit/extensions/HelperMacros.h>
-#include "IlTestBase.h"
-
-class event_storeTest: public CppUnit::TestFixture
-{
-       CPPUNIT_TEST_SUITE( event_storeTest );
-       CPPUNIT_TEST( event_store_recoverTest );
-       CPPUNIT_TEST( event_store_syncTest );
-       CPPUNIT_TEST( event_store_nextTest );
-       CPPUNIT_TEST( event_store_commitTest );
-       CPPUNIT_TEST( event_store_cleanTest );
-       CPPUNIT_TEST( event_store_findTest );
-       CPPUNIT_TEST( event_store_releaseTest );
-       CPPUNIT_TEST( event_store_initTest );
-       CPPUNIT_TEST( event_store_recover_allTest );
-       CPPUNIT_TEST( event_store_cleanupTest );
-       CPPUNIT_TEST_SUITE_END();
-
-public:
-       void setUp() {
-       }
-
-       void tearDown() {
-       }
-
-       void event_store_recoverTest() {
-       }
-
-       void event_store_syncTest() {
-       }
-
-       void event_store_nextTest() {
-       }
-
-       void event_store_commitTest() {
-       }
-
-       void event_store_cleanTest() {
-       }
-
-       void event_store_findTest() {
-       }
-
-       void event_store_releaseTest() {
-       }
-
-       void event_store_initTest() {
-       }
-
-       void event_store_recover_allTest() {
-       }
-
-       void event_store_cleanupTest() {
-       }
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION( event_storeTest );
diff --git a/org.glite.lb.logger/test/il_test.cpp b/org.glite.lb.logger/test/il_test.cpp
deleted file mode 100644 (file)
index cd97a73..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-
-extern "C" {
-#include <pthread.h>
-#include "glite/wmsutils/tls/ssl_helpers/ssl_inits.h"
-#include "glite/wmsutils/tls/ssl_helpers/ssl_pthreads.h"
-#include "glite/security/glite_gss.h"
-#include "interlogd.h"
-#include "glite/lb/consumer.h"
-}
-
-#if defined(IL_NOTIFICATIONS)
-#define DEFAULT_PREFIX "/tmp/notif_events"
-#define DEFAULT_SOCKET "/tmp/notif_interlogger.sock"
-#else
-#define DEFAULT_PREFIX "/tmp/dglogd.log"
-#define DEFAULT_SOCKET "/tmp/interlogger.sock"
-#endif
-                                                                                
-int TIMEOUT = DEFAULT_TIMEOUT;
-                                                                                
-gss_cred_id_t cred_handle = GSS_C_NO_CREDENTIAL;
-pthread_mutex_t cred_handle_lock = PTHREAD_MUTEX_INITIALIZER;
-                                                                                
-char *file_prefix = DEFAULT_PREFIX;
-int bs_only = 0;
-char *cert_file = NULL;
-char *key_file  = NULL;
-char *CAcert_dir = NULL;
-char *log_server = NULL;
-char *socket_path = DEFAULT_SOCKET;
-
-int 
-main (int ac,const char *av[])
-{
-       CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-       CppUnit::TextUi::TestRunner runner;
-       
-       runner.addTest(suite);
-       return runner.run() ? 0 : 1;
-}
diff --git a/org.glite.lb.logger/test/input_queue_socketTest.cpp b/org.glite.lb.logger/test/input_queue_socketTest.cpp
deleted file mode 100644 (file)
index d29e2cc..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#include <cppunit/extensions/HelperMacros.h>
-#include "IlTestBase.h"
-
-extern "C" {
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-
-#include "interlogd.h"
-
-       extern char *socket_path;
-}
-
-#include <string>
-using namespace std;
-class input_queue_socketTest: public CppUnit::TestFixture
-{
-       CPPUNIT_TEST_SUITE( input_queue_socketTest );
-       CPPUNIT_TEST( input_queue_getTest );
-       CPPUNIT_TEST_SUITE_END();
-
-public:
-
-       void setUp() {
-               struct sockaddr_un saddr;
-               int sock;
-               long offset = 0;
-
-               int ret = input_queue_attach();
-               CPPUNIT_ASSERT(ret == 0);
-
-               sock=socket(PF_UNIX, SOCK_STREAM, 0);
-               CPPUNIT_ASSERT(sock >= 0);
-               
-               memset(&saddr, 0, sizeof(saddr));
-               saddr.sun_family = AF_UNIX;
-               strcpy(saddr.sun_path, socket_path);
-               ret = connect(sock, (struct sockaddr *)&saddr, sizeof(saddr.sun_path));
-               CPPUNIT_ASSERT(ret >= 0);
-               
-               ret = write(sock, &offset, sizeof(offset));
-               CPPUNIT_ASSERT( ret == sizeof(offset) );
-               ret = write(sock, IlTestBase::msg, strlen(IlTestBase::msg));
-               CPPUNIT_ASSERT( ret == strlen(IlTestBase::msg) );
-               ret = write(sock, "\n", 1);
-               CPPUNIT_ASSERT( ret == 1 );
-       }
-
-       void tearDown() {
-               input_queue_detach();
-       }
-
-
-       void input_queue_getTest() {
-               char *event;
-               long offset;
-               int ret;
-
-               ret = input_queue_get(&event, &offset, 10);
-               CPPUNIT_ASSERT( ret >= 0 );
-               CPPUNIT_ASSERT_EQUAL( 0L, offset );
-               CPPUNIT_ASSERT_EQUAL( string(IlTestBase::msg), string(event) );
-               free(event);
-       }
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION(input_queue_socketTest);
diff --git a/org.glite.lb.logger/test/ll_test.cpp b/org.glite.lb.logger/test/ll_test.cpp
deleted file mode 100644 (file)
index 1e8dce6..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-#include <iostream>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-extern "C" {
-#define DEFAULT_SOCKET "/tmp/interlogger.sock"
-char *socket_path = DEFAULT_SOCKET;
-int edg_wll_log_proto_server(int *,char *,char *,int,int);
-void edg_wll_ll_log_init(int);
-}
-
-class LLTest: public  CppUnit::TestFixture
-{
-       CPPUNIT_TEST_SUITE(LLTest);
-       CPPUNIT_TEST(testProtoServer);
-       CPPUNIT_TEST_SUITE_END();
-
-public:
-
-  void setUp() {
-    char *msg = "DATE=20040831150159.702224 HOST=\"some.host\" PROG=edg-wms LVL=USAGE DG.PRIORITY=0 DG.SOURCE=\"UserInterface\" DG.SRC_INSTANCE=\"\" DG.EVNT=\"RegJob\" DG.JOBID=\"https://some.host:1234/x67qr549qc\" DG.SEQCODE=\"UI=2:NS=0:WM=0:BH=1:JSS=0:LM=0:LRMS=0:APP=0\" DG.REGJOB.JDL=\"\" DG.REGJOB.NS=\"ns address\" DG.REGJOB.PARENT=\"\" DG.REGJOB.JOBTYPE=\"SIMPLE\" DG.REGJOB.NSUBJOBS=\"0\" DG.REGJOB.SEED=\"\"";
-    pipe(pd);
-    log_proto_client(pd[1], msg);
-    input_queue_attach();
-  }
-
-  void tearDown() {
-    close(pd[0]);
-    close(pd[1]);
-    input_queue_detach();
-  }
-
-  void testProtoServer() {
-    int ret;
-    edg_wll_ll_log_init(255);
-    ret = edg_wll_log_proto_server(&pd[0], 
-                                      "michal",
-                                      "/tmp/dglogd.log",
-                                      0,
-                                      0);
-    CPPUNIT_ASSERT( ret == 0 );
-  }
-
-private:
-  int  pd[2];
-
-  int log_proto_client(int con, char *logline) {
-    char       header[32];
-    int        err;
-    int        size;
-    u_int8_t size_end[4];
-
-    err = 0;
-    size = strlen(logline)+1;
-    size_end[0] = size & 0xff; size >>= 8;
-    size_end[1] = size & 0xff; size >>= 8;
-    size_end[2] = size & 0xff; size >>= 8;
-    size_end[3] = size;
-    size = strlen(logline)+1;
-
-    err = write(con, "DGLOG", 5);
-    CPPUNIT_ASSERT(err == 5);
-    err = write(con, size_end, 4);
-    CPPUNIT_ASSERT(err == 4);
-    err = write(con, logline, size);
-    CPPUNIT_ASSERT( err == size );
-}
-
- int sock;
- int accepted;
-
-int 
-input_queue_attach()
-{ 
-  struct sockaddr_un saddr;
-
-  CPPUNIT_ASSERT((sock=socket(PF_UNIX, SOCK_STREAM, 0)) >= 0);
-
-  memset(&saddr, 0, sizeof(saddr));
-  saddr.sun_family = AF_UNIX;
-  strcpy(saddr.sun_path, socket_path);
-
-  CPPUNIT_ASSERT(bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) >= 0); 
-  CPPUNIT_ASSERT(listen(sock, 5) >= 0 );
-  return(0);
-}
-
-void input_queue_detach()
-{
-  if (sock >= 0)
-    close(sock);
-  unlink(socket_path);
-}
-
-};
-
-
-CPPUNIT_TEST_SUITE_REGISTRATION( LLTest );
-
-int 
-main (int ac,const char *av[])
-{
-       CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-       CppUnit::TextUi::TestRunner runner;
-       
-       runner.addTest(suite);
-       return runner.run() ? 0 : 1;
-}
diff --git a/org.glite.lb.logger/test/logd_proto_test.c b/org.glite.lb.logger/test/logd_proto_test.c
deleted file mode 100644 (file)
index 9ee0b44..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <netinet/in.h>
-#include <signal.h>
-#include <string.h>
-#include <syslog.h>
-#include <fcntl.h>
-
-#define edg_wll_gss_read_full(a,b,c,d,e,f)  test_edg_wll_gss_read_full(a,b,c,d,e,f)
-#define edg_wll_gss_write_full(a,b,c,d,e,f) test_edg_wll_gss_write_full(a,b,c,d,e,f)
-#define edg_wll_GssConnection               int
-
-#include "logd_proto.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/escape.h"
-#include "glite/lb/events_parse.h"
-
-int
-test_edg_wll_gss_read_full(int *fd,
-                          void *buf,
-                          size_t bufsize,
-                          struct timeval *timeout,
-                          size_t *total,
-                          edg_wll_GssStatus *code) 
-{
-  *total = read(*fd, buf, bufsize);
-  return(*total < 0 ? *total : 0);
-}
-
-int
-test_edg_wll_gss_write_full(int *fd,
-                           const void *buf,
-                           size_t bufsize,
-                           struct timeval *timeout,
-                           size_t *total,
-                           edg_wll_GssStatus *code) 
-{
-  return(0);
-}
-
-#include "logd_proto.c"
diff --git a/org.glite.lb.logger/test/server_msgTest.cpp b/org.glite.lb.logger/test/server_msgTest.cpp
deleted file mode 100644 (file)
index e669ea1..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <cppunit/extensions/HelperMacros.h>
-#include "IlTestBase.h"
-
-#include <string.h>
-
-using namespace std;
-
-class server_msgTest: public CppUnit::TestFixture 
-{
-       CPPUNIT_TEST_SUITE(server_msgTest);
-       CPPUNIT_TEST( server_msg_createTest );
-       CPPUNIT_TEST( server_msg_copyTest );
-       CPPUNIT_TEST_SUITE_END();
-
-public:
-
-       void setUp() {
-               msg = server_msg_create((char *)IlTestBase::msg);
-       }
-
-       void tearDown() {
-               server_msg_free(msg);
-       }
-
-       void server_msg_createTest() {
-               CPPUNIT_ASSERT( msg != NULL );
-               CPPUNIT_ASSERT_EQUAL( string(msg->job_id_s), string(IlTestBase::smsg.job_id_s) );
-               CPPUNIT_ASSERT_EQUAL( string(msg->msg), string(IlTestBase::smsg.msg) );
-               CPPUNIT_ASSERT_EQUAL( msg->len, IlTestBase::smsg.len );
-               CPPUNIT_ASSERT_EQUAL( msg->ev_len, IlTestBase::smsg.ev_len );
-               CPPUNIT_ASSERT_EQUAL( msg->es, IlTestBase::smsg.es );
-               CPPUNIT_ASSERT( !server_msg_is_priority(msg) );
-       }
-
-       void server_msg_copyTest() {
-               struct server_msg *msg2;
-
-               msg2 = server_msg_copy(msg);
-               CPPUNIT_ASSERT( msg2 != NULL );
-               CPPUNIT_ASSERT( msg2 != msg );
-               CPPUNIT_ASSERT_EQUAL( string(msg->job_id_s), string(msg2->job_id_s) );
-               CPPUNIT_ASSERT( msg->job_id_s != msg2->job_id_s);
-               CPPUNIT_ASSERT_EQUAL( string(msg->msg), string(msg2->msg) );
-               CPPUNIT_ASSERT( msg->msg != msg2->msg );
-               CPPUNIT_ASSERT_EQUAL( msg->len, msg2->len );
-               CPPUNIT_ASSERT_EQUAL( msg->ev_len, msg2->ev_len );
-               CPPUNIT_ASSERT_EQUAL( msg->es, msg2->es );
-               server_msg_free(msg2);
-       }
-
-private:
-       struct server_msg *msg;
-};
-
-
-CPPUNIT_TEST_SUITE_REGISTRATION(server_msgTest);
diff --git a/org.glite.lb.server/.cvsignore b/org.glite.lb.server/.cvsignore
deleted file mode 100644 (file)
index 1df717b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-.project
-.cdtproject
\ No newline at end of file
diff --git a/org.glite.lb.server/LICENSE b/org.glite.lb.server/LICENSE
deleted file mode 100644 (file)
index 259a91f..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
diff --git a/org.glite.lb.server/Makefile b/org.glite.lb.server/Makefile
deleted file mode 100644 (file)
index 8af132c..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-# defaults
-top_srcdir=..
-stagedir=.
-globalprefix=glite
-lbprefix=lb
-package=glite-lb-server
-version=0.2.0
-PREFIX=/opt/glite
-
-# gridsite requires openssl libraries, we want to include the ones from globus
-globus_prefix=/opt/globus
-nothrflavour=gcc32
-thrflavour=gcc32pthr
-expat_prefix=/opt/expat
-cares_prefix=/opt/c-ares
-gsoap_prefix=/opt/gsoap
-classads_prefix=/opt/classads
-voms_prefix=/opt/glite
-lcas_prefix=/opt/glite
-gridsite_prefix=/opt/glite
-
--include Makefile.inc
--include ../project/version.properties
-
-version=${module.version}
-
-default all: compile
-
-GLITE_LB_SERVER_WITH_WS=yes
-
-ifdef LB_STANDALONE
-       LB_STANDALONE_FLAGS:=-DLB_STANDALONE
-#      GLITE_LB_SERVER_WITH_WS=no
-endif
-
-ifdef LB_PERF
-       STATIC_LIB_BK:=libglite_lb_bkserver_perf.a
-       LB_PERF_FLAGS:=-DLB_PERF
-else
-       STATIC_LIB_BK:=libglite_lb_bkserver.a
-endif
-
-ifeq ($(GLITE_LB_SERVER_WITH_WS),yes)
-       WS_CFLAGS=-DGLITE_LB_SERVER_WITH_WS 
-       NSMAP=LoggingAndBookkeeping.nsmap
-else
-       WS_CFLAGS=
-endif
-
-GSOAP_FILES_PREFIX:= bk_ws_
-
-YACC=bison -y
-CC=gcc
-CXX=g++
-
-ifeq ($(gsoap_version),2.7.0)
-       VPATH=${top_srcdir}/interface:${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/doc:${top_srcdir}/examples:${top_srcdir}/project:${gsoap_prefix}
-else
-       VPATH=${top_srcdir}/interface:${top_srcdir}/src:${top_srcdir}/test:${top_srcdir}/doc:${top_srcdir}/examples:${top_srcdir}/project
-endif
-AT3=${stagedir}/sbin/glite-lb-at3
-
-SUFFIXES = .T 
-
-DEBUG:=-g -O0 -Wall
-
-GRIDSITE_CFLAGS = -I${gridsite_prefix}/include `xml2-config --cflags`
-GRIDSITE_LIBS = -L${gridsite_prefix}/${libdir} -L${gridsite_prefix}/lib -lgridsite_globus `xml2-config --libs`
-
-LCAS_CFLAGS=-I${lcas_prefix}/include
-
-CFLAGS:= \
-       ${WS_CFLAGS} ${DEBUG} \
-       -DVERSION=\"${version}\" \
-       -I${gsoap_prefix}/include -I${gsoap_prefix}/ \
-       -I${stagedir}/include -I${top_srcdir}/src -I. \
-       -I${top_srcdir}/interface \
-       -I${expat_prefix}/include \
-       -I${cares_prefix}/include \
-       -I${classads_prefix}/include -I${classads_prefix}/include/classad \
-       -I${voms_prefix}/include \
-       ${COVERAGE_FLAGS} \
-       $(GRIDSITE_CFLAGS) ${LCAS_CFLAGS}\
-       -D_GNU_SOURCE ${LB_STANDALONE_FLAGS} ${LB_PERF_FLAGS} -DLB_EVENTS_BLOB \
-       -I${globus_prefix}/include/${nothrflavour} #gridsite needs this
-
-CXXFLAGS:=${CFLAGS}
-
-ifdef LB_PROF
-       SRVBONES_LIB:= ${stagedir}/${libdir}/libglite_lbu_server_bones.la
-       LB_COMMON_LIB:=${stagedir}/${libdir}/libglite_lb_common_${nothrflavour}.la
-       LB_UTILS_DB_LIB:=${stagedir}/${libdir}/libglite_lbu_db.la
-       CFLAGS:=${CFLAGS} -pg -g
-       LDFLAGS:=${LDFLAGS} -pg
-else
-       SRVBONES_LIB:= -L${stagedir}/${libdir} -lglite_lbu_server_bones
-       LB_COMMON_LIB:=-L${stagedir}/${libdir} -lglite_lb_common_${nothrflavour}
-       LB_UTILS_DB_LIB:=-L${stagedir}/${libdir} -lglite_lbu_db
-       LDFLAGS:= -L${stagedir}/${libdir}
-endif
-
-# LB_MACHINE_LIB:=${stagedir}/${libdir}/libglite_lb_statemachine.a
-LB_MACHINE_LIB:=-L${stagedir}/${libdir} -lglite_lb_statemachine
-
-ifdef LBS_DB_PROFILE
-       CFLAGS:=${CFLAGS} -DLBS_DB_PROFILE
-endif
-
-TEST_LIBS:=-L${cppunit_prefix}/lib -lcppunit
-TEST_INC:=-I${cppunit_prefix}/include
-
-COMPILE:=libtool --mode=compile ${CC} ${CFLAGS}
-CXXCOMPILE:=libtool --mode=compile ${CXX} ${CXXFLAGS}
-LINK:=libtool --mode=link ${CC} -rpath ${stagedir}/${libdir}  ${LDFLAGS} 
-SOLINK:=libtool --mode=link ${CC} -module ${LDFLAGS} -rpath ${stagedir}/${libdir}
-# XXX: not used? LINKXX:=libtool --mode=link ${CXX} ${LDFLAGS} 
-INSTALL:=libtool --mode=install install
-LINKXX:=libtool --mode=link  ${CXX} -rpath ${stagedir}/${libdir} ${LDFLAGS}
-XSLTPROC:=xsltproc --novalid
-
-#ifeq ($(shell ls ${gsoap_prefix}/bin/soapcpp2),${gsoap_prefix}/bin/soapcpp2)
-#      gsoap_bin_prefix := ${gsoap_prefix}/bin
-#else
-#      gsoap_bin_prefix := ${gsoap_prefix}
-#endif
-
-gsoap_bin_prefix:=${shell if [ -x  ${gsoap_prefix}/bin/soapcpp2 ]; then echo ${gsoap_prefix}/bin; else echo ${gsoap_prefix}; fi }
-
-ifneq (${expat_prefix},/usr)
-       expatlib := -L${expat_prefix}/lib
-endif
-
-vomsflavour := _${nothrflavour}
-ifeq (${nothrflavour},gcc32) 
-       vomsflavour :=
-endif 
-ifeq (${nothrflavour},gcc32dbg)
-       vomsflavour :=
-endif
-VOMS_LIBS:=-L${voms_prefix}/${libdir} -lvomsapi${vomsflavour}
-LCAS_LIBS:=-L${lcas_prefix}/${libdir} -llcas
-
-#EXT_LIBS:= \
-#      ${expatlib} -lexpat \
-#      ${GRIDSITE_LIBS} \
-#      -lvomsc${vomsflavour} \
-
-ifneq (${classads_prefix},/usr)
-       classadslib := -L${classads_prefix}/${libdir} -L${classads_prefix}/lib
-endif
-
-classadslib := ${classadslib} -lclassad
-
-EXT_LIBS:=  \
-       -lz -lcares\
-       ${GRIDSITE_LIBS} \
-       ${classadslib} \
-       ${LCAS_LIBS} \
-       ${VOMS_LIBS}
-
-COMMON_LIBS:= -L${stagedir}/${libdir} -lglite_lb_common_${nothrflavour} -lglite_security_gss_${nothrflavour} -lglite_lbu_trio -lglite_lbu_maildir
-
-BKSERVER_BASE_OBJS:= \
-       bkserverd.o il_lbproxy.o get_events.o index.o jobstat.o jobstat_supp.o \
-       seqcode.o write2rgma.o lb_html.o lb_http.o lb_proto.o cond_dump.o lb_xml_parse.o \
-       lb_xml_parse_V21.o lb_text.o \
-       openserver.o query.o userjobs.o db_store.o request.o store.o \
-       stored_master.o srv_purge.o server_state.o dump.o lb_authz.o load.o \
-       notification.o il_notification.o notif_match.o stats.o db_calls.o db_supp.o lb_rss.o pretty_print_wrapper.o 
-
-gsoap_version ?= ${gsoap_default_version}
-
-dotless_gsoap_ver:=${shell echo ${gsoap_version} | tr -d . }
-ifeq ($(shell test -f ${stagedir}/${libdir}/libglite_security_gsoap_plugin_${dotless_gsoap_ver}_${nothrflavour}_c.so && echo ok),ok)
-       langflavour:=_c
-endif
-GSOAP_LIB:=-L${stagedir}/${libdir} -lglite_security_gsoap_plugin_${dotless_gsoap_ver}_${nothrflavour}${langflavour}
-
-ifeq ($(GLITE_LB_SERVER_WITH_WS),yes)
-       BKSERVER_OBJS:= \
-               ${BKSERVER_BASE_OBJS} \
-               ${GSOAP_FILES_PREFIX}C.o ${GSOAP_FILES_PREFIX}Server.o \
-               ws_query.o ws_fault.o ws_typeref.o
-
-       BKSERVER_LIBS= \
-               ${SRVBONES_LIB} \
-               ${LB_COMMON_LIB} \
-               ${LB_MACHINE_LIB} \
-               ${LB_UTILS_DB_LIB} \
-               ${GSOAP_LIB} \
-               ${EXT_LIBS} \
-               ${classadslib} \
-               -lglite_lbu_maildir
-else
-       BKSERVER_OBJS:= ${BKSERVER_BASE_OBJS}
-               
-       BKSERVER_LIBS= \
-               ${SRVBONES_LIB} \
-               ${LB_COMMON_LIB} \
-               ${LB_MACHINE_LIB} \
-               ${LB_UTILS_DB_LIB} \
-               -lglite_security_gss_${nothrflavour} \
-               ${EXT_LIBS} \
-               ${classadslib} \
-               -lglite_lbu_maildir
-endif
-
-INDEX_OBJS:= index.o index_parse.o jobstat_supp.o openserver.o \
-       jobstat.o query.o get_events.o write2rgma.o index_lex.o \
-       lb_authz.o store.o bkindex.o stats.o\
-       request.o db_store.o srv_purge.o notif_match.o il_lbproxy.o dump.o lb_xml_parse.o il_notification.o lb_proto.o lb_text.o server_state.o lb_xml_parse_V21.o lb_html.o cond_dump.o notification.o seqcode.o userjobs.o load.o db_calls.o db_supp.o lb_rss.o pretty_print_wrapper.o
-
-INDEX_LIBS:= ${SRVBONES_LIB} ${COMMON_LIBS} ${LB_MACHINE_LIB} ${EXT_LIBS} ${LB_UTILS_DB_LIB}
-
-WS_CLIENT_OBJS:= $(GSOAP_FILES_PREFIX)C.o $(GSOAP_FILES_PREFIX)Client.o ws_fault.o ws_typeref.o
-WS_CLIENT_LIBS:= ${GSOAP_LIB} -lglite_lb_common_${nothrflavour} \
-       -lglite_lb_common_${nothrflavour}
-
-# WS_CLIENT_LIBS:= -L${stagedir}/${libdir} \
-#                 -lglite_lb_client_${nothrflavour} \
-#                 -lglite_lb_common_${nothrflavour} \
-#                 -L${gsoap_prefix}/${libdir} -lgsoap \
-#                 -lglite_security_gsoap_plugin_${nothrflavour} \
-#                 ${EXT_LIBS}
-# 
-
-HDRS=index.h lb_authz.h store.h
-
-MAN_GZ:=glite-lb-bkindex.8.gz glite-lb-bkserverd.8.gz glite-lb-mon-db.1.gz
-MAN = $(MAN_GZ:.gz=)
-
-LIB_OBJS_BK:= \
-       il_lbproxy.o get_events.o index.o jobstat.o jobstat_supp.o \
-       seqcode.o lb_html.o lb_http.o lb_proto.o cond_dump.o lb_xml_parse.o \
-       lb_xml_parse_V21.o lb_text.o \
-       openserver.o query.o userjobs.o db_store.o request.o store.o \
-       stored_master.o srv_purge.o server_state.o dump.o lb_authz.o load.o \
-       notification.o il_notification.o notif_match.o stats.o write2rgma.o \
-       db_calls.o db_supp.o lb_rss.o pretty_print_wrapper.o
-
-MONDB_OBJS:=mon-db.o ${LIB_OBJS_BK}
-MONDB_LIBS:=${COMMON_LIBS} ${LB_MACHINE_LIB} ${LB_UTILS_DB_LIB} ${EXT_LIBS}
-
-LCAS_PLUGIN_OBJS:=lcas_lb.o
-LCAS_PLUGIN_LOBJS:=${LCAS_PLUGIN_OBJS:.o=.lo}
-LCAS_PLUGIN_LIB:=liblcas_lb.la
-
-EXAMPLES=
-
-glite-lb-bkserverd: ${NSMAP} ${BKSERVER_OBJS}
-       ${LINKXX} -o $@ ${BKSERVER_OBJS} ${BKSERVER_LIBS}
-
-glite-lb-bkindex: ${INDEX_OBJS}
-       ${LINKXX} -o $@ ${INDEX_OBJS} ${INDEX_LIBS}
-
-glite-lb-mon-db: ${MONDB_OBJS}
-       ${LINKXX} -o $@ ${MONDB_OBJS} ${MONDB_LIBS}
-
-compile: generate glite-lb-bkserverd glite-lb-bkindex glite-lb-mon-db ${STATIC_LIB_BK} ${LCAS_PLUGIN_LIB} ${MAN_GZ}
-
-generate: store.c index.c 
-
-check: compile test.xml test.query
-       -echo check.query not complete yet
-
-test_coverage:
-       -mkdir coverage
-       cd coverage && $(MAKE) -f ../Makefile top_srcdir=../../ COVERAGE_FLAGS="-fprofile-arcs -ftest-coverage" check
-       cd coverage && for i in `echo ${INDEX_OBJS} ${BKSERVER_OBJS} | tr ' ' '\012' | sort -u`; do gcov $$i ; done
-
-lb_xml_parse.c: lb_xml_parse.c.T
-       rm -f $@
-       ${AT3} $< >$@ || rm -f $@
-       chmod -w $@ >/dev/null
-
-${GSOAP_FILES_PREFIX}H.h ${GSOAP_FILES_PREFIX}C.c ${GSOAP_FILES_PREFIX}Server.c ${GSOAP_FILES_PREFIX}Client.c ${GSOAP_FILES_PREFIX}ServerLib.c ${GSOAP_FILES_PREFIX}ClientLib.c LoggingAndBookkeeping.nsmap: LB.xh
-       ${gsoap_bin_prefix}/soapcpp2 -w -c -p ${GSOAP_FILES_PREFIX} LB.xh
-
-# try several times -- LB.wsdl downloads BaseFault.xsd from www.ibm.com which may be failing
-# not used right now but may be useful one day
-# LB.xh: ws_typemap.dat
-#      ${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl || \
-#      { sleep 1 ; ${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl; } || \
-#      { sleep 4 ; ${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl; } || \
-#      { sleep 16 ; ${gsoap_prefix}/bin/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl; }
-
-LB.xh: ws_typemap.dat ${stagedir}/interface/LB.wsdl
-       cp ${stagedir}/interface/LBTypes.wsdl .
-       ${gsoap_bin_prefix}/wsdl2h -c -t ${top_srcdir}/src/ws_typemap.dat -o $@ ${stagedir}/interface/LB.wsdl
-       rm -f LBTypes.wsdl
-
-test.xml: test_xml
-       LD_LIBRARY_PATH=${cares_prefix}/${libdir}:${classads_prefix}/${libdir}:${LD_LIBRARY_PATH} ./test_xml
-
-test_xml: test_xml.cpp
-       ${CXX} -c ${CFLAGS} ${TEST_INC} $<
-       ${LINKXX} -o $@ test_xml.o lb_xml_parse.o ${LB_COMMON_LIB} ${TEST_LIBS}
-
-test.query: test_query_events
-       # XXX coredumps ./test_query_events
-
-#query_events_objs:=`echo ${BKSERVER_BASE_OBJS} |sed 's/bkserverd\.o//;s/db_store\.o//;s/stored_master\.o//;s/store\.o//;s/srv_purge\.o//;s/load\.o//;s/dump\.o//;s/lb_proto\.o//;s/lb_html\.o//;s/lb_http\.o//;'`
-
-query_events_objs := test_query_events.o query.o get_events.o jobstat_supp.o index.o db_supp.o
-
-test_query_events: ${query_events_objs}
-       ${LINKXX} -o $@ ${query_events_objs} \
-       ${TEST_LIBS} ${LB_COMMON_LIB} ${LB_MACHINE_LIB} ${classadslib}
-
-test.soapconv: test_soap_conv
-       LD_LIBRARY_PATH=${cares_prefix}/${libdir}:${classads_prefix}/${libdir}:${LD_LIBRARY_PATH} ./test_soap_conv
-
-test_soap_conv: test_soap_conv.cpp ${WS_CLIENT_OBJS}
-       ${CXX} -c ${CFLAGS} ${TEST_INC} $<
-       ${LINKXX} -o $@ test_soap_conv.o ${WS_CLIENT_OBJS} ${WS_CLIENT_LIBS} ${TEST_LIBS}
-
-examples: ${EXAMPLES}
-
-${STATIC_LIB_BK}: ${LIB_OBJS_BK}
-       ar crv $@ ${LIB_OBJS_BK}
-       ranlib $@
-
-${LCAS_PLUGIN_LIB}: ${LCAS_PLUGIN_LOBJS}
-       ${LINK} -o $@ $<
-
-doc: ${MAN_GZ}
-
-man: ${MAN_GZ}
-
-${MAN_GZ}: ${MAN}
-       cp $? .
-       gzip -f $(notdir $?)
-
-stage: compile
-       $(MAKE) install PREFIX=${stagedir} DOSTAGE=yes
-
-install:
-       -mkdir -p ${PREFIX}/bin ${PREFIX}/etc ${PREFIX}/etc/init.d ${PREFIX}/interface
-       -mkdir -p ${PREFIX}/share/doc/${package}-${version}
-       -mkdir -p ${PREFIX}/share/man/man1
-       -mkdir -p ${PREFIX}/${libdir}
-       -mkdir -p ${PREFIX}/include/${globalprefix}/${lbprefix}
-       mkdir -p ${PREFIX}/share/man/man8
-       ${INSTALL} -m 644 ${top_srcdir}/LICENSE ${PREFIX}/share/doc/${package}-${version}
-       ( cd ${top_srcdir}/project && ${INSTALL} -m 644 ChangeLog package.description package.summary ${PREFIX}/share/doc/${package}-${version} )
-       ${INSTALL} -m 644 ${MAN_GZ} ${PREFIX}/share/man/man1
-       for p in bkserverd bkindex mon-db; do \
-               ${INSTALL} -m 755 "glite-lb-$$p" "${PREFIX}/bin/glite-lb-$$p"; \
-       done
-       -mkdir -p ${PREFIX}/${libdir}/modules
-       ${INSTALL} -m 755 ${LCAS_PLUGIN_LIB} ${PREFIX}/${libdir}/modules
-       ln -sf liblcas_lb.so ${PREFIX}/${libdir}/modules/lcas_lb.mod
-
-       for f in dbsetup.sql index.conf.template; do \
-               ${INSTALL} -m 644 ${top_srcdir}/config/"glite-lb-$$f" ${PREFIX}/etc; \
-       done
-       ${INSTALL} -m 755 ${top_srcdir}/config/glite-lb-migrate_db2version20 ${PREFIX}/etc
-
-       ${INSTALL} -m 755 ${top_srcdir}/config/startup ${PREFIX}/etc/init.d/glite-lb-bkserverd
-
-       mkdir -p ${PREFIX}/include/${globalprefix}/${lbprefix}
-       (cd ${top_srcdir}/interface && install -m 644 ${HDRS} ${PREFIX}/include/${globalprefix}/${lbprefix})
-       install -m 644 ${STATIC_LIB_BK} ${PREFIX}/${libdir}
-       ${INSTALL} -m 644 ${top_srcdir}/interface/srv_perf.h ${PREFIX}/include/${globalprefix}/${lbprefix}
-       ${INSTALL} -m 644 ${MAN_GZ} ${PREFIX}/share/man/man8
-ifdef LB_PERF
-       -mkdir -p ${PREFIX}/sbin
-       ${INSTALL} -m 755 ${top_srcdir}/src/perftest_proxy.sh ${PREFIX}/sbin
-endif
-
-clean:
-       rm -rvf *.c *.h *.ch *.xh *.xml *.nsmap *.o *.lo .libs glite-lb-* ${STATIC_LIB_BK} ${LCAS_PLUGIN_LIB} test* ${MAN_GZ} ${EXAMPLES}
-       rm -rvf log.xml project/ rpmbuild/ RPMS/ tgz/
-
-%.c: %.c.T
-       rm -f $@
-       ${AT3} $< >$@ || rm -f $@
-       chmod -w $@ >/dev/null
-
-%.o: %.y
-       ${YACC} -d ${YFLAGS} $<
-       mv y.tab.c $*.c
-       mv y.tab.h $*.h
-       ${CC} -c ${CFLAGS} $*.c
-       rm $*.c
-
-%.cpp: %.cpp.T
-       rm -f $@
-       ${AT3} $< >$@ || rm -f $@
-       chmod -w $@ >/dev/null
-
-%.o %.lo: %.c
-       ${COMPILE} -c $<
-
-%.o %.lo: %.cpp
-       ${CXXCOMPILE} -c $<
-
-test_query_events.o: %.o: %.cpp
-       ${CXX} -c ${CFLAGS} ${TEST_INC} $<
-
-
-%.lo: %.c
-       ${COMPILE} -o $@ -c $<
-
-soap_version.h:
-       ${gsoap_bin_prefix}/soapcpp2 /dev/null
-       perl -ne '$$. == 2 && /.*([0-9]+)\.([0-9]+)\.([0-9]+)([a-z]?).*/ && printf "#define GSOAP_VERSION %d%02d%02d\n#define GSOAP_VERSION_LETTER '\''".($$4?$$4:"\\0")."'\''\n",$$1,$$2,$$3' soapH.h >$@
-       -rm soapC.cpp soapH.h soapStub.h soapClient.cpp soapServer.cpp soapClientLib.cpp soapServerLib.cpp
-
-ifeq ($(GLITE_LB_SERVER_WITH_WS),yes)
-bkserverd.o ws_fault.o: soap_version.h
-endif
-
diff --git a/org.glite.lb.server/build.xml b/org.glite.lb.server/build.xml
deleted file mode 100755 (executable)
index ca199d2..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Build file for the GLite LB Client module
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-       Version info: $Id$
-       Release: $Name$
-
-       Revision history:
-       $Log$
-       Revision 1.5  2005/05/26 15:13:55  zurek
-       inserted module.build.file
-       
-       Revision 1.4.2.1  2005/02/12 01:39:21  glbuild
-       Changed start time
-       
-       Revision 1.4  2004/10/18 19:16:09  zsalvet
-       RPM descriptions
-       
-       Revision 1.3  2004/08/05 15:24:32  dimeglio
-       Changed default target from compile to dist
-       
-       Revision 1.2  2004/07/07 12:07:41  akrenek
-       - use nonthr common library
-       - build without VOMS & GACL
-       
-       Revision 1.3  2004/07/06 17:45:30  flammer
-       Update of classpath definitions, targets & configure file.
-       
-       Revision 1.2  2004/06/23 00:29:33  dimeglio
-       Added standard comments and handling of support files
-       
--->
-
-<project name="server" default="dist">
-       
-       <!-- =========================================
-                Builds the GLite LB Client Module
-            ========================================= -->
-       
-       <!-- =========================================
-            Import properties (order is important)
-            ========================================= -->
-
-       <!-- import baseline & user properties -->
-       <import file="../org.glite/project/baseline.properties.xml" />
-
-       <!-- import component build properties,
-                       component properties &
-                       component common properties -->
-       <import file="./project/properties.xml"/>
-       
-       <!-- import subsystem build properties,
-                       subsystem properties &
-                       subsystem common properties -->
-       <import file="${subsystem.properties.file}"/>
-
-       <!-- import global build properties &
-                       global properties -->
-       <import file="${global.properties.file}" />
-               
-       <!-- =========================================
-                Load dependency property files (order is important)
-            ========================================= -->
-       <property file="${user.dependencies.file}"/>
-       <property file="${component.dependencies.file}" />
-       <property file="${subsystem.dependencies.file}" />
-       <property file="${global.dependencies.file}"/>
-       
-       <!-- =========================================
-                Load configure options (order is important)
-            ========================================= -->
-       <import file="${global.configure.options.file}"/>
-       <import file="${component.configure.options.file}"/>
-
-       <!-- =========================================
-                Import task definitions (order is important)
-            ========================================= -->
-       <import file="${subsystem.taskdefs.file}" />
-       <import file="${global.taskdefs.file}" />
-                       
-       <!-- =========================================
-                Load common targets
-            ========================================= -->
-       <import file="${global.targets-simple_make.file}" />
-
-       <!-- =========================================
-                Load version file 
-            ========================================= -->
-       <property file="${module.version.file}"/>
-       <property file="${module.build.file}"/>
-               
-       <!-- ==============================================
-                Local private targets
-            ============================================== -->
-       
-       <target name="localinit"
-               description="Module specific initialization tasks">
-        <!-- Copy support files from the subsystem project to the component project-->
-               <copy toDir="${module.project.dir}">
-                       <fileset dir="${subsystem.project.dir}">
-                               <include name="at3" />
-                               <include name="*.T" />
-                               <include name="*.pm" />
-                       </fileset>
-               </copy> 
-               <antcall target="lbmakefiles" />
-       </target>
-               
-       <target name="localcompile"
-               description="Module specific compile tasks">
-       </target>
-       
-       <target name="localclean"
-               description="Module specific cleaning tasks">
-               <delete>
-                       <fileset dir="${module.project.dir}">
-                               <include name="at3" />
-                               <include name="*.T" />
-                               <include name="*.pm" />
-                       </fileset>
-               </delete>       
-       </target>
-       
-       <!-- =========================================
-            RPM settings
-            ========================================= -->
-
-       <property name="build.package.summary" value="L&amp;B bookkeeping server" />
-       <property name="build.package.description" value=" The daemon
-installed at the Logging &amp; Bookkeeping (L&amp;B) server
-machine.&#xA;It is responsible for accepting events from locallogger,
-storing them in RDBMS,&#xA;and performing queries on client requests
-(job status, job log etc.).&#xA;Also includes purge utilities
-to remove (and optionally archive) inactive&#xA;data from
-the database and to change database index configuration." />
-
-</project>             
diff --git a/org.glite.lb.server/config/glite-lb-dbsetup.sql b/org.glite.lb.server/config/glite-lb-dbsetup.sql
deleted file mode 100644 (file)
index 72513ba..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-create table jobs (
-       jobid           char(32)        binary not null,
-       dg_jobid        varchar(255)    binary not null,
-       userid          char(32)        binary not null,
-       aclid           char(32)        binary null,
-       proxy           bool            not null,
-       server          bool            not null,
-       grey            bool            not null,
-       nevents         int             not null,
-
-       primary key (jobid),
-       unique (dg_jobid),
-       index (userid)
-) engine=innodb;
-
-create table users (
-       userid          char(32)        binary not null,
-       cert_subj       varchar(255)    binary not null,
-
-       primary key (userid),
-       unique (cert_subj)
-) engine=innodb;
-
-create table events (
-       jobid           char(32)        binary not null,
-       event           int             not null,
-       code            int             not null,
-       prog            varchar(255)    binary not null,
-       host            varchar(255)    binary not null,
-       time_stamp      datetime        not null,
-       userid          char(32)        binary null,
-       usec            int             null,
-       level           int             null,
-
-       arrived         datetime        not null,
-       seqcode         varchar(255)    binary not null,
-
-       primary key (jobid,event),
-       index (time_stamp),
-       index (host),
-       index (arrived)
-) engine=innodb;
-
-create table events_flesh (
-       jobid           char(32)        binary not null,
-       event           int             not null,
-       ulm             mediumblob      not null,
-       
-       primary key (jobid,event)
-) engine=innodb;
-
--- for compatibility
-create table short_fields (
-       jobid           char(32)        binary not null,
-       event           int             not null,
-       name            varchar(200)    binary not null,
-       value           varchar(255)    binary null,
-
-       primary key (jobid,event,name)
-) engine=innodb;
-
--- for compatibility
-create table long_fields (
-       jobid           char(32)        binary not null,
-       event           int             not null,
-       name            varchar(200)    binary not null,
-       value           mediumblob      null,
-
-       primary key (jobid,event,name)
-) engine=innodb;
-
-create table states (
-       jobid           char(32)        binary not null,
-       status          int             not null,
-       seq             int             not null,
-       int_status      mediumblob      not null,
-       version         varchar(32)     not null,
-       parent_job      varchar(32)     binary not null,
-
-       primary key (jobid),
-       index (parent_job)
-       
-) engine=innodb;
-
-create table status_tags (
-       jobid           char(32)        binary not null,
-       seq             int             not null,
-       name            varchar(200)    binary not null,
-       value           varchar(255)    binary null,
-
-       primary key (jobid,seq,name)
-) engine=innodb;
-
-create table server_state (
-       prefix          varchar(100)    not null,
-       name            varchar(100)    binary not null,
-       value           varchar(255)    binary not null,
-
-       primary key (prefix,name)
-) engine=innodb;
-
-create table acls (
-       aclid           char(32)        binary not null,
-       value           mediumblob      not null,
-       refcnt          int             not null,
-
-       primary key (aclid)
-) engine=innodb;
-
-create table notif_registrations (
-       notifid         char(32)        binary not null,
-       destination     varchar(200)    not null,
-       valid           datetime        not null,
-       userid          char(32)        binary not null,
-       conditions      mediumblob      not null,
-       flags           int             not null,
-
-       `STD_owner`     varchar(200)    null,
-       `STD_network_server`    varchar(200)    null,
-       `JDL_VirtualOrganisation`       varchar(200)    null,
-
-       primary key (notifid),
-       index (`STD_owner`),
-       index (`STD_network_server`),
-       index (`JDL_VirtualOrganisation`)
-) engine=innodb;
-
-create table notif_jobs (
-       notifid         char(32)        binary not null,
-       jobid           char(32)        binary not null,
-
-       primary key (notifid,jobid),
-       index (jobid)
-) engine=innodb;
-
-create table zombie_jobs (
-       jobid   varchar(32)     not null,
-       prefix_id       tinyint unsigned not null,
-       suffix_id       tinyint unsigned not null,
-
-       primary key (jobid)
-) engine=innodb;
-
-create table zombie_prefixes (
-       prefix_id       tinyint unsigned not null auto_increment,
-       prefix          varchar(255)    binary not null,
-
-       primary key (prefix_id)
-) engine=innodb;
-
-create table zombie_suffixes (
-       suffix_id       tinyint unsigned not null auto_increment,
-       suffix          varchar(255)    binary not null,
-
-       primary key (suffix_id)
-) engine=innodb;
-
-
diff --git a/org.glite.lb.server/config/glite-lb-index.conf.template b/org.glite.lb.server/config/glite-lb-index.conf.template
deleted file mode 100644 (file)
index 915df1f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-[
-       JobIndices = {
-               [ type = "system"; name = "owner" ],
-               [ type = "system"; name = "location" ],
-               [ type = "system"; name = "destination" ],
-               [ type = "system"; name = "lastUpdateTime" ]
-       }
-]
diff --git a/org.glite.lb.server/config/glite-lb-migrate_db2version20 b/org.glite.lb.server/config/glite-lb-migrate_db2version20
deleted file mode 100644 (file)
index a547fbf..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-# This script is intendent to be used to extend bkserver database to 
-# to be able to hold both bkserver and lbproxy jobs.
-# The operation should be non-destructive, i.e. all data should persist
-# and continue to be fully usable.
-
-#!/bin/bash
-usage() {
-cat <<EOF
-NAME:
-       glite-lb-migrate_db2version20
-               script for migrating older LB server or proxy databases
-               to new schema required for transaction locking and USP 
-               (United Server and Proxy)
-USAGE:
-       glite-lb-migrate_db2version20 -s|-p [-d db_name]
-
-               -s              migrate old server DB to new version
-               -p              migrate old proxy DB to new version
-               -d db_name      non-default database name
-EOF
-
-}
-
-SERVER=""
-PROXY=""
-
-while getopts "spd:h" OPTION 
-do
-    case "$OPTION" in 
-    "s") SERVER=1
-    ;;
-
-    "p") PROXY=1
-    ;;
-
-    "d") DB_NAME=$OPTARG
-    ;;
-
-    "h") 
-       usage;
-       exit;
-    ;;
-
-    esac
-done
-
-if [ -z "$SERVER" -a -z "$PROXY" ]; then
-       usage;
-       exit;
-fi
-
-if [ "$SERVER" -a "$PROXY" ]; then
-       usage;
-       exit;
-fi
-
-
-# default DB name (for server or proxy, overriden by -d option)
-if [ -z "$DB_NAME" ]; then
-       if [ "$SERVER" ]; then
-               DB_NAME="lbserver20"
-       else
-               DB_NAME="lbproxy"
-       fi
-fi
-
-
-# convert for transactions (if needed and very old DB)
-for table in jobs users events short_fields long_fields states status_tags server_state acls notif_registrations notif_jobs; do
-       echo "SHOW CREATE TABLE $table;" | mysql -u lbserver $DB_NAME | grep -i ENGINE | grep -i InnoDB >/dev/null
-       if [ $? != 0 ]; then
-               echo "ALTER TABLE $table ENGINE=InnoDB" | mysql -u lbserver $DB_NAME
-       fi
-done
-
-
-# add new columns
-mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD proxy bool not null"
-mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD server bool not null"
-mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD grey bool not null"
-mysql -u lbserver $DB_NAME -e "ALTER TABLE jobs ADD nevents int not null"
-
-
-# flag all jobs as server jobs
-if [ "$SERVER" ]; then
-       mysql -u lbserver $DB_NAME -e "UPDATE jobs SET proxy='0'"
-       mysql -u lbserver $DB_NAME -e "UPDATE jobs SET server='1'"
-else
-       mysql -u lbserver $DB_NAME -e "UPDATE jobs SET proxy='1'"
-       mysql -u lbserver $DB_NAME -e "UPDATE jobs SET server='0'"
-fi
-
-
-# for all greyjobs set a flag
-mysql -u lbserver $DB_NAME -e "UPDATE jobs,grey_jobs SET jobs.grey='1' WHERE jobs.jobid=grey_jobs.jobid"
-
-
-# erase grey_jobs table
-mysql -u lbserver $DB_NAME -e "DROP TABLE grey_jobs"
-
-
-# set nevents field
-mysql -u lbserver $DB_NAME -e "UPDATE jobs SET nevents=(SELECT max(event) FROM events where events.jobid=jobs.jobid)+1"
-
-
-# seqcode
-mysql -u lbserver $DB_NAME -e "ALTER TABLE events ADD seqcode varchar(255) binary not null"
-mysql -u lbserver $DB_NAME -e "UPDATE events,short_fields SET events.seqcode=short_fields.value WHERE events.event=short_fields.event AND events.jobid=short_fields.jobid AND short_fields.name='SEQCODE'"
-mysql -u lbserver $DB_NAME -e "DELETE FROM short_fields where name='SEQCODE'"
-
-
-# create events_flesh table
-mysql -u lbserver $DB_NAME -e "\
-\
-create table events_flesh (\
-        jobid           char(32)        binary not null,\
-        event           int             not null,\
-        ulm             mediumblob      not null,\
-\
-        primary key (jobid,event)\
-) engine=innodb"
-
-
-# notif_registrations UPDATE
-mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD flags int not null"
-
-mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD STD_owner varchar(200) null" && \
-mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(STD_owner)"
-
-mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD STD_network_server varchar(200) null" && \
-mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(STD_network_server)"
-
-mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD JDL_VirtualOrganisation varchar(200) null" && \
-mysql -u lbserver $DB_NAME -e "ALTER TABLE notif_registrations ADD index(JDL_VirtualOrganisation)"
-
-
-# zombie jobs
-mysql -u lbserver $DB_NAME -e "\
-\
-create table zombie_jobs (\
-        jobid          varchar(32)     not null,\
-        prefix_id      tinyint         unsigned not null,\
-        suffix_id      tinyint         unsigned not null,\
-\
-        primary key (jobid)\
-) engine=innodb"
-
-mysql -u lbserver $DB_NAME -e "\
-\
-create table zombie_prefixes (\
-        prefix_id      tinyint         unsigned not null auto_increment,\
-        prefix          varchar(255)    binary not null,\
-\
-        primary key (prefix_id)\
-) engine=innodb"
-
-mysql -u lbserver $DB_NAME -e "\
-\
-create table zombie_suffixes (\
-        suffix_id       tinyint unsigned not null auto_increment,\
-        suffix          varchar(255)    binary not null,\
-\
-        primary key (suffix_id)\
-) engine=innodb"
-
diff --git a/org.glite.lb.server/config/startup b/org.glite.lb.server/config/startup
deleted file mode 100755 (executable)
index c626c2c..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-#!/bin/sh
-# chkconfig: 345 75 25
-
-GLITE_LOCATION=${GLITE_LOCATION:-/opt/glite}
-GLITE_LOCATION_VAR=${GLITE_LOCATION_VAR:-/var/glite}
-GLITE_JP_LOCATION=${GLITE_JP_LOCATION:-$GLITE_LOCATION}
-
-[ -f /etc/glite.conf ] && . /etc/glite.conf
-[ -f $GLITE_LOCATION/etc/glite-wms.conf ] && . $GLITE_LOCATION/etc/glite-wms.conf
-
-[ -f $GLITE_LOCATION/etc/lb.conf ] && . $GLITE_LOCATION/etc/lb.conf
-[ -f $GLITE_LOCATION_VAR/etc/lb.conf ] && . $GLITE_LOCATION_VAR/etc/lb.conf
-
-[ -f $HOME/.glite.conf ] && . $HOME/.glite.conf
-
-[ -n "$GLITE_LB_SERVER_PIDFILE" ] && pidfile=$GLITE_LB_SERVER_PIDFILE ||
-       pidfile=$GLITE_LOCATION_VAR/glite-lb-bkserverd.pid
-[ -z "$GLITE_LB_NOTIF_SOCK" ] && GLITE_LB_NOTIF_SOCK="/tmp/glite-lb-notif.sock"
-[ -n "$GLITE_JP_IMPORTER_PIDFILE" ] && jp_importer_pidfile=$GLITE_JP_IMPORTER_PIDFILE ||
-       jp_importer_pidfile=$GLITE_LOCATION_VAR/glite-jp-importer.pid
-
-GLITE_LB_TYPE=${GLITE_LB_TYPE:-'server'} # server, proxy, both
-GLITE_LB_PROXY_SOCK=${GLITE_LB_PROXY_SOCK:-'/tmp/glite-lbproxy-ilog.sock'}
-GLITE_LB_PROXY_FPREFIX=${GLITE_LB_PROXY_FPREFIX:-'/tmp/glite-lbproxy-ilog_events'}
-
-unset creds port
-
-start()
-{
-       if test -z "$GLITE_USER" ;then
-               echo 'Error: GLITE_USER is not set'
-               echo FAILED
-               return 1
-       fi
-
-       [ -n "$GLITE_HOST_CERT" -a -n "$GLITE_HOST_KEY" ] &&
-               creds="-c $GLITE_HOST_CERT -k $GLITE_HOST_KEY"
-
-       if test -z "$creds"; then
-               if su - $GLITE_USER -c "test -r /etc/grid-security/hostkey.pem -a -r /etc/grid-security/hostcert.pem"; then
-                       echo "$0: WARNING: /etc/grid-security/hostkey.pem readable by $GLITE_USER"
-                       creds="-c /etc/grid-security/hostcert.pem -k /etc/grid-security/hostkey.pem"
-               fi
-       fi
-
-       [ -z "$GLITE_LB_EXPORT_DUMPDIR" ] && GLITE_LB_EXPORT_DUMPDIR=$GLITE_LOCATION_VAR/dump
-       dumpdir="--dump-prefix $GLITE_LB_EXPORT_DUMPDIR"
-       [ -d "$GLITE_LB_EXPORT_DUMPDIR" ] || mkdir -p "$GLITE_LB_EXPORT_DUMPDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_DUMPDIR"
-
-       [ -z "$GLITE_LB_EXPORT_PURGEDIR" ] && GLITE_LB_EXPORT_PURGEDIR=$GLITE_LOCATION_VAR/purge
-       purgedir="--purge-prefix $GLITE_LB_EXPORT_PURGEDIR"
-       [ -d "$GLITE_LB_EXPORT_PURGEDIR" ] || mkdir -p "$GLITE_LB_EXPORT_PURGEDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_PURGEDIR"
-
-       if [ x"$GLITE_LB_EXPORT_ENABLED" = x"true" ]; then
-               if [ ! -x $GLITE_JP_LOCATION/bin/glite-jp-importer ]; then
-                       echo "glite-jp-importer needed for export to Job Provenace, install glite-jp-client package too."
-                       exit 1
-               fi
-
-               # registrations
-               [ -z "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] && GLITE_LB_EXPORT_JPREG_MAILDIR=$GLITE_LOCATION_VAR/jpreg
-               jpreg_maildir="--reg-mdir $GLITE_LB_EXPORT_JPREG_MAILDIR"
-               lbreg_maildir="--jpreg-dir $GLITE_LB_EXPORT_JPREG_MAILDIR"
-               [ -d "$GLITE_LB_EXPORT_JPREG_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPREG_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPREG_MAILDIR"
-
-               # dumps
-               [ -z "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] && GLITE_LB_EXPORT_JPDUMP_MAILDIR=$GLITE_LOCATION_VAR/jpdump
-               jpdump_maildir="--dump-mdir $GLITE_LB_EXPORT_JPDUMP_MAILDIR"
-               [ -d "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_JPDUMP_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_JPDUMP_MAILDIR"
-
-               # sandboxes
-               [ -z "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ] && GLITE_LB_EXPORT_SANDBOX_MAILDIR=$GLITE_LOCATION_VAR/sandbox
-               sandbox_maildir="--sandbox-mdir $GLITE_LB_EXPORT_SANDBOX_MAILDIR"
-               [ -d "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" ] || mkdir -p "$GLITE_LB_EXPORT_SANDBOX_MAILDIR" && chown $GLITE_USER:$GLITE_GROUP -R "$GLITE_LB_EXPORT_SANDBOX_MAILDIR"
-
-               # target Job Provenance
-               [ -n "$GLITE_LB_EXPORT_JPPS" ] && jpps="--jpps $GLITE_LB_EXPORT_JPPS"
-       fi
-
-       if test -r "$GLITE_LOCATION/etc/LB-super-users"; then
-               super="--super-users-file $GLITE_LOCATION/etc/LB-super-users"
-       fi
-
-       [ -z "$creds" ] && echo $0: WARNING: No credentials specified. Using default lookup which is dangerous. >&2
-
-       [ -n "$GLITE_LB_SERVER_PORT" ] && port="-p $GLITE_LB_SERVER_PORT"
-       [ -n "$GLITE_LB_SERVER_WPORT" ] && wport="-w $GLITE_LB_SERVER_WPORT"
-       [ -z "$GLITE_LB_NOTIF_FPREFIX" ] && GLITE_LB_NOTIF_FPREFIX="/var/tmp/glite-lb-notif"
-       if [ -n "$GLITE_LB_SERVER_DEBUG" ] ; then
-               if which tscat >/dev/null; then
-                       GLITE_LB_SERVER_OTHER_OPTIONS="$GLITE_LB_SERVER_OTHER_OPTIONS -d -s 1 2>&1 | tscat >> $GLITE_LOCATION_VAR/lb.log &"
-                       GLITE_LB_NOTIF_OTHER_OPTIONS="$GLITE_LB_NOTIF_OTHER_OPTIONS -v -d 2>&1 | tscat >> $GLITE_LOCATION_VAR/notif-il.log &"
-               else
-                       GLITE_LB_SERVER_OTHER_OPTIONS="$GLITE_LB_SERVER_OTHER_OPTIONS -d -s 1 >> $GLITE_LOCATION_VAR/lb.log 2>&1 &"
-                       GLITE_LB_NOTIF_OTHER_OPTIONS="$GLITE_LB_NOTIF_OTHER_OPTIONS -v -d >> $GLITE_LOCATION_VAR/notif-il.log 2>&1 &"
-               fi
-       fi
-       case "$GLITE_LB_TYPE" in
-       proxy)
-               proxy="-P --proxy-il-sock $GLITE_LB_PROXY_SOCK --proxy-il-fprefix $GLITE_LB_PROXY_FPREFIX"
-               ;;
-       both)
-               proxy="-B --proxy-il-sock $GLITE_LB_PROXY_SOCK --proxy-il-fprefix $GLITE_LB_PROXY_FPREFIX"
-               ;;
-       *)
-               proxy=''
-               ;;
-       esac
-
-       echo -n Starting glite-lb-bkserverd ...
-       su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-bkserverd \
-               --notif-il-sock=$GLITE_LB_NOTIF_SOCK \
-               --notif-il-fprefix=$GLITE_LB_NOTIF_FPREFIX \
-               $super $creds -i $pidfile $port $wport $dumpdir $purgedir $lbreg_maildir $proxy\
-               $GLITE_LB_SERVER_OTHER_OPTIONS" \
-       && echo " done" || echo " FAILED"
-
-       if test -x $GLITE_LOCATION/bin/glite-lb-notif-interlogd; then
-               echo -n Starting glite-lb-notif-interlogd ...
-               su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-notif-interlogd \
-                       -f $GLITE_LB_NOTIF_FPREFIX -s $GLITE_LB_NOTIF_SOCK \
-                       -M 10485760 \
-                       $creds $GLITE_LB_NOTIF_OTHER_OPTIONS" && echo " done" || echo " FAILED"
-       else
-               echo Warning: glite-lb-notif-interlogd not installed, LB notifications will not work
-       fi
-
-       if test x"$GLITE_LB_EXPORT_ENABLED" = x"true" ; then
-               echo -n Starting glite-jp-importer ...
-               su - $GLITE_USER -c "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GLITE_JP_LOCATION/lib $GLITE_JP_LOCATION/bin/glite-jp-importer \
-                       -i $jp_importer_pidfile $jpreg_maildir $jpdump_maildir $sandbox_maildir \
-                       $jpps $creds $GLITE_JP_IMPORTER_ARGS" \
-               && echo " done" || echo " FAILED"
-       fi
-
-       if test x"$GLITE_LB_TYPE" = x"proxy" -o x"$GLITE_LB_TYPE" = x"both" ; then
-               if test -x $GLITE_LOCATION/bin/glite-lb-notif-interlogd; then
-                       echo -n Starting glite-lb-interlogd for proxy ...
-                       su - $GLITE_USER -c "$GLITE_LOCATION/bin/glite-lb-interlogd \
-                               -f $GLITE_LB_PROXY_FPREFIX -s $GLITE_LB_PROXY_SOCK \
-                               $creds $GLITE_LB_PREFIX_OTHER_OPTIONS" && echo " done" || echo " FAILED"
-               else
-                       echo Warning: glite-lb-interlogd not installed, logging to LB proxy will not work
-               fi
-       fi
-}
-
-stop_daemon()
-{
-       name="$1"
-       pidfile="$2"
-
-       if [ -f "$pidfile" ]; then
-               pid=`cat "$pidfile"`
-               kill $pid
-               echo -n Stopping $name \($pid\) ...
-               try=0
-               while ps p $pid >/dev/null 2>&1; do 
-                       sleep 1;
-                       try=`expr $try + 1`
-                       if [ $try = 20 ]; then
-                               echo " giving up after $try retries"
-                               return 1
-                       fi
-               done
-               echo " done"
-               rm -f $pidfile
-       else
-               echo $pidfile does not exist - $name not running? >&2
-               return 1
-       fi
-}
-
-status_daemon()
-{
-       name="$1"
-       pidfile="$2"
-
-       if [ -f "$pidfile" ]; then
-               pid=`cat "$pidfile"`
-               if ps p $pid >/dev/null 2>&1; then
-                       echo $name running as $pid 
-               else
-                       echo $name not running
-                       return 1
-               fi
-       else
-               echo $name not running
-               return 1
-       fi
-
-       return 0
-}
-
-stop()
-{
-       LC_ALL=C
-
-       echo -n Stopping glite-lb-notif-interlogd ...
-       killall glite-lb-notif-interlogd
-       echo " done"
-
-       stop_daemon "glite-lb-bkserverd" $pidfile
-       if test x"$GLITE_LB_EXPORT_ENABLED" = x"true"; then
-               stop_daemon "glite-jp-importer" $jp_importer_pidfile
-       fi
-
-       pid=`netstat -anp --unix  2>/dev/null | grep "^unix .* LISTEN.* ${GLITE_LB_PROXY_SOCK}$"`
-       if test x"$pid" = x"" ; then
-               echo "glite-lb-interlogd for proxy not running"
-       else
-               pid=`echo $pid | sed -e 's/.*LISTEN[A-Z]*  *[^ ][^ ]*  *\([0-9]*\).*/\1/'`
-               echo -n Stopping glite-lb-interlogd for proxy \($pid\) ...
-               kill "$pid"
-               echo " done"
-       fi
-}
-
-status()
-{
-       retval=0
-       LC_ALL=C
-
-       if netstat -an --unix | grep "^unix .* LISTEN.* ${GLITE_LB_NOTIF_SOCK}$" >/dev/null 2>&1 ;then
-               echo glite-lb-notif-interlogd running
-       else
-               echo glite-lb-notif-interlogd not running
-               retval=1
-       fi
-
-       if netstat -an --unix | grep "^unix .* LISTEN.* ${GLITE_LB_PROXY_SOCK}$" >/dev/null 2>&1 ;then
-               echo glite-lb-interlogd for proxy running
-       else
-               echo glite-lb-interlogd for proxy not running
-               retval=1
-       fi
-
-       status_daemon "glite-lb-bkserverd" "$pidfile" || retval=1
-       if test x"$GLITE_LB_EXPORT_ENABLED" = x"true"; then
-               status_daemon "glite-jp-importer" "$jp_importer_pidfile" || retval=1
-       fi
-
-       return $retval
-}
-
-case x$1 in
-       xstart) start;;
-       xstop)  stop;;
-       xrestart) stop; start;;
-       xstatus) status;;
-       x*)     echo usage: $0 start,stop,restart,status >&2
-               exit 1;;
-esac
diff --git a/org.glite.lb.server/configure b/org.glite.lb.server/configure
deleted file mode 100755 (executable)
index 89fdb6e..0000000
+++ /dev/null
@@ -1,714 +0,0 @@
-#!/usr/bin/perl
-
-# WARNING: Don't edit this file unless it is the master copy in org.glite.lb
-#
-# For the purpose of standalone builds of lb/jobid/lbjp-common components
-# it is copied on tagging 
-
-# $Header$
-
-use Getopt::Long;
-
-my $pwd = `pwd`; chomp $pwd;
-my $prefix = $pwd.'/stage';
-my $stagedir;
-my $staged;
-my $module;
-my $thrflavour = 'gcc64dbgpthr';
-my $nothrflavour = 'gcc64dbg';
-my $mode = 'build';
-my $help = 0;
-my $listmodules;
-my $version;
-my $output;
-my $lb_tag = '';
-my $lbjp_tag = '';
-my $jp_tag = '';
-my $sec_tag = '';
-my $jobid_tag = '';
-my $libdir = 'lib';
-
-my @nodes = qw/client server logger utils doc ws-test db jpprimary jpindex jpclient/;
-my %enable_nodes;
-my %disable_nodes;
-
-my %extern_prefix = (
-       cares => '/opt/c-ares',
-       classads => '/opt/classads',
-       cppunit => '/usr',
-       expat => '/usr',
-       globus => '/opt/globus',
-       jglobus => '/opt/globus',
-       gsoap => '/usr',
-       mysql => '/usr',
-       'mysql-devel' => '',
-       'mysql-server' => '',
-       voms => '/opt/glite',
-       gridsite => '/opt/glite',
-       lcas => '/opt/glite',
-       ant => '/usr',
-       jdk => '/usr',
-       libtar => '/usr',
-);
-
-my %jar = (
-       'commons-codec' => '/usr/share/java/commons-codec-1.3.jar',
-);
-
-
-my %glite_prefix;
-my %need_externs;
-my %need_externs_type;
-my %need_jars;
-my %extrafull;
-my %extranodmod;
-my %deps;
-my %deps_type;
-my %topbuild;
-
-my %lbmodules = (
-       'lb' => [ qw/client common doc logger server state-machine types utils ws-interface ws-test glite-LB/], 
-       'security' => [qw/gss gsoap-plugin/],
-       'lbjp-common' => [qw/db maildir server-bones trio jp-interface/],
-       'jobid' => [qw/api-c api-cpp/],
-       'jp' => [ qw/client doc index primary server-common ws-interface/ ],
-       );
-
-
-my @opts = (
-       'prefix=s' => \$prefix,
-       'staged=s' => \$staged,
-       'module=s' => \$module,
-       'thrflavour=s' => \$thrflavour,
-       'nothrflavour=s' => \$nothrflavour,
-       'mode=s' => \$mode,
-       'listmodules=s' => \$listmodules,
-       'version=s' => \$version,
-       'output=s' => \$output,
-       'stage=s' => \$stagedir,
-       'lb-tag=s' => \$lb_tag,
-       'lbjp-common-tag=s' => \$lbjp_tag,
-       'jp-tag=s' => \$jp_tag,
-       'security-tag=s' => \$sec_tag,
-       'jobid-tag=s' => \$jobid_tag,
-       'help' => \$help,
-       'libdir=s' => \$libdir,
-);
-
-for (@nodes) {
-       $enable_nodes{$_} = 0;
-       $disable_nodes{$_} = 0;
-       
-       push @opts,"disable-$_",\$disable_nodes{$_};
-       push @opts,"enable-$_",\$enable_nodes{$_};
-}
-
-push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix;
-push @opts,"with-$_=s",\$jar{$_} for keys %jar;
-
-my @keeparg = @ARGV;
-
-GetOptions @opts or die "Errors parsing command line\n";
-
-$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq '';
-$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq '';
-
-if ($help) { usage(); exit 0; }
-
-if ($listmodules) {
-       my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}};
-       print "@m\n";
-       exit 0;
-}
-
-warn "$0: --version and --output make sense only in --mode=etics\n"
-       if ($version || $output) && $mode ne 'etics';
-
-my $en;
-for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; }
-
-my $dis;
-for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; }
-
-die "--enable-* and --disable-* are mutually exclusive\n"
-       if $en && $dis;
-
-die "--module cannot be used with --enable-* or --disable-*\n"
-       if $module && ($en || $dis);
-
-die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}};
-
-if ($dis) {
-       for (@nodes) {
-               $enable_nodes{$_} = 1 unless $disable_nodes{$_};
-       }
-}
-
-if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ;
-
-for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; }
-
-$stagedir = $prefix unless $stagedir;
-
-if ($mode eq 'build') {
-       print "Writing config.status\n";
-       open CONF,">config.status" or die "config.status: $!\n";
-       print CONF "$0 @keeparg\n";
-       close CONF;
-}
-
-
-my @modules;
-my %aux;
-
-if ($module) {
-#      push @modules,split(/[,.]+/,$module);
-       push @modules,$module;
-}
-else {
-       @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes));
-       
-       my $n;
-
-       do {
-               local $"="\n";
-               $n = $#modules;
-               push @modules,(map @{$deps{$_}},@modules);
-
-               undef %aux; @aux{@modules} = (1) x ($#modules+1);
-               @modules = keys %aux;
-       } while ($#modules > $n);
-}
-
-@aux{@modules} = (1) x ($#modules+1);
-delete $aux{$_} for (split /,/,$staged);
-@modules = keys %aux;
-
-mode_build() if $mode eq 'build';
-mode_checkout() if $mode eq 'checkout';
-mode_etics($module) if $mode eq 'etics';
-
-sub mode_build {
-       print "\nBuilding modules: @modules\n";
-       
-       my @ext = map @{$need_externs{$_}},@modules;
-       my @myjars = map @{$need_jars{$_}},@modules;
-       undef %aux; @aux{@ext} = 1;
-       @ext = keys %aux;
-       undef %aux; @aux{@myjars} = (1) x ($#myjars+1);
-       @myjars = keys %aux;
-       
-       print "\nRequired externals:\n";
-       print "\t$_: $extern_prefix{$_}\n" for @ext;
-       print "\t$_: $jar{$_}\n" for @myjars;
-       print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n";
-       
-       mkinc($_) for @modules;
-       
-       print "Creating Makefile\n";
-       
-       open MAK,">Makefile" or die "Makefile: $!\n";
-       
-       print MAK "all: @modules\n\nclean:\n";
-       
-       for (@modules) {
-               my $full = full($_);
-               my $build = $topbuild{$_} ? '': '/build';
-               print MAK "\tcd $full$build && \${MAKE} clean\n"
-       }
-       
-       print MAK "\ndistclean:\n";
-       
-       for (@modules) {
-               my $full = full($_);
-               print MAK $topbuild{$_} ?
-                       "\tcd $full$build && \${MAKE} distclean\n" :
-                       "\trm -rf $full$build\n"
-       }
-       
-       print MAK "\n";
-       
-       for (@modules) {
-               my %ldeps; undef %ldeps;  
-               @ldeps{@{$deps{$_}}} = 1;
-               for my $x (split /,/,$staged) { delete $ldeps{$x}; }
-               my @dnames = $module ? () : keys %ldeps;
-       
-               my $full = full($_);
-               my $build = $topbuild{$_} ? '': '/build';
-       
-               print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n";
-       }
-       
-       close MAK;
-}
-       
-sub mode_checkout() {
-       for (@modules) {
-               my $module = $_;
-               my $tag = "";
-               if ($lb_tag){
-                       for (@{$lbmodules{lb}}){
-                               if ("lb.".$_ eq $module){
-                                       $tag = '-r '.$lb_tag;
-                               }
-                       }       
-               }
-               if ($lbjp_tag){
-                       for (@{$lbmodules{'lbjp-common'}}){
-                               if ("lbjp-common.".$_ eq $module){
-                                        $tag = '-r '.$lbjp_tag;
-                                }
-                       }
-               }
-               if ($jp_tag){
-                       for (@{$lbmodules{'jp'}}){
-                               if ("jp.".$_ eq $module){
-                                        $tag = '-r '.$jp_tag;
-                               }
-                        }
-               }
-               if ($sec_tag){
-                       for (@{$lbmodules{security}}){
-                               if ("security.".$_ eq $module){
-                                        $tag = '-r '.$sec_tag;
-                                }
-                       }
-               }
-               if ($jobid_tag){
-                       for (@{$lbmodules{jobid}}){
-                               if ("jobid.".$_ eq $module){
-                                        $tag = '-r '.$jobid_tag;
-                                }
-                       }
-               }
-               #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){
-               #       print "found";
-               #}
-               $_ = full($_);
-               print "\n*** Checking out $_\n";
-               system("cvs checkout  $tag $_") == 0 or die "cvs checkout $tag $_: $?\n";
-       }
-}
-
-BEGIN{
-%need_externs_aux = (
-       'lb.client' => [ qw/cppunit:B classads/ ],
-       'lb.client-java' => [ qw/ant:B jglobus jdk:B/ ],
-       'lb.common' => [ qw/expat cppunit:B classads/ ],
-       'lb.doc' => [],
-       'lb.logger' => [ qw/cppunit:B/ ],
-       'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ],
-       'lb.state-machine' => [ qw/classads/ ],
-       'lb.utils' => [ qw/cppunit:B/ ],
-       'lb.ws-interface' => [],
-       'lb.ws-test' => [ qw/gsoap:B/ ],
-       'lb.types' => [ qw// ],
-       'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R yaim:R/ ],
-       'lbjp-common.db' => [ qw/mysql:R mysql-devel:B/ ],
-       'lbjp-common.maildir' => [ qw// ],
-       'lbjp-common.server-bones' => [ qw// ],
-       'lbjp-common.trio' => [ qw/cppunit:B/ ],
-       'lbjp-common.jp-interface' => [ qw/cppunit:B/ ],
-       'security.gss' =>  [ qw/globus_essentials:R globus:B cares cppunit:B/ ],
-       'security.gsoap-plugin' =>  [ qw/cppunit:B globus_essentials:R globus:B cares gsoap:B/ ],
-       'jobid.api-c' =>  [ qw/cppunit:B/ ],
-       'jobid.api-cpp' =>  [ qw/cppunit:B/ ],
-       'jobid.api-java' =>  [ qw/ant:B jdk:B/ ],
-       'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ],
-        'jp.doc' => [],
-        'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ],
-        'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ],
-        'jp.server-common' => [],
-        'jp.ws-interface' => [],
-);
-
-for my $ext (keys %need_externs_aux) {
-       for (@{$need_externs_aux{$ext}}) {
-               /([^:]*)(?::(.*))?/;
-               push @{$need_externs{$ext}},$1;
-               my $type = $2 ? $2 : 'BR';
-               $need_externs_type{$ext}->{$1} = $type;
-       }
-}
-
-%need_jars = (
-       'jobid.api-java' => [ qw/commons-codec/ ],
-);
-
-for my $jar (keys %need_jars) {
-       for (@{$need_jars{$jar}}) {
-               $need_externs_type{$jar}->{$_} = 'BR';  # XXX
-       }
-}
-
-%deps_aux = (
-       'lb.client' => [ qw/
-               lb.types:B lb.common
-               lbjp-common.trio
-               jobid.api-cpp:B jobid.api-c
-               security.gss
-       / ],
-       'lb.client-java' => [ qw/
-               lb.types:B
-               jobid.api-java
-       / ],
-       'lb.common' => [ qw/
-               jobid.api-cpp:B jobid.api-c
-               lb.types:B lbjp-common.trio security.gss
-       / ],
-       'lb.doc' => [ qw/lb.types:B/ ],
-       'lb.logger' => [ qw/
-               lbjp-common.trio
-               jobid.api-c
-               lb.common
-               security.gss
-       / ],
-       'lb.server' => [ qw/
-               lb.ws-interface lb.types:B lb.common lb.state-machine
-               lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir
-               jobid.api-c
-               security.gsoap-plugin security.gss
-       / ],
-       'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ],
-       'lb.utils' => [ qw/
-               lbjp-common.jp-interface
-               jobid.api-c
-               lbjp-common.trio lbjp-common.maildir
-               lb.client lb.state-machine
-       / ],
-       'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ],
-       'lb.ws-interface' => [ qw/lb.types:B/ ],
-       'lb.types' => [ qw// ],
-       'lb.glite-LB' => [ qw/
-               lb.logger:R lb.server:R lb.utils:R lb.doc:R
-               lb.ws-test:R
-       / ],
-       'lbjp-common.db' => [ qw/lbjp-common.trio/ ],
-       'lbjp-common.maildir' => [ qw// ],
-       'lbjp-common.server-bones' => [ qw// ],
-       'lbjp-common.trio' => [ qw// ],
-       'security.gss' =>  [ qw// ],
-       'security.gsoap-plugin' =>  [ qw/security.gss/ ],
-       'jobid.api-c' =>  [ qw// ],
-       'jobid.api-cpp' =>  [ qw/jobid.api-c/ ],
-       'jobid.api-java' =>  [ qw// ],
-
-       'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ],
-
-       'jp.client' => [ qw/
-                jp.ws-interface
-                lbjp-common.jp-interface lbjp-common.maildir
-                jobid.api-c
-                security.gsoap-plugin
-        / ],
-       'jp.doc' => [ qw// ],
-       'jp.index' => [ qw/
-                jp.server-common jp.ws-interface
-                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
-                security.gsoap-plugin
-        / ],
-       'jp.primary' => [ qw/
-                jobid.api-c
-                jp.server-common jp.ws-interface
-                lb.state-machine
-                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
-                security.gsoap-plugin
-        / ],
-       'jp.server-common' => [ qw/ 
-                lbjp-common.jp-interface lbjp-common.db
-        / ],
-       'jp.ws-interface' => [ qw// ],
-);
-
-for my $ext (keys %deps_aux) {
-       for (@{$deps_aux{$ext}}) {
-               /([^:]*)(?::(.*))?/;
-               push @{$deps{$ext}},$1;
-               my $type = $2 ? $2 : 'BR';
-               $deps_type{$ext}->{$1} = $type;
-       }
-}
-
-
-%extrafull = ( gridsite=>'org.gridsite.core');
-
-#( java => 'client-java' );
-%extranodmod = (
-       db => 'lbjp-common.db',
-       jpprimary => 'jp.primary',
-       jpindex => 'jp.index',
-       jpclient => 'jp.client',
-);
-
-my @t = qw/lb.client-java jobid.api-java lb.types/;
-@topbuild{@t} = (1) x ($#t+1);
-}
-
-sub full
-{
-       my $short = shift;
-       return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short;
-}
-
-sub mkinc
-{
-       my %aux;
-       undef %aux;
-       my @m=qw/
-lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java
-security.gss security.gsoap-plugin
-jobid.api-c jobid.api-cpp jobid.api-java
-lbjp-common.db lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface
-jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface
-/;
-       @aux{@m} = (1) x ($#m+1);
-
-       my $short = shift;
-       my $full = full $short;
-
-       unless ($aux{$short}) {
-               print "Makefile.inc not needed in $full\n";
-               return;
-       }
-
-       my $build = '';
-       
-       unless ($topbuild{$_}) {
-               $build = '/build';
-               unless (-d "$full/build") {
-                       mkdir "$full/build" or die "mkdir $full/build: $!\n";
-               }
-               unlink "$full/build/Makefile";
-               symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n";
-       }
-
-       open MKINC,">$full$build/Makefile.inc"
-               or die "$full$build/Makefile.inc: $!\n";
-
-       print "Creating $full$build/Makefile.inc\n";
-
-       print MKINC qq{
-PREFIX = $prefix
-stagedir = $stagedir
-thrflavour = $thrflavour
-nothrflavour = $nothrflavour
-libdir = $libdir
-};
-
-       for (@{$need_externs{$short}}) {
-               print MKINC "${_}_prefix = $extern_prefix{$_}\n"
-       }
-
-       for (@{$need_jars{$short}}) {
-               print MKINC "${_}_jar = $jar{$_}\n"
-       }
-
-       my $need_gsoap = 0;
-       for (@{$need_externs{$short}})  { $need_gsoap = 1 if $_ eq 'gsoap'; }
-
-       print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
-
-       close MKINC;
-}
-
-my %etics_externs;
-my %etics_projects;
-BEGIN{
-       %etics_externs = (
-               globus_essentials=>'vdt_globus_essentials',
-               globus=>'globus',
-               cares=>'c-ares',
-               voms=>'org.glite.security.voms-api-cpp',
-               gridsite=>'org.gridsite.shared',
-               lcas=>'org.glite.security.lcas',
-               trustmanager=>'org.glite.security.trustmanager',
-               utiljava=>'org.glite.security.util-java',
-               yaim=>'org.glite.yaim.lb',
-               gpt=>'gpt',
-               fetchcrl=>'fetch-crl',
-               gip_release=>'glite-info-provider-release',
-               gip_service=>'glite-info-provider-service',
-               bdii=>'bdii',
-               glite_version=>'glite-version',
-               glite_info_templates=>'glite-info-templates',
-               glue_schema=>'glue-schema',
-       );
-       %etics_projects = (
-               vdt=>[qw/globus globus_essentials/],
-               'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim/],
-       );
-};
-
-sub mode_etics {
-       $fmod = shift;
-
-       die "$0: --module required with --etics\n" unless $fmod;
-       
-       my ($subsys,$module) = split /\./,$fmod;
-
-       my ($major,$minor,$rev,$age);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               open V,"org.glite.$subsys.$module/project/version.properties"
-                       or die "org.glite.$subsys.$module/project/version.properties: $!\n";
-       
-               while ($_ = <V>) {
-                       chomp;
-                       ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/;
-                       $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/;
-               }
-               close V;
-       }
-
-       my @copts = ();
-       my %ge;
-       @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1);
-
-       for (@{$need_externs{"$subsys.$module"}}) {
-           if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-               push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}";
-           }
-       }
-
-       for (@{$need_jars{"$subsys.$module"}}) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-
-               push @copts,"--with-$_ \${$eext.location}/$_*.jar";
-       }
-
-
-       my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}";
-       my $file = $output ? $output : "$conf.ini";
-       open C,">$file" or die "$file: $!\n";
-
-       my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build\n";
-
-       my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..';
-
-       print STDERR "Writing $file\n";
-       print C qq{
-[Configuration-$conf]
-profile = None
-moduleName = org.glite.$subsys.$module
-displayName = $conf
-description = org.glite.$subsys.$module
-projectName = org.glite
-age = $age
-deploymentType = None
-tag = $conf
-version = $major.$minor.$rev
-path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz
-
-[Platform-default:VcsCommand]
-displayName = None
-description = None
-tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName}
-branch = None
-commit = None
-checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName}
-
-[Platform-default:BuildCommand]
-postpublish = None
-packaging = None
-displayName = None
-description = None
-doc = None
-prepublish = None
-publish = None
-compile = make
-init = None
-install = make install
-clean = make clean
-test = make check
-configure = cd $confdir && \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts
-checkstyle = None
-
-[Platform-default:Property]
-$buildroot
-
-[Platform-default:DynamicDependency]
-
-};
-       for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-
-               my $proj = 'externals';
-               for my $p (keys %etics_projects) {
-                       for $m (@{$etics_projects{$p}}) {
-                               $proj = $p if $m eq $_;
-                       }
-               }
-
-               my $type = $need_externs_type{"$subsys.$module"}->{$_};
-               print C "$proj|$eext = $type\n";
-       }
-
-       for (@{$deps{"$subsys.$module"}}) {
-               my $type = $deps_type{"$subsys.$module"}->{$_};
-               print C "org.glite|org.glite.$_ = $type\n";
-       }
-
-       close C;
-}
-
-sub gsoap_version {
-       local $_;
-       my $gsoap_version;
-       open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n";
-
-       while ($_ = <S>) {
-               chomp;
-
-               $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/;
-       }
-       close S;
-       return $gsoap_version;
-}
-
-
-sub usage {
-       my @ext = keys %extern_prefix;
-       my @myjars, keys %jar;
-
-       print STDERR qq{
-usage: $0 options
-
-General options (defaults in []):
-  --prefix=PREFIX              destination directory [./stage]
-  --staged=module,module,...   what is already in PREFIX (specify without org.glite.)
-  --thrflavour=flavour
-  --nothrflavour=flavour       threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg]
-  --listmodules=subsys          list modules of a subsystem
-  --libdir=libdir              typically [lib,lib64] postfix
-  
-Mode of operation:
-  --mode={checkout|build|etics}        what to do [build]
-  
-What to build:
-  --module=module              build this module only (mostly in-Etics operation)
-  --enable-NODE                        build this "node" (set of modules) only. Available nodes are
-                                       @{$lbmodules{lb}},@{$lbmodules{security}}
-  --disable-NODE               don't build this node
-  --lb-tag=tag                 checkout LB modules with specific tag
-  --jp-tag=tag                 checkout JP modules with specific tag
-  --lbjp-common-tag=tag         checkout lbjp-common modules with specific tag
-  --security-tag=tag           checkout security modules with specific tag
-  --jobid-tag=tag              checkout jobid modules with specific tag
-
-Dependencies:
-  --with-EXTERNAL=PATH         where to look for an external. Required externals
-                               (not all for all modules) are:
-                                       @ext
-  --with-JAR=JAR               where to look for jars. Required jars are:
-                                       @myjars
-                               Summary of what will be used is always printed
-
-};
-
-}
diff --git a/org.glite.lb.server/doc/glite-lb-bkindex.8 b/org.glite.lb.server/doc/glite-lb-bkindex.8
deleted file mode 100644 (file)
index 0d43e51..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-.TH GLITE-LB-BKINDEX 8 "April 2008" "EU EGEE Project" "Logging&Bookkeeping"
-
-.SH NAME
-glite-lb-bkindex - dump or rebuild bookkeeping server indices
-
-.SH SYNOPSIS
-.B glite-lb-bkindex
-.RB [\| -mrv\| ] 
-.RI [ FILE ]
-.br
-.B glite-lb-bkindex
-.RB [\| -dmv\| ] 
-
-
-.SH DESCRIPTION
-The bookkeeping server
-.B glite-lb-bkserverd
-uses database indices to support various types of user queries efficiently.
-.B glite-lb-bkindex 
-is a tool for dumping and manipulating the indices.
-Both single- and multiple-column indices are supported.
-
-Due to performance reasons (reindexing may take rather long time)
-the default invocation performs only "dry run" - the input is checked and intended actions
-reported but not really performed.
-The option -r has to be specified to do the real work.
-
-.B glite-lb-bkindex
-should not be run while there is a running 
-.B glite-lb-bkserverd
-on top of the same database.
-
-.PP
-By default the L&B server indexes data according to JobId only. Because
-the querying capabilities of L&B release 2 were considerably extended,
-the server refuses to process a query which would not utilize any index.
-This prevent overloading the underlying database engine. Consequently, even a trivial query 'give me all my jobs' results in an error in the default setup  because under certain conditions processing such query may require handling gigabytes of data.
-
-.PP
-The server administrator can create and modify the set of indices and control the set of supported queries. The description of columns to be indexed is given to 
-.B glite-lb-bkindex
-utility via 
-.I FILE
-that  follows this syntax (subset of ClassAd syntax):
-
-.PP
-.IP
-.I FILE
-::= 
-.BI [\ JobIndices\ =\ {\  index-description\ \fR[\fP ,\  index-description\fR]*\fP
-.B  } ]
-.br
-.I index-description
-::= 
-.I column-description \fR|\fP list-of-columns
-.br
-.I list-of-columns 
-::= 
-.BI {\  column-description\ \fR+\fP\  }
-.br
-.I column-description 
-::= 
-.BI [\  column-type ;\  column-name ;\  prefix-len\  \fR?\fP\ ]
-.br
-.I column-type 
-::= 
-.B type = """user""" \fR|\fP type = """system""" \fR|\fP type = """time"""
-.br
-.I column-name 
-::= 
-.B name = """\fIactual_column_name\fP"""
-.br
-.I prefix-len 
-::= 
-.BI prefixlen\ =\  integer
-
-.PP
-The only top-level attribute 
-.B JobIndices
-is a list (possibly empty) of index descriptions. Each index description is either a single column or a list of columns (where the order is important). The column is described by mandatory attributes 
-.B type 
-and 
-.B name\fR,\fP
-and an optional attribute 
-.B prefixlen\fR.\fP 
-Possible values of type are 
-.B """system"""
-(L&B internal attributes)
-.B """time"""
-("state entered" timestamps), and  
-.B """user"""
-(user tags).
-Currently supported system column names are 
-.I owner\fR,\fP destination \fRand\fP location\fR.\fP
-and valid timestamps are the job states, i.e.
-.I submitted, waiting, ready, scheduled, running, done, cleared, cancelled, aborted\fR.
-Names of user tags are arbitrary as long as their length is less than 60 characters and they contain only ASCII printable characters excluding backtick (`).
-The
-.B prefixlen
-value may be used to restrict indexing of columns, which may grow rather long, to a fixed size. This becomes necessary with compound indices as MySQL limits the total size of index to 250 bytes only.
-
-.PP
-In the following example the index file contains two indices, the first
-one on a single system attribute -- <job owner>, the second one composed
-from system attribute (job) <destination> and user tag called <experiment number>:
-
-.IP
-[
-.br
-\ \ JobIndices = {
-.br
-\ \ \ \ [ type = "system"; name = "owner" ],
-.br
-\ \ \ \ {
-.br
-\ \ \ \ \ \ [ type = "system"; name = "destination";
-.br
-\ \ \ \ \ \ \ \ prefixlen = 100 ],
-.br
-\ \ \ \ \ \ [ type = "user"; name = "experiment number"; 
-.br
-\ \ \ \ \ \ \ \ prefixlen = 100 ] 
-.br
-\ \ \ \ }
-.br
-\ \ }
-.br
-]
-
-.SH OPTIONS
-.TP
-.B "-d\fR,\fP --dump"
-Print current setup on
-.I stdout\fR.\fP
-
-.TP
-.BI \-m " STRING" "\fR,\fP --mysql " STRING
-.I STRING
-is the database connect string in the form
-
-USER_NAME/PASSWORD@DB_HOSTNAME:DB_NAME
-
-It defaults to lbserver/@localhost:lbserver20 (common with
-.B glite-lb-bkserverd\fR).
-
-.TP
-.B "-r, --really"
-Really perform reindexing.
-
-.TP
-.B "-R, --remove"
-Remove all indexes from server.
-
-.TP
-.B "-v, --verbose"
-Increase verbosity.
-
-
-.\".SH USAGE
-.\" Add any additional description here
-
-.PP
-
-.SH REPORTING BUGS
-Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch
-
-.SH SEE ALSO
-.B glite-lb-purge\fR(8),\fP glite-lb-bkserverd\fR(8)
-
-.SH AUTHOR
-EU EGEE, JRA1.
diff --git a/org.glite.lb.server/doc/glite-lb-bkserverd.8 b/org.glite.lb.server/doc/glite-lb-bkserverd.8
deleted file mode 100644 (file)
index 94066c6..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-.TH GLITE-LB-BKSERVERD 8 "April 2008" "EU EGEE Project" "Logging&Bookkeeping"
-
-.SH NAME
-glite-lb-bkserverd - bookkeeping server daemon
-
-.SH SYNOPSIS
-.B glite-lb-bkserverd
-.RI [ options ]
-.br
-
-.SH DESCRIPTION
-.B glite-lb-bkserverd 
-accepts L&B events from interlogger, manages the data storage,
-and serves user queries (L&B consumer clients).
-
-Currently, the data are stored in MySQL database.
-
-.PP
-The main process spawns several
-.I slave
-processes. Then it listens on 
-.I port
-(default value is 9000) for consumer queries and
-.I port+1
-for interlogger daemon requests to store events to database.
-Requests are redirected to the slaves 
-(and picked up by the first free slave process).
-All the connection handling and data processing (including SSL handshake)
-is performed by the slaves.
-
-The slaves voluntarily die and are resurrected periodically to workaround
-potential resource leakage.
-
-
-.SH OPTIONS
-.TP
-.BI \-a " HOST:PORT" "\fR,\fP --address " HOST:PORT
-Make the server pretend (wrt. data handling) it listens on 
-.I HOST:PORT 
-instead of the real listening address.
-This is used for debugging and various administrative purposes
-(e.g. computing usage statistics on data dumped from another server).
-
-.TP
-.BI \-c " FILE" "\fR,\fP --cert " FILE
-Get certificate from
-.I FILE\fR.\fP
-This option overrides the
-.B \fR$\fPX509_USER_CERT
-environment variable.
-
-.TP
-.BI \-b " SWITCH" "\fR,\fP --transactions " SWITCH
-Set transaction on/off.
-.I SWITCH
-is true where its value is not 0.
-
-.TP
-.BI \-C " DIR" "\fR,\fP --CAdir " DIR
-Trusted CA's certificates directory.
-.I DIR\fR.\fP
-This option overrides the
-.B \fR$\fPX509_CERT_DIR
-environment variable.
-
-.TP
-.BI \-V " DIR" "\fR,\fP --VOMSdir " DIR
-Trusted VOMS server's certificates directory.
-.I DIR\fR.\fP
-This option overrides the
-.B \fR$\fPX509_VOMS_DIR
-environment variable.
-
-.TP
-.B "-d\fR,\fP --debug"
-Don't run as daemon, print additional diagnostics.
-
-.TP
-.B "-r\fR,\fP --rgmaexport"
-Write state info to RGMA interface.
-
-.TP
-.BI \-i " FILE" "\fR,\fP --pidfile " FILE
-Store master pid into
-.I FILE
-instead of the default pidfile location.
-Unless unavoidable it is not recommended to change the pidfile location
-as it is also used for locking to prevent starting up multiple server instances
-and to generate the semaphore set unique key (see option -l).
-
-
-.TP
-.BI \-k " FILE" "\fR,\fP --key " FILE
-Get private key from
-.I FILE\fR.\fP
-This option overrides the
-.B \fR$\fPX509_USER_KEY
-environment variable.
-
-.TP
-.BI -l " NUM" "\fR,\fP --semaphores " NUM
-Use 
-.I NUM
-semaphores (job locks).
-
-To prevent race conditions on simultaneous event storage and job-state updates
-.B glite-lb-bkserverd
-uses a set of semaphores to lock jobs.
-Jobids are hashed to the semaphores and only one of the set of jobs that map
-to a particular semaphore may be updated at any given time. 
-Therefore
-.I NUM
-is a limit on potential processing parallelism.
-
-.I NUM
-defaults to the number of slaves (see -s).
-
-
-.TP
-.BI -L " NUM:NUM:NUM" "\fR,\fP --limits " NUM:NUM:NUM
-Limit the maximum number of returned jobs/events that match user query to 
-.I NUM:NUM:NUM\fP in format events_limit:jobs_limit:size_limit.\
-
-.TP
-.BI -N " NUM" "\fR,\fP --notif-dur " NUM
-Maximal duration of notification registrations in hours
-.I NUM\fR.\fP
-
-.TP
-.BI -S " PREFIX" "\fR,\fP --purge-prefix " PREFIX
-Purge files full-path prefix
-.I PREFIX\fR.\fP
-
-.TP
-.BI -D " PREFIX" "\fR,\fP --dump-prefix " PREFIX
-Dump files full-path prefix
-.I PREFIX\fR.\fP
-
-.TP
-.BI -J " DIR" "\fR,\fP --jpreg-dir " DIR
-JP registration temporary files prefix (implies '-j').
-.I DIR\fR.\fP
-
-.TP
-.BI "-j \fR,\fP --enable-jpreg-export"
-Enable JP registration export (disabled by default).
-
-.TP
-.BI \-m " STRING" "\fR,\fP --mysql " STRING
-.I STRING
-is a database connect string in the form
-USER_NAME/PASSWORD@DB_HOSTNAME:DB_NAME
-
-It defaults to lbserver/@localhost:lbserver20.
-
-.TP
-.B "-n, --noauth"
-Turn off any authorization.
-
-.TP
-.BI \-p " NUM" "\fR,\fP --port " NUM
-Listen on the port
-.I NUM\fR.\fP
-
-.TP
-.BI \-w " NUM" "\fR,\fP --wsport " NUM
-Set port to serve the web services requests to
-.I NUM\fR.
-
-.TP
-.B "-r\fR,\fP --rgmaexport"
-Write state info into the RGMA interface. Experimental.
-
-.TP
-.BI -s " NUM" "\fR,\fP --slaves " NUM
-Fork
-.I NUM
-slaves.
-
-.TP
-.BI --super-user " USER" "\fR,\fP  --super-user-file " FILE
-Bypass query authorization (i.e. return results anyway) when 
-USER (or users listed in FILE) connect.
-
-.TP
-.BI --no-index " NUM"
-Disable checking the indices for superusers (NUM=1) or entirely (NUM=2).
-
-.TP
-.BI --strict-locking
-.I (not recommended).
-Use a more strict locking strategy -- lock jobs sooner, when events
-are stored, not just for status update.
-This prevents a non-probable but still possible race
-condition with parallel purge but may slow down processing on
-heavy loaded servers. Anyway, the only consequence of the race condition
-is a little garbage left in the database which is cleaned 
-form time to time anyway.
-
-.TP
-.BI --notif-il-sock " SOCK
-Socket
-.I SOCK
-to send notifications.
-
-.TP
-.BI --notif-il-sock " PREFIX
-File
-.I PREFIX
-for notifications.
-
-.TP
-.BI --count-statistics " NUM
-Count certain statistics on jobs for superusers (NUM=1) or for all (NUM=2).
-
-.TP
-.BI -t " NUM" "\fR,\fP --request-timeout " NUM
-Request timeout
-.I NUM
-for one client.
-
-.TP
-.BI --silent
-Do not print diagnostic, even if -d is on.
-
-.TP
-.BI -g \fP --greyjobs
-Allow delayed registration (grey jobs), implies --strict-locking.
-
-.TP
-.BI -A\fR,\fP --enable-lcas
-Activate LCAS-based authorization.
-
-.TP
-.BI -I\fR,\fP --rss-time " NUM"
-Set the maximal age (in seconds) of states published via RSS.
-
-.TP
-.BI -P\fR,\fP --proxyonly          
-Run only proxy service.
-
-.TP
-.BI -B\fR,\fP --withproxy
-Run both server and proxy service.
-
-.TP
-.BI -o\fR,\fP --sock
-Path-name to the local socket for communication with LB proxy.
-
-.TP
-.BI -q\fR,\fP --con-queue
-Size of the connection queue (accept).
-
-.TP
-.BI -W\fR,\fP --proxy-il-sock
-Socket to send events to.
-
-.TP
-.BI -Z\fR,\fP --proxy-il-fprefix
-File prefix for events.
-
-.\".SH USAGE
-.\" Add any additional description here
-
-.PP
-
-.SH FILES
-.TP
-.I /var/run/edg-bkserverd.pid
-if running as root (not recommended).
-
-.TP
-.I $HOME/edg-bkserverd.pid
-otherwise.
-
-.TP
-File to store pid and to generate semaphores key.
-
-.TP
-No configuration files needed.
-
-.SH ENVIRONMENT
-.TP
-.B X509_USER_KEY
-If
-.B \fR$\fPX509_USER_KEY
-is set, it is used to locate private key file.
-
-.TP
-.B X509_USER_CERT
-If
-.B \fR$\fPX509_USER_CERT
-is set, it is used to locate certificate file.
-
-.TP
-.B X509_CERT_DIR
-If
-.B \fR$\fPX509_CERT_DIR
-is set, it is used to locate the trusted CA's certificates and ca-signing-policy files.
-
-.TP
-.B X509_USER_PROXY
-If
-.B \fR$\fPX509USER_PROXY
-is set, it is used to locate proxy certificate file.
-
-.TP
-.B EDG_WL_RGMA_FILE
-If
-.B \fR$\fPEDG_WL_RGMA_FILE
-is set, it is used as name of file for sharing data with RGMA services.
-
-.TP
-.B EDG_WL_RGMA_SOCK
-If
-.B \fR$\fPEDG_WL_RGMA_SOCK
-is set, it is  used as name of socket for communication with RGMA.
-
-.SH BUGS
-In a case of a sudden crash, alive slave processes may survive or some resources (IPC locks, open ports) may stay allocated. Please, deal with such problems via standard commands
-.B kill\fR and\fP ipcrm\fR.\fP
-
-Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch
-
-.SH SEE ALSO
-.B glite-lb-bkindex\fR(8),\fP glite-lb-purge\fR(8),\fP glite-lb-interlogd\fR(8),\fP glite-lb-logd\fR(8),\fP glite-lb-logevent\fR(1),\fP
-
-.SH AUTHOR
-EU EGEE, JRA1.
diff --git a/org.glite.lb.server/doc/glite-lb-mon-db.1 b/org.glite.lb.server/doc/glite-lb-mon-db.1
deleted file mode 100644 (file)
index ab0eefd..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-.TH GLITE-LB-MON-DB 1 "Mar 2006" "EU EGEE Project" "Logging & Bookkeeping Utils"
-
-.SH NAME
-glite-lb-mon-db - program for monitoring the number of jobs in the LB system
-
-.SH SYNOPSIS
-.B glite-lb-mon-db
-.B [-m dbstring -d -v -h]
-.br
-
-.SH DESCRIPTION
-.B glite-lb-mon-db
-is a low-level program for monitoring the the number of jobs in the LB system. 
-Using the LB internals, it connects directly to the underlying MySQL database and reads
-the number of jobs in each state.
-
-.SH OPTIONS
-.TP
-.B \-m dbstring, \-\-mysql=dbstring
-Use non-default database connection string.
-
-.TP
-.B \-d, \-\-debug
-Print debug info (if any).
-
-.TP
-.B \-v, \-\-verbose
-Be verbose.
-
-.TP
-.B \-h, \-\-help
-Display help and exit.
-
-.SH EXAMPLES
-.TP 
-.BI glite-lb-mon-db 
-this is the default usage
-.TP
-.BI glite-lb-mon-db \ -m \ lbserver/@localhost:lbproxy
-use this dbstring to query the LB Proxy database. WARNING: the data in the LB Proxy may be incomplete!
-
-.SH ENVIRONMENT
-.TP
-.B MYSQL_UNIX_PORT
-set this environment variable to specify the path to the non-default MySQL socket path
-.TP
-.B LBDB
-you can set this environment variable as an alternative to specify the non-default database connection string
-
-.SH REPORTING BUGS
-Please, report all bugs to EU EGEE Bug Tracking System located at https://savannah.cern.ch/bugs/?func=additem&group=jra1mdw 
-
-.SH SEE ALSO
-.BR glite-lb-mon (1)
-
-.SH AUTHOR
-EU EGEE JRA1, CESNET group.
diff --git a/org.glite.lb.server/examples/stdsoap2_2.6.0.c b/org.glite.lb.server/examples/stdsoap2_2.6.0.c
deleted file mode 100644 (file)
index b4d6102..0000000
+++ /dev/null
@@ -1,10775 +0,0 @@
-/*
-
-stdsoap2.c[pp] 2.6.0
-
-Runtime environment.
-
-gSOAP XML Web services tools
-Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc. All Rights Reserved.
-
-Contributors:
-
-Wind River Systems, Inc., for the following additions (marked WR[...]):
-  - vxWorks compatible
-  - Support for IPv6.
-
---------------------------------------------------------------------------------
-gSOAP public license.
-
-The contents of this file are subject to the gSOAP Public License Version 1.3
-(the "License"); you may not use this file except in compliance with the
-License. You may obtain a copy of the License at
-http://www.cs.fsu.edu/~engelen/soaplicense.html
-Software distributed under the License is distributed on an "AS IS" basis,
-WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-for the specific language governing rights and limitations under the License.
-
-The Initial Developer of the Original Code is Robert A. van Engelen.
-Copyright (C) 2000-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved.
---------------------------------------------------------------------------------
-GPL license.
-
-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
-
-Author contact information:
-engelen@genivia.com / engelen@acm.org
---------------------------------------------------------------------------------
-
-Installation note:
-
-Win32 build needs winsock.dll (Visual C++ "wsock32.lib")
-To do this in Visual C++ 6.0, go to "Project", "settings", select the "Link"
-tab (the project file needs to be selected in the file view) and add
-"wsock32.lib" to the "Object/library modules" entry
-
-*/
-
-#include "stdsoap2.h"
-
-#ifdef __cplusplus
-SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.6.0 2004-03-28 12:00:00 GMT")
-extern "C" {
-#else
-SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.6.0 2004-03-28 12:00:00 GMT")
-#endif
-
-/*      EOF=-1 */
-#define LT (wchar)(-2) /* XML character '<' */
-#define TT (wchar)(-3) /* XML character '</' */
-#define GT (wchar)(-4) /* XML character '>' */
-#define QT (wchar)(-5) /* XML character '"' */
-#define AP (wchar)(-6) /* XML character ''' */
-
-#define soap_blank(c)          ((c) >= 0 && (c) <= 32)
-#define soap_notblank(c)       ((c) > 32)
-#define soap_hash_ptr(p)       (((unsigned long)(p) >> 3) & (SOAP_PTRHASH - 1))
-
-static int soap_isxdigit(int);
-static wchar soap_char(struct soap*);
-static wchar soap_getchunkchar(struct soap*);
-static void soap_update_ptrs(struct soap*, char*, char*, long);
-static int soap_has_copies(struct soap*, char*, char*);
-static struct soap_ilist *soap_hlookup(struct soap*, const char*);
-static void soap_init_iht(struct soap*);
-static void soap_free_iht(struct soap*);
-static void soap_init_pht(struct soap*);
-static void soap_free_pht(struct soap*);
-static int soap_set_error(struct soap*, const char*, const char*, const char*, int);
-static int soap_copy_fault(struct soap*, const char*, const char*, const char*);
-static int soap_getattrval(struct soap*, char*, size_t, wchar);
-static void soap_set_local_namespaces(struct soap*);
-static size_t soap_begin_dime(struct soap*);
-static int soap_isnumeric(struct soap*, const char*);
-static void *fplugin(struct soap*, const char*);
-
-#ifndef WITH_LEAN
-static time_t soap_timegm(struct tm*);
-static void soap_init_logs(struct soap*);
-static void soap_close_logfile(struct soap*, int);
-static void soap_set_logfile(struct soap*, int, const char*);
-#endif
-
-#ifndef WITH_LEANER
-static int soap_putdimefield(struct soap*, const char*, size_t);
-static char *soap_getdimefield(struct soap*, size_t);
-#endif
-
-#ifdef WITH_GZIP
-static int soap_getgzipheader(struct soap*);
-#endif
-
-#ifdef WITH_OPENSSL
-static int ssl_auth_init(struct soap*);
-static int ssl_verify_callback(int, X509_STORE_CTX*);
-static int ssl_password(char*, int, int, void *);
-/* This callback is included for future references. It should not be deleted
-static DH *ssl_tmp_dh(SSL*, int, int);
-*/
-#endif
-
-static const char *soap_strerror(struct soap*);
-static const char *tcp_error(struct soap*);
-static const char *http_error(struct soap*, int);
-static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t);
-static int http_get(struct soap*);
-static int http_post_header(struct soap*, const char*, const char*);
-static int http_response(struct soap*, int, size_t);
-static int http_parse(struct soap*);
-static int http_parse_header(struct soap*, const char*, const char*);
-static int tcp_connect(struct soap*, const char*, const char*, int);
-static int tcp_accept(struct soap*, int, struct sockaddr*, int*);
-static int tcp_disconnect(struct soap*);
-static int fsend(struct soap*, const char*, size_t);
-static size_t frecv(struct soap*, char*, size_t);
-
-/* WR[ */
-#ifdef VXWORKS
-static int vx_nonblocking = TRUE; /* ioctl argument */
-#endif
-/* ]WR */
-
-#ifndef PALM_2
-static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/";
-static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/";
-static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope";
-static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding";
-static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc";
-#endif
-
-#ifndef PALM_1
-const struct soap_double_nan soap_double_nan = {0xFFFFFFFF, 0xFFFFFFFF};
-static const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-static const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63";
-#endif
-
-static const char soap_padding[3] = "\0\0";
-#define SOAP_STR_PADDING (soap_padding)
-#define SOAP_STR_EOS (soap_padding)
-
-#ifndef WITH_LEAN
-static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */
-{ { 160, "nbsp" },
-  { 161, "iexcl" },
-  { 162, "cent" },
-  { 163, "pound" },
-  { 164, "curren" },
-  { 165, "yen" },
-  { 166, "brvbar" },
-  { 167, "sect" },
-  { 168, "uml" },
-  { 169, "copy" },
-  { 170, "ordf" },
-  { 171, "laquo" },
-  { 172, "not" },
-  { 173, "shy" },
-  { 174, "reg" },
-  { 175, "macr" },
-  { 176, "deg" },
-  { 177, "plusmn" },
-  { 178, "sup2" },
-  { 179, "sup3" },
-  { 180, "acute" },
-  { 181, "micro" },
-  { 182, "para" },
-  { 183, "middot" },
-  { 184, "cedil" },
-  { 185, "sup1" },
-  { 186, "ordm" },
-  { 187, "raquo" },
-  { 188, "frac14" },
-  { 189, "frac12" },
-  { 190, "frac34" },
-  { 191, "iquest" },
-  { 192, "Agrave" },
-  { 193, "Aacute" },
-  { 194, "Acirc" },
-  { 195, "Atilde" },
-  { 196, "Auml" },
-  { 197, "Aring" },
-  { 198, "AElig" },
-  { 199, "Ccedil" },
-  { 200, "Egrave" },
-  { 201, "Eacute" },
-  { 202, "Ecirc" },
-  { 203, "Euml" },
-  { 204, "Igrave" },
-  { 205, "Iacute" },
-  { 206, "Icirc" },
-  { 207, "Iuml" },
-  { 208, "ETH" },
-  { 209, "Ntilde" },
-  { 210, "Ograve" },
-  { 211, "Oacute" },
-  { 212, "Ocirc" },
-  { 213, "Otilde" },
-  { 214, "Ouml" },
-  { 215, "times" },
-  { 216, "Oslash" },
-  { 217, "Ugrave" },
-  { 218, "Uacute" },
-  { 219, "Ucirc" },
-  { 220, "Uuml" },
-  { 221, "Yacute" },
-  { 222, "THORN" },
-  { 223, "szlig" },
-  { 224, "agrave" },
-  { 225, "aacute" },
-  { 226, "acirc" },
-  { 227, "atilde" },
-  { 228, "auml" },
-  { 229, "aring" },
-  { 230, "aelig" },
-  { 231, "ccedil" },
-  { 232, "egrave" },
-  { 233, "eacute" },
-  { 234, "ecirc" },
-  { 235, "euml" },
-  { 236, "igrave" },
-  { 237, "iacute" },
-  { 238, "icirc" },
-  { 239, "iuml" },
-  { 240, "eth" },
-  { 241, "ntilde" },
-  { 242, "ograve" },
-  { 243, "oacute" },
-  { 244, "ocirc" },
-  { 245, "otilde" },
-  { 246, "ouml" },
-  { 247, "divide" },
-  { 248, "oslash" },
-  { 249, "ugrave" },
-  { 250, "uacute" },
-  { 251, "ucirc" },
-  { 252, "uuml" },
-  { 253, "yacute" },
-  { 254, "thorn" },
-  { 255, "yuml" },
-  {   0, NULL }
-};
-#endif
-
-#ifndef WITH_LEAN
-static const struct soap_code_map h_error_codes[] =
-{
-#ifdef HOST_NOT_FOUND   
-  { HOST_NOT_FOUND, "Host not found" },
-#endif
-#ifdef TRY_AGAIN
-  { TRY_AGAIN, "Try Again" },
-#endif
-#ifdef NO_RECOVERY  
-  { NO_RECOVERY, "No Recovery" },
-#endif
-#ifdef NO_DATA
-  { NO_DATA, "No Data" },
-#endif
-#ifdef NO_ADDRESS
-  { NO_ADDRESS, "No Address" },
-#endif
-  { 0, NULL }
-};
-#endif
-
-#ifndef WITH_LEAN
-static const struct soap_code_map h_http_error_codes[] =
-{ { 201, "Created" },
-  { 202, "Accepted" },
-  { 203, "Non-Authoritative Information" },
-  { 204, "No Content" },
-  { 205, "Reset Content" },
-  { 206, "Partial Content" },
-  { 300, "Multiple Choices" },
-  { 301, "Moved Permanently" },
-  { 302, "Found" },
-  { 303, "See Other" },
-  { 304, "Not Modified" },
-  { 305, "Use Proxy" },
-  { 307, "Temporary Redirect" },
-  { 400, "Bad Request" },
-  { 401, "Unauthorized" },
-  { 402, "Payment Required" },
-  { 403, "Forbidden" },
-  { 404, "Not Found" },
-  { 405, "Method Not Allowed" },
-  { 406, "Not Acceptable" },
-  { 407, "Proxy Authentication Required" },
-  { 408, "Request Time-out" },
-  { 409, "Conflict" },
-  { 410, "Gone" },
-  { 411, "Length Required" },
-  { 412, "Precondition Failed" },
-  { 413, "Request Entity Too Large" },
-  { 414, "Request-URI Too Large" },
-  { 415, "Unsupported Media Type" },
-  { 416, "Requested range not satisfiable" },
-  { 417, "Expectation Failed" },
-  { 500, "Internal Server Error" },
-  { 501, "Not Implemented" },
-  { 502, "Bad Gateway" },
-  { 503, "Service Unavailable" },
-  { 504, "Gateway Time-out" },
-  { 505, "HTTP Version not supported" },
-  {   0, NULL }
-};
-#endif
-
-#ifdef WITH_OPENSSL
-static const struct soap_code_map h_ssl_error_codes[] =
-{
-#define _SSL_ERROR(e) { e, #e }
-  _SSL_ERROR(SSL_ERROR_SSL),
-  _SSL_ERROR(SSL_ERROR_ZERO_RETURN),
-  _SSL_ERROR(SSL_ERROR_WANT_READ),
-  _SSL_ERROR(SSL_ERROR_WANT_WRITE),
-  _SSL_ERROR(SSL_ERROR_WANT_CONNECT),
-  _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP),
-  _SSL_ERROR(SSL_ERROR_SYSCALL),
-  { 0, NULL }
-};
-#endif
-
-#ifdef WIN32
-static int tcp_done = 0;
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-fsend(struct soap *soap, const char *s, size_t n)
-{ register int nwritten;
-#if defined(__cplusplus) && !defined(UNDER_CE)
-  if (soap->os)
-  { soap->os->write(s, n);
-    if (soap->os->good())
-      return SOAP_OK;
-    return SOAP_EOF;
-  }
-#endif
-  while (n)
-  { if (soap_valid_socket(soap->socket))
-    { 
-#ifndef WITH_LEAN
-      if (soap->send_timeout)
-      { struct timeval timeout;
-        fd_set fd;
-        if (soap->send_timeout > 0)
-        { timeout.tv_sec = soap->send_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->send_timeout/1000000;
-          timeout.tv_usec = -soap->send_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        for (;;)
-        { register int r = select((SOAP_SOCKET)(soap->socket + 1), NULL, &fd, &fd, &timeout);
-          if (r > 0)
-            break;
-          if (!r)
-          { soap->errnum = 0;
-            return SOAP_EOF;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            return SOAP_EOF;
-          }
-        }
-      }
-#endif
-#ifdef WITH_OPENSSL
-      if (soap->ssl)
-        nwritten = SSL_write(soap->ssl, s, n);
-      else
-#endif
-#ifndef PALM
-        nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
-#else
-        nwritten = send((SOAP_SOCKET)soap->socket, (void*)s, n, soap->socket_flags);
-#endif
-      if (nwritten <= 0)
-      {
-#ifdef WITH_OPENSSL
-       int err;
-        if (soap->ssl && (err = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-          return SOAP_EOF;
-#endif
-        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EWOULDBLOCK && soap_socket_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_socket_errno;
-          return SOAP_EOF;
-        }
-        nwritten = 0; /* and call write() again */
-      }
-    }
-    else
-    {
-#ifdef WITH_FASTCGI
-      nwritten = fwrite((void*)s, 1, n, stdout);
-      fflush(stdout);
-#else
-#ifdef UNDER_CE
-      nwritten = fwrite(s, 1, n, soap->sendfd);
-#else
-/* WR[ */
-#ifdef VXWORKS
-#ifdef WMW_RPM_IO
-      if (soap->rpmreqid)
-          {
-          httpBlockPut(soap->rpmreqid, s, n); 
-          nwritten = n;
-          }
-      else
-          {
-          nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
-          }
-#else
-      nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
-#endif /* WMW_RPM_IO */
-#else
-/* ]WR */
-      nwritten = write((SOAP_SOCKET)soap->sendfd, s, n);
-/* WR[ */
-#endif
-/* ]WR */
-#endif
-#endif
-      if (nwritten <= 0)
-      { if (soap_errno != SOAP_EINTR && soap_errno != SOAP_EWOULDBLOCK && soap_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_errno;
-          return SOAP_EOF;
-        }
-        nwritten = 0; /* and call write() again */
-      }
-    }
-    n -= nwritten;
-    s += nwritten;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_flush_raw(struct soap *soap, const char *s, size_t n)
-{ 
-#ifndef WITH_LEAN
-  if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-  { char *t;
-    if (!(t = (char*)soap_push_block(soap, n)))
-      return soap->error = SOAP_EOM;
-    memcpy(t, s, n);
-    return SOAP_OK;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-  { char t[16];
-    sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n);
-    DBGMSG(SENT, t, strlen(t));
-    if ((soap->error = soap->fsend(soap, t, strlen(t))))
-      return soap->error;
-    soap->chunksize += n;
-  }
-#endif
-  DBGMSG(SENT, s, n);
-  return soap->error = soap->fsend(soap, s, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_flush(struct soap *soap)
-{ if (soap->bufidx)
-  {
-#ifdef WITH_ZLIB
-    if (soap->mode & SOAP_ENC_ZLIB)
-    { soap->d_stream.next_in = (Byte*)soap->buf;
-      soap->d_stream.avail_in = (unsigned int)soap->bufidx;
-#ifdef WITH_GZIP
-      soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->bufidx);
-#endif
-      do
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream.avail_in));
-        if (deflate(&soap->d_stream, Z_NO_FLUSH) != Z_OK)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-          return soap->error = SOAP_ZLIB_ERROR;
-        }
-        if (!soap->d_stream.avail_out)
-        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN))
-            return soap->error;
-          soap->d_stream.next_out = (Byte*)soap->z_buf;
-          soap->d_stream.avail_out = SOAP_BUFLEN;
-        }
-      } while (soap->d_stream.avail_in);
-    }
-    else
-#endif
-    if (soap_flush_raw(soap, soap->buf, soap->bufidx))
-      return soap->error;
-    soap->bufidx = 0;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send_raw(struct soap *soap, const char *s, size_t n)
-{ if (!n)
-    return SOAP_OK;
-  if (soap->mode & SOAP_IO_LENGTH)
-  { soap->count += n;
-    if (soap->fprepare)
-      return soap->fprepare(soap, s, n);
-    return SOAP_OK;
-  }
-  if (soap->mode & SOAP_IO)
-  { register size_t i = SOAP_BUFLEN - soap->bufidx;
-    while (n >= i)
-    { memcpy(soap->buf + soap->bufidx, s, i);
-      soap->bufidx = SOAP_BUFLEN;
-      if (soap_flush(soap))
-        return soap->error;
-      s += i;
-      n -= i;
-      i = SOAP_BUFLEN;
-    }
-    memcpy(soap->buf + soap->bufidx, s, n);
-    soap->bufidx += n;
-    return SOAP_OK;
-  }
-  return soap_flush_raw(soap, s, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send(struct soap *soap, const char *s)
-{ if (s)
-    return soap_send_raw(soap, s, strlen(s));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static size_t
-frecv(struct soap *soap, char *s, size_t n)
-{ register int r;
-  soap->errnum = 0;
-#if defined(__cplusplus) && !defined(UNDER_CE)
-  if (soap->is)
-  { if (soap->is->good())
-      return soap->is->read(s, n).gcount();
-    return 0;
-  }
-#endif
-  if (soap_valid_socket(soap->socket))
-  { for (;;)
-    { 
-#ifndef WITH_LEAN
-      struct timeval timeout;
-      fd_set fd;
-      if (soap->recv_timeout)
-      { if (soap->recv_timeout > 0)
-        { timeout.tv_sec = soap->recv_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->recv_timeout/1000000;
-          timeout.tv_usec = -soap->recv_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        for (;;)
-        { r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-          if (r > 0)
-            break;
-          if (r == 0)
-            return 0;
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            return 0;
-          }
-        }
-      }
-#endif
-#ifdef WITH_OPENSSL
-      if (soap->ssl)
-      { int err;
-       r = SSL_read(soap->ssl, s, n);
-        if ((err = SSL_get_error(soap->ssl, r)) == SSL_ERROR_NONE)
-          return (size_t)r;
-       if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-          return 0;
-      }
-      else
-#endif
-      { r = recv((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
-        if (r >= 0)
-          return (size_t)r;
-        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_socket_errno;
-          return 0;
-        }
-      }
-#ifndef WITH_LEAN
-      { struct timeval timeout;
-        fd_set fd;
-        timeout.tv_sec = 0;
-        timeout.tv_usec = 10000;
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-        if (r < 0 && soap_socket_errno != SOAP_EINTR)
-        { soap->errnum = soap_socket_errno;
-          return 0;
-        }
-      }
-#endif
-    }
-  }
-#ifdef WITH_FASTCGI
-  return fread(s, 1, n, stdin);
-#else
-#ifdef UNDER_CE
-  return fread(s, 1, n, soap->recvfd);
-#else
-/* WR[ */
-#ifdef WMW_RPM_IO
-  if (soap->rpmreqid)
-      {
-      r = httpBlockRead(soap->rpmreqid, s, n);
-      }
-  else
-      {
-      r = read(soap->recvfd, s, n);
-      }
-  if (r >= 0)
-  {
-    return r;
-  }
-  return 0;
-#else
-/* ]WR */
-  r = read((SOAP_SOCKET)soap->recvfd, s, n);
-  if (r >= 0)
-    return (size_t)r;
-  soap->errnum = soap_errno;
-  return 0;
-/* WR[ */
-#endif
-/* ]WR */
-#endif
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static wchar
-soap_getchunkchar(struct soap *soap)
-{ if (soap->bufidx < soap->buflen)
-    return soap->buf[soap->bufidx++];
-  soap->bufidx = 0;
-  soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)soap->buflen));
-  DBGMSG(RECV, soap->buf, soap->buflen);
-  if (soap->buflen)
-    return soap->buf[soap->bufidx++];
-  return EOF;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_isxdigit(int c)
-{ switch (c)
-  { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
-    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-      return 1;
-  }
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_raw(struct soap *soap)
-{ register size_t ret;
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { if (soap->d_stream.next_out == Z_NULL)
-      return EOF;
-    if (soap->d_stream.avail_in || !soap->d_stream.avail_out)
-    { register int r;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n"));
-      soap->d_stream.next_out = (Byte*)soap->buf;
-      soap->d_stream.avail_out = SOAP_BUFLEN;
-      r = inflate(&soap->d_stream, Z_NO_FLUSH);
-      if (r == Z_OK || r == Z_STREAM_END)
-      { soap->bufidx = 0;
-        soap->buflen = SOAP_BUFLEN - soap->d_stream.avail_out;
-        if (soap->zlib_in == SOAP_ZLIB_GZIP)
-          soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
-        if (r == Z_STREAM_END)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-          soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
-          soap->d_stream.next_out = Z_NULL;
-        }
-        if (soap->buflen)
-        { soap->count += soap->buflen;
-          return SOAP_OK;
-        }
-      }
-      else if (r != Z_BUF_ERROR)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-        soap->d_stream.next_out = Z_NULL;
-        return EOF;
-      }
-    }
-zlib_again:
-    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize)
-    { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
-      soap->buflen = soap->z_buflen;
-    }
-  }
-#endif
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */
-  { 
-chunk_again:
-    if (soap->chunksize)
-    { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));
-      DBGMSG(RECV, soap->buf, ret);
-      soap->bufidx = 0;
-      soap->chunksize -= ret;
-    }
-    else
-    { register wchar c;
-      char tmp[8], *t;
-      t = tmp;
-      if (!soap->chunkbuflen)
-      { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
-        DBGMSG(RECV, soap->buf, ret);
-        soap->bufidx = 0;
-        if (!ret)
-          return EOF;
-      }
-      else
-        soap->bufidx = soap->buflen;
-      soap->buflen = soap->chunkbuflen;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (%u %u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));
-      while (!soap_isxdigit((int)(c = soap_getchunkchar(soap))))
-        if ((int)c == EOF)
-         return EOF;
-      do
-        *t++ = (char)c;
-      while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && t - tmp < 7);
-      while ((int)c != EOF && c != '\n')
-        c = soap_getchunkchar(soap);
-      if ((int)c == EOF)
-        return EOF;
-      *t = '\0';
-      soap->chunksize = soap_strtoul(tmp, &t, 16);
-      if (!soap->chunksize)
-      { soap->chunkbuflen = 0;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n"));
-       while ((int)c != EOF && c != '\n')
-          c = soap_getchunkchar(soap);
-        return EOF;
-      }
-      soap->buflen = soap->bufidx + soap->chunksize;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to %u (%u %s)\n", (unsigned int)soap->buflen, (unsigned int)soap->bufidx, tmp));
-      if (soap->buflen > soap->chunkbuflen)
-      { soap->buflen = soap->chunkbuflen;
-        soap->chunksize -= soap->buflen - soap->bufidx;
-        soap->chunkbuflen = 0;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%lu bytes left)\n", (unsigned long)(soap->buflen - soap->bufidx)));
-      }
-      else if (soap->chunkbuflen)
-        soap->chunksize = 0;
-      ret = soap->buflen - soap->bufidx;
-      if (!ret)
-        goto chunk_again;
-    }
-  }
-  else
-  { soap->bufidx = 0;
-    soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
-    DBGMSG(RECV, soap->buf, ret);
-  }
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { int r;
-    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-    soap->d_stream.avail_in = (unsigned int)ret;
-    soap->d_stream.next_out = (Byte*)soap->buf;
-    soap->d_stream.avail_out = SOAP_BUFLEN;
-    r = inflate(&soap->d_stream, Z_NO_FLUSH);
-    if (r == Z_OK || r == Z_STREAM_END)
-    { soap->bufidx = 0;
-      soap->z_buflen = soap->buflen;
-      soap->buflen = ret = SOAP_BUFLEN - soap->d_stream.avail_out;
-      if (soap->zlib_in == SOAP_ZLIB_GZIP)
-        soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)ret));
-      if (!ret)
-        goto zlib_again;
-      if (r == Z_STREAM_END)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-        soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
-        soap->d_stream.next_out = Z_NULL;
-      }
-    }
-    else
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream.msg?soap->d_stream.msg:""));
-      soap->d_stream.next_out = Z_NULL;
-      return EOF;
-    }
-  }
-#endif
-  soap->count += ret;
-  return !ret;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-  { if (soap->dime_buflen)
-    { char *s;
-      int i;
-      unsigned char tmp[12];
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n"));
-      soap->count += soap->dime_buflen - soap->buflen;
-      soap->buflen = soap->dime_buflen;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime_size&3));
-      for (i = -(long)soap->dime_size&3; i > 0; i--)
-      { soap->bufidx++;
-        if (soap->bufidx >= soap->buflen)
-          if (soap_recv_raw(soap))
-            return EOF;
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n"));
-      s = (char*)tmp;
-      for (i = 12; i > 0; i--)
-      { *s++ = soap->buf[soap->bufidx++];
-        if (soap->bufidx >= soap->buflen)
-          if (soap_recv_raw(soap))
-            return EOF;
-      }
-      soap->dime_flags = tmp[0] & 0x7;
-      soap->dime_size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime_size));
-      if (soap->dime_flags & SOAP_DIME_CF)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n"));
-        soap->dime_chunksize = soap->dime_size;
-        if (soap->buflen - soap->bufidx >= soap->dime_size)
-        { soap->dime_buflen = soap->buflen;
-          soap->buflen = soap->bufidx + soap->dime_chunksize;
-        }
-        else
-          soap->dime_chunksize -= soap->buflen - soap->bufidx;
-      }
-      else
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n"));
-        soap->dime_buflen = 0;
-        soap->dime_chunksize = 0;
-      }
-      soap->count = soap->buflen - soap->bufidx;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count));
-      return SOAP_OK;
-    }
-    if (soap->dime_chunksize)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime_chunksize));
-      if (soap_recv_raw(soap))
-        return EOF;
-      if (soap->buflen - soap->bufidx >= soap->dime_chunksize)
-      { soap->dime_buflen = soap->buflen;
-        soap->count -= soap->buflen - soap->bufidx - soap->dime_chunksize;
-        soap->buflen = soap->bufidx + soap->dime_chunksize;
-      }
-      else
-        soap->dime_chunksize -= soap->buflen - soap->bufidx;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%u\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned int)soap->count));
-      return SOAP_OK;
-    }
-  }
-#endif
-  return soap_recv_raw(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_getchar(struct soap *soap)
-{ register wchar c;
-  if (soap->ahead)
-  { c = soap->ahead;
-    soap->ahead = 0;
-    return c;
-  }
-  return soap_get1(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const struct soap_code_map*
-SOAP_FMAC2
-soap_code(const struct soap_code_map *map, const char *str)
-{ while (map->string)
-  { if (!strcmp(str, map->string))
-      return map;
-    map++;
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_int_code(const struct soap_code_map *map, const char *str, long other)
-{ while (map->string)
-  { if (!strcmp(str, map->string))
-      return map->code;
-    map++;
-  }
-  return other;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_str_code(const struct soap_code_map *map, long code)
-{ while (map->code != code && map->string)
-    map++;
-  return map->string;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static wchar
-soap_char(struct soap *soap)
-{ char tmp[8];
-  register int i;
-  register wchar c;
-  register char *s = tmp;
-  for (i = 0; i < 7; i++)
-  { c = soap_get1(soap);
-    if (c == ';' || (int)c == EOF)
-      break;
-    *s++ = (char)c;
-  }
-  *s = '\0';
-  if (*tmp == '#')
-  { if (tmp[1] == 'x' || tmp[1] == 'X')
-      return soap_strtol(tmp + 2, NULL, 16);
-    return atol(tmp + 1);
-  }
-  if (!strcmp(tmp, "lt"))
-    return '<';
-  if (!strcmp(tmp, "gt"))
-    return '>';
-  if (!strcmp(tmp, "amp"))
-    return '&';
-  if (!strcmp(tmp, "quot"))
-    return '"';
-  if (!strcmp(tmp, "apos"))
-    return '\'';
-#ifndef WITH_LEAN
-  return (wchar)soap_int_code(html_entity_codes, tmp, 127);
-#else
-  return 127; /* use this to represent unknown code */
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_get(struct soap *soap)
-{ register wchar c;
-  c = soap->ahead;
-  if (c)
-    soap->ahead = 0;
-  else
-    c = soap_get1(soap);
-  for (;;)
-  { if (soap->cdata)
-    { if (c == ']')
-      { c = soap_get1(soap);
-        if (c == ']')
-        { soap->cdata = 0;
-          soap_get1(soap); /* skip > */
-          c = soap_get1(soap);
-        }
-       else
-        { soap_revget1(soap);
-          return ']';
-        }
-      }
-      else
-        return c;
-    }
-    switch (c)
-    { case '<':
-        do c = soap_get1(soap);
-        while (soap_blank(c));
-        if (c == '!' || c == '?' || c == '%')
-        { if (c == '!')
-          { c = soap_get1(soap);
-            if (c == '[')
-            { do c = soap_get1(soap);
-              while ((int)c != EOF && c != '[');
-              if ((int)c == EOF)
-                break;
-              soap->cdata = 1;
-              c = soap_get1(soap);
-             continue;
-            }
-            if (c == '-' && (c = soap_get1(soap)) == '-')
-            { do
-              { c = soap_get1(soap);
-                if (c == '-' && (c = soap_get1(soap)) == '-')
-                  break;
-              } while ((int)c != EOF);
-            }
-          }
-          while ((int)c != EOF && c != '>')
-            c = soap_get1(soap);
-         if ((int)c == EOF)
-           break;
-          c = soap_get1(soap);
-          continue;
-        }
-        if (c == '/')
-          return TT;
-        soap_revget1(soap);
-        return LT;
-      case '>':
-        return GT;
-      case '"':
-        return QT;
-      case '\'':
-        return AP;
-      case '&':
-        return soap_char(soap) | 0x80000000;
-    }
-    break;
-  }
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_advance(struct soap *soap)
-{ register wchar c;
-  while ((int)((c = soap_get(soap)) != EOF) && c != LT && c != TT)
-    ;
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_skip(struct soap *soap)
-{ register wchar c;
-  do c = soap_get(soap);
-  while (soap_blank(c));
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_move(struct soap *soap, long n)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %ld bytes forward\n", (long)n));
-  for (; n > 0; n--)
-    if ((int)soap_getchar(soap) == EOF)
-      return SOAP_EOF;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_tell(struct soap *soap)
-{ return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pututf8(struct soap *soap, register unsigned long c)
-{ char tmp[16];
-  if (c > 0 && c < 0x80)
-  { *tmp = (char)c;
-    return soap_send_raw(soap, tmp, 1);
-  }
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { register char *t = tmp;
-    if (c < 0x0800)
-      *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-    else
-    { if (c < 0x010000)
-        *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-      else
-      { if (c < 0x200000)
-          *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-        else
-        { if (c < 0x04000000)
-            *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-          else
-          { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-            *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-          }
-          *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-        }     
-        *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-      }
-      *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-    }
-    *t++ = (char)(0x80 | (c & 0x3F));
-    *t = '\0';
-  }
-  else
-#endif
-    sprintf(tmp, "&#%lu;", c);
-  return soap_send(soap, tmp);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_getutf8(struct soap *soap)
-{ register wchar c, c1, c2, c3, c4;
-  c = soap_get(soap);
-  if (c < 0x80)
-    return c;
-  c1 = soap_get(soap);
-  if (c1 < 0x80)
-  { soap_unget(soap, c1);
-    return c;
-  }
-  c1 &= 0x3F;
-  if (c < 0xE0)
-    return ((wchar)(c & 0x1F) << 6) | c1;
-  c2 = (wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xF0)
-    return ((wchar)(c & 0x0F) << 12) | (c1 << 6) | c2;
-  c3 = (wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xF8)
-    return ((wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
-  c4 = (wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xFC)
-    return ((wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4;
-  return ((wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (wchar)(soap_get1(soap) & 0x3F);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_puthex(struct soap *soap, const unsigned char *s, int n)
-{ /* TODO: serialize to DOM (as an option) using new soap_s2hex() */
-  char d[2];
-  register int i;
-  for (i = 0; i < n; i++)
-  { register int m = *s++;
-    d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0'));
-    m &= 0x0F;
-    d[1] = (char)(m + (m > 9 ? '7' : '0'));
-    if (soap_send_raw(soap, d, 2))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-unsigned char*
-SOAP_FMAC2
-soap_gethex(struct soap *soap, int *n)
-{ register wchar c;
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { register int i;
-    register char *s = (char*)soap_push_block(soap, SOAP_BLKLEN);
-    if (!s)
-    { soap_end_block(soap);
-      if (n)
-        *n = 0;
-      return NULL;
-    }
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { register char d1, d2;
-      c = soap_get(soap);
-      if (soap_isxdigit(c))
-      { d1 = (char)c;
-        c = soap_get(soap); 
-       if (soap_isxdigit(c))
-          d2 = (char)c;
-        else 
-        { soap_end_block(soap);
-         soap->error = SOAP_TYPE;
-         if (n)
-           *n = 0;
-          return NULL;
-        }
-      }
-      else
-      { unsigned char *p;
-        soap_unget(soap, c);
-        if (n)
-          *n = (int)soap_size_block(soap, i);
-        p = (unsigned char*)soap_save_block(soap, NULL);
-        return p;
-      }
-      *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putbase64(struct soap *soap, const unsigned char *s, int n)
-{ register int i;
-  register unsigned long m;
-  char d[4];
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->data = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1);
-    return soap_s2base64(soap, s, soap->dom->data, n);
-  }
-#endif
-  if (!s)
-    return SOAP_OK;
-  for (; n > 2; n -= 3, s += 3)
-  { m = ((unsigned long)((unsigned char*)s)[0] << 16) | ((unsigned long)((unsigned char*)s)[1] << 8) | (unsigned long)((unsigned char*)s)[2];
-    for (i = 4; i > 0; m >>= 6)
-      d[--i] = soap_base64o[m & 0x3F];
-    if (soap_send_raw(soap, d, 4))
-      return soap->error;
-  }
-  if (n > 0)
-  { m = 0;
-    for (i = 0; i < n; i++)
-      m = (m << 8) | *s++;
-    for (; i < 3; i++)
-      m <<= 8;
-    for (i++; i > 0; m >>= 6)
-      d[--i] = soap_base64o[m & 0x3F];
-    for (i = 3; i > n; i--)
-      d[i] = '=';
-    if (soap_send_raw(soap, d, 4))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-unsigned char*
-SOAP_FMAC2
-soap_getbase64(struct soap *soap, int *n, int malloc_flag)
-{ register wchar c;
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { register int i;
-    register char *s = (char*)soap_push_block(soap, 3*SOAP_BLKLEN); /* must be multiple of 3 */
-    if (!s)
-    { soap_end_block(soap);
-      if (n)
-        *n = 0;
-      return NULL;
-    }
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { register unsigned long m = 0;
-      register int j = 0;
-      while (j < 4)
-      { c = soap_get(soap);
-        if (c == '=' || c < 0)
-        { unsigned char *p;
-          i *= 3;
-          switch (j)
-          { case 2:
-              *s++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *s++ = (char)((m >> 10) & 0xFF);
-              *s++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-           *n = (int)soap_size_block(soap, i);
-          p = (unsigned char*)soap_save_block(soap, NULL);
-          if (c >= 0)
-          { while ((int)((c = soap_get(soap)) != EOF) && c != LT && c != TT)
-              ;
-         }
-          soap_unget(soap, c);
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      }
-      *s++ = (char)((m >> 16) & 0xFF);
-      *s++ = (char)((m >> 8) & 0xFF);
-      *s++ = (char)(m & 0xFF);
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_strdup(struct soap *soap, const char *s)
-{ char *t = NULL;
-  if (s && (t = (char*)soap_malloc(soap, strlen(s) + 1)))
-    strcpy(t, s);
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_new_block(struct soap *soap)
-{ struct soap_blist *p;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist));
-  if (!(p = (struct soap_blist*)SOAP_MALLOC(sizeof(struct soap_blist))))
-    return SOAP_EOM;   
-  p->next = soap->blist; 
-  p->ptr = NULL;
-  p->size = 0;
-  soap->blist = p;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_push_block(struct soap *soap, size_t n)
-{ char *p;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)soap->blist->size));
-  if (!(p = (char*)SOAP_MALLOC(n + sizeof(char*) + sizeof(size_t))))
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  *(char**)p = soap->blist->ptr;
-  *(size_t*)(p + sizeof(char*)) = n;
-  soap->blist->ptr = p;
-  soap->blist->size += n;
-  return p + sizeof(char*) + sizeof(size_t);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_pop_block(struct soap *soap)
-{ char *p;
-  if (!soap->blist->ptr)
-    return;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n"));
-  p = soap->blist->ptr;
-  soap->blist->size -= *(size_t*)(p + sizeof(char*));
-  soap->blist->ptr = *(char**)p;
-  SOAP_FREE(p);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_update_ptrs(struct soap *soap, char *start, char *end, long offset)
-{ int i;
-  register struct soap_ilist *ip;
-  register void *p, **q;
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end)
-        ip->ptr = (char*)ip->ptr + offset;
-      for (q = &ip->link; q; q = (void**)p)
-      { p = *q;
-        if (p && (char*)p >= start && (char*)p < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p));
-          *q = (char*)p + offset;
-        }
-      }
-      for (q = &ip->copy; q; q = (void**)p)
-      { p = *q;
-        if (p && (char*)p >= start && (char*)p < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy update id='%s' %p\n", ip->id, p));
-          *q = (char*)p + offset;
-        }
-      }
-    }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_has_copies(struct soap *soap, register char *start, register char *end)
-{ int i;
-  register struct soap_ilist *ip;
-  register char *p;
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-      for (p = (char*)ip->copy; p; p = *(char**)p)
-        if (p >= start && p < end)
-          return SOAP_ERR;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_resolve(struct soap *soap)
-{ int i, flag1 = 0, flag2;
-  register struct soap_ilist *ip;
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->ptr)
-        soap_resolve_ptr(ip);
-      else if (*ip->id == '#')
-        flag1 = 1;
-    }
-  do
-  { flag2 = 0;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n"));
-    for (i = 0; i < SOAP_IDHASH; i++)
-      for (ip = soap->iht[i]; ip; ip = ip->next)
-        if (ip->copy && ip->ptr && ip->size)
-          if (!soap_has_copies(soap, (char*)ip->ptr, (char*)ip->ptr + ip->size))
-          { register void *p, **q = (void**)ip->copy;
-            DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id));
-            ip->copy = NULL;
-            do
-            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size));
-             p = *q;
-              memcpy(q, ip->ptr, ip->size);
-              q = (void**)p;
-            } while (q);
-           flag2 = 1;
-         }
-  } while (flag2);
-  if (flag1)
-    return soap->error = SOAP_MISSING_ID;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_resolve_ptr(struct soap_ilist *ip)
-{ register void *p, **q, *r;
-  q = (void**)ip->link;
-  ip->link = NULL;
-  r = ip->ptr;
-  while (q)
-  { p = *q;
-    *q = r;
-    q = (void**)p;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_size_block(struct soap *soap, size_t n)
-{ if (soap->blist->ptr)
-  { soap->blist->size -= *(size_t*)(soap->blist->ptr + sizeof(char*)) - n;
-    *(size_t*)(soap->blist->ptr + sizeof(char*)) = n;
-  }
-  return soap->blist->size;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_first_block(struct soap *soap)
-{ char *p, *q, *r;
-  p = soap->blist->ptr;
-  if (!p)
-    return NULL;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block\n"));
-  r = NULL;
-  do
-  { q = *(char**)p;
-    *(char**)p = r;
-    r = p;
-    p = q;
-  } while (p);
-  soap->blist->ptr = r;
-  return r + sizeof(char*) + sizeof(size_t);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_next_block(struct soap *soap)
-{ char *p;
-  p = soap->blist->ptr;
-  if (p)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n"));
-    soap->blist->ptr = *(char**)p;
-    SOAP_FREE(p);
-    if (soap->blist->ptr)
-      return soap->blist->ptr + sizeof(char*) + sizeof(size_t);
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_block_size(struct soap *soap)
-{ return *(size_t*)(soap->blist->ptr + sizeof(char*));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_end_block(struct soap *soap)
-{ struct soap_blist *bp;
-  char *p, *q;
-  bp = soap->blist;
-  if (bp)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n"));
-    for (p = bp->ptr; p; p = q)
-    { q = *(char**)p;
-      SOAP_FREE(p);
-    }
-    soap->blist = bp->next;
-    SOAP_FREE(bp);
-  }
-  DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n"));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_save_block(struct soap *soap, char *p)
-{ register size_t n;
-  register char *q, *s;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)soap->blist->size, soap->blist->ptr, p));
-  if (soap->blist->size)
-  { if (!p)
-      p = (char*)soap_malloc(soap, soap->blist->size);
-    if (p)
-      for (s = p, q = soap_first_block(soap); q; q = soap_next_block(soap))
-      { n = soap_block_size(soap);
-        soap_update_ptrs(soap, q, q + n, (long)s - (long)q); /* pointers s and q may or may not be related */
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s));
-        memcpy(s, q, n);
-        s += n;
-      } 
-    else
-      soap->error = SOAP_EOM;
-  }
-  soap_end_block(soap);
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_store_block(struct soap *soap, char *p)
-{ p = soap_save_block(soap, p);
-  if (!soap->blist)
-  { struct soap_ilist *ip;
-    int i;
-    for (i = 0; i < SOAP_IDHASH; i++)
-      for (ip = soap->iht[i]; ip; ip = ip->next)
-        if (ip->ptr)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolve link chain to point to %p\n", ip->ptr));
-          soap_resolve_ptr(ip);
-        }
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsize(struct soap *soap, const char *type, int size)
-{ return soap_putsizes(soap, type, &size, 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsizes(struct soap *soap, const char *type, const int *size, int dim)
-{ return soap_putsizesoffsets(soap, type, size, NULL, dim);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim)
-{ int i;
-  if (!type)
-    return NULL;
-  if (soap->version == 2)
-  { sprintf(soap->type, "%s[%d", type, size[0]);
-    for (i = 1; i < dim; i++)
-      sprintf(soap->type + strlen(soap->type), " %d", size[i]);
-  }
-  else
-  { if (offset)
-    { sprintf(soap->type, "%s[%d", type, size[0] + offset[0]);
-      for (i = 1; i < dim; i++)
-        sprintf(soap->type + strlen(soap->type), ",%d", size[i] + offset[i]);
-    }
-    else
-    { sprintf(soap->type, "%s[%d", type, size[0]);
-      for (i = 1; i < dim; i++)
-        sprintf(soap->type + strlen(soap->type), ",%d", size[i]);
-    }
-    strcat(soap->type, "]");
-  }
-  return soap->type;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putoffset(struct soap *soap, int offset)
-{ return soap_putoffsets(soap, &offset, 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putoffsets(struct soap *soap, const int *offset, int dim)
-{ register int i;
-  sprintf(soap->arrayOffset, "[%d", offset[0]);
-  for (i = 1; i < dim; i++)
-    sprintf(soap->arrayOffset + strlen(soap->arrayOffset), ",%d", offset[i]);
-  strcat(soap->arrayOffset, "]");
-  return soap->arrayOffset;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_size(const int *size, int dim)
-{ register int i, n = size[0];
-  for (i = 1; i < dim; i++)
-    n *= size[i];
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getoffsets(const char *attr, const int *size, int *offset, int dim)
-{ register int i, j = 0;
-  if (offset)
-    for (i = 0; i < dim && attr && *attr; i++)
-    { attr++;
-      j *= size[i];
-      j += offset[i] = (int)atol(attr);
-      attr = strchr(attr, ',');
-    }
-  else
-    for (i = 0; i < dim && attr && *attr; i++)
-    { attr++;
-      j *= size[i];
-      j += (int)atol(attr);
-      attr = strchr(attr, ',');
-    }
-  return j;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getsize(const char *attr1, const char *attr2, int *j)
-{ register int n, k;
-  char *s;
-  *j = 0;
-  if (!*attr1)
-    return -1;
-  n = 1;
-  do
-  { attr1++;
-    k = (int)soap_strtol(attr1, &s, 10);
-    n *= k;
-    if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1)
-      return -1;
-    attr1 = strchr(s, ',');
-    if (!attr1)
-      attr1 = strchr(s, ' ');
-    if (attr2 && *attr2)
-    { attr2++;
-      *j *= k;
-      k = (int)soap_strtol(attr2, &s, 10);
-      *j += k;
-      if (k < 0)
-        return -1;
-      attr2 = s;
-    }
-  } while (attr1 && *attr1 != ']');
-  return n - *j;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getsizes(const char *attr, int *size, int dim)
-{ register int i, k, n;
-  if (!*attr)
-    return -1;
-  i = strlen(attr);
-  n = 1;
-  do
-  { for (i = i-1; i >= 0; i--)
-      if (attr[i] == '[' || attr[i] == ',' || attr[i] == ' ')
-        break;
-    k = (int)atol(attr + i + 1);
-    n *= size[--dim] = k;
-    if (k < 0 || n > SOAP_MAXARRAYSIZE)
-      return -1;
-  } while (i >= 0 && attr[i] != '[');
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getposition(const char *attr, int *pos)
-{ register int i, n;
-  if (!*attr)
-    return -1;
-  n = 0;
-  i = 1;
-  do
-  { pos[n++] = (int)atol(attr + i);
-    while (attr[i] && attr[i] != ',' && attr[i] != ']')
-      i++;
-    if (attr[i] == ',')
-      i++;
-  } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']');
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_push_namespace(struct soap *soap, const char *id, const char *ns)
-{ register struct soap_nlist *np;
-  register struct Namespace *p;
-  np = (struct soap_nlist*)SOAP_MALLOC(sizeof(struct soap_nlist) + strlen(id));
-  if (!np)
-    return soap->error = SOAP_EOM;
-  np->next = soap->nlist;
-  soap->nlist = np;
-  strcpy(np->id, id);
-  np->level = soap->level;
-  np->index = -1;
-  np->ns = NULL;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns));
-  p = soap->local_namespaces;
-  if (p)
-  { register short i;
-    for (i = 0; p->id; p++, i++)
-    { if (p->ns)
-        if (!soap_tag_cmp(ns, p->ns))
-          break;
-      if (p->in)
-        if (!soap_tag_cmp(ns, p->in))
-        { if (p->out)
-            SOAP_FREE(p->out);
-          if ((p->out = (char*)SOAP_MALLOC(strlen(ns) + 1)))
-            strcpy(p->out, ns);
-          if (i == 0)
-          { if (!strcmp(ns, soap_env1))
-            { soap->version = 1; /* and make sure we use SOAP 1.1 */
-              if (p->out)
-                SOAP_FREE(p[1].out);
-              if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc1))))
-                strcpy(p[1].out, soap_enc1);
-            }
-            else
-            { soap->version = 2; /* and make sure we use SOAP 1.2 */
-              if (p[1].out)
-                SOAP_FREE(p[1].out);
-              if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc2))))
-                strcpy(p[1].out, soap_enc2);
-            }
-          }
-          break;
-        }
-    }
-    if (p && p->id)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id));
-      np->index = i;
-    }
-  }
-  if (!p || !p->id)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns));
-    np->ns = (char*)SOAP_MALLOC(strlen(ns) + 1);
-    if (!np->ns)
-      return soap->error = SOAP_EOM;
-    strcpy(np->ns, ns);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_push_default_namespace(struct soap *soap, const char *id, int n)
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && np->index >= -1)
-    np = np->next;
-  if (np && (!strncmp(np->id, id, n) && !np->id[n]))
-    return SOAP_OK;
-  np = (struct soap_nlist*)SOAP_MALLOC(sizeof(struct soap_nlist) + n);
-  if (!np)
-    return soap->error = SOAP_EOM;
-  np->next = soap->nlist;
-  soap->nlist = np;
-  strncpy(np->id, id, n);
-  np->id[n] = '\0';
-  np->level = soap->level;
-  np->index = -2;
-  np->ns = NULL;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_pop_namespace(struct soap *soap)
-{ register struct soap_nlist *np;
-  while (soap->nlist && soap->nlist->level >= soap->level)
-  { np = soap->nlist->next;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Popped namespace binding (level=%u) '%s'\n", soap->level, soap->nlist->id));
-    if (soap->nlist->ns)
-      SOAP_FREE(soap->nlist->ns);
-    SOAP_FREE(soap->nlist);
-    soap->nlist = np;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_namespace(struct soap *soap, const char *id1, const char *id2, int n1, int n2) 
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && (np->index == -2 || (strncmp(np->id, id1, n1) || np->id[n1])))
-    np = np->next;
-  if (np)
-  { if (np->index < 0 || (np->index >= 0 && soap->local_namespaces[np->index].id && (strncmp(soap->local_namespaces[np->index].id, id2, n2) || soap->local_namespaces[np->index].id[n2])))
-      return SOAP_NAMESPACE;
-    return SOAP_OK;
-  }
-  if (n1 == 3 && n1 == n2 && !strcmp(id1, "xml") && !strcmp(id1, id2))
-    return SOAP_OK;
-  return SOAP_SYNTAX_ERROR; 
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_default_namespace(struct soap *soap)
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && np->index >= -1)
-    np = np->next;
-  if (np)
-    return np->id;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_tag_cmp(register const char *s, register const char *t)
-{ for (; *s && *s != '"'; s++, t++)
-    if (tolower(*s) != tolower(*t))
-      if (*t != '-')
-      { if (*t != '*')
-          return 1;
-        if (*++t)
-        { register int c = tolower(*t);
-          for (; *s && *s != '"'; s++)
-          { if (tolower(*s) == c)
-              if (!soap_tag_cmp(s + 1, t + 1))
-                return 0;
-          }
-          break;
-        }
-        else
-          return 0;
-      }
-  if (*t == '*' && !t[1])
-    return 0;
-  return *t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_tag(struct soap *soap, const char *tag1, const char *tag2)
-{ register const char *s, *t;
-  if (!tag1 || !tag2 || !*tag2)
-    return SOAP_OK;
-  s = strchr(tag1, ':');
-  t = strchr(tag2, ':');
-  if (t)
-  { if (s)
-    { if (SOAP_STRCMP(s + 1, t + 1))
-        return SOAP_TAG_MISMATCH;
-      if (t != tag2 && soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
-        return SOAP_TAG_MISMATCH;
-      }
-    } 
-    else if (SOAP_STRCMP(tag1, t + 1))
-      return SOAP_TAG_MISMATCH;
-    else if (t != tag2 && soap_match_namespace(soap, tag1, tag2, 0, t - tag2))
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
-      return SOAP_TAG_MISMATCH;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2));
-    return SOAP_OK;
-  }
-  if (s)
-  { if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER && soap->encodingStyle))
-      return SOAP_TAG_MISMATCH;
-    if (SOAP_STRCMP(s + 1, tag2))
-      return SOAP_TAG_MISMATCH;
-    if (!soap->encodingStyle)
-    { t = soap_default_namespace(soap);
-      if (!t || soap_match_namespace(soap, tag1, t, s - tag1, strlen(t)))
-        return SOAP_TAG_MISMATCH;
-    }
-  }
-  else if (SOAP_STRCMP(tag1, tag2))
-    return SOAP_TAG_MISMATCH;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_array(struct soap *soap, const char *type)
-{ if (*soap->arrayType)
-    if (soap_match_tag(soap, soap->arrayType, type)
-     && soap_match_tag(soap, soap->arrayType, "xsd:anyType")
-     && soap_match_tag(soap, soap->arrayType, "xsd:ur-type")
-    )
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type));
-      return SOAP_TAG_MISMATCH;
-    }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-
-#ifdef WITH_OPENSSL
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid)
-{ int err;
-  soap->keyfile = keyfile;
-  soap->password = password;
-  soap->cafile = cafile;
-  soap->capath = capath;
-  if (dhfile)
-  { soap->dhfile = dhfile;
-    soap->rsa = 0;
-  }
-  else
-  { soap->dhfile = NULL;
-    soap->rsa = 1;
-  }
-  soap->randfile = randfile;
-  soap->require_client_auth = (flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION);
-  if (!(err = soap->fsslauth(soap)))
-    if (sid)
-      SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, strlen(sid));
-  return err; 
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile)
-{ soap->keyfile = keyfile;
-  soap->password = password;
-  soap->cafile = cafile;
-  soap->capath = capath;
-  soap->dhfile = NULL;
-  soap->rsa = 0;
-  soap->randfile = randfile;
-  soap->require_server_auth = (flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION);
-  return soap->fsslauth(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-ssl_init()
-{ static int done = 0;
-  if (!done)
-  { done = 1;
-    SSL_library_init();
-#ifndef WITH_LEAN
-    SSL_load_error_strings();
-#endif
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char *
-ssl_error(struct soap *soap, int ret)
-{ int err = SSL_get_error(soap->ssl, ret);
-  const char *msg = soap_str_code(h_ssl_error_codes, err);
-  if (msg)
-    strcpy(soap->msgbuf, msg);
-  else
-    return ERR_error_string(err, soap->msgbuf);
-  if (ERR_peek_error())
-  { unsigned long r;
-    strcat(soap->msgbuf, "\n");
-    while ((r = ERR_get_error()))
-      ERR_error_string_n(r, soap->msgbuf + strlen(soap->msgbuf), sizeof(soap->msgbuf) - strlen(soap->msgbuf));
-  } 
-  else
-  { switch (ret)
-    { case 0:
-        strcpy(soap->msgbuf, "EOF was observed that violates the protocol. The client probably provided invalid authentication information.");
-        break;
-      case -1:
-        sprintf(soap->msgbuf, "Error observed by underlying BIO: %s", strerror(errno));  
-        break;
-    }
-  }
-  return soap->msgbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_password(char *buf, int num, int rwflag, void *userdata)
-{ if (num < (int)strlen((char*)userdata) + 1)
-    return 0;
-  return strlen(strcpy(buf, (char*)userdata));
-}
-#endif
-
-/******************************************************************************/
-/* This callback is included for future references. It should not be deleted
-#ifndef PALM_1
-static DH *
-ssl_tmp_dh(SSL *ssl, int is_export, int keylength)
-{ static DH *dh512 = NULL;
-  static DH *dh1024 = NULL;
-  DH *dh;
-  switch (keylength)
-  { case 512:
-      if (!dh512)
-      { BIO *bio = BIO_new_file("dh512.pem", "r");
-        if (bio)
-        { dh512 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-          BIO_free(bio);
-          return dh512;
-        }
-      }
-      else
-        return dh512;
-    default:
-      if (!dh1024)
-      { BIO *bio = BIO_new_file("dh1024.pem", "r");
-        if (bio)
-        { dh1024 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-          BIO_free(bio);
-        }
-      }
-      dh = dh1024;
-  }
-  return dh;
-}
-#endif
-*/
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_auth_init(struct soap *soap)
-{ ssl_init();
-  if (!soap->ctx)
-    if (!(soap->ctx = SSL_CTX_new(SSLv23_method())))
-      return soap_set_receiver_error(soap, "SSL error", "Can't setup context", SOAP_SSL_ERROR);
-  if (soap->randfile)
-  { if (!RAND_load_file(soap->randfile, -1))
-      return soap_set_receiver_error(soap, "SSL error", "Can't load randomness", SOAP_SSL_ERROR);
-  }
-  else if (!RAND_load_file("/dev/random", 1024))
-  { int r;
-#ifdef HAVE_RAND_R
-    unsigned int s = (unsigned int)time(NULL);
-#endif
-    RAND_seed(soap->buf, sizeof(soap->buf));
-    while (!RAND_status())
-    {
-#ifdef HAVE_RAND_R
-      r = rand_r(&s);
-#else
-      r = rand();
-#endif
-      RAND_seed(&r, sizeof(int));
-    }
-  }
-  if (soap->cafile || soap->capath)
-    if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath))
-      return soap_set_receiver_error(soap, "SSL error", "Can't read CA file and/or directory", SOAP_SSL_ERROR);
-  if (!SSL_CTX_set_default_verify_paths(soap->ctx))
-    return soap_set_receiver_error(soap, "SSL error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR);
-  if (soap->keyfile)
-  { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile))
-      return soap_set_receiver_error(soap, "SSL error", "Can't read certificate key file", SOAP_SSL_ERROR);
-    if (soap->password)
-    { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password);
-      SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password);
-      if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
-        return soap_set_receiver_error(soap, "SSL error", "Can't read key file", SOAP_SSL_ERROR);
-    }
-  }
-  if (soap->rsa)
-  { RSA *rsa = RSA_generate_key(512, RSA_F4, NULL, NULL);
-    if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa))
-    { if (rsa)
-        RSA_free(rsa);
-      return soap_set_receiver_error(soap, "SSL error", "Can't set RSA key", SOAP_SSL_ERROR);
-    }
-    RSA_free(rsa);
-  }
-  else if (soap->dhfile)
-  { DH *dh = 0;
-    BIO *bio;
-    bio = BIO_new_file(soap->dhfile, "r");
-    if (!bio)
-      return soap_set_receiver_error(soap, "SSL error", "Can't read DH file", SOAP_SSL_ERROR);
-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-    BIO_free(bio);
-    if (SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0)
-    { if (dh)
-        DH_free(dh);
-      return soap_set_receiver_error(soap, "SSL error", "Can't set DH parameters", SOAP_SSL_ERROR);
-    }
-    DH_free(dh);
-  }
-  SSL_CTX_set_options(soap->ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2);
-  SSL_CTX_set_verify(soap->ctx, soap->require_client_auth ? (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) : soap->require_server_auth ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, soap->fsslverify);
-#if (OPENSSL_VERSION_NUMBER < 0x00905100L)
-  SSL_CTX_set_verify_depth(soap->ctx, 1); 
-#endif  
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_verify_callback(int ok, X509_STORE_CTX *store)
-{
-#ifdef SOAP_DEBUG
-  if (!ok) 
-  { char data[256];
-    X509 *cert = X509_STORE_CTX_get_current_cert(store);
-    fprintf(stderr, "SSL Verify error with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(X509_STORE_CTX_get_error(store)));
-    X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data));
-    fprintf(stderr, "certificate issuer %s\n", data);
-    X509_NAME_oneline(X509_get_subject_name(cert), data, sizeof(data));
-    fprintf(stderr, "certificate subject %s\n", data);
-  }
-#endif
-  return ok;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_accept(struct soap *soap)
-{ int i, r;
-  if (!soap_valid_socket(soap->socket))
-    return soap_set_receiver_error(soap, "SSL error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR);
-  if (!soap->ssl)
-  { soap->ssl = SSL_new(soap->ctx);
-    if (!soap->ssl)
-      return soap_set_receiver_error(soap, "SSL error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
-  }
-  else
-    SSL_clear(soap->ssl);
-  soap->imode |= SOAP_ENC_SSL;
-  soap->omode |= SOAP_ENC_SSL;
-#ifdef WIN32
-  u_long nonblocking = 1;
-  ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &nonblocking);
-#else
-  fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)|O_NONBLOCK);
-#endif
-  soap->bio = BIO_new_socket((SOAP_SOCKET)soap->socket, BIO_NOCLOSE);
-  SSL_set_bio(soap->ssl, soap->bio, soap->bio);
-  i = 100;
-  while ((r = SSL_accept(soap->ssl)) <= 0)
-  { int err = SSL_get_error(soap->ssl, r);
-    if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
-    { struct timeval timeout;
-      fd_set fd;
-      if (i-- <= 0)
-        break;
-      timeout.tv_sec = 0;
-      timeout.tv_usec = 100000;
-      FD_ZERO(&fd);
-      FD_SET((SOAP_SOCKET)soap->socket, &fd);
-      r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-      if (r < 0 && soap_socket_errno != SOAP_EINTR)
-      { soap->errnum = soap_socket_errno;
-        return SOAP_EOF;
-      }
-    }
-    else
-    { soap->errnum = err;
-      break;
-    }
-  }
-#ifdef WIN32
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
-  }
-#else
-  fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
-#endif
-  if (r <= 0)
-  { soap_set_receiver_error(soap, ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
-    soap_closesock(soap);
-    return SOAP_SSL_ERROR;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#endif /* WITH_OPENSSL */
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-tcp_init(struct soap *soap)
-{ soap->errmode = 1;
-#ifdef WIN32
-  if (tcp_done)
-    return 0;
-  tcp_done = 1;
-  { WSADATA w;
-    if (WSAStartup(MAKEWORD(1, 1), &w))
-    { tcp_done = 0;
-      return -1;
-    }
-  }
-#endif
-#ifdef PALM
-  errno = 0;
-  h_errno = 0;
-  AppNetRefnum = 0;
-  NetUInit();
-  AppNetTimeout = 10000;
-  NetLibOpen(AppNetRefnum, &h_errno);
-#endif
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_done(struct soap *soap)
-{ 
-#ifndef WITH_LEAN
-  int i;
-#endif
-  soap_free(soap);
-  while (soap->clist)
-  { struct soap_clist *p = soap->clist->next;
-    SOAP_FREE(soap->clist);
-    soap->clist = p;
-  }
-  soap->keep_alive = 0; /* to force close the socket */
-  soap_closesock(soap);
-#ifdef WITH_COOKIES
-  soap_free_cookies(soap);
-#endif
-  while (soap->plugins)
-  { register struct soap_plugin *p = soap->plugins->next;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id));
-    if (soap->plugins->fcopy || !soap->copy)
-      soap->plugins->fdelete(soap, soap->plugins);
-    SOAP_FREE(soap->plugins);
-    soap->plugins = p;
-  }
-  soap->fplugin = fplugin;
-  soap->fpost = http_post;
-  soap->fget = http_get;
-  soap->fposthdr = http_post_header;
-  soap->fresponse = http_response;
-  soap->fparse = http_parse;
-  soap->fparsehdr = http_parse_header;
-#ifndef MAC_CARBON
-  soap->faccept = tcp_accept;
-  soap->fopen = tcp_connect;
-  soap->fclose = tcp_disconnect;
-  soap->fsend = fsend;
-  soap->frecv = frecv;
-#endif
-  soap->fprepare = NULL;
-  soap->fignore = NULL;
-#ifdef WITH_OPENSSL
-  if (soap->session)
-  { SSL_SESSION_free(soap->session);
-    soap->session = NULL;
-  }
-#endif
-  if (!soap->copy)
-  { if (soap_valid_socket(soap->master))
-    { closesocket((SOAP_SOCKET)soap->master);
-      soap->master = SOAP_INVALID_SOCKET;
-    }
-#ifdef WITH_OPENSSL
-    if (soap->ctx)
-    { SSL_CTX_free(soap->ctx);
-      soap->ctx = NULL;
-    }
-#endif
-  }
-#ifndef WITH_LEAN
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-  { soap_close_logfile(soap, i);
-    if (soap->logfile[i])
-    { SOAP_FREE((void*)soap->logfile[i]);
-      soap->logfile[i] = NULL;
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_cleanup(struct soap *soap)
-{ soap_done(soap);
-#ifdef WIN32
-  if (!tcp_done)
-    return;
-  tcp_done = 0;
-  WSACleanup();
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-tcp_error(struct soap *soap)
-{ register const char *msg = NULL;
-  switch (soap->errmode)
-  { case 0:
-      msg = soap_strerror(soap);
-      break;
-    case 1:
-      msg = "WSAStartup failed";
-      break;
-    case 2:
-    {
-#ifndef WITH_LEAN
-      msg = soap_str_code(h_error_codes, soap->errnum);
-      if (!msg)
-#endif
-      { sprintf(soap->msgbuf, "TCP error %d", soap->errnum);
-        msg = soap->msgbuf;
-      }
-    }
-  }
-  return msg;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-http_error(struct soap *soap, int status)
-{ register const char *msg = NULL;
-#ifndef WITH_LEAN
-  msg = soap_str_code(h_http_error_codes, status);
-  if (!msg)
-#endif
-  { sprintf(soap->msgbuf, "HTTP error %d", status);
-    msg = soap->msgbuf;
-  }
-  return msg;
-}
-#endif
-
-/******************************************************************************/
-/* WR[ */
-#ifndef WITH_IPV6
-/* ]WR */
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-soap_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr)
-{ unsigned long iadd;
-  struct hostent hostent, *host = &hostent;
-/* WR[ */
-#ifdef VXWORKS
-  int hostint;
-  char * addrcopy = (char*)malloc(strlen(addr) + 1); /*copy of addr. */
-  /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */
-  strncpy(addrcopy, addr, strlen(addr)+1);
-  iadd = inet_addr(addrcopy);
-#else
-/* ]WR */
-#if defined(_AIXVERSION_431) || defined(TRU64)
-  struct hostent_data ht_data;
-#endif
-  iadd = inet_addr(addr);
-/* WR[ */
-#endif
-/* ]WR */
-  if ((int)iadd != -1)
-  { memcpy(inaddr, &iadd, sizeof(iadd));
-/* WR[ */
-#ifdef VXWORKS
-    free(addrcopy);
-#endif
-/* ]WR */
-    return 0;
-  }
-#if defined(__GLIBC__)
-  if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0)
-    host = NULL;
-#elif defined(_AIXVERSION_431) || defined(TRU64)
-  memset(&ht_data, 0, sizeof(ht_data));
-  if (gethostbyname_r(addr, &hostent, &ht_data) < 0)
-  { host = NULL;
-    soap->errnum = h_errno;
-  }
-#elif defined(HAVE_GETHOSTBYNAME_R)
-  host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum);
-/* WR[ */
-#elif defined(VXWORKS)
-  /* If the DNS resolver library resolvLib has been configured in the vxWorks
-   * image, a query for the host IP address is sent to the DNS server, if the
-   * name was not found in the local host table. */
-  hostint = hostGetByName(addrcopy);
-  if (hostint == ERROR)
-    {
-    host = NULL;
-    soap->errnum = soap_errno; 
-    }
-  free(addrcopy);  /*free() is placed after the error checking to assure that
-                   * errno captured is that from hostGetByName() */
-/* ]WR */
-#else
-  if (!(host = gethostbyname(addr)))
-    soap->errnum = h_errno;
-#endif
-  if (!host)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n"));
-    return -1;
-  }
-/* WR[ */
-#ifdef VXWORKS
-  inaddr->s_addr = hostint;
-#else
-/* ]WR */
-  memcpy(inaddr, host->h_addr, host->h_length);
-/* WR[ */
-#endif
-/* ]WR */
-  return 0;
-}
-#endif
-#endif
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port)
-{ struct sockaddr_in sockaddr;
-/* WR[ */
-#ifdef WITH_IPV6
-  struct addrinfo *addrinfo;
-  struct addrinfo hints;
-  struct addrinfo resaddr;
-  struct sockaddr_storage addrstorage;
-  int err;
-#endif /* WITH_IPV6 */
-/* ]WR */
-  register int fd;
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  if (soap_valid_socket(soap->socket))
-    closesocket((SOAP_SOCKET)soap->socket);
-  soap->socket = SOAP_INVALID_SOCKET;
-  if (tcp_init(soap))
-  { soap_set_sender_error(soap, tcp_error(soap), "TCP initialization failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  soap->errmode = 0;
-/* WR[ */
-#ifdef WITH_IPV6
-  memset(&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
-  hints.ai_socktype = SOCK_STREAM;
-  soap->errmode = 2;
-  if (soap->proxy_host)
-    err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &addrinfo);
-  else
-    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
-  if (addrinfo)
-  { resaddr = *addrinfo;
-    addrstorage = *((struct sockaddr_storage *) addrinfo->ai_addr);
-    resaddr.ai_addr = (struct sockaddr *) &addrstorage;
-    freeaddrinfo(addrinfo);
-  }
-  if (err)
-  { soap_set_sender_error(soap, gai_strerror(err), 
-    "TCP getaddrinfo on proxy host failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  fd = (int)socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol); /* modified to use fd */
-  soap->errmode = 0;
-#else /* WITH_IPV6 */
-/* ]WR */
-  fd = (int)socket(AF_INET, SOCK_STREAM, 0);
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-  if (fd < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP socket failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#ifndef WITH_LEAN
-  if (soap->connect_flags & SO_LINGER)
-  { struct linger linger;
-    memset(&linger, 0, sizeof(struct linger));
-    linger.l_onoff = 1;
-    linger.l_linger = 0;
-    if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
-    { soap->errnum = soap_socket_errno;
-      soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR);
-      closesocket((SOAP_SOCKET)fd);
-      return -1;
-    }
-  }
-  if ((soap->connect_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (soap->keep_alive && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-#ifdef TCP_NODELAY
-  if (setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-#endif
-#endif
-/* WR[ */
-#ifndef WITH_IPV6
-/* ]WR */
-  memset(&sockaddr, 0, sizeof(sockaddr));
-  sockaddr.sin_family = AF_INET;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Open socket %d to host='%s'\n", fd, host));
-  soap->errmode = 2;
-  if (soap->proxy_host)
-  { if (soap_gethost(soap, soap->proxy_host, &sockaddr.sin_addr))
-    { soap_set_sender_error(soap, tcp_error(soap), "TCP get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR);
-      closesocket((SOAP_SOCKET)fd);
-      return -1;
-    }
-    sockaddr.sin_port = htons((short)soap->proxy_port);
-  }
-  else
-  { if (soap_gethost(soap, host, &sockaddr.sin_addr))
-    { soap_set_sender_error(soap, tcp_error(soap), "TCP get host by name failed in tcp_connect()", SOAP_TCP_ERROR);
-      closesocket((SOAP_SOCKET)fd);
-      return -1;
-    }
-    sockaddr.sin_port = htons((short)port);
-  }
-  soap->errmode = 0;
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  if (soap->connect_timeout)
-#if defined(WIN32)
-  { u_long nonblocking = 1;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  {
-    vx_nonblocking = TRUE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
-#endif
-  else
-#if defined(WIN32)
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  {
-    vx_nonblocking = FALSE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-  for (;;)
-  { 
-/* WR[ */
-#ifdef WITH_IPV6
-    if (connect((SOAP_SOCKET)fd, resaddr.ai_addr, resaddr.ai_addrlen)) /* modified to use fd */
-#else /* WITH_IPV6 */
-    if (connect((SOAP_SOCKET)fd, (struct sockaddr*)&sockaddr, sizeof(sockaddr)))
-#endif /* WITH_IPV6 */
-/* ]WR */
-    { 
-#ifndef WITH_LEAN
-      if (soap->connect_timeout && (soap_socket_errno == SOAP_EINPROGRESS || soap_socket_errno == SOAP_EWOULDBLOCK))
-      { struct timeval timeout;
-#if defined(SOCKLEN_T)
-        SOCKLEN_T n = sizeof(struct sockaddr_in);
-#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
-        socklen_t n = sizeof(struct sockaddr_in);
-#elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
-        int n = sizeof(struct sockaddr_in);
-#else
-        size_t n = sizeof(struct sockaddr_in);
-#endif
-        fd_set fds;
-        if (soap->connect_timeout > 0)
-        { timeout.tv_sec = soap->connect_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->connect_timeout/1000000;
-          timeout.tv_usec = -soap->connect_timeout%1000000;
-        }
-        FD_ZERO(&fds);
-        FD_SET((SOAP_SOCKET)fd, &fds);
-        for (;;)
-        { int r = select((SOAP_SOCKET)(fd + 1), NULL, &fds, NULL, &timeout);
-          if (r > 0)
-           break;
-          if (!r)
-          { soap->errnum = 0;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
-            soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-            closesocket((SOAP_SOCKET)fd);
-            return -1;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-            soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-            closesocket((SOAP_SOCKET)fd);
-            return -1;
-          }
-        }
-       n = sizeof(soap->errnum);
-        if (!getsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &n) && !soap->errnum)
-          break;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-        soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-        closesocket((SOAP_SOCKET)fd);
-        return -1;
-      }
-      else
-#endif
-      if (soap_socket_errno != SOAP_EINTR)
-      { soap->errnum = soap_socket_errno;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-        soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-        closesocket((SOAP_SOCKET)fd);
-        return -1;
-      }
-    }  
-    else
-      break;
-  }
-#ifndef WITH_LEAN
-  if (soap->connect_timeout)
-#if defined(WIN32)
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  {
-    vx_nonblocking = FALSE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-  soap->socket = fd;
-#ifdef WITH_OPENSSL
-  soap->imode &= ~SOAP_ENC_SSL;
-  soap->omode &= ~SOAP_ENC_SSL;
-  if (!strncmp(endpoint, "https:", 6))
-  { int r;
-    if (soap->proxy_host)
-    { unsigned int k = soap->omode; /* make sure we only parse HTTP */
-      size_t n = soap->count; /* save the content length */
-      soap->omode &= ~0xFF; /* mask IO and ENC */
-      soap->omode |= SOAP_IO_BUFFER;
-      soap_begin_send(soap);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to proxy server\n"));
-      sprintf(soap->tmpbuf, "CONNECT %s:%d HTTP/%s", host, port, soap->http_version);
-      if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return -1;
-#ifndef WITH_LEAN
-      if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
-      { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
-        strcpy(soap->tmpbuf, "Basic ");
-        soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-        if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
-          return soap->error;
-      }
-#endif
-      if ((soap->error = soap->fposthdr(soap, NULL, NULL))
-       || soap_end_send(soap))
-        return -1;
-      soap->omode = k;
-      k = soap->imode;
-      soap->imode &= ~0xFF; /* mask IO and ENC */
-      if (soap_begin_recv(soap))
-        return -1;
-      soap->imode = k;
-      soap->count = n;
-      soap_begin_send(soap);
-    }
-    if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
-    { soap_set_sender_error(soap, "SSL error", "SSL authentication failed in tcp_connect(): check password, key file, and ca file.", SOAP_SSL_ERROR);
-      return -1;
-    }
-    soap->ssl = SSL_new(soap->ctx);
-    if (!soap->ssl)
-    { soap->error = SOAP_SSL_ERROR;
-      return -1;
-    }
-    if (soap->session)
-    { if (!strcmp(soap->session_host, host) && soap->session_port == port)
-        SSL_set_session(soap->ssl, soap->session);
-      SSL_SESSION_free(soap->session);
-      soap->session = NULL;
-    }
-    soap->imode |= SOAP_ENC_SSL;
-    soap->omode |= SOAP_ENC_SSL;
-    soap->bio = BIO_new_socket((SOAP_SOCKET)fd, BIO_NOCLOSE);
-    SSL_set_bio(soap->ssl, soap->bio, soap->bio);
-#ifndef WITH_LEAN
-    if (soap->connect_timeout)
-#ifdef WIN32
-    { u_long nonblocking = 1;
-      ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
-    }
-#else
-      fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
-#endif
-#endif
-    for (;;)
-    { if ((r = SSL_connect(soap->ssl)) <= 0)
-      { int err = SSL_get_error(soap->ssl, r);
-        if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-        { soap_set_sender_error(soap, ssl_error(soap, r), "SSL connect failed in tcp_connect()", SOAP_SSL_ERROR);
-          return -1;
-        }
-        if (soap->connect_timeout)
-        { struct timeval timeout;
-          fd_set fds;
-          if (soap->connect_timeout > 0)
-          { timeout.tv_sec = soap->connect_timeout;
-            timeout.tv_usec = 0;
-          }
-          else
-          { timeout.tv_sec = -soap->connect_timeout/1000000;
-            timeout.tv_usec = -soap->connect_timeout%1000000;
-          }
-          FD_ZERO(&fds);
-          FD_SET((SOAP_SOCKET)(soap->socket), &fds);
-          for (;;)
-          { int r = select((SOAP_SOCKET)(soap->socket + 1), &fds, NULL, &fds, &timeout);
-            if (r > 0)
-             break;
-            if (!r)
-            { soap->errnum = 0;
-              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
-              soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-              return -1;
-            }
-          }
-         continue;
-        }
-      }
-      break;
-    }
-#ifndef WITH_LEAN
-    if (soap->connect_timeout)
-#ifdef WIN32
-    { u_long blocking = 0;
-      ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-    }
-#else
-      fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-    if (soap->require_server_auth)
-    { X509 *peer;
-      int err;
-      if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK)
-      { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate cannot be verified in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-      peer = SSL_get_peer_certificate(soap->ssl);
-      if (!peer)
-      { soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-      X509_NAME_get_text_by_NID(X509_get_subject_name(peer), NID_commonName, soap->msgbuf, sizeof(soap->msgbuf));
-      X509_free(peer);
-      if (soap_tag_cmp(soap->msgbuf, host))
-      { soap_set_sender_error(soap, "SSL error", "SSL certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-    }
-  }
-#endif
-  return fd;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_bind(struct soap *soap, const char *host, int port, int backlog)
-{ struct sockaddr_in sockaddr;
-/* WR[ */
-#ifdef WITH_IPV6
-  struct addrinfo *addrinfo;
-  struct addrinfo hints;
-  struct addrinfo resaddr;
-  struct sockaddr_storage addrstorage;
-  int err;
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  if (soap_valid_socket(soap->master))
-  { closesocket((SOAP_SOCKET)soap->master);
-    soap->master = SOAP_INVALID_SOCKET;
-  }
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->errmode = 1;
-  if (tcp_init(soap))
-  { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-/* WR[ */
-#ifdef WITH_IPV6
-  memset(&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
-  hints.ai_socktype = SOCK_STREAM;
-  hints.ai_flags = AI_PASSIVE;
-  soap->errmode = 2;
-  if (host)
-    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
-  else
-    err = getaddrinfo(NULL, soap_int2s(soap, port), &hints, &addrinfo);
-  if (NULL != addrinfo)
-  {
-    resaddr = *addrinfo;
-    addrstorage = *((struct sockaddr_storage *) addrinfo->ai_addr);
-    resaddr.ai_addr = (struct sockaddr *) &addrstorage;
-    freeaddrinfo(addrinfo);
-  }
-  if (err)
-  { soap_set_receiver_error(soap, gai_strerror(err), "TCP getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  soap->errmode = 0;
-  if ((soap->master = socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol)) < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#else /* WITH_IPV6 */
-/* ]WR */
-  soap->errmode = 0;
-  if ((soap->master = (int)socket(AF_INET, SOCK_STREAM, 0)) < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  if (soap->bind_flags && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#ifdef TCP_NODELAY
-  if (setsockopt((SOAP_SOCKET)soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#endif
-#endif
-/* WR[ */
-#ifdef WITH_IPV6
-  soap->errmode = 0;
-  if (bind(soap->master, resaddr.ai_addr, resaddr.ai_addrlen) || listen(soap->master, backlog))
-  { 
-    soap->errnum = soap_socket_errno;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
-    soap_closesock(soap);
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }  
-#else /* WITH_IPV6 */
-/* ]WR */
-  memset(&sockaddr, 0, sizeof(sockaddr));
-  sockaddr.sin_family = AF_INET;
-  soap->errmode = 2;
-  if (host)
-  { if (soap_gethost(soap, host, &sockaddr.sin_addr))
-    { soap_set_receiver_error(soap, tcp_error(soap), "TCP get host by name failed in soap_bind()", SOAP_TCP_ERROR);
-      return -1;
-    }
-  }
-  else
-    sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
-  sockaddr.sin_port = htons((short)port);
-  soap->errmode = 0;
-  if (bind((SOAP_SOCKET)soap->master, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) || listen((SOAP_SOCKET)soap->master, backlog))
-  { soap->errnum = soap_socket_errno;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
-    soap_closesock(soap);
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }  
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifdef WITH_OPENSSL
-  if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
-    return -1;
-#endif
-  return soap->master;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_poll(struct soap *soap)
-{ 
-#ifndef WITH_LEAN
-  struct timeval timeout;
-  fd_set sfd,rfd;
-  int r;
-  timeout.tv_sec = 0;
-  timeout.tv_usec = 0;
-  FD_ZERO(&rfd);
-  FD_ZERO(&sfd);
-  if (soap->socket >= 0)
-  { FD_SET(soap->socket, &rfd);
-    FD_SET(soap->socket, &sfd);
-    r = select(soap->socket + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  else if (soap->master >= 0)
-  { FD_SET(soap->master, &rfd);
-    r = select(soap->master + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  else
-  { FD_SET(soap->sendfd, &sfd);
-    FD_SET(soap->recvfd, &rfd);
-    r = select((soap->sendfd > soap->recvfd ? soap->sendfd : soap->recvfd) + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  if (r > 0)
-  {
-#ifdef WITH_OPENSSL
-    if (soap->ssl)
-    { if ((soap->socket >= 0) && FD_ISSET(soap->socket, &rfd))
-      { char buf = '\0';
-       if (SSL_peek(soap->ssl, &buf, 1) <= 0)
-         return SOAP_EOF;
-      }
-    }
-#endif   
-    return SOAP_OK;
-  }
-  if (r < 0 && (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno != SOAP_EINTR)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR);
-    return soap->error = SOAP_TCP_ERROR;
-  }
-  else
-    soap->errnum = soap_errno;
-  return SOAP_EOF;
-#else
-  return SOAP_OK;
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_accept(struct soap *soap, int s, struct sockaddr *a, int *n)
-{
-#if defined(SOCKLEN_T)
-  return (int)accept((SOAP_SOCKET)s, a, (SOCKLEN_T*)n);
-#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
-  return (int)accept((SOAP_SOCKET)s, a, (socklen_t*)n);
-#elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
-  return (int)accept((SOAP_SOCKET)s, a, n);
-#else
-  return (int)accept((SOAP_SOCKET)s, a, (size_t*)n);
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_accept(struct soap *soap)
-{ 
-/* WR[ */
-#ifdef WITH_IPV6
-  struct sockaddr_storage sockaddr;
-#else /* WITH_IPV6 */
-/* ]WR */
-  struct sockaddr_in sockaddr;
-/* WR[ */
-#endif
-/* ]WR */
-  int n = (int)sizeof(struct sockaddr);
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  memset(&sockaddr, 0, sizeof(sockaddr));
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->errmode = 0;
-  if (soap_valid_socket(soap->master))
-  { for (;;)
-    { 
-#ifndef WITH_LEAN
-      if (soap->accept_timeout)
-      { struct timeval timeout;
-        fd_set fd;
-        if (soap->accept_timeout > 0)
-        { timeout.tv_sec = soap->accept_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->accept_timeout/1000000;
-          timeout.tv_usec = -soap->accept_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->master, &fd);
-        for (;;)
-        { int r = select((SOAP_SOCKET)(soap->master + 1), &fd, &fd, NULL, &timeout);
-          if (r > 0)
-            break;
-          if (!r)
-          { soap->errnum = 0;
-            soap_set_receiver_error(soap, "Timeout", "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            soap_closesock(soap);
-            soap_set_sender_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-          }
-        }
-#if defined(WIN32)
-       { u_long nonblocking = 1;
-          ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &nonblocking);
-        }
-#elif defined(VXWORKS)
-        { vx_nonblocking = TRUE;
-          ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-        }
-#else
-        fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)|O_NONBLOCK);
-#endif
-      }
-      else
-#if defined(WIN32)
-      { u_long blocking = 0;
-        ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
-      }
-/* WR[ */
-#elif defined(VXWORKS)
-       {
-        vx_nonblocking = FALSE;
-        ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-       }
-/* ]WR */
-#else
-        fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-      if ((soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&sockaddr, &n)) >= 0)
-      {
-/* WR[ */
-#ifdef WITH_IPV6
-/* Use soap->host to store the numeric form of the remote host */
-        getnameinfo((struct sockaddr*)&sockaddr, n, soap->host, sizeof(soap->host), NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV); 
-        soap->ip = 0; /* info stored in soap->host */
-        soap->port = 0; /* info stored in soap->host */
-#else /* WITH_IPV6 */
-/* ]WR */
-        soap->ip = ntohl(sockaddr.sin_addr.s_addr);
-        soap->port = (int)ntohs(sockaddr.sin_port);
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-        soap->keep_alive = ((soap->imode & SOAP_IO_KEEPALIVE) != 0);
-#ifndef WITH_LEAN
-       if (soap->accept_flags & SO_LINGER)
-        { struct linger linger;
-          memset(&linger, 0, sizeof(struct linger));
-          linger.l_onoff = 1;
-          linger.l_linger = 0;
-         if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
-          { soap->errnum = soap_socket_errno;
-           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-         }
-        }
-        if ((soap->accept_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-#ifdef TCP_NODELAY
-        if (setsockopt((SOAP_SOCKET)soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-#endif
-#endif
-        if (soap->accept_timeout)
-        {
-#if defined(WIN32)
-          u_long blocking = 0;
-          ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
-          ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
-/* WR[ */
-#elif defined(VXWORKS)
-          vx_nonblocking = FALSE;
-          ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-          ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)(&vx_nonblocking));
-/* ]WR */
-#else
-          fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
-          fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
-#endif
-       }
-        return soap->socket;
-      }
-      if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
-      { soap->errnum = soap_socket_errno;
-        soap_set_receiver_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-        return -1;
-      }
-    }
-  }
-  else
-  { soap_set_receiver_error(soap, tcp_error(soap), "TCP no master socket in soap_accept()", SOAP_TCP_ERROR);
-    return -1;
-  }
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_disconnect(struct soap *soap)
-{
-#ifdef WITH_OPENSSL
-  if (soap->ssl)
-  { int r, s = 0;
-    if (soap->session)
-      SSL_SESSION_free(soap->session);
-    if (*soap->host)
-    { soap->session = SSL_get1_session(soap->ssl);
-      if (soap->session)
-      { strcpy(soap->session_host, soap->host);
-        soap->session_port = soap->port;
-      }
-    }
-    r = SSL_shutdown(soap->ssl);
-    if (r != 1)
-    { s = ERR_get_error();
-      if (s)
-      { if (soap_valid_socket(soap->socket))
-        { shutdown((SOAP_SOCKET)soap->socket, 1);
-          soap->socket = SOAP_INVALID_SOCKET;
-        }
-        r = SSL_shutdown(soap->ssl);
-      }
-    }
-    DBGLOG(TEST, if (s) SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r)));
-    SSL_free(soap->ssl);
-    soap->ssl = NULL;
-    if (s)
-      return SOAP_SSL_ERROR;
-    ERR_remove_state(0);
-  }
-#endif
-  if (soap_valid_socket(soap->socket))
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Closing socket %d\n", soap->socket));
-    shutdown((SOAP_SOCKET)soap->socket, 2);
-    closesocket((SOAP_SOCKET)soap->socket);
-    soap->socket = SOAP_INVALID_SOCKET;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_closesock(struct soap *soap)
-{ register int status = soap->error;
-#ifndef MAC_CARBON
-  if (status == SOAP_EOF || !soap->keep_alive)
-  { if ((soap->error = soap->fclose(soap)))
-      return soap->error;
-    soap->socket = SOAP_INVALID_SOCKET;
-  }
-#endif
-#ifdef WITH_ZLIB
-  if (soap->zlib_state == SOAP_ZLIB_DEFLATE)
-    deflateEnd(&soap->d_stream);
-  else if (soap->zlib_state == SOAP_ZLIB_INFLATE)
-    inflateEnd(&soap->d_stream);
-  soap->zlib_state = SOAP_ZLIB_NONE;
-#endif
-  return soap->error = status;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_hash(register const char *s)
-{ register int h = 0;
-  while (*s)
-    h += *s++ & 0x1F;
-  return h % SOAP_IDHASH;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_init_pht(struct soap *soap)
-{ register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing pointer hashtable\n"));
-  for (i = 0; i < SOAP_PTRHASH; i++)
-    soap->pht[i] = NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new()
-{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
-  if (soap)
-    soap_init(soap);
-  return soap;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new1(int mode)
-{ return soap_new2(mode, mode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new2(int imode, int omode)
-{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
-  if (soap)
-    soap_init2(soap, imode, omode);
-  return soap;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_free_pht(struct soap *soap)
-{ register struct soap_plist *pp, *next;
-  register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n"));
-  for (i = 0; i < SOAP_PTRHASH; i++)
-  { for (pp = soap->pht[i]; pp; pp = next)
-    { next = pp->next;
-      SOAP_FREE(pp);
-    }
-    soap->pht[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embed_element(struct soap *soap, const void *p, const char *tag, int type)
-{ register int i;
-  struct soap_plist *pp;
-  if (soap->version != 1)
-    soap->encoding = 1;
-  if ((i = soap_pointer_lookup(soap, p, type, &pp)))
-  { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp))
-      return 0;
-    soap_set_embedded(soap, pp);
-  }
-  return i;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embed_array(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type)
-{ register int i;
-  struct soap_plist *pp;
-  if (soap->version != 1)
-    soap->encoding = 1;
-  if ((i = soap_array_pointer_lookup(soap, p, a, n, type, &pp)))
-  { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp))
-      return 0;
-    soap_set_embedded(soap, pp);
-  }
-  return i;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp)
-{ register struct soap_plist *pp;
-  *ppp = NULL;
-  if (p)
-    for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next)
-      if (pp->ptr == p && pp->type == type)
-      { *ppp = pp;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id));
-        return pp->id;
-      }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_pointer_lookup(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
-{ struct soap_plist *pp;
-  *ppp = NULL;
-  if (!p || !a->__ptr)
-    return 0;
-  for (pp = soap->pht[soap_hash_ptr(a->__ptr)]; pp; pp = pp->next)
-    if (pp->type == type && pp->array && pp->array->__ptr == a->__ptr && pp->array->__size == n)
-    { *ppp = pp;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a->__ptr, type, pp->id));
-      return pp->id;
-    }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a->__ptr, type));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pointer_enter(struct soap *soap, const void *p, int type, struct soap_plist **ppp)
-{ register struct soap_plist *pp;
-  if (!p)
-  { *ppp = NULL;
-    return 0;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter location=%p type=%d id=%lu\n", p, type, soap->idnum+1));
-  *ppp = pp = (struct soap_plist*)SOAP_MALLOC(sizeof(struct soap_plist));
-  if (pp)
-  { register int h = soap_hash_ptr(p);
-    pp->next = soap->pht[h];
-    pp->type = type;
-    if ((soap->mode & SOAP_XML_TREE) || soap->part == SOAP_IN_HEADER)
-    { pp->mark1 = 0;
-      pp->mark2 = 0;
-    }
-    else
-    { pp->mark1 = 1;
-      pp->mark2 = 1;
-    }
-    pp->ptr = p;
-    pp->array = NULL;
-    soap->pht[h] = pp;
-    return pp->id = ++soap->idnum;
-  }
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int type, struct soap_plist **ppp)
-{ struct soap_plist *pp;
-  *ppp = NULL;
-  if (!p || !a->__ptr)
-    return 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array enter location=%p size=%d type=%d id=%lu\n", a->__ptr, a->__size, type, soap->idnum+1));
-  *ppp = pp = (struct soap_plist*)SOAP_MALLOC(sizeof(struct soap_plist));
-  if (pp)
-  { register int h = soap_hash_ptr(a->__ptr);
-    pp->next = soap->pht[h];
-    pp->type = type;
-    if ((soap->mode & SOAP_XML_TREE) || soap->part == SOAP_IN_HEADER)
-    { pp->mark1 = 0;
-      pp->mark2 = 0;
-    }
-    else
-    { pp->mark1 = 1;
-      pp->mark2 = 1;
-    }
-    pp->ptr = p;
-    pp->array = a;
-    soap->pht[h] = pp;
-    return pp->id = ++soap->idnum;
-  }
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_begin_count(struct soap *soap)
-{ soap_clr_attr(soap);
-  soap_set_local_namespaces(soap);
-  if (soap->mode & SOAP_ENC_DIME)
-    soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME;
-  else
-  { soap->mode = soap->omode;
-    if (((soap->mode & (SOAP_IO_STORE | SOAP_IO_CHUNK)) || (soap->mode & SOAP_ENC_XML)) && !soap->fprepare)
-      soap->mode &= ~SOAP_IO_LENGTH;
-    else
-      soap->mode |= SOAP_IO_LENGTH;
-  }
-  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
-  { if (!(soap->mode & SOAP_ENC_DIME))
-      soap->mode &= ~SOAP_IO_LENGTH;
-    if (soap->mode & SOAP_ENC_XML)
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  soap->count = 0;
-  soap->ns = 0;
-  soap->null = 0;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  soap->encoding = 0;
-  soap->part = SOAP_BEGIN;
-  soap->idnum = 0;
-  soap->dime_count = 0; /* count # of attachments */
-  soap->dime_size = 0; /* accumulate total size of attachments */
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=%hd count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_begin_send(struct soap *soap)
-{ soap_clr_attr(soap);
-  soap_set_local_namespaces(soap);
-  soap->mode = (soap->omode & ~SOAP_IO_LENGTH) | (soap->mode & SOAP_ENC_DIME);
-  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
-  { if (soap->mode & SOAP_ENC_XML)
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket))
-  { if (soap->count || (soap->mode & SOAP_ENC_XML))
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    soap_new_block(soap);
-  if (!(soap->mode & SOAP_IO_KEEPALIVE))
-    soap->keep_alive = 0;
-#ifdef WIN32
-#ifndef UNDER_CE
-#ifndef WITH_FASTCGI
-  if (!soap_valid_socket(soap->socket)) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */
-#ifdef __BORLANDC__
-    setmode((SOAP_SOCKET)soap->sendfd, O_BINARY);
-#else
-    _setmode((SOAP_SOCKET)soap->sendfd, _O_BINARY);
-#endif
-#endif
-#endif
-#endif
-  if (soap->mode & SOAP_IO)
-  { soap->bufidx = 0;
-    soap->buflen = 0;
-  }
-  soap->chunksize = 0;
-  soap->ns = 0;
-  soap->null = 0;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  soap->encoding = 0;
-  soap->part = SOAP_BEGIN;
-  soap->idnum = 0;
-  soap->level = 0;
-#ifdef WITH_ZLIB
-  soap->z_ratio_out = 1.0;
-  if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE)
-  {
-#ifdef WITH_GZIP
-    memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10);
-    soap->d_stream.next_out = (Byte*)soap->z_buf + 10;
-    soap->d_stream.avail_out = SOAP_BUFLEN - 10;
-    soap->z_crc = crc32(0L, NULL, 0);
-    if (deflateInit2(&soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK)
-#else
-    soap->d_stream.next_out = (Byte*)soap->z_buf;
-    soap->d_stream.avail_out = SOAP_BUFLEN;
-    if (deflateInit(&soap->d_stream, soap->z_level) != Z_OK)
-#endif
-      return soap->error = SOAP_ZLIB_ERROR;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n"));
-    soap->zlib_state = SOAP_ZLIB_DEFLATE;
-  }
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=%hd count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_embedded(struct soap *soap, const void *p, int t)
-{ struct soap_plist *pp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d\n", p, t));
-  if (soap_pointer_lookup(soap, p, t, &pp))
-  { pp->mark1 = 1;
-    pp->mark2 = 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d set to %d\n", p, t, (int)pp->mark1));
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_reference(struct soap *soap, const void *p, int t)
-{ register int i;
-  struct soap_plist *pp;
-  if (!p)
-    return 1;
-  i = soap_pointer_lookup(soap, p, t, &pp);
-  if (i)
-  { if (pp->mark1 == 0)
-    { pp->mark1 = 2;
-      pp->mark2 = 2;
-    }
-  }
-  else
-  { soap_pointer_enter(soap, p, t, &pp);
-    pp->mark1 = 0;
-    pp->mark2 = 0;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type = %d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2));
-  return pp->mark1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_reference(struct soap *soap, const void *p, const struct soap_array *a, int n, int t)
-{ register int i;
-  struct soap_plist *pp;
-  if (!p)
-    return 1;
-  i = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
-  if (i)
-  { if (pp->mark1 == 0)
-    { pp->mark1 = 2;
-      pp->mark2 = 2;
-    }
-  }
-  else if (!soap_array_pointer_enter(soap, p, a, t, &pp))
-    return 1;
-  pp->mark1 = 0;
-  pp->mark2 = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p size=%d type = %d (%d %d)\n", p, a->__ptr, n, t, (int)pp->mark1, (int)pp->mark2));
-  return pp->mark1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embedded_id(struct soap *soap, int id, const void *p, int t)
-{ struct soap_plist *pp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id));
-  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)) && soap->part != SOAP_IN_HEADER)
-  { if (id < 0)
-    { id = soap_pointer_lookup(soap, p, t, &pp);
-      if (id > 0 && pp)
-      { if (soap->mode & SOAP_IO_LENGTH)
-          pp->mark1 = 2;
-        else
-          pp->mark2 = 2;
-      }
-      return -1;
-    }
-    return id;
-  }
-  if (id < 0)
-    id = soap_pointer_lookup(soap, p, t, &pp);
-  else
-    soap_pointer_lookup(soap, p, t, &pp);
-  if (id > 0 && pp)
-  { if (soap->mode & SOAP_IO_LENGTH)
-      pp->mark1 = 1;
-    else
-      pp->mark2 = 1;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2));
-  }
-  return id;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_embedded(struct soap *soap, struct soap_plist *pp)
-{ if (!pp)
-    return 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2));
-  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)) && soap->part != SOAP_IN_HEADER)
-  { if (soap->mode & SOAP_IO_LENGTH)
-      return pp->mark1 != 0;
-    return pp->mark2 != 0;
-  }
-  if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 1;
-  return pp->mark2 == 1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_single(struct soap *soap, struct soap_plist *pp)
-{ if ((soap->mode & SOAP_XML_TREE) || soap->part == SOAP_IN_HEADER)
-    return 1;
-  if (!pp)
-    return 0;
-  if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 0;
-  return pp->mark2 == 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_multi(struct soap *soap, struct soap_plist *pp)
-{ if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 2;
-  return pp->mark2 == 2;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_embedded(struct soap *soap, struct soap_plist *pp)
-{ if (!pp)
-    return;
-  if (soap->mode & SOAP_IO_LENGTH)
-    pp->mark1 = 1;
-  else
-    pp->mark2 = 1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_attached(struct soap *soap, struct soap_plist *pp, const char *id, const char *type, const char *options, size_t size)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attached id='%s' type='%s'\n", id?id:"", type?type:""));
-  if (soap->mode & SOAP_IO_LENGTH)
-  { if (pp->mark1 != 3)
-    { pp->mark1 = 3;
-      soap->dime_count++; /* one more attachment found */
-      soap->dime_size += 12; /* increase total size (DIME fields) */
-      if (id)
-        soap->dime_size += (strlen(id)+3)&(~3);
-      if (type)
-        soap->dime_size += (strlen(type)+3)&(~3);
-      if (options)
-        soap->dime_size += 4 + (((((unsigned char)options[2] << 8 | (unsigned char)options[3]))+3)&(~3));
-      soap->dime_size += (size+3)&(~3);
-    }
-  }
-  else if (pp->mark2 != 3)
-    pp->mark2 = 3;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_init_iht(struct soap *soap)
-{ register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing ID hashtable\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-    soap->iht[i] = NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_free_iht(struct soap *soap)
-{ register int i;
-  register struct soap_ilist *ip, *p;
-  register struct soap_clist *cp, *q;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = p)
-    { for (cp = ip->clist; cp; cp = q)
-      { q = cp->next;
-        SOAP_FREE(cp);
-      }
-      p = ip->next;
-      SOAP_FREE(ip);
-    }
-    soap->iht[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static struct soap_ilist *
-soap_hlookup(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next)
-    if (!strcmp(ip->id, id))
-      return ip;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_ilist *
-SOAP_FMAC2
-soap_lookup(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  ip = soap_hlookup(soap, id);
-#ifndef WITH_LEANER
-  if (!ip && *id != '#' && !strchr(id, ':')) /* try content id "cid:" with DIME attachments */
-  { char cid[SOAP_TAGLEN];
-    strcpy(cid, "cid:");
-    strncat(cid + 4, id, sizeof(cid) - 5);
-    cid[sizeof(cid) - 1] = '\0';
-    ip = soap_hlookup(soap, cid);
-  }
-#endif
-  return ip;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_ilist *
-SOAP_FMAC2
-soap_enter(struct soap *soap, const char *id)
-{ register int h;
-  register struct soap_ilist *ip;
-  ip = (struct soap_ilist*)SOAP_MALLOC(sizeof(struct soap_ilist) + strlen(id));
-  if (ip)
-  { h = soap_hash(id);
-    strcpy(ip->id, id);
-    ip->next = soap->iht[h];
-    soap->iht[h] = ip;
-    return ip;
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_malloc(struct soap *soap, size_t n)
-{ register char *p;
-  if (!n)
-    return NULL;
-  if (!soap)
-    return SOAP_MALLOC(n);
-  n += (-(long)n) & 7;
-  if (!(p = (char*)SOAP_MALLOC(n + sizeof(void*) + sizeof(size_t))))
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  /* keep chain of alloced cells for later destruction */
-  soap->alloced = 1;
-  *(void**)(p + n) = soap->alist;
-  *(size_t*)(p + n + sizeof(void*)) = n;
-  soap->alist = p + n;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Malloc %u bytes at location %p\n", (unsigned int)n, p));
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_dealloc(struct soap *soap, void *p)
-{ if (!soap)
-    return;
-  if (p)
-  { register char **q;
-    for (q = (char**)&soap->alist; *q; q = *(char***)q)
-    { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
-      { *q = **(char***)q;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p));
-        SOAP_FREE(p);
-        return;
-      }
-    }
-    soap_delete(soap, p);
-  }
-  else
-  { register char *q;
-    while (soap->alist)
-    { q = (char*)soap->alist;
-      soap->alist = *(void**)q;
-      q -= *(size_t*)(q + sizeof(void*));
-      if (q == (char*)soap->fault)
-        soap->fault = NULL; /* this was deallocated */
-      else if (q == (char*)soap->header)
-        soap->header = NULL; /* this was deallocated */
-      SOAP_FREE(q);
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Dealloc all data done\n"));
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_delete(struct soap *soap, void *p)
-{ register struct soap_clist **cp = &soap->clist;
-  if (p)
-  { while (*cp)
-    { if (p == (*cp)->ptr)
-      { register struct soap_clist *q = *cp;
-        *cp = q->next;
-        q->fdelete(q);
-        SOAP_FREE(q);
-        return;
-      }
-      cp = &(*cp)->next;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p));
-  }
-  else
-  { while (*cp)
-    { register struct soap_clist *q = *cp;
-      *cp = q->next;
-      if (q->ptr == (void*)soap->fault)
-        soap->fault = NULL; /* this was deallocated */
-      else if (q->ptr == (void*)soap->header)
-        soap->header = NULL; /* this was deallocated */
-      q->fdelete(q);
-      SOAP_FREE(q);
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_clist *
-SOAP_FMAC2
-soap_link(struct soap *soap, void *p, int t, int n, void (*fdelete)(struct soap_clist*))
-{ register struct soap_clist *cp;
-  if ((cp = (struct soap_clist*)SOAP_MALLOC(sizeof(struct soap_clist))))
-  { cp->next = soap->clist;
-    cp->type = t;
-    cp->size = n; 
-    cp->ptr = p;
-    cp->fdelete = fdelete;
-    soap->clist = cp;
-  }
-  return cp;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_unlink(struct soap *soap, const void *p)
-{ register char **q;
-  register struct soap_clist **cp;
-  if (!soap || !p)
-    return;
-  for (q = (char**)&soap->alist; *q; q = *(char***)q)
-  { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
-    { *q = **(char***)q;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p));
-      return;
-    }
-  }
-  for (cp = &soap->clist; *cp; cp = &(*cp)->next)
-  { if (p == (*cp)->ptr)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p));
-      q = (char**)*cp;
-      *cp = (*cp)->next;
-      SOAP_FREE(q);
-      return;
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_lookup_type(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  if (*id)
-  { ip = soap_lookup(soap, id);
-    if (ip)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type));
-      return ip->type;
-    }
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k)
-{ struct soap_ilist *ip;
-  void *q;
-  if (*id == '\0')
-    return p;
-  soap->alloced = 0;
-  if (!p)
-    p = (void**)soap_malloc(soap, sizeof(void*));
-  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
-  if (!ip)
-  { ip = soap_enter(soap, id); /* new hash table entry for string id */
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' %p (%u bytes)\n", id, p, (unsigned int)n));
-    ip->type = t;
-    ip->size = n; 
-    ip->link = p;
-    ip->copy = NULL;
-    ip->clist = NULL;
-    ip->ptr = NULL;
-    ip->level = k;
-    *p = NULL;
-  }
-  else if (!soap->blist && ip->ptr)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type='%d' (%u bytes)\n", id, t, (unsigned int)n));
-    if (ip->type != t)
-    { soap->error = SOAP_HREF;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Object mismatch: id's type='%d' href's type='%d'\n", ip->type, t));
-      return NULL;
-    }
-    while (ip->level < k)
-    { q = soap_malloc(soap, sizeof(void*));  
-      *p = q;
-      p = (void**)q;
-      k--;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    *p = ip->ptr;
-  }
-  else if (ip->level > k)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving level %u pointers to href='%s'\n", ip->level, id));
-    while (ip->level > k)
-    { void *s, **r = &ip->link;
-      q = ip->link;
-      while (q)
-      { *r = soap_malloc(soap, sizeof(void*));
-        s = *(void**)q;
-        *(void**)q = *r;
-        r = *(void***)q;
-        q = s;
-      }
-      *r = NULL;
-      ip->size = n; 
-      ip->copy = NULL;
-      ip->level = ip->level - 1;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    q = ip->link;
-    ip->link = p;
-    *p = q;
-  }
-  else
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' (%u bytes)\n", id, (unsigned int)n));
-    while (ip->level < k)
-    { q = soap_malloc(soap, sizeof(void*));  
-      *p = q;
-      p = (void**)q;
-      k--;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    q = ip->link;
-    ip->link = p;
-    *p = q;
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_forward(struct soap *soap, const char *href, void *p, int t, size_t n)
-{ struct soap_ilist *ip;
-  if (!p || !*href)
-    return p;
-  ip = soap_lookup(soap, soap->href); /* lookup pointer to hash table entry for string id */
-  if (!ip)
-  { if (n >= sizeof(void*))
-    { ip = soap_enter(soap, href); /* new hash table entry for string id */
-      ip->type = t;
-      ip->size = n;
-      ip->link = NULL;
-      ip->copy = p;
-      ip->clist = NULL;
-      *(void**)p = NULL;
-      ip->ptr = NULL;
-      ip->level = 0;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first copying address %p for type %d href='%s'\n", p, t, href));
-      return p;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding problem: copying location %p too small (%u) for href='%s'\n", p, (unsigned int)n, href));
-    soap->error = SOAP_HREF;
-    return NULL;
-  }
-  else if (ip->ptr)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying value from location %p to location %p to resolve href='%s'\n", ip->ptr, p, href));
-    memcpy(p, ip->ptr, n);
-  }
-  else if (n >= sizeof(void*))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type %d href='%s' (prev in chain = %p)\n", p, t, href, ip->copy));
-    *(void**)p = ip->copy;
-    ip->copy = p;
-    return p;
-  }
-  else
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding problem: copying location %p too small (%u) for href='%s'\n", p, (unsigned int)n, href));
-    soap->error = SOAP_HREF; /* href to object too small to hold pointer */
-    return NULL;
-  }
-  return ip->ptr;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, int k)
-{ struct soap_ilist *ip;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%d level=%d\n", id, t, p, (int)n, k));
-  soap->alloced = 0;
-  if (*id == '\0')
-  { if (!p)
-      return soap_malloc(soap, n);
-    else
-      return p;
-  }
-  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s'\n", id));
-  if (!ip)
-  { ip = soap_enter(soap, id); /* new hash table entry for string id */
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%u\n", id, t, (unsigned int)n));
-    ip->type = t;
-    ip->size = n;
-    ip->link = NULL;
-    ip->copy = NULL;
-    ip->clist = NULL;
-    if (!p)
-      p = soap_malloc(soap, n);
-    ip->ptr = p;
-    ip->level = k;
-  }
-  else if (ip->ptr) /* storage address was forwarded */
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id));
-    if (p)
-    { soap->error = SOAP_MULTI_ID;
-      return NULL;
-    }
-  }
-  else 
-  { if (!p)
-      p = soap_malloc(soap, n);
-    ip->ptr = p;
-    if (!soap->blist)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolve link chain to point to %p\n", ip->ptr));
-      soap_resolve_ptr(ip);
-    }
-  }
-  return ip->ptr;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_end_send(struct soap *soap)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send\n"));
-  if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */
-  { if (soap_flush(soap))
-#ifdef WITH_ZLIB
-    { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE)
-      { soap->zlib_state = SOAP_ZLIB_NONE;
-        deflateEnd(&soap->d_stream);
-      }
-      return soap->error;
-    }
-#else
-      return soap->error;
-#endif
-#ifdef WITH_ZLIB
-    if (soap->mode & SOAP_ENC_ZLIB)
-    { int r;
-      soap->d_stream.avail_in = 0;
-      do
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n"));
-        r = deflate(&soap->d_stream, Z_FINISH);
-        if (soap->d_stream.avail_out != SOAP_BUFLEN)
-        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream.avail_out))
-          { soap->zlib_state = SOAP_ZLIB_NONE;
-            deflateEnd(&soap->d_stream);
-            return soap->error;
-         }
-          soap->d_stream.next_out = (Byte*)soap->z_buf;
-          soap->d_stream.avail_out = SOAP_BUFLEN;
-        }
-      } while (r == Z_OK);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-      soap->z_ratio_out = (float)soap->d_stream.total_out / (float)soap->d_stream.total_in;
-      soap->mode &= ~SOAP_ENC_ZLIB;
-      soap->zlib_state = SOAP_ZLIB_NONE;
-      if (deflateEnd(&soap->d_stream) != Z_OK || r != Z_STREAM_END)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-#ifdef WITH_GZIP
-      soap->z_buf[0] = soap->z_crc & 0xFF;
-      soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF;
-      soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF;
-      soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF;
-      soap->z_buf[4] = soap->d_stream.total_in & 0xFF;
-      soap->z_buf[5] = (soap->d_stream.total_in >> 8) & 0xFF;
-      soap->z_buf[6] = (soap->d_stream.total_in >> 16) & 0xFF;
-      soap->z_buf[7] = (soap->d_stream.total_in >> 24) & 0xFF;
-      if (soap_flush_raw(soap, soap->z_buf, 8))
-        return soap->error;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", soap->z_crc));
-#endif
-    }
-#endif
-#ifndef WITH_LEAN
-    if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    { char *p;
-      if (!(soap->mode & SOAP_ENC_XML))
-      { soap->mode--;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size));
-        if (soap->status >= SOAP_POST)
-          soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size);
-        else if (soap->status != SOAP_STOP)
-          soap->error = soap->fresponse(soap, soap->status, soap->blist->size);
-        if (soap->error || soap_flush(soap))
-          return soap->error;
-        soap->mode++;
-      }
-      for (p = soap_first_block(soap); p; p = soap_next_block(soap))
-      { DBGMSG(SENT, p, soap_block_size(soap));
-        if ((soap->error = soap->fsend(soap, p, soap_block_size(soap))))
-        { soap_end_block(soap);
-          return soap->error;
-        }
-      }
-      soap_end_block(soap);
-    }
-    else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    { DBGMSG(SENT, "\r\n0\r\n\r\n", 7);
-      if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7)))
-        return soap->error;
-    }
-#endif
-  }
-#ifdef WITH_OPENSSL
-  if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive)
-    shutdown((SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
-#else
-  if (soap_valid_socket(soap->socket) && !soap->keep_alive)
-    shutdown((SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send message ok\n"));
-  soap->part = SOAP_END;
-  soap->count = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_end_recv(struct soap *soap)
-{ soap->part = SOAP_END;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n"));
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { soap->mode &= ~SOAP_ENC_ZLIB;
-    memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
-    soap->bufidx = (char*)soap->d_stream.next_in - soap->z_buf;
-    soap->buflen = soap->z_buflen;
-    soap->zlib_state = SOAP_ZLIB_NONE;
-    if (inflateEnd(&soap->d_stream) != Z_OK)
-      return soap->error = SOAP_ZLIB_ERROR;
-#ifdef WITH_GZIP
-    if (soap->zlib_in == SOAP_ZLIB_GZIP)
-    { wchar c;
-      short i;
-      for (i = 0; i < 8; i++)
-      { if ((int)(c = soap_getchar(soap)) == EOF)
-          return soap->error = SOAP_EOF;
-        soap->z_buf[i] = (char)c;
-      }
-      if (soap->z_crc != ((unsigned char)soap->z_buf[0] | (unsigned long)((unsigned char)soap->z_buf[1] << 8) | (unsigned long)((unsigned char)soap->z_buf[2] << 16) | (unsigned long)((unsigned char)soap->z_buf[3] << 24)))
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: crc check failed, message corrupted? (crc32=%lu)\n", soap->z_crc));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-      if (soap->d_stream.total_out != ((unsigned char)soap->z_buf[4] | (unsigned long)((unsigned char)soap->z_buf[5] << 8) | (unsigned long)((unsigned char)soap->z_buf[6] << 16) | (unsigned long)((unsigned char)soap->z_buf[7] << 24)))
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: incorrect message length\n"));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-    }
-#endif
-  }
-#endif
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    while ((int)soap_getchar(soap) != EOF) /* advance to last chunk */
-      ;
-  if (soap->fdisconnect)
-    if ((soap->error = soap->fdisconnect(soap)))
-      return soap->error;
-  return soap_resolve(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_free(struct soap *soap)
-{ register struct soap_nlist *np;
-  register struct soap_attribute *tp;
-  register struct Namespace *ns;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n"));
-  while (soap->nlist)
-  { np = soap->nlist->next;
-    if (soap->nlist->ns)
-      SOAP_FREE(soap->nlist->ns);
-    SOAP_FREE(soap->nlist);
-    soap->nlist = np;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n"));
-  while (soap->blist)
-    soap_end_block(soap);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attributes\n"));
-  while (soap->attributes)
-  { tp = soap->attributes->next;
-    if (soap->attributes->value)
-      SOAP_FREE(soap->attributes->value);
-    SOAP_FREE(soap->attributes);
-    soap->attributes = tp;
-  }
-  soap_free_pht(soap);
-  soap_free_iht(soap);
-  ns = soap->local_namespaces;
-  if (ns)
-  { for (; ns->id; ns++)
-    { if (ns->out)
-      { SOAP_FREE(ns->out);
-       if (soap->encodingStyle == ns->out)
-          soap->encodingStyle = SOAP_STR_EOS;
-        ns->out = NULL;
-      }
-      if (soap->encodingStyle == ns->ns)
-        soap->encodingStyle = SOAP_STR_EOS;
-    }
-    SOAP_FREE(soap->local_namespaces);
-    soap->local_namespaces = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static void
-soap_init_logs(struct soap *soap)
-{ int i;
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-  { soap->logfile[i] = NULL;
-    soap->fdebug[i] = NULL;
-  }
-#ifdef SOAP_DEBUG  
-  soap_set_recv_logfile(soap, "RECV.log");
-  soap_set_sent_logfile(soap, "SENT.log");
-  soap_set_test_logfile(soap, "TEST.log");
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_open_logfile(struct soap *soap, int i)
-{ if (soap->logfile[i])
-    soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a");
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static void
-soap_close_logfile(struct soap *soap, int i)
-{ if (soap->fdebug[i])
-  { fclose(soap->fdebug[i]);
-    soap->fdebug[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_close_logfiles(struct soap *soap)
-{ int i;
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-    soap_close_logfile(soap, i);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static void
-soap_set_logfile(struct soap *soap, int i, const char *logfile)
-{ char *s = NULL;
-  soap_close_logfile(soap, i);
-  if (soap->logfile[i])
-    SOAP_FREE((void*)soap->logfile[i]);
-  if (logfile)
-    if ((s = (char*)SOAP_MALLOC(strlen(logfile) + 1)))
-      strcpy(s, logfile);
-  soap->logfile[i] = s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_recv_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_RECV, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_sent_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_SENT, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_test_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_TEST, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_copy(struct soap *soap)
-{ return soap_copy_context((struct soap*)SOAP_MALLOC(sizeof(struct soap)), soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_copy_context(struct soap *copy, struct soap *soap)
-{ if (copy)
-  { register struct soap_plugin *p;
-    memcpy(copy, soap, sizeof(struct soap));
-    copy->copy = 1;
-    copy->user = NULL;
-    copy->userid = NULL;
-    copy->passwd = NULL;
-    copy->nlist = NULL;
-    copy->blist = NULL;
-    copy->clist = NULL;
-    copy->alist = NULL;
-    copy->attributes = NULL;
-    copy->local_namespaces = NULL;
-    soap_set_local_namespaces(copy);
-    soap_init_iht(copy);
-    soap_init_pht(copy);
-    copy->header = NULL;
-    copy->fault = NULL;
-    copy->action = NULL;
-    *copy->host = '\0';
-#ifndef WITH_LEAN
-#ifdef WITH_COOKIES
-    copy->cookies = soap_copy_cookies(soap);
-#else
-    copy->cookies = NULL;
-#endif
-    soap_init_logs(copy);
-#endif
-    copy->plugins = NULL;
-    for (p = soap->plugins; p; p = p->next)
-    { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin));
-      if (!q)
-        return NULL;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id));
-      *q = *p;
-      if (p->fcopy && (soap->error = p->fcopy(soap, q, p)))
-      { SOAP_FREE(q);
-        return NULL;
-      }
-      q->next = copy->plugins;
-      copy->plugins = q;
-    }
-  }
-  else
-    soap->error = SOAP_EOM;
-  return copy;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init(struct soap *soap)
-{ soap->version = 1; /* default SOAP 1.1 */
-  soap_imode(soap, SOAP_IO_DEFAULT);
-  soap_omode(soap, SOAP_IO_DEFAULT);
-  soap->copy = 0;
-  soap->plugins = NULL;
-  soap->user = NULL;
-  soap->userid = NULL;
-  soap->passwd = NULL;
-  soap->fpost = http_post;
-  soap->fget = http_get;
-  soap->fposthdr = http_post_header;
-  soap->fresponse = http_response;
-  soap->fparse = http_parse;
-  soap->fparsehdr = http_parse_header;
-  soap->fconnect = NULL;
-  soap->fdisconnect = NULL;
-#ifndef MAC_CARBON
-  soap->faccept = tcp_accept;
-  soap->fopen = tcp_connect;
-  soap->fclose = tcp_disconnect;
-  soap->fsend = fsend;
-  soap->frecv = frecv;
-#endif
-  soap->fprepare = NULL;
-  soap->fignore = NULL;
-  soap->fplugin = fplugin;
-  soap->fdimereadopen = NULL;
-  soap->fdimewriteopen = NULL;
-  soap->fdimereadclose = NULL;
-  soap->fdimewriteclose = NULL;
-  soap->fdimeread = NULL;
-  soap->fdimewrite = NULL;
-  soap->float_format = "%.9G"; /* .9G preserves single FP precision, but is not very efficient */
-  soap->double_format = "%.18G"; /* .18G preserves double FP precision, but is not very efficient */
-  soap->dime_id_format = "cid:id%d"; /* default DIME id format */
-  soap->http_version = "1.1";
-  soap->encodingStyle = SOAP_STR_EOS;
-  soap->actor = NULL;
-  soap->max_keep_alive = SOAP_MAXKEEPALIVE;
-  soap->keep_alive = 0;
-  soap->recv_timeout = 0;
-  soap->send_timeout = 0;
-  soap->connect_timeout = 0;
-  soap->accept_timeout = 0;
-  soap->socket_flags = 0;
-  soap->connect_flags = 0;
-  soap->bind_flags = 0;
-  soap->accept_flags = 0;
-  soap->ip = 0;
-#ifndef WITH_NONAMESPACES
-  soap->namespaces = namespaces;
-#else
-  soap->namespaces = NULL;
-#endif
-  soap->local_namespaces = NULL;
-  soap->nlist = NULL;
-  soap->blist = NULL;
-  soap->clist = NULL;
-  soap->alist = NULL;
-  soap->attributes = NULL;
-  soap->header = NULL;
-  soap->fault = NULL;
-  soap->master = SOAP_INVALID_SOCKET;
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->os = NULL;
-  soap->is = NULL;
-  soap->dom = NULL;
-#ifndef UNDER_CE
-  soap->recvfd = 0;
-  soap->sendfd = 1;
-#else
-  soap->recvfd = stdin;
-  soap->sendfd = stdout;
-#endif 
-  soap->host[0] = '\0';
-  soap->port = 0;
-  soap->action = NULL;
-  soap->proxy_host = NULL;
-  soap->proxy_port = 8080;
-  soap->proxy_userid = NULL;
-  soap->proxy_passwd = NULL;
-#ifdef WITH_OPENSSL
-  soap->fsslauth = ssl_auth_init;
-  soap->fsslverify = ssl_verify_callback;
-  soap->bio = NULL;
-  soap->ssl = NULL;
-  soap->ctx = NULL;
-  soap->require_server_auth = 0;
-  soap->require_client_auth = 0;
-  soap->rsa = 0;
-  soap->keyfile = NULL;
-  soap->password = NULL;
-  soap->dhfile = NULL;
-  soap->cafile = NULL;
-  soap->capath = NULL;
-  soap->randfile = NULL;
-  soap->session = NULL;
-#endif
-#ifdef WITH_ZLIB
-  soap->zlib_state = SOAP_ZLIB_NONE;
-  soap->zlib_in = SOAP_ZLIB_NONE;
-  soap->zlib_out = SOAP_ZLIB_NONE;
-  soap->d_stream.zalloc = NULL;
-  soap->d_stream.zfree = NULL;
-  soap->d_stream.opaque = NULL;
-  soap->z_level = 6;
-#endif
-#ifndef WITH_LEAN
-  soap->cookies = NULL;
-  soap->cookie_domain = NULL;
-  soap->cookie_path = NULL;
-  soap->cookie_max = 32;
-  soap_init_logs(soap);
-#endif
-/* WR[ */
-#ifdef WMW_RPM_IO
-  soap->rpmreqid = NULL;
-#endif /* WMW_RPM_IO */
-/* ]WR */
-  soap_init_iht(soap);
-  soap_init_pht(soap);
-  soap_begin(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init1(struct soap *soap, int mode)
-{ soap_init2(soap, mode, mode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init2(struct soap *soap, int imode, int omode)
-{ soap_init(soap);
-  soap_imode(soap, imode);
-  soap_omode(soap, omode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_begin(struct soap *soap)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing\n"));
-  if (!soap->keep_alive)
-  { soap->buflen = 0;
-    soap->bufidx = 0;
-  }
-  soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0);
-  soap->null = 0;
-  soap->position = 0;
-  soap->encoding = 0;
-  soap->mustUnderstand = 0;
-  soap->mode = 0;
-  soap->ns = 0;
-  soap->part = SOAP_BEGIN;
-  soap->alloced = 0;
-  soap->count = 0;
-  soap->length = 0;
-  soap->cdata = 0;
-  soap->error = SOAP_OK;
-  soap->peeked = 0;
-  soap->ahead = 0;
-  soap->idnum = 0;
-  soap->level = 0;
-  soap->endpoint[0] = '\0';
-  soap->dime_chunksize = 0;
-  soap->dime_buflen = 0;
-  soap->dot_net_bug = 0;
-  soap_free(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_end(struct soap *soap)
-{ register struct soap_clist *cp;
-  soap_free(soap);
-  soap_dealloc(soap, NULL);
-  while (soap->clist)
-  { cp = soap->clist->next;
-    SOAP_FREE(soap->clist);
-    soap->clist = cp;
-  }
-  soap_closesock(soap);
-#ifndef WITH_LEAN
-  soap_close_logfiles(soap);
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_namespaces(struct soap *soap, struct Namespace *p)
-{ struct Namespace *ns = soap->local_namespaces;
-  struct soap_nlist *np, *nq, *nr;
-  unsigned int level = soap->level;
-  soap->namespaces = p;
-  soap->local_namespaces = NULL;
-  soap_set_local_namespaces(soap);
-  /* reverse the list */
-  np = soap->nlist;
-  soap->nlist = NULL;
-  if (np)
-  { nq = np->next;
-    np->next = NULL;
-    while (nq)
-    { nr = nq->next;
-      nq->next = np;
-      np = nq;
-      nq = nr;
-    }
-  }
-  while (np)
-  { soap->level = np->level; /* preserve element nesting level */
-    if (np->ns)
-    { if (soap_push_namespace(soap, np->id, np->ns))
-        return soap->error;
-    }
-    else if (np->index >= 0 && ns)
-    { if (ns[np->index].out)
-      { if (soap_push_namespace(soap, np->id, ns[np->index].out))
-          return soap->error;
-      }
-      else if (soap_push_namespace(soap, np->id, ns[np->index].ns))
-        return soap->error;
-    }
-    if (np->ns)
-      SOAP_FREE(np->ns);
-    nq = np;
-    np = np->next;
-    SOAP_FREE(nq);
-  }
-  if (ns)
-  { int i;
-    for (i = 0; ns[i].id; i++)
-    { if (ns[i].out)
-      { SOAP_FREE(ns[i].out);
-        ns[i].out = NULL;
-      }
-    }
-    SOAP_FREE(ns);
-  }
-  soap->level = level; /* restore level */
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_set_local_namespaces(struct soap *soap)
-{ if (soap->namespaces && !soap->local_namespaces)
-  { register struct Namespace *ns;
-    register size_t n = 1;
-    for (ns = soap->namespaces; ns->id; ns++)
-      n++;
-    if (n > 3)
-    { n *= sizeof(struct Namespace);
-      ns = (struct Namespace*)SOAP_MALLOC(n);
-      if (ns)
-      { memcpy(ns, soap->namespaces, n);
-        ns[0].id = "SOAP-ENV";
-        ns[1].id = "SOAP-ENC";
-        ns[2].id = "xsi";
-        if (ns[0].ns)
-        { if (!strcmp(ns[0].ns, soap_env1))
-            soap->version = 1;
-          else
-            soap->version = 2;
-        }
-        soap->local_namespaces = ns;
-      }
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element(struct soap *soap, const char *tag, int id, const char *type)
-{ struct Namespace *ns = soap->local_namespaces;
-  register const char *s;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' id='%d' type='%s'\n", tag, id, type?type:""));
-/**/
-#ifdef WITH_DOM
-  if (soap->mode & SOAP_XML_DOM)
-  { register struct soap_dom_element *p, *e = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
-    e->next = NULL;
-    e->prnt = soap->dom;
-    e->nstr = NULL;
-    e->name = soap_strdup(soap, tag); /* check EOM? */
-    e->data = NULL;
-    e->type = 0;
-    e->node = NULL;
-    e->elts = NULL;
-    e->atts = NULL;
-    if (soap->dom)
-    { p = soap->dom->elts;
-      if (p)
-      { while (p->next)
-          p = p->next;
-        p->next = e;
-      }
-      else
-        soap->dom->elts = e;
-    }
-    soap->dom = e;
-  }
-  else
-#endif
-{
-  soap->level++;
-  if (!soap->ns && !(soap->mode & SOAP_XML_CANONICAL))
-    if (soap_send(soap, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"))
-      return soap->error;
-  if (soap_send_raw(soap, "<", 1))
-    return soap->error;
-  s = tag;
-  if (ns && soap->part != SOAP_IN_ENVELOPE && (soap->part == SOAP_IN_HEADER || !soap->encodingStyle))
-  { register const char *t = strchr(s, ':');
-    if (t)
-    { s = t + 1;
-      for (ns++; ns->id; ns++)
-      { if ((ns->out || ns->ns) && !strncmp(ns->id, tag, t - tag) && !ns->id[t - tag])
-        { if (soap_send(soap, s) || soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns))
-            return soap->error;
-         s = NULL;
-          break;
-        }
-      }
-    }
-  }
-  if (s)
-    if (soap_send(soap, tag))
-      return soap->error;
-}
-/**/
-  if (!soap->ns)
-  { for (ns = soap->local_namespaces; ns && ns->id; ns++)
-    { if (*ns->id && (ns->out || ns->ns))
-      { sprintf(soap->tmpbuf, "xmlns:%s", ns->id);
-        if (soap_attribute(soap, soap->tmpbuf, ns->out ? ns->out : ns->ns))
-          return soap->error;
-      }
-    }   
-    soap->ns = 1;
-  }
-  if (id > 0)
-  { sprintf(soap->tmpbuf, "_%d", id);
-    if (soap_attribute(soap, "id", soap->tmpbuf))
-      return soap->error;
-  }
-  if (type && *type)
-  { if (soap_attribute(soap, "xsi:type", type))
-      return soap->error;
-  }
-  if (soap->null && soap->position > 0)
-  { int i;
-    sprintf(soap->tmpbuf, "[%d", soap->positions[0]);
-    for (i = 1; i < soap->position; i++)
-      sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ",%d", soap->positions[i]);
-    strcat(soap->tmpbuf, "]");
-    if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf))
-      return soap->error;
-  }
-  if (soap->mustUnderstand)
-  { if (soap->actor && *soap->actor)
-    { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor))
-        return soap->error;
-    }
-    if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1"))
-      return soap->error;
-    soap->mustUnderstand = 0;
-  }
-  if (soap->encoding)
-  { if (soap->encodingStyle)
-    { if (!*soap->encodingStyle && soap->local_namespaces)
-      { if (soap->local_namespaces[1].out)
-          soap->encodingStyle = soap->local_namespaces[1].out;
-        else
-          soap->encodingStyle = soap->local_namespaces[1].ns;
-      }
-      if (soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle))
-        return soap->error;
-    }
-    soap->encoding = 0;
-  }
-  soap->null = 0;
-  soap->position = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type)
-{ if (*tag == '-')
-    return SOAP_OK;
-  if (soap_element(soap, tag, id, type))
-    return soap->error;
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRRCHR
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_strrchr(const char *s, int t)
-{ register char *r = NULL;
-  while (*s)
-    if (*s++ == t)
-      r = (char*)s - 1;
-  return r;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRTOL
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_strtol(const char *s, char **t, int b)
-{ register long n = 0;
-  register int c;
-  while (*s > 0 && *s <= 32)
-    s++;
-  if (b == 10)
-  { short neg = 0;
-    if (*s == '-')
-    { s++;
-      neg = 1;
-    }
-    else if (*s == '+')
-      s++;
-    while ((c = *s) && c >= '0' && c <= '9')
-    { if (n > 214748364)
-        break;
-      n *= 10;
-      n += c - '0';
-      s++;
-    }
-    if (neg)
-      n = -n;
-  }
-  else /* b == 16 and value is always positive */
-  { while ((c = *s))
-    { if (c >= '0' && c <= '9')
-        c -= '0';
-      else if (c >= 'A' && c <= 'F')
-        c -= 'A' - 10;
-      else if (c >= 'a' && c <= 'f')
-        c -= 'a' - 10;
-      if (n > 0x07FFFFFF)
-        break;
-      n <<= 4;
-      n += c;
-      s++;
-    }
-  }
-  if (t)
-    *t = (char*)s;
-  return n;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRTOUL
-SOAP_FMAC1
-unsigned long
-SOAP_FMAC2
-soap_strtoul(const char *s, char **t, int b)
-{ unsigned long n = 0;
-  register int c;
-  while (*s > 0 && *s <= 32)
-    s++;
-  if (b == 10)
-  { if (*s == '+')
-      s++;
-    while ((c = *s) && c >= '0' && c <= '9')
-    { if (n > 429496729)
-        break;
-      n *= 10;
-      n += c - '0';
-      s++;
-    }
-  }
-  else /* b == 16 */
-  { while ((c = *s))
-    { if (c >= '0' && c <= '9')
-        c -= '0';
-      else if (c >= 'A' && c <= 'F')
-        c -= 'A' - 10;
-      else if (c >= 'a' && c <= 'f')
-        c -= 'a' - 10;
-      if (n > 0x0FFFFFFF)
-        break;
-      n <<= 4;
-      n += c;
-      s++;
-    }
-  }
-  if (t)
-    *t = (char*)s;
-  return n;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset)
-{ if (soap_element(soap, tag, id, "SOAP-ENC:Array"))
-    return soap->error;
-  if (soap->version == 2)
-  { const char *s;
-    s = soap_strrchr(type, '[');
-    if ((size_t)(s - type) < sizeof(soap->tmpbuf))
-    { strncpy(soap->tmpbuf, type, s - type);
-      soap->tmpbuf[s - type] = '\0';
-      if (type && *type && (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)))
-        return soap->error;
-      if (s && (soap_attribute(soap, "SOAP-ENC:arraySize", s + 1)))
-        return soap->error;
-    }
-  }
-  else
-  { if (offset && (soap_attribute(soap, "SOAP-ENC:offset", offset)))
-      return soap->error;
-    if (type && *type && (soap_attribute(soap, "SOAP-ENC:arrayType", type)))
-      return soap->error;
-  }
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_start_end_out(struct soap *soap, const char *tag)
-{ register struct soap_attribute *tp;
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { for (tp = soap->attributes; tp; tp = tp->next)
-    { if (tp->visible)
-      { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
-       a->next = soap->dom->atts;
-        a->nstr = NULL;
-        a->name = soap_strdup(soap, tp->name); /* check EOM */
-        a->data = soap_strdup(soap, tp->value); /* check EOM */
-        a->wide = NULL;
-       soap->dom->atts = a;
-        tp->visible = 0;
-      }
-    }
-    return SOAP_OK;
-  }
-#endif
-/**/
-  for (tp = soap->attributes; tp; tp = tp->next)
-  { if (tp->visible)
-    { if (soap_send_raw(soap, " ", 1)
-       || soap_send(soap, tp->name))
-        return soap->error;
-      if (tp->visible == 2 && tp->value)
-        if (soap_send_raw(soap, "=\"", 2)
-        || soap_string_out(soap, tp->value, 1)
-        || soap_send_raw(soap, "\"", 1))
-          return soap->error;
-      tp->visible = 0;
-    }
-  }
-  if (tag)
-  { soap->level--;
-#ifndef WITH_LEAN
-    if (soap->mode & SOAP_XML_CANONICAL)
-    { if (soap_send_raw(soap, ">", 1)
-       || soap_element_end_out(soap, tag))
-        return soap->error;
-      return SOAP_OK;
-    }
-#endif
-    return soap_send_raw(soap, "/>", 2);
-  }
-  return soap_send_raw(soap, ">", 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_end_out(struct soap *soap, const char *tag)
-{ if (*tag == '-')
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag));
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { if (soap->dom->prnt)
-      soap->dom = soap->dom->prnt;
-    return SOAP_OK;
-  }
-#endif
-/**/
-  if (soap->part != SOAP_IN_ENVELOPE && (soap->part == SOAP_IN_HEADER || !soap->encodingStyle) && soap->local_namespaces)
-  { const char *s = strchr(tag, ':');
-    if (s && strncmp(tag, "SOAP-ENV", s - tag))
-      tag = s + 1;
-  }
-  soap->level--;
-  if (soap_send_raw(soap, "</", 2)
-   || soap_send(soap, tag)
-   || soap_send_raw(soap, ">", 1))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_ref(struct soap *soap, const char *tag, int id, int href)
-{ int n = 0;
-  if (soap_element(soap, tag, id, NULL))
-    return soap->error;
-  if (soap->version == 2)
-    n = 1;
-  sprintf(soap->tmpbuf, "#_%d", href);
-  if (soap_attribute(soap, "href" + n, soap->tmpbuf + n)
-   || soap_element_start_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_href(struct soap *soap, const char *tag, int id, const char *href)
-{ if (soap_element(soap, tag, id, NULL)
-   || soap_attribute(soap, "href", href)
-   || soap_element_start_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_null(struct soap *soap, const char *tag, int id, const char *type)
-{ struct soap_attribute *tp;
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (tp->visible)
-      break;
-  if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL))
-  { if (soap_element(soap, tag, id, type))
-      return soap->error;
-    if (soap->part != SOAP_IN_HEADER && soap->encodingStyle)
-      if (soap_attribute(soap, "xsi:nil", "true"))
-        return soap->error;
-    return soap_element_start_end_out(soap, tag);
-  }
-  soap->null = 1;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_result(struct soap *soap, const char *tag)
-{ if (soap->version == 2 && soap->encodingStyle)
-    if (soap_element(soap, "SOAP-RPC:result", 0, NULL)
-     || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc)
-     || soap_element_start_end_out(soap, NULL)
-     || soap_string_out(soap, tag, 0)
-     || soap_element_end_out(soap, "SOAP-RPC:result"))
-      return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_attribute(struct soap *soap, const char *name, const char *value)
-{ 
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
-    a->next = soap->dom->atts;
-    a->nstr = NULL;
-    a->name = soap_strdup(soap, name); /* check EOM */
-    a->data = soap_strdup(soap, value); /* check EOM */
-    a->wide = NULL;
-    soap->dom->atts = a;
-    return SOAP_OK;
-  }
-#endif
-/**/
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { if (soap_set_attr(soap, name, value))
-      return soap->error;
-  }
-  else
-#endif
-  { if (soap_send_raw(soap, " ", 1)
-     || soap_send(soap, name))
-      return soap->error;
-    if (value)
-      if (soap_send_raw(soap, "=\"", 2)
-       || soap_string_out(soap, value, 1)
-       || soap_send_raw(soap, "\"", 1))
-        return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_begin_in(struct soap *soap, const char *tag)
-{ if (tag && *tag == '-')
-    return SOAP_OK;
-  if (!soap_peek_element(soap))
-  { if (soap->other)
-      return soap->error = SOAP_TAG_MISMATCH;
-    if (!(soap->error = soap_match_tag(soap, soap->tag, tag)))
-    { if (tag && !soap->encodingStyle)
-      { const char *s = strchr(tag, ':');
-        if (s)
-          soap_push_default_namespace(soap, tag, s - tag);
-      }
-      soap->peeked = 0;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:"" ));
-      if (soap->body)
-        soap->level++;
-    }
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_end_in(struct soap *soap, const char *tag)  
-{ register wchar c;
-  register char *s;
-  register const char *t;
-  if (tag && *tag == '-')
-    return SOAP_OK;
-  soap->level--;
-  soap_pop_namespace(soap);
-  if (soap->peeked)
-  { if (*soap->tag == '\0')
-    { soap->peeked = 0;
-      soap->error = SOAP_OK;
-    }
-    else
-      return soap->error = SOAP_SYNTAX_ERROR;
-  }
-  else
-  { while (((c = soap_get(soap)) != TT))
-    { if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      if (c == LT)
-        return soap->error = SOAP_SYNTAX_ERROR;
-    }
-  }
-  s = soap->tag;
-  do c = soap_get(soap);
-  while (soap_blank(c));
-  do
-  { *s++ = (char)c;
-    c = soap_get(soap);
-  } while (soap_notblank(c));
-  *s = '\0';
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  while (soap_blank(c))
-    c = soap_get(soap);
-  if (c != GT)
-    return soap->error = SOAP_SYNTAX_ERROR;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:""));
-  if (!tag)
-    return SOAP_OK;
-  if ((s = strchr(soap->tag, ':')))
-    s++;
-  else
-    s = soap->tag;
-  if ((t = strchr(tag, ':')))
-    t++;
-  else
-    t = tag;
-  if (!SOAP_STRCMP(s, t))
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element does not match\n"));
-  return soap->error = SOAP_SYNTAX_ERROR;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_attribute *
-SOAP_FMAC2
-soap_attr(struct soap *soap, const char *name)
-{ register struct soap_attribute *tp;
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (!soap_match_tag(soap, tp->name, name))
-      return tp;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char *
-SOAP_FMAC2
-soap_attr_value(struct soap *soap, const char *name)
-{ register struct soap_attribute *tp = soap_attr(soap, name);
-  if (tp && tp->visible == 2)
-    return tp->value;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_attr(struct soap *soap, const char *name, const char *value)
-{ register struct soap_attribute *tp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value?value:""));
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (!strcmp(tp->name, name))
-      break;
-  if (!tp)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name));
-    if (!(tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(name))))
-      return soap->error = SOAP_EOM;
-    tp->ns = NULL;
-#ifndef WITH_LEAN
-    if (soap->mode & SOAP_XML_CANONICAL)
-    { struct soap_attribute **tpp = &soap->attributes;
-      const char *s = strchr(name, ':');
-      if (!strncmp(name, "xmlns", 5))
-      { for (; *tpp; tpp = &(*tpp)->next)
-          if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0)
-            break;
-      }
-      else if (!s)
-      { for (; *tpp; tpp = &(*tpp)->next)
-          if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0))
-            break;
-      }
-      else
-      { int k;
-        for (; *tpp; tpp = &(*tpp)->next)
-       { if (!strncmp((*tpp)->name, "xmlns:", 6) && !strncmp((*tpp)->name + 6, name, s - name) && !(*tpp)->name[6 + s - name])
-         { if (!tp->ns)
-            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Canonicalization: prefix %s=%p(%s)\n", name, (*tpp)->ns, (*tpp)->ns));
-             tp->ns = (*tpp)->ns;
-           }
-         }
-          else if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0)))
-            break;
-        }
-      }
-      tp->next = *tpp;
-      *tpp = tp;
-    }
-    else
-#endif
-    { tp->next = soap->attributes;
-      soap->attributes = tp;
-    }
-    strcpy(tp->name, name);
-    tp->value = NULL;
-  }
-  else if (value && tp->value && tp->size <= strlen(value))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value));
-    SOAP_FREE(tp->value);
-    tp->value = NULL;
-    tp->ns = NULL;
-  }
-  if (value)
-  { if (!tp->value)
-    { tp->size = strlen(value) + 1;
-      if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
-        return soap->error = SOAP_EOM;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value of %s (%p)\n", tp->name, tp->value));
-    }
-    strcpy(tp->value, value);
-    if (!strncmp(tp->name, "xmlns:", 6))
-      tp->ns = tp->value;
-    tp->visible = 2;
-  }
-  else
-    tp->visible = 1;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_attr(struct soap *soap)
-{ register struct soap_attribute *tp;
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { while (soap->attributes)
-    { tp = soap->attributes->next;
-      SOAP_FREE(soap->attributes->value);
-      SOAP_FREE(soap->attributes);
-      soap->attributes = tp;
-    }
-  }
-  else
-#endif
-  { for (tp = soap->attributes; tp; tp = tp->next)
-      tp->visible = 0;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int
-soap_getattrval(struct soap *soap, char *s, size_t n, wchar d)
-{ size_t i;
-  wchar c;
-  for (i = 0; i < n; i++)
-  { c = soap_getutf8(soap);
-    switch (c)
-    {
-    case TT:
-      *s++ = '<';
-      soap_unget(soap, '/');
-      break;
-    case LT:
-      *s++ = '<';
-      break;
-    case GT:
-      if (d == ' ')
-      { soap_unget(soap, c);
-        *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '>';
-      break;
-    case QT:
-      if (c == d)
-      { *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '"';
-      break;
-    case AP:
-      if (c == d)
-      { *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '\'';
-      break;
-    case '\t':
-    case '\n':
-    case '\r':
-    case ' ':
-    case '/':
-      if (d == ' ')
-      { soap_unget(soap, c);
-        *s = '\0';
-        return SOAP_OK;
-      }
-    default:
-      if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      *s++ = (char)c;
-    }
-  }
-  return soap->error = SOAP_EOM;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_peek_element(struct soap *soap)
-{ struct soap_attribute *tp;
-  const char *t;
-  register char *s;
-  register wchar c;
-  register int i;
-  if (soap->peeked)
-  { if (*soap->tag == '\0')
-      return soap->error = SOAP_NO_TAG;
-    return SOAP_OK;
-  }
-  soap->peeked = 1;
-  for (;;)
-  { while (((c = soap_get(soap)) != LT) && c != TT)
-    { if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-    }
-    if (c == TT)
-    { *soap->tag = '\0';
-      return soap->error = SOAP_NO_TAG; /* ending tag found */
-    }
-    s = soap->tag;
-    do c = soap_get(soap);
-    while (soap_blank(c));
-    i = sizeof(soap->tag);
-    while (c != '/' && soap_notblank(c))
-    { if (--i > 0)
-        *s++ = (char)c;
-      c = soap_get(soap);
-    }
-    while (soap_blank(c))
-      c = soap_get(soap);
-    *s = '\0';
-    if (*soap->tag != '?')
-      break;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI <%s?>\n", soap->tag));
-    while ((int)c != EOF && c != GT && c != '?')
-    { s = soap->tmpbuf;
-      i = sizeof(soap->tmpbuf) - 2;
-      while (c != '=' && c != GT && c != '?' && soap_notblank(c))
-      { if (--i > 0)
-          *s++ = (char)c;
-        c = soap_get(soap);
-      }
-      while (soap_blank(c))
-        c = soap_get(soap);
-      if (c == '=')
-      { *s++ = '=';
-       do c = soap_get(soap);
-        while (soap_blank(c));
-        if (c != QT && c != AP)
-        { soap_unget(soap, c);
-          c = ' '; /* blank delimiter */
-        }
-        if (soap_getattrval(soap, s, i, c) == SOAP_EOM)
-         while (soap_getattrval(soap, soap->tmpbuf, sizeof(soap->tmpbuf), c) == SOAP_EOM)
-           ;
-        else if (!strcmp(soap->tag, "?xml") && (!soap_tag_cmp(soap->tmpbuf, "encoding=iso-8859-1") || !soap_tag_cmp(soap->tmpbuf, "encoding=latin1")))
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML latin1 encoding\n"));
-          soap->mode |= SOAP_C_LATIN;
-        }
-      }
-      do c = soap_get(soap);
-      while (soap_blank(c));
-    }
-  }
-  soap->id[0] = '\0';
-  soap->href[0] = '\0';
-  soap->type[0] = '\0';
-  soap->arrayType[0] = '\0';
-  soap->arraySize[0] = '\0';
-  soap->arrayOffset[0] = '\0';
-  soap->other = 0;
-  soap->root = -1;
-  soap->position = 0;
-  soap->null = 0;
-  soap->mustUnderstand = 0;
-  soap_clr_attr(soap);
-  soap_pop_namespace(soap);
-  while ((int)c != EOF && c != GT && c != '/')
-  { s = soap->tmpbuf;
-    i = sizeof(soap->tmpbuf);
-    while (c != '=' && c != '/' && soap_notblank(c))
-    { if (--i > 0)
-        *s++ = (char)c;
-      c = soap_get(soap);
-    }
-    *s = '\0';
-    if (i == sizeof(soap->tmpbuf))
-      return soap->error = SOAP_SYNTAX_ERROR;
-    if (!strncmp(soap->tmpbuf, "xmlns:", 6))
-    { soap->tmpbuf[5] = '\0';
-      t = soap->tmpbuf + 6;
-    }
-    else if (!strcmp(soap->tmpbuf, "xmlns"))
-      t = SOAP_STR_EOS;
-    else
-      t = NULL;
-    tp = soap_attr(soap, soap->tmpbuf);
-    if (!tp)
-    { tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(soap->tmpbuf));
-      if (!tp)
-        return soap->error = SOAP_EOM;
-      strcpy(tp->name, soap->tmpbuf);
-      tp->value = NULL;
-      tp->size = 0;
-      tp->next = soap->attributes;
-      soap->attributes = tp;
-    }
-    while (soap_blank(c))
-      c = soap_get(soap);
-    if (c == '=')
-    { do c = soap_get(soap);
-      while (soap_blank(c));
-      if (c != QT && c != AP)
-      { soap_unget(soap, c);
-        c = ' '; /* blank delimiter */
-      }
-      if (soap_getattrval(soap, tp->value, tp->size, c))
-      { size_t size;
-        if (soap->error == SOAP_EOM)
-          soap->error = SOAP_OK;
-        else
-          return soap->error;
-        if (soap_new_block(soap))
-          return soap->error;
-        for (;;)
-        { if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
-            return soap->error;
-          if (soap_getattrval(soap, s, SOAP_BLKLEN, c))
-          { if (soap->error == SOAP_EOM)
-              soap->error = SOAP_OK;
-            else
-              return soap->error;
-          }
-          else
-            break;
-        }
-        size = tp->size + soap->blist->size;
-        if (!(s = (char*)SOAP_MALLOC(size)))
-          return soap->error = SOAP_EOM;
-        soap_save_block(soap, s + tp->size);
-        if (tp->value)
-        { memcpy(s, tp->value, tp->size);
-          SOAP_FREE(tp->value);
-        }
-        tp->value = s;
-        tp->size = size;
-      }
-      do c = soap_get(soap);
-      while (soap_blank(c));
-      tp->visible = 2; /* seen this attribute w/ value */
-    }
-    else
-      tp->visible = 1; /* seen this attribute w/o value */
-    if (t && tp->value)
-    { if (soap_push_namespace(soap, t, tp->value))
-        return soap->error;
-      tp->visible = 0;
-    }
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  for (tp = soap->attributes; tp; tp = tp->next)
-  { if (tp->visible && tp->value)
-    { if (!strcmp(tp->name, "id"))
-      { if (soap->part != SOAP_IN_HEADER || !soap->dot_net_bug)
-        { *soap->id = '#';
-          strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2);
-        }
-      }
-      else if (!strcmp(tp->name, "href"))
-        strncpy(soap->href, tp->value, sizeof(soap->href) - 1);
-      else if (soap->version == 2 && !strcmp(tp->name, "ref"))
-      { *soap->href = '#';
-        strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2);
-      }
-      else if (!soap_match_tag(soap, tp->name, "xsi:type"))
-        strncpy(soap->type, tp->value, sizeof(soap->type) - 1);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType"))
-      { s = soap_strrchr(tp->value, '[');
-        if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType))
-        { strncpy(soap->arrayType, tp->value, s - tp->value);
-          soap->arrayType[s - tp->value] = '\0';
-          strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1);
-        }
-        else
-          strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
-      }
-      else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:itemType"))
-        strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
-      else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize"))
-        strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:offset"))
-        strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset));
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:position"))
-        soap->position = soap_getposition(tp->value, soap->positions);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:root"))
-        soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true")));
-      else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")
-            || !soap_match_tag(soap, tp->name, "SOAP-ENV:role"))
-      { if ((!soap->actor || strcmp(soap->actor, tp->value))
-         && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")
-         && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next"))
-          soap->other = 1;
-      }
-      else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
-            && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
-        soap->mustUnderstand = 1;
-      else if ((!soap_match_tag(soap, tp->name, "xsi:null")
-             || !soap_match_tag(soap, tp->name, "xsi:nil"))
-            && (!strcmp(tp->value, "1")
-             || !strcmp(tp->value, "true")))
-        soap->null = 1;
-    }
-  }
-  if (!(soap->body = (c != '/')))
-    do c = soap_get(soap);
-    while (soap_blank(c));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_retry(struct soap *soap)
-{ soap->peeked = 1;
-  soap->error = SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_revert(struct soap *soap)
-{ soap->peeked = 1;
-  if (soap->body)
-    soap->level--;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting last element (level=%u)\n", soap->level));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_string_out(struct soap *soap, const char *s, int flag)
-{ register const char *t;
-  register wchar c;
-  register wchar mask = 0x80000000;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->data = soap_strdup(soap, s); /* check EOM */
-    return SOAP_OK;
-  }
-#endif
-  if (soap->mode & SOAP_C_UTFSTRING)
-    mask = 0;
-  t = s;
-  while ((c = *t++))
-  { switch (c)
-    { 
-    case 9:
-      if (flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#x9;", 5))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case 10:
-      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xA;", 5))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case 13:
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xD;", 5))
-        return soap->error;
-      s = t;
-      break;
-    case '&':
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&amp;", 5))
-        return soap->error;
-      s = t;
-      break;
-    case '<':
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&lt;", 4))
-        return soap->error;
-      s = t;
-      break;
-    case '>':
-      if (!flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&gt;", 4))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case '"':
-      if (flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&quot;", 6))
-         return soap->error;
-        s = t;
-      }
-      break;
-    default:
-      if (c & mask)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c))
-          return soap->error;
-        s = t;
-      }
-    }
-  }
-  return soap_send_raw(soap, s, t - s - 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_string_in(struct soap *soap, int flag)
-{ register char *s;
-  char *t = NULL;
-  register int i, n = 0;
-  register wchar c;
-  char buf[8];
-  if (soap_new_block(soap))
-    return NULL;
-#ifdef WITH_CDATA
-  if (!flag)
-  { register int state = 0; /* 0 = normal, 1 = CDATA, 2 = comment, 3 = PI */
-    for (;;)
-    { if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
-        return NULL;
-      for (i = 0; i < SOAP_BLKLEN; i++)
-      { if (t)
-        { *s++ = *t++;
-          if (!*t)
-            t = NULL;
-          continue;
-        }
-        c = soap_getchar(soap);
-       if ((int)c == EOF)
-          goto end;
-        if (c >= 0x80 && !(soap->mode & SOAP_C_LATIN))
-        { soap_unget(soap, c);
-         c = soap_getutf8(soap);
-         if (soap->mode & SOAP_C_UTFSTRING)
-          { if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < AP)
-            { c &= 0x7FFFFFFF;
-              t = buf;
-              if (c < 0x0800)
-                *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-              else
-              { if (c < 0x010000)
-                  *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-                else
-                { if (c < 0x200000)
-                    *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-                  else
-                  { if (c < 0x04000000)
-                      *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-                    else
-                    { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-                      *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-                    }
-                    *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-                  }     
-                  *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-                }
-                *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-              }
-              *t++ = (char)(0x80 | (c & 0x3F));
-              *t = '\0';
-              t = buf;
-              *s++ = *t++;
-              continue;
-           }
-          }
-        }
-       switch (state)
-        { case 1:
-            if (c == ']')
-             state = 4;
-           *s++ = c;
-           continue;
-         case 2:
-           if (c == '-')
-              state = 6;
-           *s++ = c;
-           continue;
-         case 3:
-           if (c == '?')
-             state = 8;
-           *s++ = c;
-           continue;
-          /* CDATA */
-         case 4:
-           if (c == ']')
-              state = 5;
-           else
-             state = 1;
-           *s++ = c;
-           continue;
-         case 5:
-           if (c == '>')
-             state = 0;
-           else
-             state = 1;
-           *s++ = c;
-           continue;
-          /* comment */
-          case 6:
-            if (c == '-')
-             state = 7;
-           else
-             state = 2;
-           *s++ = c;
-           continue;
-          case 7:
-            if (c == '>')
-             state = 0;
-           else
-             state = 2;
-           *s++ = c;
-           continue;
-          /* PI */
-         case 8:
-            if (c == '>')
-             state = 0;
-           else
-             state = 3;
-           *s++ = c;
-           continue;
-        }
-        switch (c)
-        {
-        case '/':
-          if (n > 0)
-          { c = soap_get1(soap);
-            if (c == '>')
-              n--;
-            soap_unget(soap, c);
-          }
-          *s++ = '/';
-          break;
-        case '<':
-         c = soap_get1(soap);
-         if (c == '/')
-         { if (n == 0)
-           { c = TT;
-             goto end;
-           }
-           n--;
-         }
-         else if (c == '!')
-         { c = soap_get1(soap);
-           if (c == '[')
-            { do c = soap_get1(soap);
-              while ((int)c != EOF && c != '[');
-              if ((int)c == EOF)
-                 goto end;
-             t = (char*)"![CDATA[";
-             state = 1;
-           }
-            else if (c == '-')
-           { if ((c = soap_get1(soap)) == '-')
-               state = 2;
-             t = (char*)"!-";
-             soap_unget(soap, c);
-           }
-           else
-           { t = (char*)"!";
-             soap_unget(soap, c);
-           }
-           *s++ = '<';
-           break;
-         }
-         else if (c == '?')
-           state = 3;
-         else
-           n++;
-          soap_unget(soap, c);
-          *s++ = '<';
-          break;
-        case '>':
-          *s++ = '>';
-          break;
-        case '"':
-          *s++ = '"';
-          break;
-        default:
-          *s++ = (char)(c & 0xFF);
-        }
-      }
-    }
-  }
-#endif
-  for (;;)
-  { if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
-      return NULL;
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { if (t)
-      { *s++ = *t++;
-        if (!*t)
-          t = NULL;
-        continue;
-      }
-      if (soap->mode & SOAP_C_UTFSTRING)
-      { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < AP)
-        { c &= 0x7FFFFFFF;
-          t = buf;
-          if (c < 0x0800)
-            *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-          else
-          { if (c < 0x010000)
-              *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-            else
-            { if (c < 0x200000)
-                *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-              else
-              { if (c < 0x04000000)
-                  *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-                else
-                { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-                  *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-                }
-                *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-              }     
-              *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-            }
-            *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-          }
-          *t++ = (char)(0x80 | (c & 0x3F));
-          *t = '\0';
-          t = buf;
-          *s++ = *t++;
-          continue;
-        }
-      }
-      else if (soap->mode & SOAP_C_LATIN)
-        c = soap_get(soap);
-      else
-        c = soap_getutf8(soap);
-      switch (c)
-      {
-      case TT:
-        if (n == 0)
-          goto end;
-        n--;
-        *s++ = '<';
-        soap_unget(soap, '/');
-        break;
-      case LT:
-        n++;
-        *s++ = '<';
-        break;
-      case GT:
-        *s++ = '>';
-        break;
-      case QT:
-        *s++ = '"';
-        break;
-      case AP:
-        *s++ = '\'';
-        break;
-      case '/':
-        if (n > 0)
-        { c = soap_get(soap);
-          if (c == GT)
-            n--;
-          soap_unget(soap, c);
-        }
-        *s++ = '/';
-        break;
-      case '<':
-        if (flag)
-          *s++ = '<';
-        else
-        { *s++ = '&';
-          t = (char*)"lt;";
-        }
-        break;
-      case '>':
-        if (flag)
-          *s++ = '>';
-        else
-        { *s++ = '&';
-          t = (char*)"gt;";
-        }
-        break;
-      case '"':
-        if (flag)
-          *s++ = '"';
-        else
-        { *s++ = '&';
-          t = (char*)"quot;";
-        }
-        break;
-      default:
-        if ((int)c == EOF)
-          goto end;
-        *s++ = (char)(c & 0xFF);
-      }
-    }
-  }
-end:
-  soap_unget(soap, c);
-  *s = '\0';
-  soap_size_block(soap, i+1);
-  t = soap_save_block(soap, NULL);
-  if (flag == 2)
-    if (soap_s2QName(soap, t, &t))
-      return NULL;
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_wstring_out(struct soap *soap, const wchar_t *s, int flag)
-{ const char *t;
-  char tmp;
-  register wchar c;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->wide = NULL; /* soap_malloc() ??? */
-    return SOAP_OK;
-  }
-#endif
-  while ((c = *s++))
-  { switch (c)
-    { 
-    case 9:
-      if (flag)
-        t = "&#x9;";
-      else
-        t = "\t";
-      break;
-    case 10:
-      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
-        t = "&#xA;";
-      else
-        t = "\n";
-      break;
-    case 13:
-      t = "&#xD;";
-      break;
-    case '&':
-      t = "&amp;";
-      break;
-    case '<':
-      t = "&lt;";
-      break;
-    case '>':
-      if (flag)
-        t = ">";
-      else
-       t = "&gt;";
-      break;
-    case '"':
-      if (flag)
-        t = "&quot;";
-      else
-        t = "\"";
-      break;
-    default:
-      if (c > 0 && c < 0x80)
-      { tmp = (char)c;
-        if (soap_send_raw(soap, &tmp, 1))
-          return soap->error;
-      }
-      else if (soap_pututf8(soap, (unsigned long)c))
-        return soap->error;
-      continue;
-    }
-    if (soap_send(soap, t))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t *
-SOAP_FMAC2
-soap_wstring_in(struct soap *soap, int flag)
-{ wchar_t *s;
-  register int i, n = 0;
-  register wchar c;
-  const char *t = NULL;
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { if (!(s = (wchar_t*)soap_push_block(soap, sizeof(wchar_t)*SOAP_BLKLEN)))
-      return NULL;
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { if (t)
-      { *s++ = (wchar_t)*t++;
-        if (!*t)
-          t = NULL;
-        continue;
-      }
-      if (soap->mode & SOAP_C_LATIN)
-        c = soap_get(soap);
-      else
-        c = soap_getutf8(soap);
-      switch (c)
-      {
-      case TT:
-        if (n == 0)
-          goto end;
-        n--;
-        *s++ = '<';
-        soap_unget(soap, '/');
-        break;
-      case LT:
-        n++;
-        *s++ = '<';
-        break;
-      case GT:
-        *s++ = '>';
-        break;
-      case QT:
-        *s++ = '"';
-        break;
-      case AP:
-        *s++ = '\'';
-        break;
-      case '/':
-        if (n > 0)
-        { c = soap_getutf8(soap);
-          if (c == GT)
-            n--;
-          soap_unget(soap, c);
-        }
-        *s++ = '/';
-        break;
-      case '<':
-        if (flag)
-          *s++ = (wchar)'<';
-        else
-        { *s++ = (wchar)'&';
-          t = "lt;";
-        }
-        break;
-      case '>':
-        if (flag)
-          *s++ = (wchar)'>';
-        else
-        { *s++ = (wchar)'&';
-          t = "gt;";
-        }
-        break;
-      case '"':
-        if (flag)
-          *s++ = (wchar)'"';
-        else
-        { *s++ = (wchar)'&';
-          t = "quot;";
-        }
-        break;
-      default:
-        if ((int)c == EOF)
-          goto end;
-        *s++ = (wchar_t)c & 0x7FFFFFFF;
-      }
-    }
-  }
-end:
-  soap_unget(soap, c);
-  *s = '\0';
-  soap_size_block(soap, sizeof(wchar_t) * (i + 1));
-  return (wchar_t*)soap_save_block(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_int2s(struct soap *soap, int n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n)
-{ long m = (long)*p;
-  return soap_outlong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2int(struct soap *soap, const char *s, int *p)
-{ if (s)
-  { char *r;
-    *p = (int)soap_strtol(s, &r, 10);
-    if (*r)
-      return soap->error = SOAP_TYPE;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int *
-SOAP_FMAC2
-soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0);
-    if (!p || soap_s2int(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (int*)soap_id_forward(soap, soap->href, p, t, sizeof(int));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_long2s(struct soap *soap, long n)
-{ sprintf(soap->tmpbuf, "%ld", n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2long(struct soap *soap, const char *s, long *p)
-{ if (s)
-  { char *r;
-    *p = soap_strtol(s, &r, 10);
-    if (*r)
-      return soap->error = SOAP_TYPE;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-long *
-SOAP_FMAC2
-soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0);
-    if (!p || soap_s2long(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (long*)soap_id_forward(soap, soap->href, p, t, sizeof(long));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_LONG642s(struct soap *soap, LONG64 n)
-{ sprintf(soap->tmpbuf, SOAP_LONG_FORMAT, n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_LONG642s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p)
-{ if (s && sscanf(s, SOAP_LONG_FORMAT, p) != 1)
-    return soap->error = SOAP_TYPE;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-LONG64 *
-SOAP_FMAC2
-soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":integer")
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":negativeInteger")
-   && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":long")
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0);
-    if (!p || soap_s2LONG64(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (LONG64*)soap_id_forward(soap, soap->href, p, t, sizeof(LONG64));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_byte2s(struct soap *soap, char n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n)
-{ long m = (long)*p;
-  return soap_outlong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2byte(struct soap *soap, const char *s, char *p)
-{ if (s)
-  { long n;
-    char *r;
-    n = soap_strtol(s, &r, 10);
-    if (*r || n < -128 || n > 127)
-      return soap->error = SOAP_TYPE;
-    *p = (char)n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0);
-    if (!p || soap_s2byte(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (char*)soap_id_forward(soap, soap->href, p, t, sizeof(char));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_short2s(struct soap *soap, short n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n)
-{ long m = (long)*p;
-  return soap_outlong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2short(struct soap *soap, const char *s, short *p)
-{ if (s)
-  { long n;
-    char *r;
-    n = soap_strtol(s, &r, 10);
-    if (*r || n < -32768 || n > 32767)
-      return soap->error = SOAP_TYPE;
-    *p = (char)n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-short *
-SOAP_FMAC2
-soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0);
-    if (!p || soap_s2short(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (short*)soap_id_forward(soap, soap->href, p, t, sizeof(short));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_float2s(struct soap *soap, float n)
-{ const char *s;
-  if (isnan(n))
-    s = "NaN";
-  else if (n >= FLT_PINFTY)
-    s = "INF";
-  else if (n <= FLT_NINFTY)
-    s = "-INF";
-  else
-  { sprintf(soap->tmpbuf, soap->float_format, n);
-    s = soap->tmpbuf;
-  }
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_float2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2float(struct soap *soap, const char *s, float *p)
-{ if (s)
-  { if (!soap_tag_cmp(s, "INF"))
-      *p = FLT_PINFTY;
-    else if (!soap_tag_cmp(s, "+INF"))
-      *p = FLT_PINFTY;
-    else if (!soap_tag_cmp(s, "-INF"))
-      *p = FLT_NINFTY;
-    else if (!soap_tag_cmp(s, "NaN"))
-      *p = FLT_NAN;
-    else
-    {
-#ifdef HAVE_STRTOD
-      char *r;
-      *p = (float)strtod(s, &r);
-      if (*r)
-#endif
-        if (sscanf(s, soap->float_format, p) != 1)
-          return soap->error = SOAP_TYPE;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int soap_isnumeric(struct soap *soap, const char *type)
-{ if (soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":float")
-   && soap_match_tag(soap, soap->type, ":double")
-   && soap_match_tag(soap, soap->type, ":decimal")
-   && soap_match_tag(soap, soap->type, ":integer")
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":negativeInteger")
-   && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":long")
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte")
-   && soap_match_tag(soap, soap->type, ":unsignedLong")
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return SOAP_ERR;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-float *
-SOAP_FMAC2
-soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type != '\0' && soap_isnumeric(soap, type))
-    return NULL;
-  if (soap->body && !*soap->href)
-  { p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0);
-    if (!p || soap_s2float(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (float*)soap_id_forward(soap, soap->href, p, t, sizeof(float));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_double2s(struct soap *soap, double n)
-{ const char *s;
-  if (isnan(n))
-    s = "NaN";
-  else if (n >= DBL_PINFTY)
-    s = "INF";
-  else if (n <= DBL_NINFTY)
-    s = "-INF";
-  else
-  { sprintf(soap->tmpbuf, soap->double_format, n);
-    s = soap->tmpbuf;
-  }
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_double2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2double(struct soap *soap, const char *s, double *p)
-{ if (s)
-  { if (!soap_tag_cmp(s, "INF"))
-      *p = DBL_PINFTY;
-    else if (!soap_tag_cmp(s, "+INF"))
-      *p = DBL_PINFTY;
-    else if (!soap_tag_cmp(s, "-INF"))
-      *p = DBL_NINFTY;
-    else if (!soap_tag_cmp(s, "NaN"))
-      *p = DBL_NAN;
-    else
-    {
-#ifdef HAVE_STRTOD
-      char *r;
-      *p = strtod(s, &r);
-      if (*r)
-#endif
-        if (sscanf(s, soap->double_format, p) != 1)
-          return soap->error = SOAP_TYPE;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-double *
-SOAP_FMAC2
-soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type != '\0' && soap_isnumeric(soap, type))
-    return NULL;
-  if (soap->body && !*soap->href)
-  { p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0);
-    if (!p || soap_s2double(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (double*)soap_id_forward(soap, soap->href, p, t, sizeof(double));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedByte2s(struct soap *soap, unsigned char n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n)
-{ unsigned long m = (unsigned long)*p;
-  return soap_outunsignedLong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p)
-{ if (s)
-  { unsigned long n;
-    char *r;
-    n = soap_strtoul(s, &r, 10);
-    if (*r || n > 255)
-      return soap->error = SOAP_TYPE;
-    *p = (unsigned char)n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned char *
-SOAP_FMAC2
-soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0);
-    if (!p || soap_s2unsignedByte(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (unsigned char*)soap_id_forward(soap, soap->href, p, t, sizeof(unsigned char));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedShort2s(struct soap *soap, unsigned short n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n)
-{ unsigned long m = (unsigned long)*p;
-  return soap_outunsignedLong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p)
-{ if (s)
-  { unsigned long n;
-    char *r;
-    n = soap_strtoul(s, &r, 10);
-    if (*r || n > 65535)
-      return soap->error = SOAP_TYPE;
-    *p = (unsigned short)n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-unsigned short *
-SOAP_FMAC2
-soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0);
-    if (!p || soap_s2unsignedShort(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (unsigned short*)soap_id_forward(soap, soap->href, p, t, sizeof(unsigned short));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedInt2s(struct soap *soap, unsigned int n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n)
-{ unsigned long m = (unsigned long)*p;
-  return soap_outunsignedLong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p)
-{ if (s)
-  { char *r;
-    *p = (unsigned int)soap_strtoul(s, &r, 10);
-    if (*r)
-      return soap->error = SOAP_TYPE;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned int *
-SOAP_FMAC2
-soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0);
-    if (!p || soap_s2unsignedInt(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (unsigned int*)soap_id_forward(soap, soap->href, p, t, sizeof(unsigned int));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedLong2s(struct soap *soap, unsigned long n)
-{ sprintf(soap->tmpbuf, "%lu", n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p)
-{ if (s)
-  { char *r;
-    *p = soap_strtoul(s, &r, 10);
-    if (*r)
-      return soap->error = SOAP_TYPE;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned long *
-SOAP_FMAC2
-soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0);
-    if (!p || soap_s2unsignedLong(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (unsigned long*)soap_id_forward(soap, soap->href, p, t, sizeof(unsigned long));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_ULONG642s(struct soap *soap, ULONG64 n)
-{ sprintf(soap->tmpbuf, SOAP_ULONG_FORMAT, n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_ULONG642s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p)
-{ if (s && sscanf(s, SOAP_ULONG_FORMAT, p) != 1)
-    return soap->error = SOAP_TYPE;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-ULONG64 *
-SOAP_FMAC2
-soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":unsignedLong")
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0);
-    if (!p || soap_s2ULONG64(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (ULONG64*)soap_id_forward(soap, soap->href, p, t, sizeof(ULONG64));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2string(struct soap *soap, const char *s, char **t)
-{ *t = NULL;
-  if (s && !(*t = soap_strdup(soap, s)))
-    return soap->error = SOAP_EOM;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2QName(struct soap *soap, const char *s, char **t)
-{ if (s)
-  { struct soap_nlist *np = soap->nlist;
-    const char *p = strchr(s, ':');
-    if (p)
-    { int n = p - s;
-      while (np && (np->index == -2 || strncmp(np->id, s, n) || np->id[n]))
-        np = np->next;
-      p++;
-    }
-    else
-    { while (np && *np->id)
-        np = np->next;
-      p = s;
-    }
-    if (np)
-    { if (np->index >= 0 && soap->local_namespaces)
-      { const char *q = soap->local_namespaces[np->index].id;
-        if (q)
-        { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(q) + 2)))
-            sprintf(*t, "%s:%s", q, p);
-          return SOAP_OK;
-        }
-      }
-      if (np->ns)
-      { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(np->ns) + 4)))
-          sprintf(*t, "\"%s\":%s", np->ns, p);
-        return SOAP_OK;
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined (index=%d, URI=%s)\n", s, np->index, np->ns?np->ns:""));
-      return soap->error = SOAP_NAMESPACE; 
-    }
-    if (soap->mode & SOAP_XML_STRICT)
-      return soap->error = SOAP_NAMESPACE;
-    *t = soap_strdup(soap, s);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_QName2s(struct soap *soap, const char *s)
-{ struct Namespace *p;
-  char *t;
-  int i;
-  if (!s || *s != '"')
-    return s;
-  s++;
-  if ((p = soap->local_namespaces))
-  { for (i = 0; p->id; p++, i++)
-    { if (p->ns)
-        if (!soap_tag_cmp(s, p->ns))
-          break;
-      if (p->in)
-        if (!soap_tag_cmp(s, p->in))
-          break;
-    }
-    if (p && p->id)
-    { s = strchr(s, '"');
-      if (s)
-      { t = (char*)soap_malloc(soap, strlen(p->id) + strlen(s));
-        strcpy(t, p->id);
-       strcat(t, s + 1);
-        return t;
-      }
-    }
-  }
-  t = (char*)strchr(s, '"');
-  if (t)
-    i = t - s;
-  else
-    i = 0;
-  t = soap_strdup(soap, s);
-  t[i] = '\0';
-  sprintf(soap->tmpbuf, "xmlns:_%lu", soap->idnum++);
-  soap_set_attr(soap, soap->tmpbuf, t);
-  s = strchr(s, '"');
-  if (s)
-  { t = (char*)soap_malloc(soap, strlen(soap->tmpbuf) + strlen(s) - 6);
-    strcpy(t, soap->tmpbuf + 6);
-    strcat(t, s + 1);
-  }
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) 
-{ if (!*p)
-  { if (soap_element_null(soap, tag, id, type))
-      return soap->error;
-  }
-  else
-  { struct soap_plist *pp;
-    int i = soap_pointer_lookup(soap, *p, n, &pp);
-    if (id > 0)
-    { if (i)
-      { if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        soap_set_embedded(soap, pp);
-      }
-      else
-      { i = soap_pointer_enter(soap, *p, n, &pp);
-        if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        if (soap->mode & SOAP_IO_LENGTH)
-          pp->mark1 = 0;
-        else
-          pp->mark2 = 0;
-      }
-    }
-    else if (i)
-    { if (soap_is_embedded(soap, pp))
-      { if (soap_element_ref(soap, tag, 0, i))
-          return soap->error;
-      }
-      else if (soap_is_single(soap, pp))
-      { if (soap_element_begin_out(soap, tag, 0, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-      }
-      else
-      { if (soap_element_begin_out(soap, tag, i, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        soap_set_embedded(soap, pp);
-      }
-    }
-    else
-    { soap_pointer_enter(soap, *p, n, &pp);
-      if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-        return soap->error;
-      if (soap->mode & SOAP_IO_LENGTH)
-        pp->mark1 = 0;
-      else
-        pp->mark2 = 0;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char **
-SOAP_FMAC2
-soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { p = (char**)soap_id_enter(soap, soap->id, p, t, sizeof(char**), 0);
-    if (p)
-      *p = NULL;
-  }
-  else if (soap->body && !*soap->href)
-  { if (soap_match_tag(soap, soap->type, "PointerTostring") == 0)
-    { p = (char**)soap_id_enter(soap, soap->id, p, t, sizeof(char**), 0);
-      p = (char**)soap_instring(soap, "string", p, type, t, flag);
-    }
-    else
-    { if (!p)
-        if ((p = (char**)soap_id_enter(soap, SOAP_STR_EOS, p, t, sizeof(char**), 0)) == NULL)
-          return NULL;
-      *p = (char*)soap_id_enter(soap, soap->id, soap_string_in(soap, flag), t, 0, 0);
-    }
-  }
-  else
-    p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char*), 0);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) 
-{ if (!*p)
-  { if (soap_element_null(soap, tag, id, type))
-      return soap->error;
-  }
-  else
-  { struct soap_plist *pp;
-    int i = soap_pointer_lookup(soap, *p, n, &pp);
-    if (id > 0)
-    { if (i)
-      { if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        soap_set_embedded(soap, pp);
-      }
-      else
-      { i = soap_pointer_enter(soap, *p, n, &pp);
-        if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        if (soap->mode & SOAP_IO_LENGTH)
-          pp->mark1 = 0;
-        else
-          pp->mark2 = 0;
-      }
-    }
-    else if (i)
-    { if (soap_is_embedded(soap, pp))
-      { if (soap_element_ref(soap, tag, 0, i))
-          return soap->error;
-      }
-      else if (soap_is_single(soap, pp))
-      { if (soap_element_begin_out(soap, tag, 0, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-      }
-      else
-      { if (soap_element_begin_out(soap, tag, i, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        soap_set_embedded(soap, pp);
-      }
-    }
-    else
-    { if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-        return soap->error;
-      if (soap->mode & SOAP_IO_LENGTH)
-        pp->mark1 = 0;
-      else
-        pp->mark2 = 0;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t **
-SOAP_FMAC2
-soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { p = (wchar_t**)soap_id_enter(soap, soap->id, p, t, sizeof(wchar_t**), 0);
-    if (p)
-      *p = NULL;
-  }
-  else if (soap->body && !*soap->href)
-  { if (soap_match_tag(soap, soap->type, "PointerTostring") == 0)
-      p = (wchar_t**)soap_inwstring(soap, "string", (wchar_t**)soap_id_enter(soap, soap->id, p, t, sizeof(wchar_t**), 0), type, t);
-    else
-    { if (!p)
-        if (!(p = (wchar_t**)soap_id_enter(soap, SOAP_STR_EOS, p, t, sizeof(wchar_t**), 0)))
-          return NULL;
-      *p = (wchar_t*)soap_id_enter(soap, soap->id, soap_wstring_in(soap, 1), t, 0, 0);
-    }
-  }
-  else
-    p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t*), 0);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static time_t
-soap_timegm(struct tm *T)
-{
-#if defined(HAVE_TIMEGM)
-  return timegm(T);
-#elif defined(HAVE_GETTIMEOFDAY)
-  struct timezone t;
-  gettimeofday(NULL, &t); /* doesn't work properly on Solaris */
-  T->tm_min -= t.tz_minuteswest;
-  T->tm_isdst = (t.tz_dsttime != 0);
-  return mktime(T);
-/* WR[ */
-  /* The following define was added for VxWorks*/
-#elif defined(HAVE_MKTIME)
-  /* FOR VXWORKS:
-  vxWorks does not seem to have any variable representation of time zones, but
-  timezone information can be set in INSTALL_DIR/target/h/private/timeP.h header
-  file, by setting the ZONEBUFFER define.  The ZONEBUFFER define follows this 
-  format:
-  
-    name_of_zone:<(unused)>:time_in_minutes_from_UTC:daylight_start:daylight_end 
-    
-  To calculate local time, the value of time_in_minutes_from_UTC is subtracted
-  from UTC; time_in_minutes_from_UTC must be positive. Daylight information is 
-  expressed as mmddhh (month-day-hour), for example: 
-
-    UTC::0:040102:100102
-    
-  */
-  return mktime(T);
-/* ]WR */
-#elif defined(HAVE_FTIME)
-  struct timeb t;
-  t.timezone = 0;
-  t.dstflag = -1;
-  ftime(&t);
-  T->tm_min -= t.timezone;
-  T->tm_isdst = t.dstflag; /* doesn't work properly on Solaris */
-  return mktime(T);
-#else
-#warning "time_t (de)serialization is not MT safe on this platform"
-  time_t t;
-  char *tz = getenv("TZ");
-  putenv("TZ=UTC");
-  tzset();
-  t = mktime(T);
-  if (tz)
-  { char tmp[16];
-    strcpy(tmp, "TZ=");
-    strncat(tmp, tz, 12);
-    tmp[15] = '\0';
-    putenv(tmp);
-  }
-  else
-    putenv("TZ=");
-  tzset();
-  return t;
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_dateTime2s(struct soap *soap, time_t n)
-{ struct tm T;
-  struct tm *pT = &T;
-#if defined(HAVE_GMTIME_R)
-  if (gmtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PGMTIME_R)
-  if (gmtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-#elif defined(HAVE_PGMTIME)
-  if (gmtime(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-/* ]WR */
-#elif defined(HAVE_GMTIME)
-  if ((pT = gmtime(&n)))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-#elif defined(HAVE_GETTIMEOFDAY)
-  struct timezone t;
-#if defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { gettimeofday(NULL, &t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.tz_minuteswest/60-(t.tz_dsttime!=0), abs(t.tz_minuteswest)%60);
-  }
-#else
-  if ((pT = localtime(&n)))
-  { gettimeofday(NULL, &t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.tz_minuteswest/60-(t.tz_dsttime!=0), abs(t.tz_minuteswest)%60);
-  }
-#endif
-#elif defined(HAVE_FTIME)
-  struct timeb t;
-#if defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { ftime(&t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60-(t.dstflag!=0), abs(t.timezone)%60);
-  }
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PLOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf+strlen(soap->tmpbuf), "%+03d:%02d", t.timezone/60, abs(t.timezone)%60);
-  }
-/* ]WR */
-#else
-  if ((pT = localtime(&n)))
-  { ftime(&t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60-(t.dstflag!=0), abs(t.timezone)%60);
-  }
-#endif
-#elif defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PLOCALTIME_R)
-  if (localtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-/* ]WR */
-#else
-  if ((pT = localtime(&n)))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-#endif
-  else
-    strcpy(soap->tmpbuf, "1969-12-31T23:59:59Z");
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_dateTime2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2dateTime(struct soap *soap, const char *s, time_t *p)
-{ if (s)
-  { struct tm T;
-    char zone[16];
-    memset(&T, 0, sizeof(struct tm));
-    zone[sizeof(zone)-1] = '\0';
-    sscanf(s, "%d-%d-%dT%d:%d:%d%15s", &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone);
-    if (T.tm_year == 1)
-      T.tm_year = 70;
-    else
-      T.tm_year -= 1900;
-    T.tm_mon--;
-    if (*zone)
-    { if (*zone == '.')
-      { for (s = zone + 1; *s; s++)
-          if (*s < '0' || *s > '9')
-            break;
-      }
-      else
-        s = zone;
-      if (*s != 'Z')
-      { int h = 0, m = 0;
-        sscanf(s, "%d:%d", &h, &m);
-        T.tm_hour -= h;
-        if (h >= 0)
-          T.tm_min -= m;
-        else
-          T.tm_min += m;
-      }
-      *p = soap_timegm(&T);
-    }
-    else
-      *p = mktime(&T); /* no time zone: suppose it is localtime? */
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-time_t *
-SOAP_FMAC2
-soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char * type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":dateTime"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  if (soap->body && !*soap->href)
-  { p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0);
-    if (!p || soap_s2dateTime(soap, soap_value(soap), p))
-      return NULL;
-  }
-  else
-    p = (time_t*)soap_id_forward(soap, soap->href, p, t, sizeof(time_t));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outliteral(struct soap *soap, const char *tag, char *const*p)
-{ int i;
-  const char *t = NULL;
-  if (tag && *tag != '-')
-  { if ((t = strchr(tag, ':')))
-    { strncpy(soap->tmpbuf, tag, t-tag);
-      soap->tmpbuf[t-tag] = '\0';
-      for (i = 0; soap->local_namespaces[i].id; i++)
-        if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
-          break;
-      t++;
-      sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
-    }
-    else
-    { t = tag;
-      sprintf(soap->tmpbuf, "<%s>", tag);
-    }
-    if (soap_send(soap, soap->tmpbuf))
-      return soap->error;
-  }
-  if (p && *p)
-  { if (soap_send(soap, *p))
-      return soap->error;
-  }
-  if (t)
-  { sprintf(soap->tmpbuf, "</%s>", t);
-    return soap_send(soap, soap->tmpbuf);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char **
-SOAP_FMAC2
-soap_inliteral(struct soap *soap, const char *tag, char **p)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (!p)
-    if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
-      return NULL;
-  if (soap->null)
-    *p = NULL;
-  else if (soap->body)
-    *p = soap_string_in(soap, 0);
-  else
-    *p = NULL;
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p)
-{ int i;
-  const char *t = NULL;
-  wchar_t c;
-  const wchar_t *s;
-  if (tag && *tag != '-')
-  { if (tag && (t = strchr(tag, ':')))
-    { strncpy(soap->tmpbuf, tag, t-tag);
-      soap->tmpbuf[t-tag] = '\0';
-      for (i = 0; soap->local_namespaces[i].id; i++)
-        if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
-          break;
-      t++;
-      sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
-    }
-    else
-    { t = tag;
-      sprintf(soap->tmpbuf, "<%s>", tag);
-    }
-    if (soap_send(soap, soap->tmpbuf))
-      return soap->error;
-  }
-  if (p)
-  { s = *p;
-    while ((c = *s++))
-      if (soap_pututf8(soap, (unsigned char)c))
-        return soap->error;
-  }
-  if (t)
-  { sprintf(soap->tmpbuf, "</%s>", t);
-    return soap_send(soap, soap->tmpbuf);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t **
-SOAP_FMAC2
-soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (!p)
-    if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
-      return NULL;
-  if (soap->null)
-    *p = NULL;
-  else if (soap->body)
-    *p = soap_wstring_in(soap, 0);
-  else
-    *p = NULL;
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_value(struct soap *soap)
-{ size_t i;
-  wchar c = 0;
-  char *s;
-  s = soap->tmpbuf;
-  for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++)
-  { c = soap_get(soap);
-    if (c == TT || (int)c == EOF || soap_blank(c))
-      break;
-    *s++ = (char)c;
-  }
-  if ((int)c == EOF || c == TT)
-    soap_unget(soap, c);
-  *s = '\0';
-  return soap->tmpbuf; /* return non-null pointer */
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getline(struct soap *soap, char *s, int len)
-{ int i = len;
-  wchar c = 0;
-  for (;;)
-  { while (--i > 0)
-    { c = soap_getchar(soap);
-      if (c == '\r' || c == '\n' || (int)c == EOF)
-        break;
-      *s++ = (char)c;
-    }
-    *s = '\0';
-    while (c != '\n' && (int)c != EOF)
-      c = soap_getchar(soap);
-    if ((int)c == EOF)
-      return SOAP_EOF;
-    if (i+1 == len) /* empty line: end of HTTP header */
-      break;
-    c = soap_unget(soap, soap_getchar(soap));
-    if (c != ' ' && c != '\t') /* HTTP line continuation? */
-      break;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static size_t
-soap_begin_dime(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-  { size_t count;
-    sprintf(soap->id, soap->dime_id_format, 0);
-    soap->dime_id = soap->id;
-    if (soap->local_namespaces)
-    { if (soap->local_namespaces[0].out)
-        soap->dime_type = (char*)soap->local_namespaces[0].out;
-      else
-        soap->dime_type = (char*)soap->local_namespaces[0].ns;
-    }
-    soap->dime_options = NULL;
-    count = soap->dime_size + 12 + ((soap->count+3)&(~3)) + ((strlen(soap->dime_id)+3)&(~3)) + ((strlen(soap->dime_type)+3)&(~3));
-    soap->dime_size = soap->count;
-    if (soap->dime_count)
-      soap->dime_flags = SOAP_DIME_MB | SOAP_DIME_ABSURI;
-    else
-      soap->dime_flags = SOAP_DIME_MB | SOAP_DIME_ME | SOAP_DIME_ABSURI;
-    return count;
-  }
-#endif
-  return soap->count;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static int
-soap_putdimefield(struct soap *soap, const char *s, size_t n)
-{ if (soap_send_raw(soap, s, n))
-    return soap->error;
-  return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_dime_option(struct soap *soap, unsigned short type, const char *option)
-{ size_t n;
-  char *s = NULL;
-  if (option)
-  { n = strlen(option);
-    s = (char*)soap_malloc(soap, n + 5);
-    if (s)
-    { s[0] = type >> 8;
-      s[1] = type & 0xFF;
-      s[2] = n >> 8;
-      s[3] = n & 0xFF;
-      strcpy(s + 4, option);
-    }
-  }
-  return s;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putdimehdr(struct soap *soap)
-{ unsigned char tmp[12];
-  size_t optlen = 0, idlen = 0, typelen = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime_id?soap->dime_id:""));
-  if (soap->dime_options)
-    optlen = (((unsigned char)soap->dime_options[2] << 8) | ((unsigned char)soap->dime_options[3])) + 4;
-  if (soap->dime_id)
-    idlen = strlen(soap->dime_id);
-  if (soap->dime_type)
-    typelen = strlen(soap->dime_type);
-  tmp[0] = SOAP_DIME_VERSION | (soap->dime_flags & 0x7);
-  tmp[1] = soap->dime_flags & 0xF0;
-  tmp[2] = optlen >> 8;
-  tmp[3] = optlen & 0xFF;
-  tmp[4] = idlen >> 8;
-  tmp[5] = idlen & 0xFF;
-  tmp[6] = typelen >> 8;
-  tmp[7] = typelen & 0xFF;
-  tmp[8] = soap->dime_size >> 24;
-  tmp[9] = (soap->dime_size >> 16) & 0xFF;
-  tmp[10] = (soap->dime_size >> 8) & 0xFF;
-  tmp[11] = soap->dime_size & 0xFF;
-  if (soap_send_raw(soap, (char*)tmp, 12)
-   || soap_putdimefield(soap, soap->dime_options, optlen)
-   || soap_putdimefield(soap, soap->dime_id, idlen)
-   || soap_putdimefield(soap, soap->dime_type, typelen))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putdime(struct soap *soap, int i, char *id, char *type, char *options, void *ptr, size_t size)
-{ void *h;
-  if (id)
-    soap->dime_id = id;
-  else
-  { sprintf(soap->id, soap->dime_id_format, i);
-    soap->dime_id = soap->id;
-  }
-  soap->dime_type = type;
-  soap->dime_options = options;
-  soap->dime_size = size;
-  soap->dime_flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA;
-  if (soap->fdimereadopen && ((h = soap->fdimereadopen(soap, (void*)ptr, soap->dime_id, type, options)) || soap->error))
-  { size_t n;
-    if (!h)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n"));
-      return soap->error;
-    }
-    if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE))
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n"));
-      n = sizeof(soap->tmpbuf);
-      do 
-      { size = soap->fdimeread(soap, h, soap->tmpbuf, n);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size));
-        if (size == n)
-          soap->dime_flags |= SOAP_DIME_CF;
-        else
-       { soap->dime_flags &= ~SOAP_DIME_CF;
-          if (--soap->dime_count == 0)  
-            soap->dime_flags |= SOAP_DIME_ME;
-        }
-       soap->dime_size = size;
-        if (soap_putdimehdr(soap)
-        || soap_send_raw(soap, soap->tmpbuf, size)
-        || soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime_size&3))
-          break;
-        if (soap->dime_id)
-       { soap->dime_flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA);
-          soap->dime_id = NULL;
-          soap->dime_type = NULL;
-          soap->dime_options = NULL;
-        }  
-       } while (size >= n);
-    }
-    else
-    { if (--soap->dime_count == 0)
-        soap->dime_flags |= SOAP_DIME_ME;
-      if (soap_putdimehdr(soap))
-        return soap->error;
-      do
-      { if (size < sizeof(soap->tmpbuf))
-          n = size;
-        else
-          n = sizeof(soap->tmpbuf);
-        if (!(n = soap->fdimeread(soap, h, soap->tmpbuf, n)))
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)soap->dime_size));
-          soap->error = SOAP_EOF;
-         break;
-        }
-        if (soap_send_raw(soap, soap->tmpbuf, n))
-          break;
-        size -= n;
-      } while (size);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
-      soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime_size&3);
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
-    if (soap->fdimereadclose)
-      soap->fdimereadclose(soap, h);
-    return soap->error;
-  }
-  if (--soap->dime_count == 0)
-     soap->dime_flags |= SOAP_DIME_ME;
-  if (soap_putdimehdr(soap))
-     return soap->error;
-  return soap_putdimefield(soap, (char*)ptr, size);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static char *
-soap_getdimefield(struct soap *soap, size_t n)
-{ register wchar c;
-  register int i;
-  register char *s;
-  char *p = NULL;
-  if (n)
-  { p = (char*)soap_malloc(soap, n + 1);
-    if (p)
-    { s = p;
-      for (i = n; i > 0; i--)
-      { if ((int)(c = soap_get1(soap)) == EOF)
-        { soap->error = SOAP_EOF;
-          return NULL;
-        }
-        *s++ = (char)c;
-      }
-      *s = '\0';
-      if ((soap->error = soap_move(soap, -(long)n&3)))
-        return NULL;
-    }
-    else
-      soap->error = SOAP_EOM;
-  }
-  return p;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getdimehdr(struct soap *soap)
-{ register wchar c;
-  register char *s;
-  register int i;
-  unsigned char tmp[12];
-  size_t optlen, idlen, typelen;
-  if (!(soap->mode & SOAP_ENC_DIME))
-    return soap->error = SOAP_EOD;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n"));
-  if (soap->dime_buflen || soap->dime_chunksize)
-  { if (soap_move(soap, (long)(soap->dime_size - soap_tell(soap))))
-      return soap->error = SOAP_EOF;
-    soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n"));
-    return SOAP_OK;
-  }
-  s = (char*)tmp;
-  for (i = 12; i > 0; i--)
-  { if ((int)(c = soap_getchar(soap)) == EOF)
-      return soap->error = SOAP_EOF;
-    *s++ = (char)c;
-  }
-  if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION)
-    return soap->error = SOAP_DIME_MISMATCH;
-  soap->dime_flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0);
-  optlen = (tmp[2] << 8) | tmp[3];
-  idlen = (tmp[4] << 8) | tmp[5];
-  typelen = (tmp[6] << 8) | tmp[7];
-  soap->dime_size = (tmp[8] << 24) | (tmp[9] << 16) | (tmp[10] << 8) | tmp[11];
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%u flags=0x%X\n", (unsigned int)soap->dime_size, soap->dime_flags));
-  if (!(soap->dime_options = soap_getdimefield(soap, optlen)) && soap->error)
-    return soap->error;
-  if (!(soap->dime_id = soap_getdimefield(soap, idlen)) && soap->error)
-    return soap->error;
-  if (!(soap->dime_type = soap_getdimefield(soap, typelen)) && soap->error)
-    return soap->error;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id=%s, type=%s, options=%s\n", soap->dime_id?soap->dime_id:"", soap->dime_type?soap->dime_type:"", soap->dime_options?soap->dime_options+4:""));
-  if (soap->dime_flags & SOAP_DIME_ME)
-    soap->mode &= ~SOAP_ENC_DIME;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getdime(struct soap *soap)
-{ if (soap_getdimehdr(soap))
-    return soap->error;
-  if (soap->fdimewriteopen && ((soap->dime_ptr = (char*)soap->fdimewriteopen(soap, soap->dime_id, soap->dime_type, soap->dime_options)) || soap->error))
-  { char *id, *type, *options;
-    size_t size, n;
-    if (!soap->dime_ptr)
-      return soap->error;
-    id = soap->dime_id;
-    type = soap->dime_type;
-    options = soap->dime_options;
-    for (;;)
-    { size = soap->dime_size;
-      for (;;)
-      { n = soap->buflen - soap->bufidx;
-        if (size < n)
-          n = size;
-        if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime_ptr, soap->buf + soap->bufidx, n)))
-          break;
-       size -= n;
-       if (!size)
-       { soap->bufidx += n;
-         break;
-       }
-       if (soap_recv(soap))
-        { soap->error = SOAP_EOF;
-         goto end;
-        }
-      }
-      if (soap_move(soap, -(long)soap->dime_size&3))
-      { soap->error = SOAP_EOF;
-       break;
-      }
-      if (!(soap->dime_flags & SOAP_DIME_CF))
-        break;
-      if (soap_getdimehdr(soap))
-        break;
-    }
-end:
-    if (soap->fdimewriteclose)
-      soap->fdimewriteclose(soap, (void*)soap->dime_ptr);
-    soap->dime_size = 0;
-    soap->dime_id = id;
-    soap->dime_type = type;
-    soap->dime_options = options;
-  }
-  else if (soap->dime_flags & SOAP_DIME_CF)
-  { char *id, *type, *options;
-    register wchar c;
-    register char *s;
-    register int i;
-    id = soap->dime_id;
-    type = soap->dime_type;
-    options = soap->dime_options;
-    if (soap_new_block(soap))
-      return SOAP_EOM;
-    for (;;)
-    { s = (char*)soap_push_block(soap, soap->dime_size);
-      if (!s)
-        return soap->error = SOAP_EOM;
-      for (i = soap->dime_size; i > 0; i--)
-      { if ((int)(c = soap_get1(soap)) == EOF)
-          return soap->error = SOAP_EOF;
-        *s++ = (char)c;
-      }
-      if (soap_move(soap, -(long)soap->dime_size&3))
-        return soap->error = SOAP_EOF;
-      if (!(soap->dime_flags & SOAP_DIME_CF))
-        break;
-      if (soap_getdimehdr(soap))
-        return soap->error;
-    }
-    soap->dime_size = soap->blist->size++; /* allocate one more for '\0' */
-    if (!(soap->dime_ptr = soap_save_block(soap, NULL)))
-      return soap->error;
-    soap->dime_ptr[soap->dime_size] = '\0'; /* make 0-terminated to enable string-based attachments */
-    soap->dime_id = id;
-    soap->dime_type = type;
-    soap->dime_options = options;
-  }
-  else
-    soap->dime_ptr = soap_getdimefield(soap, soap->dime_size);
-  return soap->error;
-}
-#endif
-#endif
-
-/******************************************************************************/
-
-#ifdef WITH_COOKIES
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_encode_cookie(const char *s, char *t, int len)
-{ register int c;
-  register int n = len;
-  while ((c = *s++) && --n > 0)
-  { if (c > ' ' && c < 128 && c != ';' && c != ',')
-      *t++ = c;
-    else if (n > 2)
-    { *t++ = '%';
-      *t++ = (c >> 4) + (c > 159 ? '7' : '0');
-      c &= 0xF;
-      *t++ = c + (c > 9 ? '7' : '0');
-      n -= 2;
-    }
-    else
-      break;
-  }
-  *t = '\0';
-  return len - n;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_decode_cookie(char *buf, int len, const char *val)
-{ const char *s;
-  char *t;
-  for (s = val; *s; s++)
-    if (*s != ' ' && *s != '=')
-      break;
-  if (*s == '"')
-  { t = buf;
-    s++;
-    while (*s && *s != '"' && --len)
-      *t++ = *s++;
-    *t = '\0';
-    do s++;
-    while (*s && *s != ';' && *s != '=');
-  }
-  else
-  { t = buf;
-    while (*s && *s != ';' && *s != '=' && --len)
-      switch (*s)
-      { case ' ':
-          s++;
-          break;
-        case '%':
-          *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4)
-               + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0');
-          s += 3;
-          break;
-        default:
-          *t++ = *s++;
-      }
-    *t = '\0';
-  }
-  return s;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  size_t n;
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!path)
-    path = soap->cookie_path;
-  if (*path == '/')
-    path++;
-  n = strlen(path);
-  for (p = soap->cookies; p; p = p->next)
-    if (!strcmp(p->name, name)
-     && domain
-     && p->domain
-     && !strcmp(p->domain, domain)
-     && !strncmp(p->path, path, n))
-      break;
-  return p;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path)
-{ struct soap_cookie **p, *q;
-  int n;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie: %s=%s domain=%s path=%s\n", name, value?value:"", domain?domain:"", path?path:""));
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!path)
-    path = soap->cookie_path;
-  if (!path)
-  { soap_set_receiver_error(soap, "Cookie path not set", NULL, SOAP_HTTP_ERROR);
-    return NULL;
-  }
-  if (*path == '/')
-    path++;
-  q = soap_cookie(soap, name, domain, path);
-  if (!q)
-  { if ((q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-    { if ((q->name = (char*)SOAP_MALLOC(strlen(name)+1)))
-        strcpy(q->name, name);
-      q->value = NULL;
-      q->domain = NULL;
-      q->path = NULL;
-      q->expire = -1;
-      q->version = 0;
-      q->secure = 0;
-      q->env = 0;
-      q->modified = 0;
-      for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--)
-        if (!strcmp((*p)->name, name) && (*p)->path && strcmp((*p)->path, path) < 0)
-          break;
-      if (n)
-      { q->next = *p;
-        *p = q;
-      }
-      else
-      { SOAP_FREE(q->name);
-        SOAP_FREE(q);
-        q = NULL;
-      }
-    }
-  }
-  else
-    q->modified = 1;
-  if (q)
-  { if (q->value)
-    { SOAP_FREE(q->value);
-      q->value = NULL;
-    }
-    if (q->domain)
-    { SOAP_FREE(q->domain);
-      q->domain = NULL;
-    }
-    if (q->path)
-    { SOAP_FREE(q->path);
-      q->path = NULL;
-    }
-    if (value && *value && (q->value = (char*)SOAP_MALLOC(strlen(value)+1)))
-      strcpy(q->value, value);
-    if (domain && *domain && (q->domain = (char*)SOAP_MALLOC(strlen(domain)+1)))
-      strcpy(q->domain, domain);
-    if (path && *path && (q->path = (char*)SOAP_MALLOC(strlen(path)+1)))
-      strcpy(q->path, path);
-    q->session = 1;
-  }
-  return q;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie **p, *q;
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!domain)
-  { soap_set_receiver_error(soap, "Cookie domain not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
-    return;
-  }
-  if (!path)
-    path = soap->cookie_path;
-  if (!path)
-  { soap_set_receiver_error(soap, "Cookie path not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
-    return;
-  }
-  if (*path == '/')
-    path++;
-  for (p = &soap->cookies, q = *p; q; q = *p)
-    if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path)))
-    { if (q->value)
-        SOAP_FREE(q->value);
-      if (q->domain)
-        SOAP_FREE(q->domain);
-      if (q->path)
-        SOAP_FREE(q->path);
-      *p = q->next;
-      SOAP_FREE(q);
-    }
-    else
-      p = &q->next;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-    return p->value;
-  return NULL;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-    return p->expire;
-  return -1;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->expire = expire;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->session = 1;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->session = 0;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putsetcookies(struct soap *soap)
-{ struct soap_cookie *p;
-  char *s, tmp[4096];
-  const char *t;
-  for (p = soap->cookies; p; p = p->next)
-    if (p->modified || !p->env)
-    { s = tmp;
-      if (p->name)
-        s += soap_encode_cookie(p->name, s, tmp-s+4064);
-      if (p->value)
-      { *s++ = '=';
-        s += soap_encode_cookie(p->value, s, tmp-s+4064);
-      }
-      if (p->domain && (int)strlen(p->domain) < tmp-s+4064)
-        sprintf(s, ";Domain=%s", p->domain);
-      else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064)
-        sprintf(s, ";Domain=%s", soap->cookie_domain);
-      strcpy(s, ";Path=/");
-      if (p->path)
-        t = p->path;
-      else
-        t = soap->cookie_path;
-      if (t)
-      { if (*t == '/')
-          t++;
-        if ((int)strlen(t) < tmp-s+4064)
-          strcat(s, t);
-      }
-      s += strlen(s);
-      if (p->version > 0)
-      { sprintf(s, ";Version=%u", p->version);
-        s += strlen(s);
-      }
-      if (p->expire >= 0)
-      { sprintf(s, ";Max-Age=%ld", p->expire);
-        s += strlen(s);
-      }
-      if (p->secure)
-        strcpy(s, ";Secure");
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp));
-      if (soap->fposthdr(soap, "Set-Cookie", tmp))
-        return soap->error;
-    }
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure)
-{ struct soap_cookie **p, *q;
-  unsigned int version = 0;
-  time_t now = time(NULL);
-  char *s, tmp[4096];
-  p = &soap->cookies;
-  while ((q = *p))
-  { if (q->expire && now > q->expire)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name));
-      SOAP_FREE(q->name);
-      if (q->value)
-        SOAP_FREE(q->value);
-      if (q->domain)
-        SOAP_FREE(q->domain);
-      if (q->path)
-        SOAP_FREE(q->path);
-      *p = q->next;
-      SOAP_FREE(q);
-    }
-    else if ((!q->domain || !strcmp(q->domain, domain))
-          && (!q->path || !strncmp(q->path, path, strlen(q->path)))
-          && (!q->secure || secure))
-    { s = tmp;
-      if (q->version != version)
-      { sprintf(s, "$Version=%u;", q->version);
-        version = q->version;
-      }
-      if (q->name)
-        s += soap_encode_cookie(q->name, s, tmp-s+4080);
-      if (q->value)
-      { *s++ = '=';
-        s += soap_encode_cookie(q->value, s, tmp-s+4080);
-      }
-      if (q->path && (int)strlen(q->path) < tmp-s+4080)
-      { sprintf(s, ";$Path=/%s", q->path);
-        s += strlen(s);
-      }
-      if (q->domain && (int)strlen(q->domain) < tmp-s+4080)
-        sprintf(s, ";$Domain=%s", q->domain);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp));
-      if (soap->fposthdr(soap, "Cookie", tmp))
-        return soap->error;
-      p = &q->next;
-    }
-    else
-      p = &q->next;
-  }
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_getcookies(struct soap *soap, const char *val)
-{ struct soap_cookie *p = NULL, *q;
-  const char *s;
-  char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
-  char *domain = NULL;
-  char *path = NULL;
-  unsigned int version = 0;
-  time_t now = time(NULL);
-  if (!val)
-    return;
-  s = val;
-  while (*s)
-  { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-    if (!soap_tag_cmp(tmp, "$Version"))
-    { if ((s = soap_decode_cookie(tmp, sizeof(tmp), s)))
-      { if (p)
-          p->version = (int)atol(tmp);
-        else
-          version = (int)atol(tmp);
-      }
-    }
-    else if (!soap_tag_cmp(tmp, "$Path"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(t, tmp);
-      }
-      else
-        t = NULL;
-      if (p)
-      { if (p->path)
-          SOAP_FREE(p->path);
-        p->path = t;
-      }
-      else
-      { if (path)
-          SOAP_FREE(path);
-        path = t;
-      }
-    }
-    else if (!soap_tag_cmp(tmp, "$Domain"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(t, tmp);
-      }
-      else
-        t = NULL;
-      if (p)
-      { if (p->domain)
-          SOAP_FREE(p->domain);
-       p->domain = t;
-      }
-      else
-      { if (domain)
-          SOAP_FREE(domain);
-        domain = t;
-      }
-    }
-    else if (p && !soap_tag_cmp(tmp, "Path"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      if (p->path)
-        SOAP_FREE(p->path);
-      if (*tmp)
-      { if ((p->path = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(p->path, tmp);
-      }
-      else
-        p->path = NULL;
-    }
-    else if (p && !soap_tag_cmp(tmp, "Domain"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      if (p->domain)
-        SOAP_FREE(p->domain);
-      if (*tmp)
-      { if ((p->domain = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(p->domain, tmp);
-      }
-      else
-        p->domain = NULL;
-    }
-    else if (p && !soap_tag_cmp(tmp, "Version"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      p->version = (unsigned int)atol(tmp);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Max-Age"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      p->expire = now + atol(tmp);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Expires"))
-    { struct tm T;
-      char a[3]; 
-      static const char mns[] = "anebarprayunulugepctovec";
-      s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      memset(&T, 0, sizeof(struct tm));
-      a[0] = tmp[4];
-      a[1] = tmp[5];
-      a[2] = '\0';
-      T.tm_mday = (int)atol(a);
-      a[0] = tmp[8];
-      a[1] = tmp[9];
-      T.tm_mon = (strstr(mns, a) - mns) / 2;
-      a[0] = tmp[11];
-      a[1] = tmp[12];
-      T.tm_year = 100 + (int)atol(a);
-      a[0] = tmp[13];
-      a[1] = tmp[14];
-      T.tm_hour = (int)atol(a);
-      a[0] = tmp[16];
-      a[1] = tmp[17];
-      T.tm_min = (int)atol(a);
-      a[0] = tmp[19];
-      a[1] = tmp[20];
-      T.tm_sec = (int)atol(a);
-      p->expire = soap_timegm(&T);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Secure"))
-      p->secure = 1;
-    else
-    { if (p)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
-        if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
-        { q->version = p->version;
-          q->expire = p->expire;
-          q->secure = p->secure;
-          q->env = 1;
-        }
-        if (p->name)
-          SOAP_FREE(p->name);
-        if (p->value)
-          SOAP_FREE(p->value);
-        if (p->domain)
-          SOAP_FREE(p->domain);
-        if (p->path)
-          SOAP_FREE(p->path);
-        SOAP_FREE(p);
-      }
-      if ((p = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-      { p->name = (char*)SOAP_MALLOC(strlen(tmp)+1);
-        strcpy(p->name, tmp);
-        s = soap_decode_cookie(tmp, sizeof(tmp), s);
-        if (*tmp)
-        { p->value = (char*)SOAP_MALLOC(strlen(tmp)+1);
-          strcpy(p->value, tmp);
-        }
-        else
-          p->value = NULL;
-        p->domain = domain;
-        p->path = path;
-        p->expire = 0;
-        p->secure = 0;
-        p->version = version;
-      }
-    }
-    if (*s == ';')
-      s++;
-  }
-  if (p)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
-    if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
-    { q->version = p->version;
-      q->expire = p->expire;
-      q->secure = p->secure;
-    }
-    if (p->name)
-      SOAP_FREE(p->name);
-    if (p->value)
-      SOAP_FREE(p->value);
-    if (p->domain)
-      SOAP_FREE(p->domain);
-    if (p->path)
-      SOAP_FREE(p->path);
-    SOAP_FREE(p);
-  }
-  if (domain)
-    SOAP_FREE(domain);
-  if (path)
-    SOAP_FREE(path);
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getenv_cookies(struct soap *soap)
-{ struct soap_cookie *p;
-  const char *s;
-  char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
-  if (!(s = getenv("HTTP_COOKIE")))
-    return SOAP_ERR;
-  do
-  { s = soap_decode_cookie(key, sizeof(key), s);
-    s = soap_decode_cookie(val, sizeof(val), s);
-    p = soap_set_cookie(soap, key, val, NULL, NULL);
-    if (p)
-      p->env = 1;
-    if (*s == ';')
-      s++;
-  } while (*s);
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_copy_cookies(struct soap *soap)
-{ struct soap_cookie *p, **q, *r;
-  q = &r;
-  for (p = soap->cookies; p; p = p->next)
-  { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-      return r;
-    **q = *p;
-    if (p->name)
-    { if (((*q)->name = (char*)SOAP_MALLOC(strlen(p->name)+1)))
-        strcpy((*q)->name, p->name);
-    }
-    if (p->value)
-    { if (((*q)->value = (char*)SOAP_MALLOC(strlen(p->value)+1)))
-        strcpy((*q)->value, p->value);
-    }
-    if (p->domain)
-    { if (((*q)->domain = (char*)SOAP_MALLOC(strlen(p->domain)+1)))
-        strcpy((*q)->domain, p->domain);
-    }
-    if (p->path)
-    { if (((*q)->path = (char*)SOAP_MALLOC(strlen(p->path)+1)))
-        strcpy((*q)->path, p->path);
-    }
-    q = &(*q)->next;
-  }
-  *q = NULL;
-  return r;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_free_cookies(struct soap *soap)
-{ struct soap_cookie *p;
-  for (p = soap->cookies; p; p = soap->cookies)
-  { soap->cookies = p->next;
-    SOAP_FREE(p->name);
-    if (p->value)
-      SOAP_FREE(p->value);
-    if (p->domain)
-      SOAP_FREE(p->domain);
-    if (p->path)
-      SOAP_FREE(p->path);
-    SOAP_FREE(p);
-  }
-}
-
-/******************************************************************************/
-#endif /* WITH_COOKIES */
-
-/******************************************************************************/
-#ifdef WITH_GZIP
-#ifndef PALM_2
-static int
-soap_getgzipheader(struct soap *soap)
-{ int i;
-  wchar c, f = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n"));
-  for (i = 0; i < 9; i++)
-  { if ((int)(c = soap_get1(soap) == EOF))
-      return soap->error = SOAP_EOF;
-    if (i == 2)
-      f = c;
-  }
-  if (f & 0x04) /* FEXTRA */
-  { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--)
-      if ((int)soap_get1(soap) == EOF)
-        return soap->error = SOAP_EOF;
-  }
-  if (f & 0x08) /* FNAME */
-    do
-      c = soap_get1(soap);
-    while (c && (int)c != EOF);
-  if ((int)c != EOF && (f & 0x10)) /* FCOMMENT */
-    do
-      c = soap_get1(soap);
-    while (c && (int)f != EOF);
-  if ((int)c != EOF && (f & 0x01)) /* FHCRC */
-  { if ((int)(c = soap_get1(soap)) != EOF)
-      c = soap_get1(soap);
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_begin_recv(struct soap *soap)
-{ wchar c;
-  soap_set_local_namespaces(soap);
-  soap_free_iht(soap);
-  if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK)
-    soap->omode |= SOAP_IO_CHUNK;
-  soap->imode &= ~SOAP_IO;
-  soap->mode = soap->imode;
-  if (!soap->keep_alive)
-  { soap->buflen = 0;
-    soap->bufidx = 0;
-  }
-  if (!(soap->mode & SOAP_IO_KEEPALIVE))
-    soap->keep_alive = 0;
-  soap->ahead = 0;
-  soap->peeked = 0;
-  soap->level = 0;
-  soap->part = SOAP_BEGIN;
-  soap->alloced = 0;
-  soap->count = 0;
-  soap->length = 0;
-  soap->cdata = 0;
-  *soap->endpoint = '\0';
-  soap->userid = NULL;
-  soap->passwd = NULL;
-  soap->action = NULL;
-  soap->dime_chunksize = 0;
-  soap->dime_buflen = 0;
-#ifdef WIN32
-#ifndef UNDER_CE
-#ifndef WITH_FASTCGI
-  if (!soap_valid_socket(soap->socket))
-#ifdef __BORLANDC__
-    setmode((SOAP_SOCKET)soap->recvfd, O_BINARY);
-#else
-    _setmode((SOAP_SOCKET)soap->recvfd, _O_BINARY);
-#endif
-#endif
-#endif
-#endif
-#ifdef WITH_ZLIB
-  soap->mode &= ~SOAP_ENC_ZLIB;
-  soap->zlib_in = SOAP_ZLIB_NONE;
-  soap->zlib_out = SOAP_ZLIB_NONE;
-  soap->d_stream.next_in = Z_NULL;
-  soap->d_stream.avail_in = 0;
-  soap->d_stream.next_out = (Byte*)soap->buf;
-  soap->d_stream.avail_out = SOAP_BUFLEN;
-  soap->z_ratio_in = 1.0;
-#endif
-  c = soap_getchar(soap);
-  if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20)
-    soap->mode |= SOAP_ENC_DIME;
-#ifdef WITH_GZIP
-  else if (c == 0x1F)
-  { if (soap_getgzipheader(soap))
-      return soap->error;
-    if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
-      return soap->error = SOAP_ZLIB_ERROR;
-    soap->zlib_state = SOAP_ZLIB_INFLATE;
-    soap->mode |= SOAP_ENC_ZLIB;
-    soap->zlib_in = SOAP_ZLIB_GZIP;
-    soap->z_crc = crc32(0L, NULL, 0);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
-    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-    /* should not chunk over plain transport, so why bother to check? */
-    /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */
-    /*   soap->z_buflen = soap->bufidx; */
-    /* else */
-    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-    soap->d_stream.avail_in = soap->buflen - soap->bufidx;
-    soap->z_buflen = soap->buflen;
-    soap->buflen = soap->bufidx;
-  }  
-#endif
-  else
-  { if (c == 0xEF && !(soap->mode & SOAP_C_LATIN))
-    { soap_unget(soap, c);
-      c = soap_getutf8(soap);
-      if (c == 0xFEFF)
-        c = soap_getchar(soap);
-    }
-    while (soap_blank(c))
-      c = soap_getchar(soap);
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  soap_unget(soap, c);
-  if (c != '<' && !(soap->mode & (SOAP_ENC_DIME | SOAP_ENC_ZLIB)))
-  { soap->mode &= ~SOAP_IO;
-    if ((soap->error = soap->fparse(soap)))
-    { if (soap->error == 307)  /* HTTP redirect */
-      { soap_getline(soap, soap->endpoint, sizeof(soap->endpoint));
-        soap->keep_alive = 0; /* force close when soap_closesock() */
-      }
-      return soap->error;
-    }
-    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    { soap->chunkbuflen = soap->buflen;
-      soap->buflen = soap->bufidx;
-      soap->chunksize = 0;
-    }
-#ifdef WITH_ZLIB
-    if (soap->zlib_in)
-    { /* fparse should not use soap_unget */
-#ifdef WITH_GZIP
-      c = soap_get1(soap);
-      if (c == 0x1F)
-      { if (soap_getgzipheader(soap))
-          return soap->error;
-        if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
-          return soap->error = SOAP_ZLIB_ERROR;
-        soap->zlib_state = SOAP_ZLIB_INFLATE;
-        soap->z_crc = crc32(0L, NULL, 0);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
-      }
-      else
-      { soap_revget1(soap);
-#else
-      {
-#endif
-        if (inflateInit(&soap->d_stream) != Z_OK)
-          return soap->error = SOAP_ZLIB_ERROR;
-        soap->zlib_state = SOAP_ZLIB_INFLATE;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n"));
-      }
-      soap->mode |= SOAP_ENC_ZLIB;
-      memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-      soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-      soap->d_stream.avail_in = soap->buflen - soap->bufidx;
-      soap->z_buflen = soap->buflen;
-      soap->buflen = soap->bufidx;
-    }
-#endif
-  }
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-  { if (soap_getdimehdr(soap))
-      return soap->error;
-    if (soap->dime_flags & SOAP_DIME_CF)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n"));
-      soap->dime_chunksize = soap->dime_size;
-      if (soap->buflen - soap->bufidx >= soap->dime_chunksize)
-      { soap->dime_buflen = soap->buflen;
-        soap->buflen = soap->bufidx + soap->dime_chunksize;
-      }
-      else
-        soap->dime_chunksize -= soap->buflen - soap->bufidx;
-    }
-    soap->count = soap->buflen - soap->bufidx;
-  }
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_parse(struct soap *soap)
-{ char header[SOAP_HDRLEN], *s;
-  unsigned short g = 0, k;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for response...\n"));
-  *soap->endpoint = '\0';
-  soap->length = 0;
-  do
-  { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
-      return SOAP_EOF;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf));
-    for (;;)
-    { if (soap_getline(soap, header, SOAP_HDRLEN))
-        return SOAP_EOF;
-      if (!*header)
-        break;
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header));
-      s = strchr(header, ':');
-      if (s)
-      { *s = '\0';
-        do s++;
-        while (*s && *s <= 32);
-        if ((soap->error = soap->fparsehdr(soap, header, s)))
-          return soap->error;
-      }
-    }
-    if ((s = strchr(soap->msgbuf, ' ')))
-      k = (unsigned short)soap_strtoul(s, NULL, 10);
-    else
-      k = 0;
-  } while (k == 100);
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing\n"));
-  s = strstr(soap->msgbuf, "HTTP/");
-  if (s && s[7] != '1')
-  { if (soap->keep_alive == 1)
-      soap->keep_alive = 0;
-    if (k == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* k == 0 for HTTP request */
-    { soap->imode |= SOAP_IO_CHUNK;
-      soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE;
-    }
-  }
-  if (soap->keep_alive < 0)
-    soap->keep_alive = 1;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive));
-  if (s && (((g = !strncmp(soap->msgbuf, "GET ", 4))) || !strncmp(soap->msgbuf, "POST ", 5)))
-  { size_t m = strlen(soap->endpoint);
-    size_t n = m + (s - soap->msgbuf) - 5 - (!g);
-    if (n >= sizeof(soap->endpoint))
-      n = sizeof(soap->endpoint) - 1;
-    strncpy(soap->path, soap->msgbuf + 4 + (!g), n - m);
-    soap->path[n - m] = '\0';
-    strcat(soap->endpoint, soap->path);
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint));
-    if (g)
-    { soap->error = soap->fget(soap);
-      if (soap->error == SOAP_OK)
-        soap->error = SOAP_STOP; /* prevents further processing */
-      return soap->error;
-    }
-    return SOAP_OK;
-  }
-  if (k == 0 || (k >= 200 && k <= 299) || k == 400 || k == 500)
-    return SOAP_OK;
-  return soap_set_receiver_error(soap, "HTTP error", soap->msgbuf, k);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_parse_header(struct soap *soap, const char *key, const char *val)
-{ if (!soap_tag_cmp(key, "Host"))
-  { 
-#ifdef WITH_OPENSSL
-    if (soap->imode & SOAP_ENC_SSL)
-      strcpy(soap->endpoint, "https://");
-    else
-#endif
-    strcpy(soap->endpoint, "http://");
-    strncat(soap->endpoint, val, sizeof(soap->endpoint) - 8);
-    soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
-  }
-  else if (!soap_tag_cmp(key, "Content-Type"))
-  { if (!soap_tag_cmp(val, "*application/dime*"))
-      soap->mode |= SOAP_ENC_DIME;
-  }
-  else if (!soap_tag_cmp(key, "Content-Length"))
-    soap->length = soap_strtoul(val, NULL, 10);
-  else if (!soap_tag_cmp(key, "Content-Encoding"))
-  { if (!soap_tag_cmp(val, "deflate*"))
-#ifdef WITH_ZLIB
-      soap->zlib_in = SOAP_ZLIB_DEFLATE;
-#else
-      return SOAP_ZLIB_ERROR;
-#endif
-    else if (!soap_tag_cmp(val, "gzip*"))
-#ifdef WITH_GZIP
-      soap->zlib_in = SOAP_ZLIB_GZIP;
-#else
-      return SOAP_ZLIB_ERROR;
-#endif
-  }
-#ifdef WITH_ZLIB
-  else if (!soap_tag_cmp(key, "Accept-Encoding"))
-  {
-#ifdef WITH_GZIP
-    if (strchr(val, '*') || !soap_tag_cmp(val, "*gzip*"))
-      soap->zlib_out = SOAP_ZLIB_GZIP;
-    else
-#endif
-    if (strchr(val, '*') || !soap_tag_cmp(val, "*deflate*"))
-      soap->zlib_out = SOAP_ZLIB_DEFLATE;
-    else
-      soap->zlib_out = SOAP_ZLIB_NONE;
-  }
-#endif
-  else if (!soap_tag_cmp(key, "Transfer-Encoding"))
-  { soap->mode &= ~SOAP_IO;
-    if (!soap_tag_cmp(val, "chunked*"))
-      soap->mode |= SOAP_IO_CHUNK;
-  }
-  else if (!soap_tag_cmp(key, "Connection"))
-  { if (!soap_tag_cmp(val, "keep-alive*"))
-      soap->keep_alive = -soap->keep_alive;
-    else if (!soap_tag_cmp(val, "close*"))
-      soap->keep_alive = 0;
-  }
-#ifndef WITH_LEAN
-  else if (!soap_tag_cmp(key, "Authorization"))
-  { if (!soap_tag_cmp(val, "basic *"))
-    { size_t n;
-      char *s;
-      soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n);
-      soap->tmpbuf[n] = '\0';
-      if ((s = strchr(soap->tmpbuf, ':')))
-      { *s = '\0';
-       soap->userid = soap_strdup(soap, soap->tmpbuf);
-       soap->passwd = soap_strdup(soap, s + 1);
-      }
-    }
-  }
-#endif
-  else if (!soap_tag_cmp(key, "SOAPAction"))
-  { if (val[0] && val[1])
-    { soap->action = soap_strdup(soap, val + 1);
-      soap->action[strlen(soap->action) - 1] = '\0';
-    }
-  }
-/* [ Deal with .NET bug (invalid XML id-ref) */
-  else if (!soap_tag_cmp(key, "Server"))
-  { if (!soap_tag_cmp(val, "Microsoft-IIS*"))
-      soap->dot_net_bug = 1;
-  }
-  else if (!soap_tag_cmp(key, "User-Agent"))
-  { if (!soap_tag_cmp(val, "*.NET CLR*") || !soap_tag_cmp(val, "*MS Web Services Client Protocol*"))
-      soap->dot_net_bug = 1;
-  }
-/* ] */
-#ifdef WITH_COOKIES
-  else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Set-Cookie"))
-    soap_getcookies(soap, val);
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_begin_out(struct soap *soap)
-{ soap->part = SOAP_IN_ENVELOPE;
-  return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_end_out(struct soap *soap)
-{ if (soap_element_end_out(soap, "SOAP-ENV:Envelope"))
-    return soap->error;
-  soap->part = SOAP_END_ENVELOPE;
-#ifndef WITH_LEANER
-  if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME))
-    return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->count&3);
-#endif
-  return SOAP_OK;
-} 
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_begin_in(struct soap *soap)
-{ soap->part = SOAP_IN_ENVELOPE;
-  if (soap_element_begin_in(soap, "SOAP-ENV:Envelope"))
-    return soap->error = SOAP_VERSIONMISMATCH;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_end_in(struct soap *soap)
-{ if (soap_element_end_in(soap, "SOAP-ENV:Envelope"))
-    return soap->error;
-  soap->part = SOAP_END_ENVELOPE;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_begin_out(struct soap *soap)
-{ soap->part = SOAP_IN_BODY;
-  if (soap->version == 1)
-    soap->encoding = 1;
-  if (soap_element(soap, "SOAP-ENV:Body", 0, NULL))
-    return soap->error;
-  if (soap_attribute(soap, "id", "_0"))
-    return soap->error;
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_end_out(struct soap *soap)
-{ if (soap_element_end_out(soap, "SOAP-ENV:Body"))
-    return soap->error;
-  soap->part = SOAP_IN_BODY;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_begin_in(struct soap *soap)
-{ soap->part = SOAP_IN_BODY;
-  return soap_element_begin_in(soap, "SOAP-ENV:Body");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_end_in(struct soap *soap)
-{ if (soap_element_end_in(soap, "SOAP-ENV:Body"))
-    return soap->error;
-  soap->part = SOAP_END_BODY;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_header(struct soap *soap)
-{ if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH)
-    soap->error = SOAP_OK;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_endpoint(struct soap *soap, const char *endpoint)
-{ register const char *s;
-  register size_t i, n;
-  *soap->endpoint = '\0';
-  *soap->host = '\0';
-  *soap->path = '\0';
-  soap->port = 80;
-  if (!endpoint || !*endpoint)
-    return;
-#ifdef WITH_OPENSSL
-  if (!strncmp(endpoint, "https:", 6))
-    soap->port = 443;
-#endif
-  strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1);
-  s = strchr(endpoint, ':');
-  if (s && s[1] == '/' && s[2] == '/')
-    s += 3;
-  else
-    s = endpoint;
-  n = strlen(s);
-  if (n >= sizeof(soap->host))
-    n = sizeof(soap->host) - 1;
-/* WR[ */
-#ifdef WITH_IPV6
-  if ('[' == s[0])
-  {
-    s++;
-    for (i = 0; i < n; i++)
-    { soap->host[i] = s[i];
-      if (']' == s[i])
-      {
-        s++;
-        break; 
-      }
-    }
-  }
-  else
-  {
-    for (i = 0; i < n; i++)
-    { soap->host[i] = s[i];
-      if (s[i] == '/' || s[i] == ':')
-        break; 
-    }
-  }
-#else /* WITH_IPV6 */
-/* ]WR */
-  for (i = 0; i < n; i++)
-  { soap->host[i] = s[i];
-    if (s[i] == '/' || s[i] == ':')
-      break; 
-  }
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-  soap->host[i] = '\0';
-  if (s[i] == ':')
-  { soap->port = (int)atol(s + i + 1);
-    for (i++; i < n; i++)
-      if (s[i] == '/')
-        break;
-  }
-  if (s[i])
-  { strncpy(soap->path, s + i + 1, sizeof(soap->path));
-    soap->path[sizeof(soap->path) - 1] = '\0';
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_connect(struct soap *soap, const char *endpoint, const char *action)
-{ return soap_connect_command(soap, SOAP_POST, endpoint, action);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action)
-{ char host[sizeof(soap->host)];
-  int port;
-  size_t count;
-  strcpy(host, soap->host); /* save to compare */
-  port = soap->port; /* save to compare */
-  soap_set_endpoint(soap, endpoint);
-  if (action)
-    soap->action = soap_strdup(soap, action);
-  if (soap->fconnect)
-  {
-    if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port)))
-      return soap->error;
-  }
-  else if (*soap->host)
-  { soap->status = http_command;
-    if (!soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port)
-    { soap->keep_alive = 0; /* force close */
-      soap_closesock(soap);
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
-      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
-      if (soap->error)
-        return soap->error;
-      soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0);
-    }
-    else if (!soap->keep_alive || soap_poll(soap))
-    { soap->keep_alive = 0; /* force close */
-      soap_closesock(soap);
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
-      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
-      if (soap->error)
-        return soap->error;
-    }
-  }
-  count = soap_begin_dime(soap);
-  if (soap_begin_send(soap))
-    return soap->error;
-  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint)
-  { unsigned int k = soap->mode;
-    soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
-    if ((k & SOAP_IO) != SOAP_IO_FLUSH)
-      soap->mode |= SOAP_IO_BUFFER;
-    if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count)))
-      return soap->error;
-    if ((k & SOAP_IO) == SOAP_IO_CHUNK)
-    { if (soap_flush(soap))
-        return soap->error;
-    }
-    soap->mode = k;
-  }
-  if (http_command != SOAP_POST)
-    return soap_end_send(soap);
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-    return soap_putdimehdr(soap);
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2base64(struct soap *soap, const unsigned char *s, char *t, size_t n)
-{ register size_t i;
-  register unsigned long m;
-  if (!t)
-    return SOAP_EOM;
-  t[0] = '\0';
-  if (!s)
-    return SOAP_OK;
-  for (; n > 2; n -= 3, s += 3)
-  { m = ((unsigned long)((unsigned char*)s)[0] << 16) | ((unsigned long)((unsigned char*)s)[1] << 8) | (unsigned long)((unsigned char*)s)[2];
-    for (i = 4; i > 0; m >>= 6)
-      t[--i] = soap_base64o[m & 0x3F];
-    t += 4;
-  }
-  t[0] = '\0';
-  if (n > 0)
-  { m = 0;
-    for (i = 0; i < n; i++)
-      m = (m << 8) | *s++;
-    for (; i < 3; i++)
-      m <<= 8;
-    for (i++; i > 0; m >>= 6)
-      t[--i] = soap_base64o[m & 0x3F];
-    for (i = 3; i > n; i--)
-      t[i] = '=';
-    t[4] = '\0';
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_base642s(struct soap *soap, const char *s, char *t, size_t l, size_t *n)
-{ register int i, j, c;
-  register unsigned long m;
-  char *p = t;
-  if (n)
-    *n = 0;
-  for (;;)
-  { for (i = 0; i < SOAP_BLKLEN; i++)
-    { m = 0;
-      j = 0;
-      while (j < 4)
-      { c = *s++;
-        if (c == '=' || !c)
-        { i *= 3;
-          switch (j)
-          { case 2:
-              *t++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *t++ = (char)((m >> 10) & 0xFF);
-              *t++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-           *n += i;
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      }
-      *t++ = (char)((m >> 16) & 0xFF);
-      *t++ = (char)((m >> 8) & 0xFF);
-      *t++ = (char)(m & 0xFF);
-      if (l < 3)
-      { if (n)
-         *n += i;
-        return p;
-      }
-      l -= 3;
-    }
-    if (n)
-      *n += 3 * SOAP_BLKLEN;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_puthttphdr(struct soap *soap, int status, size_t count)
-{ const char *s;
-  if (status == SOAP_FILE)
-    s = soap->http_content;
-  else if (status == SOAP_HTML)
-    s = "text/html; charset=utf-8";
-  else if (soap->mode & SOAP_ENC_DIME)
-    s = "application/dime";
-  else if (soap->version == 2)
-    s = "application/soap+xml; charset=utf-8";
-  else
-    s = "text/xml; charset=utf-8";
-  soap->error = soap->fposthdr(soap, "Content-Type", s);
-  if (soap->error)
-    return soap->error;
-#ifdef WITH_ZLIB
-  if (soap->omode & SOAP_ENC_ZLIB)
-#ifdef WITH_GZIP
-    soap->error = soap->fposthdr(soap, "Content-Encoding", "gzip");
-#else
-    soap->error = soap->fposthdr(soap, "Content-Encoding", "deflate");
-#endif
-#endif
-  if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)
-    soap->error = soap->fposthdr(soap, "Transfer-Encoding", "chunked");
-  else if (count > 0)
-  { sprintf(soap->tmpbuf, "%lu", (unsigned long)count);
-    soap->error = soap->fposthdr(soap, "Content-Length", soap->tmpbuf);
-  }
-  if (soap->error)
-    return soap->error;
-  return soap->error = soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_get(struct soap *soap)
-{ return SOAP_GET_METHOD;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count)
-{ const char *s;
-  if (soap->status == SOAP_GET)
-  { s = "GET";
-    count = 0;
-  }
-  else
-    s = "POST";
-#ifndef PALM
-  if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)))
-#else
-  if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8))
-#endif
-    return SOAP_OK;
-  if (soap->proxy_host)
-    sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version);
-  else
-    sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, path, soap->http_version);
-  if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-    return soap->error;
-  if (port != 80)
-    sprintf(soap->tmpbuf, "%s:%d", host, port);
-  else
-    strcpy(soap->tmpbuf, host); 
-  if ((soap->error = soap->fposthdr(soap, "Host", soap->tmpbuf))
-   || (soap->error = soap->fposthdr(soap, "User-Agent", "gSOAP/2.6"))
-   || (soap->error = soap_puthttphdr(soap, SOAP_OK, count)))
-    return soap->error;
-#ifdef WITH_ZLIB
-#ifdef WITH_GZIP
-  if ((soap->error = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate")))
-#else
-  if ((soap->error = soap->fposthdr(soap, "Accept-Encoding", "deflate")))
-#endif
-    return soap->error;
-#endif
-#ifndef WITH_LEAN
-  if (soap->userid && soap->passwd && strlen(soap->userid) + strlen(soap->passwd) < 761)
-  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd);
-    strcpy(soap->tmpbuf, "Basic ");
-    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-    if ((soap->error = soap->fposthdr(soap, "Authorization", soap->tmpbuf)))
-      return soap->error;
-  }
-  if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
-  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
-    strcpy(soap->tmpbuf, "Basic ");
-    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-    if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
-      return soap->error;
-  }
-#endif
-#ifdef WITH_COOKIES
-#ifdef WITH_OPENSSL
-  if (soap_putcookies(soap, host, path, soap->ssl != NULL))
-    return soap->error;
-#else
-  if (soap_putcookies(soap, host, path, 0))
-    return soap->error;
-#endif
-#endif
-  if (action)
-  { sprintf(soap->tmpbuf, "\"%s\"", action);
-    if ((soap->error = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf)))
-      return soap->error;
-  }
-  return soap->error = soap->fposthdr(soap, NULL, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_post_header(struct soap *soap, const char *key, const char *val)
-{ if (key)
-  { if (soap_send(soap, key))
-      return soap->error;
-    if (val && (soap_send(soap, ": ") || soap_send(soap, val)))
-      return soap->error;
-  }
-  return soap_send(soap, "\r\n");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_response(struct soap *soap, int status, size_t count)
-{
-/* WR[ */
-#ifdef WMW_RPM_IO
-  if (soap->rpmreqid)
-      {
-      httpOutputEnable(soap->rpmreqid);
-      }
-#endif  /* WMW_RPM_IO */
-/* ]WR */
-  if (!status || status == SOAP_HTML || status == SOAP_FILE)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "OK 200\n"));
-/* WR[ */
-#ifdef WMW_RPM_IO
-    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
-#else
-/* ]WR */
-    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
-/* WR[ */
-#endif /* WMW_RPM_IO */
-/* ]WR */
-    { sprintf(soap->tmpbuf, "HTTP/%s 200 OK", soap->http_version);
-      if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return soap->error;
-    }
-    else if ((soap->error = soap->fposthdr(soap, "Status", "200 OK")))
-      return soap->error;
-  }
-  else if (status > 200 && status < 600)
-  { sprintf(soap->tmpbuf, "HTTP/%s %d %s", soap->http_version, status, http_error(soap, status));
-    if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-      return soap->error;
-    if (status == 401)
-      if ((soap->error = soap->fposthdr(soap, "WWW-Authenticate", "Basic realm=\"gSOAP Service\"")))
-        return soap->error;
-  }
-  else
-  { const char *s = *soap_faultcode(soap);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error\n"));
-    if (soap->version == 2 && !strcmp(s, "SOAP-ENV:Sender"))
-      s = "400 Bad Request";
-    else
-      s = "500 Internal Server Error";
-/* WR[ */
-#ifdef WMW_RPM_IO
-    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
-#else
-/* ]WR */
-    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
-/* WR[ */
-#endif /* WMW_RPM_IO */
-/* ]WR */
-    { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s);
-      if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return soap->error;
-    }
-    else if ((soap->error = soap->fposthdr(soap, "Status", s)))
-      return soap->error;
-  }
-  if ((soap->error = soap->fposthdr(soap, "Server", "gSOAP/2.6"))
-   || (soap->error = soap_puthttphdr(soap, status, count)))
-    return soap->error;
-#ifdef WITH_COOKIES
-  if (soap_putsetcookies(soap))
-    return soap->error;
-#endif
-  return soap->error = soap->fposthdr(soap, NULL, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_response(struct soap *soap, int status)
-{ register size_t count;
-  if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */))
-   && (status == SOAP_HTML || status == SOAP_FILE))
-  { soap->omode &= ~SOAP_IO;
-    soap->omode |= SOAP_IO_STORE;
-  }
-  soap->status = status;
-  count = soap_begin_dime(soap);
-  if (soap_begin_send(soap))
-    return soap->error;
-  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML))
-  { register int n = soap->mode;
-    soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
-    if ((n & SOAP_IO) != SOAP_IO_FLUSH)
-      soap->mode |= SOAP_IO_BUFFER;
-    if ((soap->error = soap->fresponse(soap, status, count)))
-      return soap->error;
-    if ((n & SOAP_IO) == SOAP_IO_CHUNK)
-    { if (soap_flush(soap))
-        return soap->error;
-    }
-    soap->mode = n;
-  }
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-    return soap_putdimehdr(soap);
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_fault(struct soap *soap)
-{ const char **c = soap_faultcode(soap);
-  const char **s = soap_faultstring(soap);
-  if (!*c)
-  { if (soap->version == 2)
-      *c = "SOAP-ENV:Sender";
-    else
-      *c = "SOAP-ENV:Client";
-  }
-  if (*s)
-    return;
-  switch (soap->error)
-  { case SOAP_CLI_FAULT:
-      *s = "Client fault";
-      break;
-    case SOAP_SVR_FAULT:
-      *s = "Server fault";
-      break;
-    case SOAP_TAG_MISMATCH:
-      sprintf(soap->msgbuf, "Tag mismatch: element '%s' does not correspond to expected element", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_TYPE:
-      sprintf(soap->msgbuf, "Data type '%s' mismatch in element '%s'", soap->type, soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_SYNTAX_ERROR:
-      *s = "XML syntax error";
-      break;
-    case SOAP_NO_TAG:
-      *s = "No XML element tag found";
-      break;
-    case SOAP_MUSTUNDERSTAND:
-      *c = "SOAP-ENV:MustUnderstand";
-      sprintf(soap->msgbuf, "The data in element '%s' must be understood but cannot be handled", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_VERSIONMISMATCH:
-      *c = "SOAP-ENV:VersionMismatch";
-      *s = "SOAP version mismatch or invalid SOAP message";
-      break;
-    case SOAP_DATAENCODINGUNKNOWN:
-      *c = "SOAP-ENV:DataEncodingUnknown";
-      *s = "Unsupported SOAP data encoding";
-      break;
-    case SOAP_DIME_MISMATCH:
-      *s = "DIME version mismatch";
-      break;
-    case SOAP_NAMESPACE:
-      sprintf(soap->msgbuf, "Namespace URI mismatch in element '%s'", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_OBJ_MISMATCH:
-      *s = "Object mismatch";
-      break;
-    case SOAP_FATAL_ERROR:
-      *s = "Fatal error";
-      break;
-    case SOAP_NO_METHOD:
-      sprintf(soap->msgbuf, "Method '%s' not implemented", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_GET_METHOD:
-      *s = "HTTP GET method not implemented";
-      break;
-    case SOAP_EOM:
-      *s = "Out of memory";
-      break;
-    case SOAP_IOB:
-      *s = "Array index out of bounds";
-      break;
-    case SOAP_NULL:
-      sprintf(soap->msgbuf, "Cannot create nilable object for type '%s' in element '%s'", soap->type, soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_MULTI_ID:
-      *s = "Non-unique id attribute";
-      break;
-    case SOAP_MISSING_ID:
-      *s = "Missing id: referenced data is missing or had to be ignored";
-      break;
-    case SOAP_HREF:
-      *s = "Invalid XML: object reference with href attribute is incompatible with actual object referred to";
-      break;
-    case SOAP_FAULT:
-      break;
-    case SOAP_TCP_ERROR:
-      *s = tcp_error(soap);
-      break;
-    case SOAP_HTTP_ERROR:
-      *s = "HTTP error";
-      break;
-    case SOAP_SSL_ERROR:
-      *s = "SSL error";
-      break;
-    case SOAP_PLUGIN_ERROR:
-      *s = "Plugin registry error";
-      break;
-    case SOAP_DIME_ERROR:
-      *s = "DIME error";
-      break;
-    case SOAP_ZLIB_ERROR:
-#ifdef WITH_ZLIB
-      sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream.msg?soap->d_stream.msg:"");
-      *s = soap->msgbuf;
-#else
-      *s = "Zlib not installed for required message (de)compression";
-#endif
-      break;
-    case SOAP_EOD:
-      *s = "End of DIME error";
-      break;
-    case SOAP_REQUIRED:
-      *s = "Validation failure: XML attribute required";
-      break;
-    case SOAP_OCCURS:
-      *s = "Validation failure: XML element occurs count";
-      break;
-    case SOAP_EOF:
-      sprintf(soap->msgbuf, "End of file or no input: '%s'", soap_strerror(soap));
-      *s = soap->msgbuf;
-      break;
-    default:
-      if (soap->error > 200 && soap->error < 600)
-      { sprintf(soap->msgbuf, "HTTP Error: '%s'", http_error(soap, soap->error));
-        *s = soap->msgbuf;
-      }
-      else
-        *s = "Unknown error code";
-    }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send_fault(struct soap *soap)
-{ register int status = soap->error;
-  if (status == SOAP_STOP)
-    return status;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error));
-  soap->keep_alive = 0; /* to terminate connection */
-  soap_set_fault(soap);
-  if ((status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) && soap_poll(soap) == SOAP_OK)
-  { soap->error = SOAP_OK;
-    soap_serializeheader(soap);
-    soap_serializefault(soap);
-    soap_begin_count(soap);
-    if (soap->mode & SOAP_IO_LENGTH)
-    { soap_envelope_begin_out(soap);
-      soap_putheader(soap);
-      soap_body_begin_out(soap);
-      soap_putfault(soap);
-      soap_body_end_out(soap);
-      soap_envelope_end_out(soap);
-    }
-    if (soap_response(soap, status)
-     || soap_envelope_begin_out(soap)
-     || soap_putheader(soap)
-     || soap_body_begin_out(soap)
-     || soap_putfault(soap)
-     || soap_body_end_out(soap)
-     || soap_envelope_end_out(soap))
-      return soap_closesock(soap);
-    soap_end_send(soap);
-  }
-  soap_closesock(soap);
-  return soap->error = status;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_fault(struct soap *soap)
-{ register int status = soap->error;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Receiving SOAP Fault\n"));
-  soap->error = SOAP_OK;
-  if (soap_getfault(soap))
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed. Is this a SOAP message at all?\n"));
-    *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client");
-    soap->error = status;
-    soap_set_fault(soap);
-  }
-  else
-  { register const char *s = *soap_faultcode(soap);
-    if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver"))
-      status = SOAP_SVR_FAULT; 
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender"))
-      status = SOAP_CLI_FAULT;
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand"))
-      status = SOAP_MUSTUNDERSTAND;
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch"))
-      status = SOAP_VERSIONMISMATCH;
-    else
-    { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Fault code %s\n", s));
-      status = SOAP_FAULT;
-    }
-    if (soap_body_end_in(soap)
-     || soap_envelope_end_in(soap)
-     || soap_end_recv(soap))
-      return soap_closesock(soap);
-    soap->error = status;
-  }
-  return soap_closesock(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-soap_strerror(struct soap *soap)
-{ int err = soap->errnum;
-  if (!err)
-    err = soap_errno;
-  if (err)
-  {
-#ifndef UNDER_CE
-    return strerror(err);
-#else
-    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)&soap->werrorstr, 256, NULL);
-    wcstombs(soap->errorstr, soap->werrorstr, 256);
-    return soap->errorstr;
-#endif
-  }
-  return "Operation interrupted or timed out";
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_set_error(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail, int soaperror)
-{ *soap_faultcode(soap) = faultcode;
-  *soap_faultstring(soap) = faultstring;
-  if (faultdetail && *faultdetail)
-  { register const char **s = soap_faultdetail(soap);
-    if (s)
-      *s = faultdetail;
-  }
-  return soap->error = soaperror;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
-{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail, soaperror);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
-{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail, soaperror);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail)
-{ char *s = NULL, *t = NULL;
-  if (faultstring)
-    s = soap_strdup(soap, faultstring);
-  if (faultdetail)
-    t = soap_strdup(soap, faultdetail);
-  return soap_set_error(soap, faultcode, s, t, SOAP_FAULT);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
-{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
-{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_print_fault(struct soap *soap, FILE *fd)
-{ if (soap->error)
-  { const char **s;
-    if (!*soap_faultcode(soap))
-      soap_set_fault(soap);
-    fprintf(fd, "SOAP FAULT: %s\n\"%s\"\n", *soap_faultcode(soap), *soap_faultstring(soap));
-    s = soap_faultdetail(soap);
-    if (s && *s)
-      fprintf(fd, "Detail: %s\n", *s);
-  }
-}
-#endif
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_print_fault_location(struct soap *soap, FILE *fd)
-{ 
-#ifndef WITH_LEAN
-  int c;
-  if (soap->error && soap->buflen > 0)
-  { if (soap->bufidx == 0)
-      soap->bufidx = 1;
-    c = soap->buf[soap->bufidx - 1];
-    soap->buf[soap->bufidx - 1] = '\0';
-    soap->buf[soap->buflen - 1] = '\0';
-    if (soap->bufidx < soap->buflen)
-      fprintf(fd, "%s%c\n** HERE **\n%s\n", soap->buf, c, soap->buf + soap->bufidx);
-    else
-      fprintf(fd, "%s%c\n** HERE **\n", soap->buf, c);
-  }
-#endif
-}
-#endif
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg)
-{ register struct soap_plugin *p;
-  register int r;
-  if (!(p = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin))))
-    return soap->error = SOAP_EOM;
-  p->id = NULL;
-  p->data = NULL;
-  p->fcopy = NULL;
-  p->fdelete = NULL;
-  r = fcreate(soap, p, arg);
-  if (!r && p->fdelete)
-  { p->next = soap->plugins;
-    soap->plugins = p;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id));
-    return SOAP_OK;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id?p->id:"?", r));
-  SOAP_FREE(p);
-  return r;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void *
-fplugin(struct soap *soap, const char *id)
-{ register struct soap_plugin *p;
-  for (p = soap->plugins; p; p = p->next)
-    if (p->id == id || !strcmp(p->id, id))
-      return p->data;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void *
-SOAP_FMAC2
-soap_lookup_plugin(struct soap *soap, const char *id)
-{ return soap->fplugin(soap, id);
-}
-#endif
-
-/******************************************************************************/
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/org.glite.lb.server/examples/stdsoap2_2.6.2.c b/org.glite.lb.server/examples/stdsoap2_2.6.2.c
deleted file mode 100644 (file)
index 78c4872..0000000
+++ /dev/null
@@ -1,11020 +0,0 @@
-/*
-
-stdsoap2.c[pp] 2.6.2
-
-Runtime environment.
-
-gSOAP XML Web services tools
-Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc. All Rights Reserved.
-
-Contributors:
-
-Wind River Systems, Inc., for the following additions (marked WR[...]):
-  - vxWorks compatible
-  - Support for IPv6.
-
---------------------------------------------------------------------------------
-gSOAP public license.
-
-The contents of this file are subject to the gSOAP Public License Version 1.3
-(the "License"); you may not use this file except in compliance with the
-License. You may obtain a copy of the License at
-http://www.cs.fsu.edu/~engelen/soaplicense.html
-Software distributed under the License is distributed on an "AS IS" basis,
-WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-for the specific language governing rights and limitations under the License.
-
-The Initial Developer of the Original Code is Robert A. van Engelen.
-Copyright (C) 2000-2004 Robert A. van Engelen, Genivia inc. All Rights Reserved.
---------------------------------------------------------------------------------
-GPL license.
-
-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
-
-Author contact information:
-engelen@genivia.com / engelen@acm.org
---------------------------------------------------------------------------------
-
-Installation note:
-
-Win32 build needs winsock.dll (Visual C++ "wsock32.lib")
-To do this in Visual C++ 6.0, go to "Project", "settings", select the "Link"
-tab (the project file needs to be selected in the file view) and add
-"wsock32.lib" to the "Object/library modules" entry
-
-*/
-
-#include "stdsoap2.h"
-
-#ifdef __cplusplus
-SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.6.2 2004-06-12 12:00:00 GMT")
-extern "C" {
-#else
-SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.6.2 2004-06-12 12:00:00 GMT")
-#endif
-
-/* 8bit character representing unknown/nonrepresentable character data (not supported by current locale) */
-#ifndef SOAP_UNKNOWN_CHAR
-#define SOAP_UNKNOWN_CHAR (127)
-#endif
-
-/*      EOF=-1 */
-#define LT (wchar)(-2) /* XML character '<' */
-#define TT (wchar)(-3) /* XML character '</' */
-#define GT (wchar)(-4) /* XML character '>' */
-#define QT (wchar)(-5) /* XML character '"' */
-#define AP (wchar)(-6) /* XML character ''' */
-
-#define soap_blank(c)          ((c) >= 0 && (c) <= 32)
-#define soap_notblank(c)       ((c) > 32)
-#define soap_hash_ptr(p)       (((unsigned long)(p) >> 3) & (SOAP_PTRHASH - 1))
-
-static int soap_isxdigit(int);
-static wchar soap_char(struct soap*);
-static wchar soap_getchunkchar(struct soap*);
-static void soap_update_ptrs(struct soap*, char*, char*, long);
-static int soap_has_copies(struct soap*, char*, char*);
-static struct soap_ilist *soap_hlookup(struct soap*, const char*);
-static void soap_init_iht(struct soap*);
-static void soap_free_iht(struct soap*);
-static void soap_init_pht(struct soap*);
-static void soap_free_pht(struct soap*);
-static int soap_set_error(struct soap*, const char*, const char*, const char*, int);
-static int soap_copy_fault(struct soap*, const char*, const char*, const char*);
-static int soap_getattrval(struct soap*, char*, size_t, wchar);
-static void soap_set_local_namespaces(struct soap*);
-static size_t soap_begin_dime(struct soap*);
-static int soap_isnumeric(struct soap*, const char*);
-static void *fplugin(struct soap*, const char*);
-
-#ifndef WITH_LEAN
-static time_t soap_timegm(struct tm*);
-static void soap_init_logs(struct soap*);
-static void soap_close_logfile(struct soap*, int);
-static void soap_set_logfile(struct soap*, int, const char*);
-#endif
-
-#ifdef WITH_FAST
-/* Use look-aside buffers */
-static int soap_append_lab(struct soap*, const char*, size_t);
-#endif
-
-#ifndef WITH_LEANER
-static int soap_putdimefield(struct soap*, const char*, size_t);
-static char *soap_getdimefield(struct soap*, size_t);
-#endif
-
-#ifdef WITH_GZIP
-static int soap_getgzipheader(struct soap*);
-#endif
-
-#ifdef WITH_OPENSSL
-static int ssl_auth_init(struct soap*);
-static int ssl_verify_callback(int, X509_STORE_CTX*);
-static int ssl_password(char*, int, int, void *);
-/* This callback is included for future references. It should not be deleted
-static DH *ssl_tmp_dh(SSL*, int, int);
-*/
-#endif
-
-static const char *soap_strerror(struct soap*);
-static const char *tcp_error(struct soap*);
-static const char *http_error(struct soap*, int);
-static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t);
-static int http_get(struct soap*);
-static int http_post_header(struct soap*, const char*, const char*);
-static int http_response(struct soap*, int, size_t);
-static int http_parse(struct soap*);
-static int http_parse_header(struct soap*, const char*, const char*);
-static int tcp_connect(struct soap*, const char*, const char*, int);
-static int tcp_accept(struct soap*, int, struct sockaddr*, int*);
-static int tcp_disconnect(struct soap*);
-static int fsend(struct soap*, const char*, size_t);
-static size_t frecv(struct soap*, char*, size_t);
-
-/* WR[ */
-#ifdef VXWORKS
-static int vx_nonblocking = TRUE; /* ioctl argument */
-#endif
-/* ]WR */
-
-#ifndef PALM_2
-static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/";
-static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/";
-static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope";
-static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding";
-static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc";
-#endif
-
-#ifndef PALM_1
-const struct soap_double_nan soap_double_nan = {0xFFFFFFFF, 0xFFFFFFFF};
-static const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-static const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63";
-#endif
-
-static const char soap_padding[3] = "\0\0";
-#define SOAP_STR_PADDING (soap_padding)
-#define SOAP_STR_EOS (soap_padding)
-
-#ifndef WITH_LEAN
-static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */
-{ { 160, "nbsp" },
-  { 161, "iexcl" },
-  { 162, "cent" },
-  { 163, "pound" },
-  { 164, "curren" },
-  { 165, "yen" },
-  { 166, "brvbar" },
-  { 167, "sect" },
-  { 168, "uml" },
-  { 169, "copy" },
-  { 170, "ordf" },
-  { 171, "laquo" },
-  { 172, "not" },
-  { 173, "shy" },
-  { 174, "reg" },
-  { 175, "macr" },
-  { 176, "deg" },
-  { 177, "plusmn" },
-  { 178, "sup2" },
-  { 179, "sup3" },
-  { 180, "acute" },
-  { 181, "micro" },
-  { 182, "para" },
-  { 183, "middot" },
-  { 184, "cedil" },
-  { 185, "sup1" },
-  { 186, "ordm" },
-  { 187, "raquo" },
-  { 188, "frac14" },
-  { 189, "frac12" },
-  { 190, "frac34" },
-  { 191, "iquest" },
-  { 192, "Agrave" },
-  { 193, "Aacute" },
-  { 194, "Acirc" },
-  { 195, "Atilde" },
-  { 196, "Auml" },
-  { 197, "Aring" },
-  { 198, "AElig" },
-  { 199, "Ccedil" },
-  { 200, "Egrave" },
-  { 201, "Eacute" },
-  { 202, "Ecirc" },
-  { 203, "Euml" },
-  { 204, "Igrave" },
-  { 205, "Iacute" },
-  { 206, "Icirc" },
-  { 207, "Iuml" },
-  { 208, "ETH" },
-  { 209, "Ntilde" },
-  { 210, "Ograve" },
-  { 211, "Oacute" },
-  { 212, "Ocirc" },
-  { 213, "Otilde" },
-  { 214, "Ouml" },
-  { 215, "times" },
-  { 216, "Oslash" },
-  { 217, "Ugrave" },
-  { 218, "Uacute" },
-  { 219, "Ucirc" },
-  { 220, "Uuml" },
-  { 221, "Yacute" },
-  { 222, "THORN" },
-  { 223, "szlig" },
-  { 224, "agrave" },
-  { 225, "aacute" },
-  { 226, "acirc" },
-  { 227, "atilde" },
-  { 228, "auml" },
-  { 229, "aring" },
-  { 230, "aelig" },
-  { 231, "ccedil" },
-  { 232, "egrave" },
-  { 233, "eacute" },
-  { 234, "ecirc" },
-  { 235, "euml" },
-  { 236, "igrave" },
-  { 237, "iacute" },
-  { 238, "icirc" },
-  { 239, "iuml" },
-  { 240, "eth" },
-  { 241, "ntilde" },
-  { 242, "ograve" },
-  { 243, "oacute" },
-  { 244, "ocirc" },
-  { 245, "otilde" },
-  { 246, "ouml" },
-  { 247, "divide" },
-  { 248, "oslash" },
-  { 249, "ugrave" },
-  { 250, "uacute" },
-  { 251, "ucirc" },
-  { 252, "uuml" },
-  { 253, "yacute" },
-  { 254, "thorn" },
-  { 255, "yuml" },
-  {   0, NULL }
-};
-#endif
-
-#ifndef WITH_LEAN
-static const struct soap_code_map h_error_codes[] =
-{
-#ifdef HOST_NOT_FOUND   
-  { HOST_NOT_FOUND, "Host not found" },
-#endif
-#ifdef TRY_AGAIN
-  { TRY_AGAIN, "Try Again" },
-#endif
-#ifdef NO_RECOVERY  
-  { NO_RECOVERY, "No Recovery" },
-#endif
-#ifdef NO_DATA
-  { NO_DATA, "No Data" },
-#endif
-#ifdef NO_ADDRESS
-  { NO_ADDRESS, "No Address" },
-#endif
-  { 0, NULL }
-};
-#endif
-
-#ifndef WITH_LEAN
-static const struct soap_code_map h_http_error_codes[] =
-{ { 201, "Created" },
-  { 202, "Accepted" },
-  { 203, "Non-Authoritative Information" },
-  { 204, "No Content" },
-  { 205, "Reset Content" },
-  { 206, "Partial Content" },
-  { 300, "Multiple Choices" },
-  { 301, "Moved Permanently" },
-  { 302, "Found" },
-  { 303, "See Other" },
-  { 304, "Not Modified" },
-  { 305, "Use Proxy" },
-  { 307, "Temporary Redirect" },
-  { 400, "Bad Request" },
-  { 401, "Unauthorized" },
-  { 402, "Payment Required" },
-  { 403, "Forbidden" },
-  { 404, "Not Found" },
-  { 405, "Method Not Allowed" },
-  { 406, "Not Acceptable" },
-  { 407, "Proxy Authentication Required" },
-  { 408, "Request Time-out" },
-  { 409, "Conflict" },
-  { 410, "Gone" },
-  { 411, "Length Required" },
-  { 412, "Precondition Failed" },
-  { 413, "Request Entity Too Large" },
-  { 414, "Request-URI Too Large" },
-  { 415, "Unsupported Media Type" },
-  { 416, "Requested range not satisfiable" },
-  { 417, "Expectation Failed" },
-  { 500, "Internal Server Error" },
-  { 501, "Not Implemented" },
-  { 502, "Bad Gateway" },
-  { 503, "Service Unavailable" },
-  { 504, "Gateway Time-out" },
-  { 505, "HTTP Version not supported" },
-  {   0, NULL }
-};
-#endif
-
-#ifdef WITH_OPENSSL
-static const struct soap_code_map h_ssl_error_codes[] =
-{
-#define _SSL_ERROR(e) { e, #e }
-  _SSL_ERROR(SSL_ERROR_SSL),
-  _SSL_ERROR(SSL_ERROR_ZERO_RETURN),
-  _SSL_ERROR(SSL_ERROR_WANT_READ),
-  _SSL_ERROR(SSL_ERROR_WANT_WRITE),
-  _SSL_ERROR(SSL_ERROR_WANT_CONNECT),
-  _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP),
-  _SSL_ERROR(SSL_ERROR_SYSCALL),
-  { 0, NULL }
-};
-#endif
-
-#ifdef WIN32
-static int tcp_done = 0;
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-fsend(struct soap *soap, const char *s, size_t n)
-{ register int nwritten;
-#if defined(__cplusplus) && !defined(UNDER_CE)
-  if (soap->os)
-  { soap->os->write(s, n);
-    if (soap->os->good())
-      return SOAP_OK;
-    return SOAP_EOF;
-  }
-#endif
-  while (n)
-  { if (soap_valid_socket(soap->socket))
-    { 
-#ifndef WITH_LEAN
-      if (soap->send_timeout)
-      { struct timeval timeout;
-        fd_set fd;
-        if (soap->send_timeout > 0)
-        { timeout.tv_sec = soap->send_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->send_timeout/1000000;
-          timeout.tv_usec = -soap->send_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        for (;;)
-        { register int r = select((SOAP_SOCKET)(soap->socket + 1), NULL, &fd, &fd, &timeout);
-          if (r > 0)
-            break;
-          if (!r)
-          { soap->errnum = 0;
-            return SOAP_EOF;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            return SOAP_EOF;
-          }
-        }
-      }
-#endif
-#ifdef WITH_OPENSSL
-      if (soap->ssl)
-        nwritten = SSL_write(soap->ssl, s, n);
-      else
-#endif
-#ifndef PALM
-        nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
-#else
-        nwritten = send((SOAP_SOCKET)soap->socket, (void*)s, n, soap->socket_flags);
-#endif
-      if (nwritten <= 0)
-      {
-#ifdef WITH_OPENSSL
-       int err;
-        if (soap->ssl && (err = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-          return SOAP_EOF;
-#endif
-        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EWOULDBLOCK && soap_socket_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_socket_errno;
-          return SOAP_EOF;
-        }
-        nwritten = 0; /* and call write() again */
-      }
-    }
-    else
-    {
-#ifdef WITH_FASTCGI
-      nwritten = fwrite((void*)s, 1, n, stdout);
-      fflush(stdout);
-#else
-#ifdef UNDER_CE
-      nwritten = fwrite(s, 1, n, soap->sendfd);
-#else
-/* WR[ */
-#ifdef VXWORKS
-#ifdef WMW_RPM_IO
-      if (soap->rpmreqid)
-          {
-          httpBlockPut(soap->rpmreqid, s, n); 
-          nwritten = n;
-          }
-      else
-          {
-          nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
-          }
-#else
-      nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
-#endif /* WMW_RPM_IO */
-#else
-/* ]WR */
-      nwritten = write((SOAP_SOCKET)soap->sendfd, s, n);
-/* WR[ */
-#endif
-/* ]WR */
-#endif
-#endif
-      if (nwritten <= 0)
-      { if (soap_errno != SOAP_EINTR && soap_errno != SOAP_EWOULDBLOCK && soap_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_errno;
-          return SOAP_EOF;
-        }
-        nwritten = 0; /* and call write() again */
-      }
-    }
-    n -= nwritten;
-    s += nwritten;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_flush_raw(struct soap *soap, const char *s, size_t n)
-{ 
-#ifndef WITH_LEAN
-  if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-  { char *t;
-    if (!(t = (char*)soap_push_block(soap, n)))
-      return soap->error = SOAP_EOM;
-    memcpy(t, s, n);
-    return SOAP_OK;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-  { char t[16];
-    sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n);
-    DBGMSG(SENT, t, strlen(t));
-    if ((soap->error = soap->fsend(soap, t, strlen(t))))
-      return soap->error;
-    soap->chunksize += n;
-  }
-#endif
-  DBGMSG(SENT, s, n);
-  return soap->error = soap->fsend(soap, s, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_flush(struct soap *soap)
-{ if (soap->bufidx)
-  {
-#ifdef WITH_ZLIB
-    if (soap->mode & SOAP_ENC_ZLIB)
-    { soap->d_stream.next_in = (Byte*)soap->buf;
-      soap->d_stream.avail_in = (unsigned int)soap->bufidx;
-#ifdef WITH_GZIP
-      soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->bufidx);
-#endif
-      do
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream.avail_in));
-        if (deflate(&soap->d_stream, Z_NO_FLUSH) != Z_OK)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-          return soap->error = SOAP_ZLIB_ERROR;
-        }
-        if (!soap->d_stream.avail_out)
-        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN))
-            return soap->error;
-          soap->d_stream.next_out = (Byte*)soap->z_buf;
-          soap->d_stream.avail_out = SOAP_BUFLEN;
-        }
-      } while (soap->d_stream.avail_in);
-    }
-    else
-#endif
-    if (soap_flush_raw(soap, soap->buf, soap->bufidx))
-      return soap->error;
-    soap->bufidx = 0;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send_raw(struct soap *soap, const char *s, size_t n)
-{ if (!n)
-    return SOAP_OK;
-  if (soap->mode & SOAP_IO_LENGTH)
-  { soap->count += n;
-    if (soap->fprepare)
-      return soap->fprepare(soap, s, n);
-    return SOAP_OK;
-  }
-  if (soap->mode & SOAP_IO)
-  { register size_t i = SOAP_BUFLEN - soap->bufidx;
-    while (n >= i)
-    { memcpy(soap->buf + soap->bufidx, s, i);
-      soap->bufidx = SOAP_BUFLEN;
-      if (soap_flush(soap))
-        return soap->error;
-      s += i;
-      n -= i;
-      i = SOAP_BUFLEN;
-    }
-    memcpy(soap->buf + soap->bufidx, s, n);
-    soap->bufidx += n;
-    return SOAP_OK;
-  }
-  return soap_flush_raw(soap, s, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send(struct soap *soap, const char *s)
-{ if (s)
-    return soap_send_raw(soap, s, strlen(s));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static size_t
-frecv(struct soap *soap, char *s, size_t n)
-{ register int r;
-  soap->errnum = 0;
-#if defined(__cplusplus) && !defined(UNDER_CE)
-  if (soap->is)
-  { if (soap->is->good())
-      return soap->is->read(s, n).gcount();
-    return 0;
-  }
-#endif
-  if (soap_valid_socket(soap->socket))
-  { for (;;)
-    { 
-#ifndef WITH_LEAN
-      struct timeval timeout;
-      fd_set fd;
-      if (soap->recv_timeout)
-      { if (soap->recv_timeout > 0)
-        { timeout.tv_sec = soap->recv_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->recv_timeout/1000000;
-          timeout.tv_usec = -soap->recv_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        for (;;)
-        { r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-          if (r > 0)
-            break;
-          if (r == 0)
-            return 0;
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            return 0;
-          }
-        }
-      }
-#endif
-#ifdef WITH_OPENSSL
-      if (soap->ssl)
-      { int err;
-       r = SSL_read(soap->ssl, s, n);
-        if ((err = SSL_get_error(soap->ssl, r)) == SSL_ERROR_NONE)
-          return (size_t)r;
-       if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-          return 0;
-      }
-      else
-#endif
-      { r = recv((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
-        if (r >= 0)
-          return (size_t)r;
-        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_socket_errno;
-          return 0;
-        }
-      }
-#ifndef WITH_LEAN
-      { struct timeval timeout;
-        fd_set fd;
-        timeout.tv_sec = 0;
-        timeout.tv_usec = 10000;
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-        if (r < 0 && soap_socket_errno != SOAP_EINTR)
-        { soap->errnum = soap_socket_errno;
-          return 0;
-        }
-      }
-#endif
-    }
-  }
-#ifdef WITH_FASTCGI
-  return fread(s, 1, n, stdin);
-#else
-#ifdef UNDER_CE
-  return fread(s, 1, n, soap->recvfd);
-#else
-/* WR[ */
-#ifdef WMW_RPM_IO
-  if (soap->rpmreqid)
-      {
-      r = httpBlockRead(soap->rpmreqid, s, n);
-      }
-  else
-      {
-      r = read(soap->recvfd, s, n);
-      }
-  if (r >= 0)
-  {
-    return r;
-  }
-  return 0;
-#else
-/* ]WR */
-  r = read((SOAP_SOCKET)soap->recvfd, s, n);
-  if (r >= 0)
-    return (size_t)r;
-  soap->errnum = soap_errno;
-  return 0;
-/* WR[ */
-#endif
-/* ]WR */
-#endif
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static wchar
-soap_getchunkchar(struct soap *soap)
-{ if (soap->bufidx < soap->buflen)
-    return soap->buf[soap->bufidx++];
-  soap->bufidx = 0;
-  soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)soap->buflen));
-  DBGMSG(RECV, soap->buf, soap->buflen);
-  if (soap->buflen)
-    return soap->buf[soap->bufidx++];
-  return EOF;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_isxdigit(int c)
-{ switch (c)
-  { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
-    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-      return 1;
-  }
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_raw(struct soap *soap)
-{ register size_t ret;
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { if (soap->d_stream.next_out == Z_NULL)
-      return EOF;
-    if (soap->d_stream.avail_in || !soap->d_stream.avail_out)
-    { register int r;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n"));
-      soap->d_stream.next_out = (Byte*)soap->buf;
-      soap->d_stream.avail_out = SOAP_BUFLEN;
-      r = inflate(&soap->d_stream, Z_NO_FLUSH);
-      if (r == Z_OK || r == Z_STREAM_END)
-      { soap->bufidx = 0;
-        soap->buflen = SOAP_BUFLEN - soap->d_stream.avail_out;
-        if (soap->zlib_in == SOAP_ZLIB_GZIP)
-          soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
-        if (r == Z_STREAM_END)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-          soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
-          soap->d_stream.next_out = Z_NULL;
-        }
-        if (soap->buflen)
-        { soap->count += soap->buflen;
-          return SOAP_OK;
-        }
-      }
-      else if (r != Z_BUF_ERROR)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-        soap->d_stream.next_out = Z_NULL;
-        return EOF;
-      }
-    }
-zlib_again:
-    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize)
-    { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
-      soap->buflen = soap->z_buflen;
-    }
-  }
-#endif
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */
-  { 
-chunk_again:
-    if (soap->chunksize)
-    { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));
-      DBGMSG(RECV, soap->buf, ret);
-      soap->bufidx = 0;
-      soap->chunksize -= ret;
-    }
-    else
-    { register wchar c;
-      char tmp[8], *t;
-      t = tmp;
-      if (!soap->chunkbuflen)
-      { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
-        DBGMSG(RECV, soap->buf, ret);
-        soap->bufidx = 0;
-        if (!ret)
-          return EOF;
-      }
-      else
-        soap->bufidx = soap->buflen;
-      soap->buflen = soap->chunkbuflen;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (%u %u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));
-      while (!soap_isxdigit((int)(c = soap_getchunkchar(soap))))
-        if ((int)c == EOF)
-         return EOF;
-      do
-        *t++ = (char)c;
-      while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && t - tmp < 7);
-      while ((int)c != EOF && c != '\n')
-        c = soap_getchunkchar(soap);
-      if ((int)c == EOF)
-        return EOF;
-      *t = '\0';
-      soap->chunksize = soap_strtoul(tmp, &t, 16);
-      if (!soap->chunksize)
-      { soap->chunkbuflen = 0;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n"));
-       while ((int)c != EOF && c != '\n')
-          c = soap_getchunkchar(soap);
-        return EOF;
-      }
-      soap->buflen = soap->bufidx + soap->chunksize;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to %u (%u %s)\n", (unsigned int)soap->buflen, (unsigned int)soap->bufidx, tmp));
-      if (soap->buflen > soap->chunkbuflen)
-      { soap->buflen = soap->chunkbuflen;
-        soap->chunksize -= soap->buflen - soap->bufidx;
-        soap->chunkbuflen = 0;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%lu bytes left)\n", (unsigned long)(soap->buflen - soap->bufidx)));
-      }
-      else if (soap->chunkbuflen)
-        soap->chunksize = 0;
-      ret = soap->buflen - soap->bufidx;
-      if (!ret)
-        goto chunk_again;
-    }
-  }
-  else
-  { soap->bufidx = 0;
-    soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
-    DBGMSG(RECV, soap->buf, ret);
-  }
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { int r;
-    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-    soap->d_stream.avail_in = (unsigned int)ret;
-    soap->d_stream.next_out = (Byte*)soap->buf;
-    soap->d_stream.avail_out = SOAP_BUFLEN;
-    r = inflate(&soap->d_stream, Z_NO_FLUSH);
-    if (r == Z_OK || r == Z_STREAM_END)
-    { soap->bufidx = 0;
-      soap->z_buflen = soap->buflen;
-      soap->buflen = ret = SOAP_BUFLEN - soap->d_stream.avail_out;
-      if (soap->zlib_in == SOAP_ZLIB_GZIP)
-        soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)ret));
-      if (!ret)
-        goto zlib_again;
-      if (r == Z_STREAM_END)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-        soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
-        soap->d_stream.next_out = Z_NULL;
-      }
-    }
-    else
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream.msg?soap->d_stream.msg:""));
-      soap->d_stream.next_out = Z_NULL;
-      return EOF;
-    }
-  }
-#endif
-  soap->count += ret;
-  return !ret;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-  { if (soap->dime_buflen)
-    { char *s;
-      int i;
-      unsigned char tmp[12];
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n"));
-      soap->count += soap->dime_buflen - soap->buflen;
-      soap->buflen = soap->dime_buflen;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime_size&3));
-      for (i = -(long)soap->dime_size&3; i > 0; i--)
-      { soap->bufidx++;
-        if (soap->bufidx >= soap->buflen)
-          if (soap_recv_raw(soap))
-            return EOF;
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n"));
-      s = (char*)tmp;
-      for (i = 12; i > 0; i--)
-      { *s++ = soap->buf[soap->bufidx++];
-        if (soap->bufidx >= soap->buflen)
-          if (soap_recv_raw(soap))
-            return EOF;
-      }
-      soap->dime_flags = tmp[0] & 0x7;
-      soap->dime_size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime_size));
-      if (soap->dime_flags & SOAP_DIME_CF)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n"));
-        soap->dime_chunksize = soap->dime_size;
-        if (soap->buflen - soap->bufidx >= soap->dime_size)
-        { soap->dime_buflen = soap->buflen;
-          soap->buflen = soap->bufidx + soap->dime_chunksize;
-        }
-        else
-          soap->dime_chunksize -= soap->buflen - soap->bufidx;
-      }
-      else
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n"));
-        soap->dime_buflen = 0;
-        soap->dime_chunksize = 0;
-      }
-      soap->count = soap->buflen - soap->bufidx;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count));
-      return SOAP_OK;
-    }
-    if (soap->dime_chunksize)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime_chunksize));
-      if (soap_recv_raw(soap))
-        return EOF;
-      if (soap->buflen - soap->bufidx >= soap->dime_chunksize)
-      { soap->dime_buflen = soap->buflen;
-        soap->count -= soap->buflen - soap->bufidx - soap->dime_chunksize;
-        soap->buflen = soap->bufidx + soap->dime_chunksize;
-      }
-      else
-        soap->dime_chunksize -= soap->buflen - soap->bufidx;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%u\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned int)soap->count));
-      return SOAP_OK;
-    }
-  }
-#endif
-  return soap_recv_raw(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_getchar(struct soap *soap)
-{ register wchar c;
-  if (soap->ahead)
-  { c = soap->ahead;
-    soap->ahead = 0;
-    return c;
-  }
-  return soap_get1(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const struct soap_code_map*
-SOAP_FMAC2
-soap_code(const struct soap_code_map *map, const char *str)
-{ while (map->string)
-  { if (!strcmp(str, map->string))
-      return map;
-    map++;
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_int_code(const struct soap_code_map *map, const char *str, long other)
-{ while (map->string)
-  { if (!strcmp(str, map->string))
-      return map->code;
-    map++;
-  }
-  return other;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_str_code(const struct soap_code_map *map, long code)
-{ while (map->code != code && map->string)
-    map++;
-  return map->string;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static wchar
-soap_char(struct soap *soap)
-{ char tmp[8];
-  register int i;
-  register wchar c;
-  register char *s = tmp;
-  for (i = 0; i < 7; i++)
-  { c = soap_get1(soap);
-    if (c == ';' || (int)c == EOF)
-      break;
-    *s++ = (char)c;
-  }
-  *s = '\0';
-  if (*tmp == '#')
-  { if (tmp[1] == 'x' || tmp[1] == 'X')
-      return soap_strtol(tmp + 2, NULL, 16);
-    return atol(tmp + 1);
-  }
-  if (!strcmp(tmp, "lt"))
-    return '<';
-  if (!strcmp(tmp, "gt"))
-    return '>';
-  if (!strcmp(tmp, "amp"))
-    return '&';
-  if (!strcmp(tmp, "quot"))
-    return '"';
-  if (!strcmp(tmp, "apos"))
-    return '\'';
-#ifndef WITH_LEAN
-  return (wchar)soap_int_code(html_entity_codes, tmp, 127);
-#else
-  return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_get(struct soap *soap)
-{ register wchar c;
-  c = soap->ahead;
-  if (c)
-    soap->ahead = 0;
-  else
-    c = soap_get1(soap);
-  for (;;)
-  { if (soap->cdata)
-    { if (c == ']')
-      { c = soap_get1(soap);
-        if (c == ']')
-        { soap->cdata = 0;
-          soap_get1(soap); /* skip > */
-          c = soap_get1(soap);
-        }
-       else
-        { soap_revget1(soap);
-          return ']';
-        }
-      }
-      else
-        return c;
-    }
-    switch (c)
-    { case '<':
-        do c = soap_get1(soap);
-        while (soap_blank(c));
-        if (c == '!' || c == '?' || c == '%')
-        { if (c == '!')
-          { c = soap_get1(soap);
-            if (c == '[')
-            { do c = soap_get1(soap);
-              while ((int)c != EOF && c != '[');
-              if ((int)c == EOF)
-                break;
-              soap->cdata = 1;
-              c = soap_get1(soap);
-             continue;
-            }
-            if (c == '-' && (c = soap_get1(soap)) == '-')
-            { do
-              { c = soap_get1(soap);
-                if (c == '-' && (c = soap_get1(soap)) == '-')
-                  break;
-              } while ((int)c != EOF);
-            }
-          }
-          while ((int)c != EOF && c != '>')
-            c = soap_get1(soap);
-         if ((int)c == EOF)
-           break;
-          c = soap_get1(soap);
-          continue;
-        }
-        if (c == '/')
-          return TT;
-        soap_revget1(soap);
-        return LT;
-      case '>':
-        return GT;
-      case '"':
-        return QT;
-      case '\'':
-        return AP;
-      case '&':
-        return soap_char(soap) | 0x80000000;
-    }
-    break;
-  }
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_advance(struct soap *soap)
-{ register wchar c;
-  while ((int)((c = soap_get(soap)) != EOF) && c != LT && c != TT)
-    ;
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_skip(struct soap *soap)
-{ register wchar c;
-  do c = soap_get(soap);
-  while (soap_blank(c));
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_move(struct soap *soap, long n)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %ld bytes forward\n", (long)n));
-  for (; n > 0; n--)
-    if ((int)soap_getchar(soap) == EOF)
-      return SOAP_EOF;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_tell(struct soap *soap)
-{ return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pututf8(struct soap *soap, register unsigned long c)
-{ char tmp[16];
-  if (c > 0 && c < 0x80)
-  { *tmp = (char)c;
-    return soap_send_raw(soap, tmp, 1);
-  }
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { register char *t = tmp;
-    if (c < 0x0800)
-      *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-    else
-    { if (c < 0x010000)
-        *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-      else
-      { if (c < 0x200000)
-          *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-        else
-        { if (c < 0x04000000)
-            *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-          else
-          { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-            *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-          }
-          *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-        }     
-        *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-      }
-      *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-    }
-    *t++ = (char)(0x80 | (c & 0x3F));
-    *t = '\0';
-  }
-  else
-#endif
-    sprintf(tmp, "&#%lu;", c);
-  return soap_send(soap, tmp);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-wchar
-SOAP_FMAC2
-soap_getutf8(struct soap *soap)
-{ register wchar c, c1, c2, c3, c4;
-  c = soap_get(soap);
-  if (c < 0x80)
-    return c;
-  c1 = soap_get(soap);
-  if (c1 < 0x80)
-  { soap_unget(soap, c1);
-    return c;
-  }
-  c1 &= 0x3F;
-  if (c < 0xE0)
-    return ((wchar)(c & 0x1F) << 6) | c1;
-  c2 = (wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xF0)
-    return ((wchar)(c & 0x0F) << 12) | (c1 << 6) | c2;
-  c3 = (wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xF8)
-    return ((wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
-  c4 = (wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xFC)
-    return ((wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4;
-  return ((wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (wchar)(soap_get1(soap) & 0x3F);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_puthex(struct soap *soap, const unsigned char *s, int n)
-{ /* TODO: serialize to DOM (as an option) using new soap_s2hex() */
-  char d[2];
-  register int i;
-  for (i = 0; i < n; i++)
-  { register int m = *s++;
-    d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0'));
-    m &= 0x0F;
-    d[1] = (char)(m + (m > 9 ? '7' : '0'));
-    if (soap_send_raw(soap, d, 2))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-unsigned char*
-SOAP_FMAC2
-soap_gethex(struct soap *soap, int *n)
-{
-#ifdef WITH_FAST
-  soap->labidx = 0;
-  for (;;)
-  { register char *s;
-    register int i, k;
-    if (soap_append_lab(soap, NULL, 0))
-      return NULL;
-    s = soap->labbuf + soap->labidx;
-    k = soap->lablen - soap->labidx;
-    soap->labidx = soap->lablen;
-    for (i = 0; i < k; i++)
-    { register char d1, d2;
-      register wchar c;
-      c = soap_get(soap);
-      if (soap_isxdigit(c))
-      { d1 = (char)c;
-        c = soap_get(soap); 
-       if (soap_isxdigit(c))
-          d2 = (char)c;
-        else 
-        { soap->error = SOAP_TYPE;
-          return NULL;
-        }
-      }
-      else
-      { unsigned char *p;
-        soap_unget(soap, c);
-        if (n)
-          *n = (int)(soap->lablen - k + i);
-        p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i);
-       if (p)
-         memcpy(p, soap->labbuf, soap->lablen - k + i);
-        return p;
-      }
-      *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
-    }
-  }
-#else
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { register int i;
-    register char *s = (char*)soap_push_block(soap, SOAP_BLKLEN);
-    if (!s)
-    { soap_end_block(soap);
-      return NULL;
-    }
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { register char d1, d2;
-      register wchar c = soap_get(soap);
-      if (soap_isxdigit(c))
-      { d1 = (char)c;
-        c = soap_get(soap); 
-       if (soap_isxdigit(c))
-          d2 = (char)c;
-        else 
-        { soap_end_block(soap);
-         soap->error = SOAP_TYPE;
-          return NULL;
-        }
-      }
-      else
-      { unsigned char *p;
-        soap_unget(soap, c);
-        if (n)
-          *n = soap_size_block(soap, i);
-        p = (unsigned char*)soap_save_block(soap, NULL);
-        return p;
-      }
-      *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putbase64(struct soap *soap, const unsigned char *s, int n)
-{ register int i;
-  register unsigned long m;
-  char d[4];
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->data = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1);
-    return soap_s2base64(soap, s, soap->dom->data, n);
-  }
-#endif
-  if (!s)
-    return SOAP_OK;
-  for (; n > 2; n -= 3, s += 3)
-  { m = ((unsigned long)((unsigned char*)s)[0] << 16) | ((unsigned long)((unsigned char*)s)[1] << 8) | (unsigned long)((unsigned char*)s)[2];
-    for (i = 4; i > 0; m >>= 6)
-      d[--i] = soap_base64o[m & 0x3F];
-    if (soap_send_raw(soap, d, 4))
-      return soap->error;
-  }
-  if (n > 0)
-  { m = 0;
-    for (i = 0; i < n; i++)
-      m = (m << 8) | *s++;
-    for (; i < 3; i++)
-      m <<= 8;
-    for (i++; i > 0; m >>= 6)
-      d[--i] = soap_base64o[m & 0x3F];
-    for (i = 3; i > n; i--)
-      d[i] = '=';
-    if (soap_send_raw(soap, d, 4))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-unsigned char*
-SOAP_FMAC2
-soap_getbase64(struct soap *soap, int *n, int malloc_flag)
-{ 
-#ifdef WITH_FAST
-  soap->labidx = 0;
-  for (;;)
-  { register int i, k;
-    register char *s;
-    if (soap_append_lab(soap, NULL, 2))
-      return NULL;
-    s = soap->labbuf + soap->labidx;
-    k = 3 * ((soap->lablen - soap->labidx) / 3);
-    soap->labidx = 3 * (soap->lablen / 3);
-    if (!s)
-      return NULL;
-    for (i = 0; i < k; i += 3)
-    { register unsigned long m = 0;
-      register int j = 0;
-      do
-      { register wchar c = soap_get(soap);
-        if (c == '=' || c < 0)
-        { unsigned char *p;
-          switch (j)
-          { case 2:
-              *s++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *s++ = (char)((m >> 10) & 0xFF);
-              *s++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-            *n = (int)(soap->lablen - k + i);
-          p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i);
-         if (p)
-           memcpy(p, soap->labbuf, soap->lablen - k + i);
-          if (c >= 0)
-          { while ((int)((c = soap_get(soap)) != EOF) && c != LT && c != TT)
-              ;
-         }
-          soap_unget(soap, c);
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      } while (j < 4);
-      *s++ = (char)((m >> 16) & 0xFF);
-      *s++ = (char)((m >> 8) & 0xFF);
-      *s++ = (char)(m & 0xFF);
-    }
-  }
-#else
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { register int i;
-    register char *s = (char*)soap_push_block(soap, 3 * SOAP_BLKLEN); /* must be multiple of 3 */
-    if (!s)
-    { soap_end_block(soap);
-      return NULL;
-    }
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { register unsigned long m = 0;
-      register int j = 0;
-      do
-      { register wchar c = soap_get(soap);
-        if (c == '=' || c < 0)
-        { unsigned char *p;
-          i *= 3;
-          switch (j)
-          { case 2:
-              *s++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *s++ = (char)((m >> 10) & 0xFF);
-              *s++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-           *n = (int)soap_size_block(soap, i);
-          p = (unsigned char*)soap_save_block(soap, NULL);
-          if (c >= 0)
-          { while ((int)((c = soap_get(soap)) != EOF) && c != LT && c != TT)
-              ;
-         }
-          soap_unget(soap, c);
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      } while (j < 4);
-      *s++ = (char)((m >> 16) & 0xFF);
-      *s++ = (char)((m >> 8) & 0xFF);
-      *s++ = (char)(m & 0xFF);
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_strdup(struct soap *soap, const char *s)
-{ char *t = NULL;
-  if (s && (t = (char*)soap_malloc(soap, strlen(s) + 1)))
-    strcpy(t, s);
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_new_block(struct soap *soap)
-{ struct soap_blist *p;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist));
-  if (!(p = (struct soap_blist*)SOAP_MALLOC(sizeof(struct soap_blist))))
-    return SOAP_EOM;   
-  p->next = soap->blist; 
-  p->ptr = NULL;
-  p->size = 0;
-  soap->blist = p;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_push_block(struct soap *soap, size_t n)
-{ char *p;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)soap->blist->size));
-  if (!(p = (char*)SOAP_MALLOC(n + sizeof(char*) + sizeof(size_t))))
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  *(char**)p = soap->blist->ptr;
-  *(size_t*)(p + sizeof(char*)) = n;
-  soap->blist->ptr = p;
-  soap->blist->size += n;
-  return p + sizeof(char*) + sizeof(size_t);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_pop_block(struct soap *soap)
-{ char *p;
-  if (!soap->blist->ptr)
-    return;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n"));
-  p = soap->blist->ptr;
-  soap->blist->size -= *(size_t*)(p + sizeof(char*));
-  soap->blist->ptr = *(char**)p;
-  SOAP_FREE(p);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_update_ptrs(struct soap *soap, char *start, char *end, long offset)
-{ int i;
-  register struct soap_ilist *ip;
-  register void *p, **q;
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end)
-        ip->ptr = (char*)ip->ptr + offset;
-      for (q = &ip->link; q; q = (void**)p)
-      { p = *q;
-        if (p && (char*)p >= start && (char*)p < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p));
-          *q = (char*)p + offset;
-        }
-      }
-      for (q = &ip->copy; q; q = (void**)p)
-      { p = *q;
-        if (p && (char*)p >= start && (char*)p < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy update id='%s' %p\n", ip->id, p));
-          *q = (char*)p + offset;
-        }
-      }
-    }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_has_copies(struct soap *soap, register char *start, register char *end)
-{ int i;
-  register struct soap_ilist *ip;
-  register char *p;
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-      for (p = (char*)ip->copy; p; p = *(char**)p)
-        if (p >= start && p < end)
-          return SOAP_ERR;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_resolve(struct soap *soap)
-{ register int i;
-  register struct soap_ilist *ip;
-  short flag1 = 0, flag2;
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->ptr)
-        soap_resolve_ptr(ip);
-      else if (*ip->id == '#')
-        flag1 = 1;
-    }
-  do
-  { flag2 = 0;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n"));
-    for (i = 0; i < SOAP_IDHASH; i++)
-      for (ip = soap->iht[i]; ip; ip = ip->next)
-        if (ip->copy && ip->ptr && ip->size)
-          if (!soap_has_copies(soap, (char*)ip->ptr, (char*)ip->ptr + ip->size))
-          { register void *p, **q = (void**)ip->copy;
-            DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id));
-            ip->copy = NULL;
-            do
-            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size));
-             p = *q;
-              memcpy(q, ip->ptr, ip->size);
-              q = (void**)p;
-            } while (q);
-           flag2 = 1;
-         }
-  } while (flag2);
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-    { register struct soap_flist *fp;
-      for (fp = ip->flist; fp; fp = fp->next)
-        if (fp->finsert)
-        { unsigned int k = fp->level;
-         void *p = ip->ptr;
-          DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded container data type=%d location=%p level=%u,%u\n", fp->type, fp->ptr, ip->level, fp->level));
-         while (ip->level < k)
-          { void **q = (void**)soap_malloc(soap, sizeof(void*));  
-           if (!q)
-             return SOAP_EOM;
-           *q = p;
-            p = (void*)q;
-            k--;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-          }
-         fp->finsert(soap, fp->type, fp->ptr, p);
-        }
-    }
-  if (flag1)
-    return soap->error = SOAP_MISSING_ID;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_resolve_ptr(struct soap_ilist *ip)
-{ register void *p, **q, *r;
-  q = (void**)ip->link;
-  ip->link = NULL;
-  r = ip->ptr;
-  while (q)
-  { p = *q;
-    *q = r;
-    q = (void**)p;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_size_block(struct soap *soap, size_t n)
-{ if (soap->blist->ptr)
-  { soap->blist->size -= *(size_t*)(soap->blist->ptr + sizeof(char*)) - n;
-    *(size_t*)(soap->blist->ptr + sizeof(char*)) = n;
-  }
-  return soap->blist->size;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_first_block(struct soap *soap)
-{ char *p, *q, *r;
-  p = soap->blist->ptr;
-  if (!p)
-    return NULL;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block\n"));
-  r = NULL;
-  do
-  { q = *(char**)p;
-    *(char**)p = r;
-    r = p;
-    p = q;
-  } while (p);
-  soap->blist->ptr = r;
-  return r + sizeof(char*) + sizeof(size_t);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_next_block(struct soap *soap)
-{ char *p;
-  p = soap->blist->ptr;
-  if (p)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n"));
-    soap->blist->ptr = *(char**)p;
-    SOAP_FREE(p);
-    if (soap->blist->ptr)
-      return soap->blist->ptr + sizeof(char*) + sizeof(size_t);
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_block_size(struct soap *soap)
-{ return *(size_t*)(soap->blist->ptr + sizeof(char*));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_end_block(struct soap *soap)
-{ struct soap_blist *bp;
-  char *p, *q;
-  bp = soap->blist;
-  if (bp)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n"));
-    for (p = bp->ptr; p; p = q)
-    { q = *(char**)p;
-      SOAP_FREE(p);
-    }
-    soap->blist = bp->next;
-    SOAP_FREE(bp);
-  }
-  DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n"));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_save_block(struct soap *soap, char *p)
-{ register size_t n;
-  register char *q, *s;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)soap->blist->size, soap->blist->ptr, p));
-  if (soap->blist->size)
-  { if (!p)
-      p = (char*)soap_malloc(soap, soap->blist->size);
-    if (p)
-      for (s = p, q = soap_first_block(soap); q; q = soap_next_block(soap))
-      { n = soap_block_size(soap);
-        soap_update_ptrs(soap, q, q + n, (long)s - (long)q); /* pointers s and q may or may not be related */
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s));
-        memcpy(s, q, n);
-        s += n;
-      } 
-    else
-      soap->error = SOAP_EOM;
-  }
-  soap_end_block(soap);
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_store_block(struct soap *soap, char *p)
-{ p = soap_save_block(soap, p);
-  if (!soap->blist)
-  { struct soap_ilist *ip;
-    int i;
-    for (i = 0; i < SOAP_IDHASH; i++)
-      for (ip = soap->iht[i]; ip; ip = ip->next)
-        if (ip->ptr)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolve link chain to point to %p\n", ip->ptr));
-          soap_resolve_ptr(ip);
-        }
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsize(struct soap *soap, const char *type, int size)
-{ return soap_putsizes(soap, type, &size, 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsizes(struct soap *soap, const char *type, const int *size, int dim)
-{ return soap_putsizesoffsets(soap, type, size, NULL, dim);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim)
-{ int i;
-  if (!type)
-    return NULL;
-  if (soap->version == 2)
-  { sprintf(soap->type, "%s[%d", type, size[0]);
-    for (i = 1; i < dim; i++)
-      sprintf(soap->type + strlen(soap->type), " %d", size[i]);
-  }
-  else
-  { if (offset)
-    { sprintf(soap->type, "%s[%d", type, size[0] + offset[0]);
-      for (i = 1; i < dim; i++)
-        sprintf(soap->type + strlen(soap->type), ",%d", size[i] + offset[i]);
-    }
-    else
-    { sprintf(soap->type, "%s[%d", type, size[0]);
-      for (i = 1; i < dim; i++)
-        sprintf(soap->type + strlen(soap->type), ",%d", size[i]);
-    }
-    strcat(soap->type, "]");
-  }
-  return soap->type;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putoffset(struct soap *soap, int offset)
-{ return soap_putoffsets(soap, &offset, 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putoffsets(struct soap *soap, const int *offset, int dim)
-{ register int i;
-  sprintf(soap->arrayOffset, "[%d", offset[0]);
-  for (i = 1; i < dim; i++)
-    sprintf(soap->arrayOffset + strlen(soap->arrayOffset), ",%d", offset[i]);
-  strcat(soap->arrayOffset, "]");
-  return soap->arrayOffset;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_size(const int *size, int dim)
-{ register int i, n = size[0];
-  for (i = 1; i < dim; i++)
-    n *= size[i];
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getoffsets(const char *attr, const int *size, int *offset, int dim)
-{ register int i, j = 0;
-  if (offset)
-    for (i = 0; i < dim && attr && *attr; i++)
-    { attr++;
-      j *= size[i];
-      j += offset[i] = (int)atol(attr);
-      attr = strchr(attr, ',');
-    }
-  else
-    for (i = 0; i < dim && attr && *attr; i++)
-    { attr++;
-      j *= size[i];
-      j += (int)atol(attr);
-      attr = strchr(attr, ',');
-    }
-  return j;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getsize(const char *attr1, const char *attr2, int *j)
-{ register int n, k;
-  char *s;
-  *j = 0;
-  if (!*attr1)
-    return -1;
-  n = 1;
-  do
-  { attr1++;
-    k = (int)soap_strtol(attr1, &s, 10);
-    n *= k;
-    if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1)
-      return -1;
-    attr1 = strchr(s, ',');
-    if (!attr1)
-      attr1 = strchr(s, ' ');
-    if (attr2 && *attr2)
-    { attr2++;
-      *j *= k;
-      k = (int)soap_strtol(attr2, &s, 10);
-      *j += k;
-      if (k < 0)
-        return -1;
-      attr2 = s;
-    }
-  } while (attr1 && *attr1 != ']');
-  return n - *j;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getsizes(const char *attr, int *size, int dim)
-{ register int i, k, n;
-  if (!*attr)
-    return -1;
-  i = strlen(attr);
-  n = 1;
-  do
-  { for (i = i-1; i >= 0; i--)
-      if (attr[i] == '[' || attr[i] == ',' || attr[i] == ' ')
-        break;
-    k = (int)atol(attr + i + 1);
-    n *= size[--dim] = k;
-    if (k < 0 || n > SOAP_MAXARRAYSIZE)
-      return -1;
-  } while (i >= 0 && attr[i] != '[');
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getposition(const char *attr, int *pos)
-{ register int i, n;
-  if (!*attr)
-    return -1;
-  n = 0;
-  i = 1;
-  do
-  { pos[n++] = (int)atol(attr + i);
-    while (attr[i] && attr[i] != ',' && attr[i] != ']')
-      i++;
-    if (attr[i] == ',')
-      i++;
-  } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']');
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_push_namespace(struct soap *soap, const char *id, const char *ns)
-{ register struct soap_nlist *np;
-  register struct Namespace *p;
-  np = (struct soap_nlist*)SOAP_MALLOC(sizeof(struct soap_nlist) + strlen(id));
-  if (!np)
-    return soap->error = SOAP_EOM;
-  np->next = soap->nlist;
-  soap->nlist = np;
-  strcpy(np->id, id);
-  np->level = soap->level;
-  np->index = -1;
-  np->ns = NULL;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns));
-  p = soap->local_namespaces;
-  if (p)
-  { register short i = 0;
-    if (!strcmp(ns, soap_env1))
-      soap->version = 1; /* make sure we use SOAP 1.1 */
-    else if (!strcmp(ns, soap_env2))
-      soap->version = 2; /* make sure we use SOAP 1.2 */
-    else
-    { for (; p->id; p++, i++)
-      { if (p->ns)
-          if (!strcmp(ns, p->ns))
-            break;
-        if (p->in)
-          if (!soap_tag_cmp(ns, p->in))
-          { if (p->out)
-              SOAP_FREE(p->out);
-            if ((p->out = (char*)SOAP_MALLOC(strlen(ns) + 1)))
-              strcpy(p->out, ns);
-            break;
-          }
-      }
-    }
-    if (i == 0 && (!p->ns || strcmp(ns, p->ns)))
-    { if (p[0].out)
-        SOAP_FREE(p[0].out);
-      if ((p[0].out = (char*)SOAP_MALLOC(strlen(ns) + 1)))
-        strcpy(p[0].out, ns);
-      if (p[1].out)
-          SOAP_FREE(p[1].out);
-      if (soap->version == 1)
-      { if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc1))))
-          strcpy(p[1].out, soap_enc1);
-      }
-      else if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc2))))
-        strcpy(p[1].out, soap_enc2);
-    }
-    if (p && p->id)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id));
-      np->index = i;
-    }
-  }
-  if (!p || !p->id)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns));
-    np->ns = (char*)SOAP_MALLOC(strlen(ns) + 1);
-    if (!np->ns)
-      return soap->error = SOAP_EOM;
-    strcpy(np->ns, ns);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_push_default_namespace(struct soap *soap, const char *id, int n)
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && np->index >= -1)
-    np = np->next;
-  if (np && (!strncmp(np->id, id, n) && !np->id[n]))
-    return SOAP_OK;
-  np = (struct soap_nlist*)SOAP_MALLOC(sizeof(struct soap_nlist) + n);
-  if (!np)
-    return soap->error = SOAP_EOM;
-  np->next = soap->nlist;
-  soap->nlist = np;
-  strncpy(np->id, id, n);
-  np->id[n] = '\0';
-  np->level = soap->level;
-  np->index = -2;
-  np->ns = NULL;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_pop_namespace(struct soap *soap)
-{ register struct soap_nlist *np;
-  while (soap->nlist && soap->nlist->level >= soap->level)
-  { np = soap->nlist->next;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Popped namespace binding (level=%u) '%s'\n", soap->level, soap->nlist->id));
-    if (soap->nlist->ns)
-      SOAP_FREE(soap->nlist->ns);
-    SOAP_FREE(soap->nlist);
-    soap->nlist = np;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_namespace(struct soap *soap, const char *id1, const char *id2, int n1, int n2) 
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && (np->index == -2 || (strncmp(np->id, id1, n1) || np->id[n1])))
-    np = np->next;
-  if (np)
-  { if (np->index < 0 || (np->index >= 0 && soap->local_namespaces[np->index].id && (strncmp(soap->local_namespaces[np->index].id, id2, n2) || soap->local_namespaces[np->index].id[n2])))
-      return SOAP_NAMESPACE;
-    return SOAP_OK;
-  }
-  if (n1 == 3 && n1 == n2 && !strcmp(id1, "xml") && !strcmp(id1, id2))
-    return SOAP_OK;
-  return SOAP_SYNTAX_ERROR; 
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_default_namespace(struct soap *soap)
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && np->index >= -1)
-    np = np->next;
-  if (np)
-    return np->id;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_tag_cmp(register const char *s, register const char *t)
-{ for (; *s && *s != '"'; s++, t++)
-    if (tolower(*s) != tolower(*t))
-      if (*t != '-')
-      { if (*t != '*')
-          return 1;
-        if (*++t)
-        { register int c = tolower(*t);
-          for (; *s && *s != '"'; s++)
-          { if (tolower(*s) == c)
-              if (!soap_tag_cmp(s + 1, t + 1))
-                return 0;
-          }
-          break;
-        }
-        else
-          return 0;
-      }
-  if (*t == '*' && !t[1])
-    return 0;
-  return *t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_tag(struct soap *soap, const char *tag1, const char *tag2)
-{ register const char *s, *t;
-  if (!tag1 || !tag2 || !*tag2)
-    return SOAP_OK;
-  s = strchr(tag1, ':');
-  t = strchr(tag2, ':');
-  if (t)
-  { if (s)
-    { if (SOAP_STRCMP(s + 1, t + 1))
-        return SOAP_TAG_MISMATCH;
-      if (t != tag2 && soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
-        return SOAP_TAG_MISMATCH;
-      }
-    } 
-    else if (SOAP_STRCMP(tag1, t + 1))
-      return SOAP_TAG_MISMATCH;
-    else if (t != tag2 && soap_match_namespace(soap, tag1, tag2, 0, t - tag2))
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
-      return SOAP_TAG_MISMATCH;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2));
-    return SOAP_OK;
-  }
-  if (s)
-  { if (((soap->mode & SOAP_XML_STRICT) && soap->part != SOAP_IN_HEADER && soap->encodingStyle))
-      return SOAP_TAG_MISMATCH;
-    if (SOAP_STRCMP(s + 1, tag2))
-      return SOAP_TAG_MISMATCH;
-    if (!soap->encodingStyle)
-    { t = soap_default_namespace(soap);
-      if (!t || soap_match_namespace(soap, tag1, t, s - tag1, strlen(t)))
-        return SOAP_TAG_MISMATCH;
-    }
-  }
-  else if (SOAP_STRCMP(tag1, tag2))
-    return SOAP_TAG_MISMATCH;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_array(struct soap *soap, const char *type)
-{ if (*soap->arrayType)
-    if (soap_match_tag(soap, soap->arrayType, type)
-     && soap_match_tag(soap, soap->arrayType, "xsd:anyType")
-     && soap_match_tag(soap, soap->arrayType, "xsd:ur-type")
-    )
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type));
-      return SOAP_TAG_MISMATCH;
-    }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-
-#ifdef WITH_OPENSSL
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid)
-{ int err;
-  soap->keyfile = keyfile;
-  soap->password = password;
-  soap->cafile = cafile;
-  soap->capath = capath;
-  if (dhfile)
-  { soap->dhfile = dhfile;
-    soap->rsa = 0;
-  }
-  else
-  { soap->dhfile = NULL;
-    soap->rsa = 1;
-  }
-  soap->randfile = randfile;
-  soap->require_client_auth = (flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION);
-  if (!(err = soap->fsslauth(soap)))
-    if (sid)
-      SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, strlen(sid));
-  return err; 
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile)
-{ soap->keyfile = keyfile;
-  soap->password = password;
-  soap->cafile = cafile;
-  soap->capath = capath;
-  soap->dhfile = NULL;
-  soap->rsa = 0;
-  soap->randfile = randfile;
-  soap->require_server_auth = (flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION);
-  return soap->fsslauth(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-ssl_init()
-{ static int done = 0;
-  if (!done)
-  { done = 1;
-    SSL_library_init();
-#ifndef WITH_LEAN
-    SSL_load_error_strings();
-#endif
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char *
-ssl_error(struct soap *soap, int ret)
-{ int err = SSL_get_error(soap->ssl, ret);
-  const char *msg = soap_str_code(h_ssl_error_codes, err);
-  if (msg)
-    strcpy(soap->msgbuf, msg);
-  else
-    return ERR_error_string(err, soap->msgbuf);
-  if (ERR_peek_error())
-  { unsigned long r;
-    strcat(soap->msgbuf, "\n");
-    while ((r = ERR_get_error()))
-      ERR_error_string_n(r, soap->msgbuf + strlen(soap->msgbuf), sizeof(soap->msgbuf) - strlen(soap->msgbuf));
-  } 
-  else
-  { switch (ret)
-    { case 0:
-        strcpy(soap->msgbuf, "EOF was observed that violates the protocol. The client probably provided invalid authentication information.");
-        break;
-      case -1:
-        sprintf(soap->msgbuf, "Error observed by underlying BIO: %s", strerror(errno));  
-        break;
-    }
-  }
-  return soap->msgbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_password(char *buf, int num, int rwflag, void *userdata)
-{ if (num < (int)strlen((char*)userdata) + 1)
-    return 0;
-  return strlen(strcpy(buf, (char*)userdata));
-}
-#endif
-
-/******************************************************************************/
-/* This callback is included for future references. It should not be deleted
-#ifndef PALM_1
-static DH *
-ssl_tmp_dh(SSL *ssl, int is_export, int keylength)
-{ static DH *dh512 = NULL;
-  static DH *dh1024 = NULL;
-  DH *dh;
-  switch (keylength)
-  { case 512:
-      if (!dh512)
-      { BIO *bio = BIO_new_file("dh512.pem", "r");
-        if (bio)
-        { dh512 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-          BIO_free(bio);
-          return dh512;
-        }
-      }
-      else
-        return dh512;
-    default:
-      if (!dh1024)
-      { BIO *bio = BIO_new_file("dh1024.pem", "r");
-        if (bio)
-        { dh1024 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-          BIO_free(bio);
-        }
-      }
-      dh = dh1024;
-  }
-  return dh;
-}
-#endif
-*/
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_auth_init(struct soap *soap)
-{ ssl_init();
-  if (!soap->ctx)
-    if (!(soap->ctx = SSL_CTX_new(SSLv23_method())))
-      return soap_set_receiver_error(soap, "SSL error", "Can't setup context", SOAP_SSL_ERROR);
-  if (soap->randfile)
-  { if (!RAND_load_file(soap->randfile, -1))
-      return soap_set_receiver_error(soap, "SSL error", "Can't load randomness", SOAP_SSL_ERROR);
-  }
-  else if (!RAND_load_file("/dev/urandom", 1024))
-  { int r;
-#ifdef HAVE_RAND_R
-    unsigned int s = (unsigned int)time(NULL);
-#endif
-    RAND_seed(soap->buf, sizeof(soap->buf));
-    while (!RAND_status())
-    {
-#ifdef HAVE_RAND_R
-      r = rand_r(&s);
-#else
-      r = rand();
-#endif
-      RAND_seed(&r, sizeof(int));
-    }
-  }
-  if (soap->cafile || soap->capath)
-    if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath))
-      return soap_set_receiver_error(soap, "SSL error", "Can't read CA file and/or directory", SOAP_SSL_ERROR);
-  if (!SSL_CTX_set_default_verify_paths(soap->ctx))
-    return soap_set_receiver_error(soap, "SSL error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR);
-  if (soap->keyfile)
-  { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile))
-      return soap_set_receiver_error(soap, "SSL error", "Can't read certificate key file", SOAP_SSL_ERROR);
-    if (soap->password)
-    { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password);
-      SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password);
-      if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
-        return soap_set_receiver_error(soap, "SSL error", "Can't read key file", SOAP_SSL_ERROR);
-    }
-  }
-  if (soap->rsa)
-  { RSA *rsa = RSA_generate_key(512, RSA_F4, NULL, NULL);
-    if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa))
-    { if (rsa)
-        RSA_free(rsa);
-      return soap_set_receiver_error(soap, "SSL error", "Can't set RSA key", SOAP_SSL_ERROR);
-    }
-    RSA_free(rsa);
-  }
-  else if (soap->dhfile)
-  { DH *dh = 0;
-    BIO *bio;
-    bio = BIO_new_file(soap->dhfile, "r");
-    if (!bio)
-      return soap_set_receiver_error(soap, "SSL error", "Can't read DH file", SOAP_SSL_ERROR);
-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-    BIO_free(bio);
-    if (SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0)
-    { if (dh)
-        DH_free(dh);
-      return soap_set_receiver_error(soap, "SSL error", "Can't set DH parameters", SOAP_SSL_ERROR);
-    }
-    DH_free(dh);
-  }
-  SSL_CTX_set_options(soap->ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2);
-  SSL_CTX_set_verify(soap->ctx, soap->require_client_auth ? (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) : soap->require_server_auth ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, soap->fsslverify);
-#if (OPENSSL_VERSION_NUMBER < 0x00905100L)
-  SSL_CTX_set_verify_depth(soap->ctx, 1); 
-#endif  
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_verify_callback(int ok, X509_STORE_CTX *store)
-{
-#ifdef SOAP_DEBUG
-  if (!ok) 
-  { char data[256];
-    X509 *cert = X509_STORE_CTX_get_current_cert(store);
-    fprintf(stderr, "SSL Verify error with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(X509_STORE_CTX_get_error(store)));
-    X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data));
-    fprintf(stderr, "certificate issuer %s\n", data);
-    X509_NAME_oneline(X509_get_subject_name(cert), data, sizeof(data));
-    fprintf(stderr, "certificate subject %s\n", data);
-  }
-#endif
-  return ok;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_accept(struct soap *soap)
-{ int i, r;
-  if (!soap_valid_socket(soap->socket))
-    return soap_set_receiver_error(soap, "SSL error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR);
-  if (!soap->ssl)
-  { soap->ssl = SSL_new(soap->ctx);
-    if (!soap->ssl)
-      return soap_set_receiver_error(soap, "SSL error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
-  }
-  else
-    SSL_clear(soap->ssl);
-  soap->imode |= SOAP_ENC_SSL;
-  soap->omode |= SOAP_ENC_SSL;
-#ifdef WIN32
-  u_long nonblocking = 1;
-  ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &nonblocking);
-#else
-  fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)|O_NONBLOCK);
-#endif
-  soap->bio = BIO_new_socket((SOAP_SOCKET)soap->socket, BIO_NOCLOSE);
-  SSL_set_bio(soap->ssl, soap->bio, soap->bio);
-  i = 100;
-  while ((r = SSL_accept(soap->ssl)) <= 0)
-  { int err = SSL_get_error(soap->ssl, r);
-    if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
-    { struct timeval timeout;
-      fd_set fd;
-      if (i-- <= 0)
-        break;
-      timeout.tv_sec = 0;
-      timeout.tv_usec = 100000;
-      FD_ZERO(&fd);
-      FD_SET((SOAP_SOCKET)soap->socket, &fd);
-      r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-      if (r < 0 && soap_socket_errno != SOAP_EINTR)
-      { soap->errnum = soap_socket_errno;
-        return SOAP_EOF;
-      }
-    }
-    else
-    { soap->errnum = err;
-      break;
-    }
-  }
-#ifdef WIN32
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
-  }
-#else
-  fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
-#endif
-  if (r <= 0)
-  { soap_set_receiver_error(soap, ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
-    soap_closesock(soap);
-    return SOAP_SSL_ERROR;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#endif /* WITH_OPENSSL */
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-tcp_init(struct soap *soap)
-{ soap->errmode = 1;
-#ifdef WIN32
-  if (tcp_done)
-    return 0;
-  else
-  { WSADATA w;
-    if (WSAStartup(MAKEWORD(1, 1), &w))
-      return -1;
-    tcp_done = 1;
-  }
-#endif
-#ifdef PALM
-  errno = 0;
-  h_errno = 0;
-  AppNetRefnum = 0;
-  NetUInit();
-  AppNetTimeout = 10000;
-  NetLibOpen(AppNetRefnum, &h_errno);
-#endif
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_done(struct soap *soap)
-{ 
-#ifndef WITH_LEAN
-  int i;
-#endif
-  soap_free(soap);
-  while (soap->clist)
-  { struct soap_clist *p = soap->clist->next;
-    SOAP_FREE(soap->clist);
-    soap->clist = p;
-  }
-  soap->keep_alive = 0; /* to force close the socket */
-  soap_closesock(soap);
-#ifdef WITH_COOKIES
-  soap_free_cookies(soap);
-#endif
-  while (soap->plugins)
-  { register struct soap_plugin *p = soap->plugins->next;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id));
-    if (soap->plugins->fcopy || !soap->copy)
-      soap->plugins->fdelete(soap, soap->plugins);
-    SOAP_FREE(soap->plugins);
-    soap->plugins = p;
-  }
-  soap->fplugin = fplugin;
-  soap->fpost = http_post;
-  soap->fget = http_get;
-  soap->fposthdr = http_post_header;
-  soap->fresponse = http_response;
-  soap->fparse = http_parse;
-  soap->fparsehdr = http_parse_header;
-#ifndef MAC_CARBON
-  soap->faccept = tcp_accept;
-  soap->fopen = tcp_connect;
-  soap->fclose = tcp_disconnect;
-  soap->fsend = fsend;
-  soap->frecv = frecv;
-#endif
-  soap->fprepare = NULL;
-  soap->fignore = NULL;
-#ifdef WITH_OPENSSL
-  if (soap->session)
-  { SSL_SESSION_free(soap->session);
-    soap->session = NULL;
-  }
-#endif
-  if (!soap->copy)
-  { if (soap_valid_socket(soap->master))
-    { closesocket((SOAP_SOCKET)soap->master);
-      soap->master = SOAP_INVALID_SOCKET;
-    }
-#ifdef WITH_OPENSSL
-    if (soap->ctx)
-    { SSL_CTX_free(soap->ctx);
-      soap->ctx = NULL;
-    }
-#endif
-  }
-#ifndef WITH_LEAN
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-  { soap_close_logfile(soap, i);
-    if (soap->logfile[i])
-    { SOAP_FREE((void*)soap->logfile[i]);
-      soap->logfile[i] = NULL;
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_cleanup(struct soap *soap)
-{ soap_done(soap);
-#ifdef WIN32
-  if (!tcp_done)
-    return;
-  tcp_done = 0;
-  WSACleanup();
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-tcp_error(struct soap *soap)
-{ register const char *msg = NULL;
-  switch (soap->errmode)
-  { case 0:
-      msg = soap_strerror(soap);
-      break;
-    case 1:
-      msg = "WSAStartup failed";
-      break;
-    case 2:
-    {
-#ifndef WITH_LEAN
-      msg = soap_str_code(h_error_codes, soap->errnum);
-      if (!msg)
-#endif
-      { sprintf(soap->msgbuf, "TCP error %d", soap->errnum);
-        msg = soap->msgbuf;
-      }
-    }
-  }
-  return msg;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-http_error(struct soap *soap, int status)
-{ register const char *msg = NULL;
-#ifndef WITH_LEAN
-  msg = soap_str_code(h_http_error_codes, status);
-  if (!msg)
-#endif
-  { sprintf(soap->msgbuf, "HTTP error %d", status);
-    msg = soap->msgbuf;
-  }
-  return msg;
-}
-#endif
-
-/******************************************************************************/
-/* WR[ */
-#ifndef WITH_IPV6
-/* ]WR */
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-soap_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr)
-{ unsigned long iadd;
-  struct hostent hostent, *host = &hostent;
-/* WR[ */
-#ifdef VXWORKS
-  int hostint;
-  char * addrcopy = (char*)malloc(strlen(addr) + 1); /*copy of addr. */
-  /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */
-  strncpy(addrcopy, addr, strlen(addr)+1);
-  iadd = inet_addr(addrcopy);
-#else
-/* ]WR */
-#if defined(_AIXVERSION_431) || defined(TRU64)
-  struct hostent_data ht_data;
-#endif
-  iadd = inet_addr(addr);
-/* WR[ */
-#endif
-/* ]WR */
-  if ((int)iadd != -1)
-  { memcpy(inaddr, &iadd, sizeof(iadd));
-/* WR[ */
-#ifdef VXWORKS
-    free(addrcopy);
-#endif
-/* ]WR */
-    return 0;
-  }
-#if defined(__GLIBC__)
-  if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0)
-    host = NULL;
-#elif defined(_AIXVERSION_431) || defined(TRU64)
-  memset(&ht_data, 0, sizeof(ht_data));
-  if (gethostbyname_r(addr, &hostent, &ht_data) < 0)
-  { host = NULL;
-    soap->errnum = h_errno;
-  }
-#elif defined(HAVE_GETHOSTBYNAME_R)
-  host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum);
-/* WR[ */
-#elif defined(VXWORKS)
-  /* If the DNS resolver library resolvLib has been configured in the vxWorks
-   * image, a query for the host IP address is sent to the DNS server, if the
-   * name was not found in the local host table. */
-  hostint = hostGetByName(addrcopy);
-  if (hostint == ERROR)
-    {
-    host = NULL;
-    soap->errnum = soap_errno; 
-    }
-  free(addrcopy);  /*free() is placed after the error checking to assure that
-                   * errno captured is that from hostGetByName() */
-/* ]WR */
-#else
-  if (!(host = gethostbyname(addr)))
-    soap->errnum = h_errno;
-#endif
-  if (!host)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n"));
-    return -1;
-  }
-/* WR[ */
-#ifdef VXWORKS
-  inaddr->s_addr = hostint;
-#else
-/* ]WR */
-  memcpy(inaddr, host->h_addr, host->h_length);
-/* WR[ */
-#endif
-/* ]WR */
-  return 0;
-}
-#endif
-#endif
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port)
-{ struct sockaddr_in sockaddr;
-/* WR[ */
-#ifdef WITH_IPV6
-  struct addrinfo *addrinfo;
-  struct addrinfo hints;
-  struct addrinfo resaddr;
-  struct sockaddr_storage addrstorage;
-  int err;
-#endif /* WITH_IPV6 */
-/* ]WR */
-  register int fd;
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  if (soap_valid_socket(soap->socket))
-    closesocket((SOAP_SOCKET)soap->socket);
-  soap->socket = SOAP_INVALID_SOCKET;
-  if (tcp_init(soap))
-  { soap_set_sender_error(soap, tcp_error(soap), "TCP initialization failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  soap->errmode = 0;
-/* WR[ */
-#ifdef WITH_IPV6
-  memset(&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
-  hints.ai_socktype = SOCK_STREAM;
-  soap->errmode = 2;
-  if (soap->proxy_host)
-    err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &addrinfo);
-  else
-    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
-  if (addrinfo)
-  { resaddr = *addrinfo;
-    addrstorage = *((struct sockaddr_storage *) addrinfo->ai_addr);
-    resaddr.ai_addr = (struct sockaddr *) &addrstorage;
-    freeaddrinfo(addrinfo);
-  }
-  if (err)
-  { soap_set_sender_error(soap, gai_strerror(err), 
-    "TCP getaddrinfo on proxy host failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  fd = (int)socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol); /* modified to use fd */
-  soap->errmode = 0;
-#else /* WITH_IPV6 */
-/* ]WR */
-  fd = (int)socket(AF_INET, SOCK_STREAM, 0);
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-  if (fd < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP socket failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#ifndef WITH_LEAN
-  if (soap->connect_flags & SO_LINGER)
-  { struct linger linger;
-    memset(&linger, 0, sizeof(struct linger));
-    linger.l_onoff = 1;
-    linger.l_linger = 0;
-    if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
-    { soap->errnum = soap_socket_errno;
-      soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR);
-      closesocket((SOAP_SOCKET)fd);
-      return -1;
-    }
-  }
-  if ((soap->connect_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (soap->keep_alive && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-#ifdef TCP_NODELAY
-  if (setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR);
-    closesocket((SOAP_SOCKET)fd);
-    return -1;
-  }
-#endif
-#endif
-/* WR[ */
-#ifndef WITH_IPV6
-/* ]WR */
-  memset(&sockaddr, 0, sizeof(sockaddr));
-  sockaddr.sin_family = AF_INET;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Open socket %d to host='%s'\n", fd, host));
-  soap->errmode = 2;
-  if (soap->proxy_host)
-  { if (soap_gethost(soap, soap->proxy_host, &sockaddr.sin_addr))
-    { soap_set_sender_error(soap, tcp_error(soap), "TCP get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR);
-      closesocket((SOAP_SOCKET)fd);
-      return -1;
-    }
-    sockaddr.sin_port = htons((short)soap->proxy_port);
-  }
-  else
-  { if (soap_gethost(soap, host, &sockaddr.sin_addr))
-    { soap_set_sender_error(soap, tcp_error(soap), "TCP get host by name failed in tcp_connect()", SOAP_TCP_ERROR);
-      closesocket((SOAP_SOCKET)fd);
-      return -1;
-    }
-    sockaddr.sin_port = htons((short)port);
-  }
-  soap->errmode = 0;
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  if (soap->connect_timeout)
-#if defined(WIN32)
-  { u_long nonblocking = 1;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  {
-    vx_nonblocking = TRUE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
-#endif
-  else
-#if defined(WIN32)
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  {
-    vx_nonblocking = FALSE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-  for (;;)
-  { 
-/* WR[ */
-#ifdef WITH_IPV6
-    if (connect((SOAP_SOCKET)fd, resaddr.ai_addr, resaddr.ai_addrlen)) /* modified to use fd */
-#else /* WITH_IPV6 */
-    if (connect((SOAP_SOCKET)fd, (struct sockaddr*)&sockaddr, sizeof(sockaddr)))
-#endif /* WITH_IPV6 */
-/* ]WR */
-    { 
-#ifndef WITH_LEAN
-      if (soap->connect_timeout && (soap_socket_errno == SOAP_EINPROGRESS || soap_socket_errno == SOAP_EWOULDBLOCK))
-      { struct timeval timeout;
-#if defined(SOCKLEN_T)
-        SOCKLEN_T n = sizeof(struct sockaddr_in);
-#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
-        socklen_t n = sizeof(struct sockaddr_in);
-#elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
-        int n = sizeof(struct sockaddr_in);
-#else
-        size_t n = sizeof(struct sockaddr_in);
-#endif
-        fd_set fds;
-        if (soap->connect_timeout > 0)
-        { timeout.tv_sec = soap->connect_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->connect_timeout/1000000;
-          timeout.tv_usec = -soap->connect_timeout%1000000;
-        }
-        FD_ZERO(&fds);
-        FD_SET((SOAP_SOCKET)fd, &fds);
-        for (;;)
-        { int r = select((SOAP_SOCKET)(fd + 1), NULL, &fds, NULL, &timeout);
-          if (r > 0)
-           break;
-          if (!r)
-          { soap->errnum = 0;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
-            soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-            closesocket((SOAP_SOCKET)fd);
-            return -1;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-            soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-            closesocket((SOAP_SOCKET)fd);
-            return -1;
-          }
-        }
-       n = sizeof(soap->errnum);
-        if (!getsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &n) && !soap->errnum)
-          break;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-        soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-        closesocket((SOAP_SOCKET)fd);
-        return -1;
-      }
-      else
-#endif
-      if (soap_socket_errno != SOAP_EINTR)
-      { soap->errnum = soap_socket_errno;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-        soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-        closesocket((SOAP_SOCKET)fd);
-        return -1;
-      }
-    }  
-    else
-      break;
-  }
-#ifndef WITH_LEAN
-  if (soap->connect_timeout)
-#if defined(WIN32)
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  {
-    vx_nonblocking = FALSE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-  soap->socket = fd;
-#ifdef WITH_OPENSSL
-  soap->imode &= ~SOAP_ENC_SSL;
-  soap->omode &= ~SOAP_ENC_SSL;
-  if (!strncmp(endpoint, "https:", 6))
-  { int r;
-    if (soap->proxy_host)
-    { unsigned int k = soap->omode; /* make sure we only parse HTTP */
-      size_t n = soap->count; /* save the content length */
-      soap->omode &= ~0xFF; /* mask IO and ENC */
-      soap->omode |= SOAP_IO_BUFFER;
-      soap_begin_send(soap);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to proxy server\n"));
-      sprintf(soap->tmpbuf, "CONNECT %s:%d HTTP/%s", host, port, soap->http_version);
-      if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return -1;
-#ifndef WITH_LEAN
-      if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
-      { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
-        strcpy(soap->tmpbuf, "Basic ");
-        soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-        if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
-          return soap->error;
-      }
-#endif
-      if ((soap->error = soap->fposthdr(soap, NULL, NULL))
-       || soap_flush(soap))
-        return -1;
-      soap->omode = k;
-      k = soap->imode;
-      soap->imode &= ~0xFF; /* mask IO and ENC */
-      if (soap_begin_recv(soap))
-        return -1;
-      soap->imode = k;
-      soap->count = n;
-      soap_begin_send(soap);
-    }
-    if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
-    { soap_set_sender_error(soap, "SSL error", "SSL authentication failed in tcp_connect(): check password, key file, and ca file.", SOAP_SSL_ERROR);
-      return -1;
-    }
-    soap->ssl = SSL_new(soap->ctx);
-    if (!soap->ssl)
-    { soap->error = SOAP_SSL_ERROR;
-      return -1;
-    }
-    if (soap->session)
-    { if (!strcmp(soap->session_host, host) && soap->session_port == port)
-        SSL_set_session(soap->ssl, soap->session);
-      SSL_SESSION_free(soap->session);
-      soap->session = NULL;
-    }
-    soap->imode |= SOAP_ENC_SSL;
-    soap->omode |= SOAP_ENC_SSL;
-    soap->bio = BIO_new_socket((SOAP_SOCKET)fd, BIO_NOCLOSE);
-    SSL_set_bio(soap->ssl, soap->bio, soap->bio);
-#ifndef WITH_LEAN
-    if (soap->connect_timeout)
-#ifdef WIN32
-    { u_long nonblocking = 1;
-      ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
-    }
-#else
-      fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
-#endif
-#endif
-    for (;;)
-    { if ((r = SSL_connect(soap->ssl)) <= 0)
-      { int err = SSL_get_error(soap->ssl, r);
-        if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-        { soap_set_sender_error(soap, ssl_error(soap, r), "SSL connect failed in tcp_connect()", SOAP_SSL_ERROR);
-          return -1;
-        }
-        if (soap->connect_timeout)
-        { struct timeval timeout;
-          fd_set fds;
-          if (soap->connect_timeout > 0)
-          { timeout.tv_sec = soap->connect_timeout;
-            timeout.tv_usec = 0;
-          }
-          else
-          { timeout.tv_sec = -soap->connect_timeout/1000000;
-            timeout.tv_usec = -soap->connect_timeout%1000000;
-          }
-          FD_ZERO(&fds);
-          FD_SET((SOAP_SOCKET)(soap->socket), &fds);
-          for (;;)
-          { int r = select((SOAP_SOCKET)(soap->socket + 1), &fds, NULL, &fds, &timeout);
-            if (r > 0)
-             break;
-            if (!r)
-            { soap->errnum = 0;
-              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
-              soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-              return -1;
-            }
-          }
-         continue;
-        }
-      }
-      break;
-    }
-#ifndef WITH_LEAN
-    if (soap->connect_timeout)
-#ifdef WIN32
-    { u_long blocking = 0;
-      ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-    }
-#else
-      fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-    if (soap->require_server_auth)
-    { X509 *peer;
-      int err;
-      if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK)
-      { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate cannot be verified in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-      peer = SSL_get_peer_certificate(soap->ssl);
-      if (!peer)
-      { soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-      X509_NAME_get_text_by_NID(X509_get_subject_name(peer), NID_commonName, soap->msgbuf, sizeof(soap->msgbuf));
-      X509_free(peer);
-      if (soap_tag_cmp(soap->msgbuf, host))
-      { soap_set_sender_error(soap, "SSL error", "SSL certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-    }
-  }
-#endif
-  return fd;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_bind(struct soap *soap, const char *host, int port, int backlog)
-{ struct sockaddr_in sockaddr;
-/* WR[ */
-#ifdef WITH_IPV6
-  struct addrinfo *addrinfo;
-  struct addrinfo hints;
-  struct addrinfo resaddr;
-  struct sockaddr_storage addrstorage;
-  int err;
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  if (soap_valid_socket(soap->master))
-  { closesocket((SOAP_SOCKET)soap->master);
-    soap->master = SOAP_INVALID_SOCKET;
-  }
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->errmode = 1;
-  if (tcp_init(soap))
-  { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-/* WR[ */
-#ifdef WITH_IPV6
-  memset(&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
-  hints.ai_socktype = SOCK_STREAM;
-  hints.ai_flags = AI_PASSIVE;
-  soap->errmode = 2;
-  if (host)
-    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
-  else
-    err = getaddrinfo(NULL, soap_int2s(soap, port), &hints, &addrinfo);
-  if (NULL != addrinfo)
-  {
-    resaddr = *addrinfo;
-    addrstorage = *((struct sockaddr_storage *) addrinfo->ai_addr);
-    resaddr.ai_addr = (struct sockaddr *) &addrstorage;
-    freeaddrinfo(addrinfo);
-  }
-  if (err)
-  { soap_set_receiver_error(soap, gai_strerror(err), "TCP getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  soap->errmode = 0;
-  if ((soap->master = socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol)) < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#else /* WITH_IPV6 */
-/* ]WR */
-  soap->errmode = 0;
-  if ((soap->master = (int)socket(AF_INET, SOCK_STREAM, 0)) < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  if (soap->bind_flags && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#ifdef TCP_NODELAY
-  if (setsockopt((SOAP_SOCKET)soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#endif
-#endif
-/* WR[ */
-#ifdef WITH_IPV6
-  soap->errmode = 0;
-  if (bind(soap->master, resaddr.ai_addr, resaddr.ai_addrlen) || listen(soap->master, backlog))
-  { 
-    soap->errnum = soap_socket_errno;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
-    soap_closesock(soap);
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }  
-#else /* WITH_IPV6 */
-/* ]WR */
-  memset(&sockaddr, 0, sizeof(sockaddr));
-  sockaddr.sin_family = AF_INET;
-  soap->errmode = 2;
-  if (host)
-  { if (soap_gethost(soap, host, &sockaddr.sin_addr))
-    { soap_set_receiver_error(soap, tcp_error(soap), "TCP get host by name failed in soap_bind()", SOAP_TCP_ERROR);
-      return -1;
-    }
-  }
-  else
-    sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
-  sockaddr.sin_port = htons((short)port);
-  soap->errmode = 0;
-  if (bind((SOAP_SOCKET)soap->master, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) || listen((SOAP_SOCKET)soap->master, backlog))
-  { soap->errnum = soap_socket_errno;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
-    soap_closesock(soap);
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }  
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifdef WITH_OPENSSL
-  if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
-    return -1;
-#endif
-  return soap->master;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_poll(struct soap *soap)
-{ 
-#ifndef WITH_LEAN
-  struct timeval timeout;
-  fd_set sfd,rfd;
-  int r;
-  timeout.tv_sec = 0;
-  timeout.tv_usec = 0;
-  FD_ZERO(&rfd);
-  FD_ZERO(&sfd);
-  if (soap->socket >= 0)
-  { FD_SET(soap->socket, &rfd);
-    FD_SET(soap->socket, &sfd);
-    r = select(soap->socket + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  else if (soap->master >= 0)
-  { FD_SET(soap->master, &rfd);
-    r = select(soap->master + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  else
-  { FD_SET(soap->sendfd, &sfd);
-    FD_SET(soap->recvfd, &rfd);
-    r = select((soap->sendfd > soap->recvfd ? soap->sendfd : soap->recvfd) + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  if (r > 0)
-  {
-#ifdef WITH_OPENSSL
-    if (soap->ssl)
-    { if ((soap->socket >= 0) && FD_ISSET(soap->socket, &rfd))
-      { char buf = '\0';
-       if (SSL_peek(soap->ssl, &buf, 1) <= 0)
-         return SOAP_EOF;
-      }
-    }
-#endif   
-    return SOAP_OK;
-  }
-  if (r < 0 && (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno != SOAP_EINTR)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR);
-    return soap->error = SOAP_TCP_ERROR;
-  }
-  else
-    soap->errnum = soap_errno;
-  return SOAP_EOF;
-#else
-  return SOAP_OK;
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_accept(struct soap *soap, int s, struct sockaddr *a, int *n)
-{
-#if defined(SOCKLEN_T)
-  return (int)accept((SOAP_SOCKET)s, a, (SOCKLEN_T*)n);
-#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
-  return (int)accept((SOAP_SOCKET)s, a, (socklen_t*)n);
-#elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
-  return (int)accept((SOAP_SOCKET)s, a, n);
-#else
-  return (int)accept((SOAP_SOCKET)s, a, (size_t*)n);
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_accept(struct soap *soap)
-{ 
-/* WR[ */
-#ifdef WITH_IPV6
-  struct sockaddr_storage sockaddr;
-#else /* WITH_IPV6 */
-/* ]WR */
-  struct sockaddr_in sockaddr;
-/* WR[ */
-#endif
-/* ]WR */
-  int n = (int)sizeof(struct sockaddr);
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  memset(&sockaddr, 0, sizeof(sockaddr));
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->errmode = 0;
-  if (soap_valid_socket(soap->master))
-  { for (;;)
-    { 
-#ifndef WITH_LEAN
-      if (soap->accept_timeout)
-      { struct timeval timeout;
-        fd_set fd;
-        if (soap->accept_timeout > 0)
-        { timeout.tv_sec = soap->accept_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->accept_timeout/1000000;
-          timeout.tv_usec = -soap->accept_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->master, &fd);
-        for (;;)
-        { int r = select((SOAP_SOCKET)(soap->master + 1), &fd, &fd, NULL, &timeout);
-          if (r > 0)
-            break;
-          if (!r)
-          { soap->errnum = 0;
-            soap_set_receiver_error(soap, "Timeout", "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            soap_closesock(soap);
-            soap_set_sender_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-          }
-        }
-#if defined(WIN32)
-       { u_long nonblocking = 1;
-          ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &nonblocking);
-        }
-#elif defined(VXWORKS)
-        { vx_nonblocking = TRUE;
-          ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-        }
-#else
-        fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)|O_NONBLOCK);
-#endif
-      }
-      else
-#if defined(WIN32)
-      { u_long blocking = 0;
-        ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
-      }
-/* WR[ */
-#elif defined(VXWORKS)
-       {
-        vx_nonblocking = FALSE;
-        ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-       }
-/* ]WR */
-#else
-        fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-      if ((soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&sockaddr, &n)) >= 0)
-      {
-/* WR[ */
-#ifdef WITH_IPV6
-/* Use soap->host to store the numeric form of the remote host */
-        getnameinfo((struct sockaddr*)&sockaddr, n, soap->host, sizeof(soap->host), NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV); 
-        soap->ip = 0; /* info stored in soap->host */
-        soap->port = 0; /* info stored in soap->host */
-#else /* WITH_IPV6 */
-/* ]WR */
-        soap->ip = ntohl(sockaddr.sin_addr.s_addr);
-        soap->port = (int)ntohs(sockaddr.sin_port);
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-        soap->keep_alive = ((soap->imode & SOAP_IO_KEEPALIVE) != 0);
-#ifndef WITH_LEAN
-       if (soap->accept_flags & SO_LINGER)
-        { struct linger linger;
-          memset(&linger, 0, sizeof(struct linger));
-          linger.l_onoff = 1;
-          linger.l_linger = 0;
-         if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
-          { soap->errnum = soap_socket_errno;
-           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-         }
-        }
-        if ((soap->accept_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-#ifdef TCP_NODELAY
-        if (setsockopt((SOAP_SOCKET)soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-#endif
-#endif
-        if (soap->accept_timeout)
-        {
-#if defined(WIN32)
-          u_long blocking = 0;
-          ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
-          ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
-/* WR[ */
-#elif defined(VXWORKS)
-          vx_nonblocking = FALSE;
-          ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-          ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)(&vx_nonblocking));
-/* ]WR */
-#else
-          fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
-          fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
-#endif
-       }
-        return soap->socket;
-      }
-      if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
-      { soap->errnum = soap_socket_errno;
-        soap_set_receiver_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-        return -1;
-      }
-    }
-  }
-  else
-  { soap_set_receiver_error(soap, tcp_error(soap), "TCP no master socket in soap_accept()", SOAP_TCP_ERROR);
-    return -1;
-  }
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_disconnect(struct soap *soap)
-{
-#ifdef WITH_OPENSSL
-  if (soap->ssl)
-  { int r, s = 0;
-    if (soap->session)
-      SSL_SESSION_free(soap->session);
-    if (*soap->host)
-    { soap->session = SSL_get1_session(soap->ssl);
-      if (soap->session)
-      { strcpy(soap->session_host, soap->host);
-        soap->session_port = soap->port;
-      }
-    }
-    r = SSL_shutdown(soap->ssl);
-    if (r != 1)
-    { s = ERR_get_error();
-      if (s)
-      { if (soap_valid_socket(soap->socket))
-        { shutdown((SOAP_SOCKET)soap->socket, 1);
-          soap->socket = SOAP_INVALID_SOCKET;
-        }
-        r = SSL_shutdown(soap->ssl);
-      }
-    }
-    DBGLOG(TEST, if (s) SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r)));
-    SSL_free(soap->ssl);
-    soap->ssl = NULL;
-    if (s)
-      return SOAP_SSL_ERROR;
-    ERR_remove_state(0);
-  }
-#endif
-  if (soap_valid_socket(soap->socket))
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Closing socket %d\n", soap->socket));
-    shutdown((SOAP_SOCKET)soap->socket, 2);
-    closesocket((SOAP_SOCKET)soap->socket);
-    soap->socket = SOAP_INVALID_SOCKET;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_closesock(struct soap *soap)
-{ register int status = soap->error;
-#ifndef MAC_CARBON
-  if (status == SOAP_EOF || !soap->keep_alive)
-  { if ((soap->error = soap->fclose(soap)))
-      return soap->error;
-    soap->socket = SOAP_INVALID_SOCKET;
-  }
-#endif
-#ifdef WITH_ZLIB
-  if (soap->zlib_state == SOAP_ZLIB_DEFLATE)
-    deflateEnd(&soap->d_stream);
-  else if (soap->zlib_state == SOAP_ZLIB_INFLATE)
-    inflateEnd(&soap->d_stream);
-  soap->zlib_state = SOAP_ZLIB_NONE;
-#endif
-  return soap->error = status;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_hash(register const char *s)
-{ register int h = 0;
-  while (*s)
-    h += *s++ & 0x1F;
-  return h % SOAP_IDHASH;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_init_pht(struct soap *soap)
-{ register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing pointer hashtable\n"));
-  for (i = 0; i < SOAP_PTRHASH; i++)
-    soap->pht[i] = NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new()
-{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
-  if (soap)
-    soap_init(soap);
-  return soap;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new1(int mode)
-{ return soap_new2(mode, mode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new2(int imode, int omode)
-{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
-  if (soap)
-    soap_init2(soap, imode, omode);
-  return soap;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_free_pht(struct soap *soap)
-{ register struct soap_plist *pp, *next;
-  register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n"));
-  for (i = 0; i < SOAP_PTRHASH; i++)
-  { for (pp = soap->pht[i]; pp; pp = next)
-    { next = pp->next;
-      SOAP_FREE(pp);
-    }
-    soap->pht[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embed_element(struct soap *soap, const void *p, const char *tag, int type)
-{ register int i;
-  struct soap_plist *pp;
-  if (soap->version != 1)
-    soap->encoding = 1;
-  if ((i = soap_pointer_lookup(soap, p, type, &pp)))
-  { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp))
-      return 0;
-    soap_set_embedded(soap, pp);
-  }
-  return i;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embed_array(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type)
-{ register int i;
-  struct soap_plist *pp;
-  if (soap->version != 1)
-    soap->encoding = 1;
-  if ((i = soap_array_pointer_lookup(soap, p, a, n, type, &pp)))
-  { if (soap_is_embedded(soap, pp) || soap_is_single(soap, pp))
-      return 0;
-    soap_set_embedded(soap, pp);
-  }
-  return i;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp)
-{ register struct soap_plist *pp;
-  *ppp = NULL;
-  if (p)
-    for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next)
-      if (pp->ptr == p && pp->type == type)
-      { *ppp = pp;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id));
-        return pp->id;
-      }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_pointer_lookup(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
-{ struct soap_plist *pp;
-  *ppp = NULL;
-  if (!p || !a->__ptr)
-    return 0;
-  for (pp = soap->pht[soap_hash_ptr(a->__ptr)]; pp; pp = pp->next)
-    if (pp->type == type && pp->array && pp->array->__ptr == a->__ptr && pp->array->__size == n)
-    { *ppp = pp;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a->__ptr, type, pp->id));
-      return pp->id;
-    }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a->__ptr, type));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pointer_enter(struct soap *soap, const void *p, int type, struct soap_plist **ppp)
-{ register struct soap_plist *pp;
-  if (!p)
-  { *ppp = NULL;
-    return 0;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enter location=%p type=%d id=%lu\n", p, type, soap->idnum+1));
-  *ppp = pp = (struct soap_plist*)SOAP_MALLOC(sizeof(struct soap_plist));
-  if (pp)
-  { register int h = soap_hash_ptr(p);
-    pp->next = soap->pht[h];
-    pp->type = type;
-    if ((soap->mode & SOAP_XML_TREE) || soap->part == SOAP_IN_HEADER)
-    { pp->mark1 = 0;
-      pp->mark2 = 0;
-    }
-    else
-    { pp->mark1 = 1;
-      pp->mark2 = 1;
-    }
-    pp->ptr = p;
-    pp->array = NULL;
-    soap->pht[h] = pp;
-    return pp->id = ++soap->idnum;
-  }
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int type, struct soap_plist **ppp)
-{ struct soap_plist *pp;
-  *ppp = NULL;
-  if (!p || !a->__ptr)
-    return 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array enter location=%p size=%d type=%d id=%lu\n", a->__ptr, a->__size, type, soap->idnum+1));
-  *ppp = pp = (struct soap_plist*)SOAP_MALLOC(sizeof(struct soap_plist));
-  if (pp)
-  { register int h = soap_hash_ptr(a->__ptr);
-    pp->next = soap->pht[h];
-    pp->type = type;
-    if ((soap->mode & SOAP_XML_TREE) || soap->part == SOAP_IN_HEADER)
-    { pp->mark1 = 0;
-      pp->mark2 = 0;
-    }
-    else
-    { pp->mark1 = 1;
-      pp->mark2 = 1;
-    }
-    pp->ptr = p;
-    pp->array = a;
-    soap->pht[h] = pp;
-    return pp->id = ++soap->idnum;
-  }
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_begin_count(struct soap *soap)
-{ soap_clr_attr(soap);
-  soap_set_local_namespaces(soap);
-  if (soap->mode & SOAP_ENC_DIME)
-    soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME;
-  else
-  { soap->mode = soap->omode;
-    if (((soap->mode & (SOAP_IO_STORE | SOAP_IO_CHUNK)) || (soap->mode & SOAP_ENC_XML)) && !soap->fprepare)
-      soap->mode &= ~SOAP_IO_LENGTH;
-    else
-      soap->mode |= SOAP_IO_LENGTH;
-  }
-  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
-  { if (!(soap->mode & SOAP_ENC_DIME))
-      soap->mode &= ~SOAP_IO_LENGTH;
-    if (soap->mode & SOAP_ENC_XML)
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  soap->count = 0;
-  soap->ns = 0;
-  soap->null = 0;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  soap->encoding = 0;
-  soap->part = SOAP_BEGIN;
-  soap->idnum = 0;
-  soap->dime_count = 0; /* count # of attachments */
-  soap->dime_size = 0; /* accumulate total size of attachments */
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=%hd count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_begin_send(struct soap *soap)
-{ soap_clr_attr(soap);
-  soap_set_local_namespaces(soap);
-  soap->mode = (soap->omode & ~SOAP_IO_LENGTH) | (soap->mode & SOAP_ENC_DIME);
-  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
-  { if (soap->mode & SOAP_ENC_XML)
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket))
-  { if (soap->count || (soap->mode & SOAP_ENC_XML))
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    soap_new_block(soap);
-  if (!(soap->mode & SOAP_IO_KEEPALIVE))
-    soap->keep_alive = 0;
-#ifdef WIN32
-#ifndef UNDER_CE
-#ifndef WITH_FASTCGI
-  if (!soap_valid_socket(soap->socket)) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */
-#ifdef __BORLANDC__
-    setmode((SOAP_SOCKET)soap->sendfd, O_BINARY);
-#else
-    _setmode((SOAP_SOCKET)soap->sendfd, _O_BINARY);
-#endif
-#endif
-#endif
-#endif
-  if (soap->mode & SOAP_IO)
-  { soap->bufidx = 0;
-    soap->buflen = 0;
-  }
-  soap->chunksize = 0;
-  soap->ns = 0;
-  soap->null = 0;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  soap->encoding = 0;
-  soap->part = SOAP_BEGIN;
-  soap->idnum = 0;
-  soap->level = 0;
-#ifdef WITH_ZLIB
-  soap->z_ratio_out = 1.0;
-  if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE)
-  {
-#ifdef WITH_GZIP
-    memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10);
-    soap->d_stream.next_out = (Byte*)soap->z_buf + 10;
-    soap->d_stream.avail_out = SOAP_BUFLEN - 10;
-    soap->z_crc = crc32(0L, NULL, 0);
-    if (deflateInit2(&soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK)
-#else
-    soap->d_stream.next_out = (Byte*)soap->z_buf;
-    soap->d_stream.avail_out = SOAP_BUFLEN;
-    if (deflateInit(&soap->d_stream, soap->z_level) != Z_OK)
-#endif
-      return soap->error = SOAP_ZLIB_ERROR;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n"));
-    soap->zlib_state = SOAP_ZLIB_DEFLATE;
-  }
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=%hd count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_embedded(struct soap *soap, const void *p, int t)
-{ struct soap_plist *pp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d\n", p, t));
-  if (soap_pointer_lookup(soap, p, t, &pp))
-  { pp->mark1 = 1;
-    pp->mark2 = 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d set to %d\n", p, t, (int)pp->mark1));
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_reference(struct soap *soap, const void *p, int t)
-{ register int i;
-  struct soap_plist *pp;
-  if (!p)
-    return 1;
-  i = soap_pointer_lookup(soap, p, t, &pp);
-  if (i)
-  { if (pp->mark1 == 0)
-    { pp->mark1 = 2;
-      pp->mark2 = 2;
-    }
-  }
-  else
-  { soap_pointer_enter(soap, p, t, &pp);
-    pp->mark1 = 0;
-    pp->mark2 = 0;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type = %d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2));
-  return pp->mark1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_reference(struct soap *soap, const void *p, const struct soap_array *a, int n, int t)
-{ register int i;
-  struct soap_plist *pp;
-  if (!p)
-    return 1;
-  i = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
-  if (i)
-  { if (pp->mark1 == 0)
-    { pp->mark1 = 2;
-      pp->mark2 = 2;
-    }
-  }
-  else if (!soap_array_pointer_enter(soap, p, a, t, &pp))
-    return 1;
-  pp->mark1 = 0;
-  pp->mark2 = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p size=%d type = %d (%d %d)\n", p, a->__ptr, n, t, (int)pp->mark1, (int)pp->mark2));
-  return pp->mark1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embedded_id(struct soap *soap, int id, const void *p, int t)
-{ struct soap_plist *pp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id));
-  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)) && soap->part != SOAP_IN_HEADER)
-  { if (id < 0)
-    { id = soap_pointer_lookup(soap, p, t, &pp);
-      if (id > 0 && pp)
-      { if (soap->mode & SOAP_IO_LENGTH)
-          pp->mark1 = 2;
-        else
-          pp->mark2 = 2;
-      }
-      return -1;
-    }
-    return id;
-  }
-  if (id < 0)
-    id = soap_pointer_lookup(soap, p, t, &pp);
-  else
-    soap_pointer_lookup(soap, p, t, &pp);
-  if (id > 0 && pp)
-  { if (soap->mode & SOAP_IO_LENGTH)
-      pp->mark1 = 1;
-    else
-      pp->mark2 = 1;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2));
-  }
-  return id;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_embedded(struct soap *soap, struct soap_plist *pp)
-{ if (!pp)
-    return 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2));
-  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & (SOAP_XML_TREE | SOAP_XML_GRAPH)) && soap->part != SOAP_IN_HEADER)
-  { if (soap->mode & SOAP_IO_LENGTH)
-      return pp->mark1 != 0;
-    return pp->mark2 != 0;
-  }
-  if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 1;
-  return pp->mark2 == 1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_single(struct soap *soap, struct soap_plist *pp)
-{ if ((soap->mode & SOAP_XML_TREE) || soap->part == SOAP_IN_HEADER)
-    return 1;
-  if (!pp)
-    return 0;
-  if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 0;
-  return pp->mark2 == 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_multi(struct soap *soap, struct soap_plist *pp)
-{ if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 2;
-  return pp->mark2 == 2;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_embedded(struct soap *soap, struct soap_plist *pp)
-{ if (!pp)
-    return;
-  if (soap->mode & SOAP_IO_LENGTH)
-    pp->mark1 = 1;
-  else
-    pp->mark2 = 1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_attached(struct soap *soap, struct soap_plist *pp, const char *id, const char *type, const char *options, size_t size)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attached id='%s' type='%s'\n", id?id:"", type?type:""));
-  if (soap->mode & SOAP_IO_LENGTH)
-  { if (pp->mark1 != 3)
-    { pp->mark1 = 3;
-      soap->dime_count++; /* one more attachment found */
-      soap->dime_size += 12; /* increase total size (DIME fields) */
-      if (id)
-        soap->dime_size += (strlen(id)+3)&(~3);
-      if (type)
-        soap->dime_size += (strlen(type)+3)&(~3);
-      if (options)
-        soap->dime_size += 4 + (((((unsigned char)options[2] << 8 | (unsigned char)options[3]))+3)&(~3));
-      soap->dime_size += (size+3)&(~3);
-    }
-  }
-  else if (pp->mark2 != 3)
-    pp->mark2 = 3;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_init_iht(struct soap *soap)
-{ register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing ID hashtable\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-    soap->iht[i] = NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_free_iht(struct soap *soap)
-{ register int i;
-  register struct soap_ilist *ip, *p;
-  register struct soap_flist *fp, *q;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = p)
-    { for (fp = ip->flist; fp; fp = q)
-      { q = fp->next;
-        SOAP_FREE(fp);
-      }
-      p = ip->next;
-      SOAP_FREE(ip);
-    }
-    soap->iht[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static struct soap_ilist *
-soap_hlookup(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next)
-    if (!strcmp(ip->id, id))
-      return ip;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_ilist *
-SOAP_FMAC2
-soap_lookup(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  ip = soap_hlookup(soap, id);
-#ifndef WITH_LEANER
-  if (!ip && *id != '#' && !strchr(id, ':')) /* try content id "cid:" with DIME attachments */
-  { char cid[SOAP_TAGLEN];
-    strcpy(cid, "cid:");
-    strncat(cid + 4, id, sizeof(cid) - 5);
-    cid[sizeof(cid) - 1] = '\0';
-    ip = soap_hlookup(soap, cid);
-  }
-#endif
-  return ip;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_ilist *
-SOAP_FMAC2
-soap_enter(struct soap *soap, const char *id)
-{ register int h;
-  register struct soap_ilist *ip;
-  ip = (struct soap_ilist*)SOAP_MALLOC(sizeof(struct soap_ilist) + strlen(id));
-  if (ip)
-  { h = soap_hash(id);
-    strcpy(ip->id, id);
-    ip->next = soap->iht[h];
-    soap->iht[h] = ip;
-    return ip;
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_malloc(struct soap *soap, size_t n)
-{ register char *p;
-  if (!n)
-    return NULL;
-  if (!soap)
-    return SOAP_MALLOC(n);
-  n += (-(long)n) & 7;
-  if (!(p = (char*)SOAP_MALLOC(n + sizeof(void*) + sizeof(size_t))))
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  /* keep chain of alloced cells for later destruction */
-  soap->alloced = 1;
-  *(void**)(p + n) = soap->alist;
-  *(size_t*)(p + n + sizeof(void*)) = n;
-  soap->alist = p + n;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Malloc %u bytes at location %p\n", (unsigned int)n, p));
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_dealloc(struct soap *soap, void *p)
-{ if (!soap)
-    return;
-  if (p)
-  { register char **q;
-    for (q = (char**)&soap->alist; *q; q = *(char***)q)
-    { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
-      { *q = **(char***)q;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p));
-        SOAP_FREE(p);
-        return;
-      }
-    }
-    soap_delete(soap, p);
-  }
-  else
-  { register char *q;
-    while (soap->alist)
-    { q = (char*)soap->alist;
-      soap->alist = *(void**)q;
-      q -= *(size_t*)(q + sizeof(void*));
-      if (q == (char*)soap->fault)
-        soap->fault = NULL; /* this was deallocated */
-      else if (q == (char*)soap->header)
-        soap->header = NULL; /* this was deallocated */
-      SOAP_FREE(q);
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Dealloc all data done\n"));
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_delete(struct soap *soap, void *p)
-{ register struct soap_clist **cp = &soap->clist;
-  if (p)
-  { while (*cp)
-    { if (p == (*cp)->ptr)
-      { register struct soap_clist *q = *cp;
-        *cp = q->next;
-        q->fdelete(q);
-        SOAP_FREE(q);
-        return;
-      }
-      cp = &(*cp)->next;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p));
-  }
-  else
-  { while (*cp)
-    { register struct soap_clist *q = *cp;
-      *cp = q->next;
-      if (q->ptr == (void*)soap->fault)
-        soap->fault = NULL; /* this was deallocated */
-      else if (q->ptr == (void*)soap->header)
-        soap->header = NULL; /* this was deallocated */
-      q->fdelete(q);
-      SOAP_FREE(q);
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_clist *
-SOAP_FMAC2
-soap_link(struct soap *soap, void *p, int t, int n, void (*fdelete)(struct soap_clist*))
-{ register struct soap_clist *cp;
-  if ((cp = (struct soap_clist*)SOAP_MALLOC(sizeof(struct soap_clist))))
-  { cp->next = soap->clist;
-    cp->type = t;
-    cp->size = n; 
-    cp->ptr = p;
-    cp->fdelete = fdelete;
-    soap->clist = cp;
-  }
-  return cp;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_unlink(struct soap *soap, const void *p)
-{ register char **q;
-  register struct soap_clist **cp;
-  if (!soap || !p)
-    return;
-  for (q = (char**)&soap->alist; *q; q = *(char***)q)
-  { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
-    { *q = **(char***)q;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p));
-      return;
-    }
-  }
-  for (cp = &soap->clist; *cp; cp = &(*cp)->next)
-  { if (p == (*cp)->ptr)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p));
-      q = (char**)*cp;
-      *cp = (*cp)->next;
-      SOAP_FREE(q);
-      return;
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_lookup_type(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  if (*id)
-  { ip = soap_lookup(soap, id);
-    if (ip)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type));
-      return ip->type;
-    }
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k)
-{ struct soap_ilist *ip;
-  void **q;
-  if (*id == '\0')
-    return p;
-  soap->alloced = 0;
-  if (!p)
-    p = (void**)soap_malloc(soap, sizeof(void*));
-  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
-  if (!ip)
-  { ip = soap_enter(soap, id); /* new hash table entry for string id */
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' %p (%u bytes)\n", id, p, (unsigned int)n));
-    ip->type = t;
-    ip->size = n; 
-    ip->link = p;
-    ip->copy = NULL;
-    ip->flist = NULL;
-    ip->ptr = NULL;
-    ip->level = k;
-    *p = NULL;
-  }
-  else if (!soap->blist && ip->ptr)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type='%d' (%u bytes)\n", id, t, (unsigned int)n));
-    if (ip->type != t)
-    { soap->error = SOAP_HREF;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Object mismatch: id's type='%d' href's type='%d'\n", ip->type, t));
-      return NULL;
-    }
-    while (ip->level < k)
-    { q = (void**)soap_malloc(soap, sizeof(void*));  
-      if (!q)
-        return NULL;
-      *p = (void*)q;
-      p = q;
-      k--;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    *p = ip->ptr;
-  }
-  else if (ip->level > k)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving level %u pointers to href='%s'\n", ip->level, id));
-    while (ip->level > k)
-    { void *s, **r = &ip->link;
-      q = (void**)ip->link;
-      while (q)
-      { *r = (void*)soap_malloc(soap, sizeof(void*));
-        s = *q;
-        *q = *r;
-        r = *(void***)q;
-        q = (void**)s;
-      }
-      *r = NULL;
-      ip->size = n; 
-      ip->copy = NULL;
-      ip->level = ip->level - 1;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    q = (void**)ip->link;
-    ip->link = p;
-    *p = (void*)q;
-  }
-  else
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' (%u bytes)\n", id, (unsigned int)n));
-    while (ip->level < k)
-    { q = (void**)soap_malloc(soap, sizeof(void*));  
-      *p = q;
-      p = q;
-      k--;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    q = (void**)ip->link;
-    ip->link = p;
-    *p = (void*)q;
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_forward(struct soap *soap, const char *href, void *p, int t, size_t n)
-{ struct soap_ilist *ip;
-  if (!p || !*href)
-    return p;
-  ip = soap_lookup(soap, soap->href); /* lookup pointer to hash table entry for string id */
-  if (!ip)
-  { if (n >= sizeof(void*))
-    { ip = soap_enter(soap, href); /* new hash table entry for string id */
-      ip->type = t;
-      ip->size = n;
-      ip->link = NULL;
-      ip->copy = p;
-      ip->flist = NULL;
-      *(void**)p = NULL;
-      ip->ptr = NULL;
-      ip->level = 0;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first copying address %p for type %d href='%s'\n", p, t, href));
-      return p;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding problem: copying location %p too small (%u) for href='%s'\n", p, (unsigned int)n, href));
-    soap->error = SOAP_HREF;
-    return NULL;
-  }
-  else if (ip->ptr)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying value from location %p to location %p to resolve href='%s'\n", ip->ptr, p, href));
-    memcpy(p, ip->ptr, n);
-  }
-  else if (n >= sizeof(void*))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type %d href='%s' (prev in chain = %p)\n", p, t, href, ip->copy));
-    *(void**)p = ip->copy;
-    ip->copy = p;
-    return p;
-  }
-  else
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding problem: copying location %p too small (%u) for href='%s'\n", p, (unsigned int)n, href));
-    soap->error = SOAP_HREF; /* href to object too small to hold pointer */
-    return NULL;
-  }
-  return ip->ptr;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, int k)
-{ struct soap_ilist *ip;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%d level=%d\n", id, t, p, (int)n, k));
-  soap->alloced = 0;
-  if (*id == '\0')
-  { if (!p)
-      return soap_malloc(soap, n);
-    else
-      return p;
-  }
-  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s'\n", id));
-  if (!ip)
-  { ip = soap_enter(soap, id); /* new hash table entry for string id */
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%u\n", id, t, (unsigned int)n));
-    ip->type = t;
-    ip->size = n;
-    ip->link = NULL;
-    ip->copy = NULL;
-    ip->flist = NULL;
-    if (!p)
-      p = soap_malloc(soap, n);
-    ip->ptr = p;
-    ip->level = k;
-  }
-  else if (ip->ptr) /* storage address was forwarded */
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id));
-    if (p)
-    { soap->error = SOAP_MULTI_ID;
-      return NULL;
-    }
-  }
-  else 
-  { if (!p)
-      p = soap_malloc(soap, n);
-    ip->ptr = p;
-    if (!soap->blist)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolve link chain to point to %p\n", ip->ptr));
-      soap_resolve_ptr(ip);
-    }
-  }
-  return ip->ptr;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_end_send(struct soap *soap)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send\n"));
-  if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */
-  { if (soap_flush(soap))
-#ifdef WITH_ZLIB
-    { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE)
-      { soap->zlib_state = SOAP_ZLIB_NONE;
-        deflateEnd(&soap->d_stream);
-      }
-      return soap->error;
-    }
-#else
-      return soap->error;
-#endif
-#ifdef WITH_ZLIB
-    if (soap->mode & SOAP_ENC_ZLIB)
-    { int r;
-      soap->d_stream.avail_in = 0;
-      do
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n"));
-        r = deflate(&soap->d_stream, Z_FINISH);
-        if (soap->d_stream.avail_out != SOAP_BUFLEN)
-        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream.avail_out))
-          { soap->zlib_state = SOAP_ZLIB_NONE;
-            deflateEnd(&soap->d_stream);
-            return soap->error;
-         }
-          soap->d_stream.next_out = (Byte*)soap->z_buf;
-          soap->d_stream.avail_out = SOAP_BUFLEN;
-        }
-      } while (r == Z_OK);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-      soap->z_ratio_out = (float)soap->d_stream.total_out / (float)soap->d_stream.total_in;
-      soap->mode &= ~SOAP_ENC_ZLIB;
-      soap->zlib_state = SOAP_ZLIB_NONE;
-      if (deflateEnd(&soap->d_stream) != Z_OK || r != Z_STREAM_END)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-#ifdef WITH_GZIP
-      soap->z_buf[0] = soap->z_crc & 0xFF;
-      soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF;
-      soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF;
-      soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF;
-      soap->z_buf[4] = soap->d_stream.total_in & 0xFF;
-      soap->z_buf[5] = (soap->d_stream.total_in >> 8) & 0xFF;
-      soap->z_buf[6] = (soap->d_stream.total_in >> 16) & 0xFF;
-      soap->z_buf[7] = (soap->d_stream.total_in >> 24) & 0xFF;
-      if (soap_flush_raw(soap, soap->z_buf, 8))
-        return soap->error;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", soap->z_crc));
-#endif
-    }
-#endif
-#ifndef WITH_LEAN
-    if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    { char *p;
-      if (!(soap->mode & SOAP_ENC_XML))
-      { soap->mode--;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size));
-        if (soap->status >= SOAP_POST)
-          soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size);
-        else if (soap->status != SOAP_STOP)
-          soap->error = soap->fresponse(soap, soap->status, soap->blist->size);
-        if (soap->error || soap_flush(soap))
-          return soap->error;
-        soap->mode++;
-      }
-      for (p = soap_first_block(soap); p; p = soap_next_block(soap))
-      { DBGMSG(SENT, p, soap_block_size(soap));
-        if ((soap->error = soap->fsend(soap, p, soap_block_size(soap))))
-        { soap_end_block(soap);
-          return soap->error;
-        }
-      }
-      soap_end_block(soap);
-    }
-    else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    { DBGMSG(SENT, "\r\n0\r\n\r\n", 7);
-      if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7)))
-        return soap->error;
-    }
-#endif
-  }
-#ifdef WITH_OPENSSL
-  if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive)
-    shutdown((SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
-#else
-  if (soap_valid_socket(soap->socket) && !soap->keep_alive)
-    shutdown((SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send message ok\n"));
-  soap->part = SOAP_END;
-  soap->count = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_end_recv(struct soap *soap)
-{ soap->part = SOAP_END;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n"));
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { soap->mode &= ~SOAP_ENC_ZLIB;
-    memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
-    soap->bufidx = (char*)soap->d_stream.next_in - soap->z_buf;
-    soap->buflen = soap->z_buflen;
-    soap->zlib_state = SOAP_ZLIB_NONE;
-    if (inflateEnd(&soap->d_stream) != Z_OK)
-      return soap->error = SOAP_ZLIB_ERROR;
-#ifdef WITH_GZIP
-    if (soap->zlib_in == SOAP_ZLIB_GZIP)
-    { wchar c;
-      short i;
-      for (i = 0; i < 8; i++)
-      { if ((int)(c = soap_getchar(soap)) == EOF)
-          return soap->error = SOAP_EOF;
-        soap->z_buf[i] = (char)c;
-      }
-      if (soap->z_crc != ((unsigned char)soap->z_buf[0] | (unsigned long)((unsigned char)soap->z_buf[1] << 8) | (unsigned long)((unsigned char)soap->z_buf[2] << 16) | (unsigned long)((unsigned char)soap->z_buf[3] << 24)))
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: crc check failed, message corrupted? (crc32=%lu)\n", soap->z_crc));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-      if (soap->d_stream.total_out != ((unsigned char)soap->z_buf[4] | (unsigned long)((unsigned char)soap->z_buf[5] << 8) | (unsigned long)((unsigned char)soap->z_buf[6] << 16) | (unsigned long)((unsigned char)soap->z_buf[7] << 24)))
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: incorrect message length\n"));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-    }
-#endif
-  }
-#endif
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    while ((int)soap_getchar(soap) != EOF) /* advance to last chunk */
-      ;
-  if (soap->fdisconnect)
-    if ((soap->error = soap->fdisconnect(soap)))
-      return soap->error;
-  return soap_resolve(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_free(struct soap *soap)
-{ register struct soap_nlist *np;
-  register struct soap_attribute *tp;
-  register struct Namespace *ns;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n"));
-  while (soap->nlist)
-  { np = soap->nlist->next;
-    if (soap->nlist->ns)
-      SOAP_FREE(soap->nlist->ns);
-    SOAP_FREE(soap->nlist);
-    soap->nlist = np;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n"));
-  while (soap->blist)
-    soap_end_block(soap);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attributes\n"));
-  while (soap->attributes)
-  { tp = soap->attributes->next;
-    if (soap->attributes->value)
-      SOAP_FREE(soap->attributes->value);
-    SOAP_FREE(soap->attributes);
-    soap->attributes = tp;
-  }
-  if (soap->labbuf)
-    SOAP_FREE(soap->labbuf);
-  soap->labbuf = NULL;
-  soap->lablen = 0;
-  soap->labidx = 0;
-  soap_free_pht(soap);
-  soap_free_iht(soap);
-  ns = soap->local_namespaces;
-  if (ns)
-  { for (; ns->id; ns++)
-    { if (ns->out)
-      { SOAP_FREE(ns->out);
-       if (soap->encodingStyle == ns->out)
-          soap->encodingStyle = SOAP_STR_EOS;
-        ns->out = NULL;
-      }
-      if (soap->encodingStyle == ns->ns)
-        soap->encodingStyle = SOAP_STR_EOS;
-    }
-    SOAP_FREE(soap->local_namespaces);
-    soap->local_namespaces = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static void
-soap_init_logs(struct soap *soap)
-{ int i;
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-  { soap->logfile[i] = NULL;
-    soap->fdebug[i] = NULL;
-  }
-#ifdef SOAP_DEBUG  
-  soap_set_recv_logfile(soap, "RECV.log");
-  soap_set_sent_logfile(soap, "SENT.log");
-  soap_set_test_logfile(soap, "TEST.log");
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_open_logfile(struct soap *soap, int i)
-{ if (soap->logfile[i])
-    soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a");
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static void
-soap_close_logfile(struct soap *soap, int i)
-{ if (soap->fdebug[i])
-  { fclose(soap->fdebug[i]);
-    soap->fdebug[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_close_logfiles(struct soap *soap)
-{ int i;
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-    soap_close_logfile(soap, i);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static void
-soap_set_logfile(struct soap *soap, int i, const char *logfile)
-{ char *s = NULL;
-  soap_close_logfile(soap, i);
-  if (soap->logfile[i])
-    SOAP_FREE((void*)soap->logfile[i]);
-  if (logfile)
-    if ((s = (char*)SOAP_MALLOC(strlen(logfile) + 1)))
-      strcpy(s, logfile);
-  soap->logfile[i] = s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_recv_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_RECV, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_sent_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_SENT, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_test_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_TEST, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_copy(struct soap *soap)
-{ return soap_copy_context((struct soap*)SOAP_MALLOC(sizeof(struct soap)), soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_copy_context(struct soap *copy, struct soap *soap)
-{ if (copy)
-  { register struct soap_plugin *p;
-    memcpy(copy, soap, sizeof(struct soap));
-    copy->copy = 1;
-    copy->user = NULL;
-    copy->userid = NULL;
-    copy->passwd = NULL;
-    copy->nlist = NULL;
-    copy->blist = NULL;
-    copy->clist = NULL;
-    copy->alist = NULL;
-    copy->attributes = NULL;
-    copy->local_namespaces = NULL;
-    soap_set_local_namespaces(copy);
-    soap_init_iht(copy);
-    soap_init_pht(copy);
-    copy->header = NULL;
-    copy->fault = NULL;
-    copy->action = NULL;
-    *copy->host = '\0';
-#ifndef WITH_LEAN
-#ifdef WITH_COOKIES
-    copy->cookies = soap_copy_cookies(soap);
-#else
-    copy->cookies = NULL;
-#endif
-    soap_init_logs(copy);
-#endif
-    copy->plugins = NULL;
-    for (p = soap->plugins; p; p = p->next)
-    { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin));
-      if (!q)
-        return NULL;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id));
-      *q = *p;
-      if (p->fcopy && (soap->error = p->fcopy(soap, q, p)))
-      { SOAP_FREE(q);
-        return NULL;
-      }
-      q->next = copy->plugins;
-      copy->plugins = q;
-    }
-  }
-  else
-    soap->error = SOAP_EOM;
-  return copy;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init(struct soap *soap)
-{ soap->version = 1; /* default SOAP 1.1 */
-  soap_imode(soap, SOAP_IO_DEFAULT);
-  soap_omode(soap, SOAP_IO_DEFAULT);
-  soap->copy = 0;
-  soap->plugins = NULL;
-  soap->user = NULL;
-  soap->userid = NULL;
-  soap->passwd = NULL;
-  soap->fpost = http_post;
-  soap->fget = http_get;
-  soap->fposthdr = http_post_header;
-  soap->fresponse = http_response;
-  soap->fparse = http_parse;
-  soap->fparsehdr = http_parse_header;
-  soap->fconnect = NULL;
-  soap->fdisconnect = NULL;
-#ifndef MAC_CARBON
-  soap->faccept = tcp_accept;
-  soap->fopen = tcp_connect;
-  soap->fclose = tcp_disconnect;
-  soap->fsend = fsend;
-  soap->frecv = frecv;
-#endif
-  soap->fprepare = NULL;
-  soap->fignore = NULL;
-  soap->fplugin = fplugin;
-  soap->fdimereadopen = NULL;
-  soap->fdimewriteopen = NULL;
-  soap->fdimereadclose = NULL;
-  soap->fdimewriteclose = NULL;
-  soap->fdimeread = NULL;
-  soap->fdimewrite = NULL;
-  soap->float_format = "%.8g"; /* .8 preserves single FP precision as much as possible, but might not be very efficient */
-  soap->double_format = "%.17lg"; /* .17 preserves double FP precision as much as possible, but might not be very efficient */
-  soap->dime_id_format = "cid:id%d"; /* default DIME id format */
-  soap->http_version = "1.1";
-  soap->encodingStyle = SOAP_STR_EOS;
-  soap->actor = NULL;
-  soap->max_keep_alive = SOAP_MAXKEEPALIVE;
-  soap->keep_alive = 0;
-  soap->recv_timeout = 0;
-  soap->send_timeout = 0;
-  soap->connect_timeout = 0;
-  soap->accept_timeout = 0;
-  soap->socket_flags = 0;
-  soap->connect_flags = 0;
-  soap->bind_flags = 0;
-  soap->accept_flags = 0;
-  soap->ip = 0;
-  soap->labbuf = NULL;
-  soap->lablen = 0;
-  soap->labidx = 0;
-#ifndef WITH_NONAMESPACES
-  soap->namespaces = namespaces;
-#else
-  soap->namespaces = NULL;
-#endif
-  soap->local_namespaces = NULL;
-  soap->nlist = NULL;
-  soap->blist = NULL;
-  soap->clist = NULL;
-  soap->alist = NULL;
-  soap->attributes = NULL;
-  soap->header = NULL;
-  soap->fault = NULL;
-  soap->master = SOAP_INVALID_SOCKET;
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->os = NULL;
-  soap->is = NULL;
-  soap->dom = NULL;
-#ifndef UNDER_CE
-  soap->recvfd = 0;
-  soap->sendfd = 1;
-#else
-  soap->recvfd = stdin;
-  soap->sendfd = stdout;
-#endif 
-  soap->host[0] = '\0';
-  soap->port = 0;
-  soap->action = NULL;
-  soap->proxy_host = NULL;
-  soap->proxy_port = 8080;
-  soap->proxy_userid = NULL;
-  soap->proxy_passwd = NULL;
-#ifdef WITH_OPENSSL
-  soap->fsslauth = ssl_auth_init;
-  soap->fsslverify = ssl_verify_callback;
-  soap->bio = NULL;
-  soap->ssl = NULL;
-  soap->ctx = NULL;
-  soap->require_server_auth = 0;
-  soap->require_client_auth = 0;
-  soap->rsa = 0;
-  soap->keyfile = NULL;
-  soap->password = NULL;
-  soap->dhfile = NULL;
-  soap->cafile = NULL;
-  soap->capath = NULL;
-  soap->randfile = NULL;
-  soap->session = NULL;
-#endif
-#ifdef WITH_ZLIB
-  soap->zlib_state = SOAP_ZLIB_NONE;
-  soap->zlib_in = SOAP_ZLIB_NONE;
-  soap->zlib_out = SOAP_ZLIB_NONE;
-  soap->d_stream.zalloc = NULL;
-  soap->d_stream.zfree = NULL;
-  soap->d_stream.opaque = NULL;
-  soap->z_level = 6;
-#endif
-#ifndef WITH_LEAN
-  soap->cookies = NULL;
-  soap->cookie_domain = NULL;
-  soap->cookie_path = NULL;
-  soap->cookie_max = 32;
-  soap_init_logs(soap);
-#endif
-/* WR[ */
-#ifdef WMW_RPM_IO
-  soap->rpmreqid = NULL;
-#endif /* WMW_RPM_IO */
-/* ]WR */
-  soap_init_iht(soap);
-  soap_init_pht(soap);
-  soap_begin(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init1(struct soap *soap, int mode)
-{ soap_init2(soap, mode, mode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init2(struct soap *soap, int imode, int omode)
-{ soap_init(soap);
-  soap_imode(soap, imode);
-  soap_omode(soap, omode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_begin(struct soap *soap)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing\n"));
-  if (!soap->keep_alive)
-  { soap->buflen = 0;
-    soap->bufidx = 0;
-  }
-  soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0);
-  soap->null = 0;
-  soap->position = 0;
-  soap->encoding = 0;
-  soap->mustUnderstand = 0;
-  soap->mode = 0;
-  soap->ns = 0;
-  soap->part = SOAP_BEGIN;
-  soap->alloced = 0;
-  soap->count = 0;
-  soap->length = 0;
-  soap->cdata = 0;
-  soap->error = SOAP_OK;
-  soap->peeked = 0;
-  soap->ahead = 0;
-  soap->idnum = 0;
-  soap->level = 0;
-  soap->endpoint[0] = '\0';
-  soap->dime_chunksize = 0;
-  soap->dime_buflen = 0;
-  soap->dot_net_bug = 0;
-  soap_free(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_end(struct soap *soap)
-{ register struct soap_clist *cp;
-  soap_free(soap);
-  soap_dealloc(soap, NULL);
-  while (soap->clist)
-  { cp = soap->clist->next;
-    SOAP_FREE(soap->clist);
-    soap->clist = cp;
-  }
-  soap_closesock(soap);
-#ifndef WITH_LEAN
-  soap_close_logfiles(soap);
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_namespaces(struct soap *soap, struct Namespace *p)
-{ struct Namespace *ns = soap->local_namespaces;
-  struct soap_nlist *np, *nq, *nr;
-  unsigned int level = soap->level;
-  soap->namespaces = p;
-  soap->local_namespaces = NULL;
-  soap_set_local_namespaces(soap);
-  /* reverse the list */
-  np = soap->nlist;
-  soap->nlist = NULL;
-  if (np)
-  { nq = np->next;
-    np->next = NULL;
-    while (nq)
-    { nr = nq->next;
-      nq->next = np;
-      np = nq;
-      nq = nr;
-    }
-  }
-  while (np)
-  { soap->level = np->level; /* preserve element nesting level */
-    if (np->ns)
-    { if (soap_push_namespace(soap, np->id, np->ns))
-        return soap->error;
-    }
-    else if (np->index >= 0 && ns)
-    { if (ns[np->index].out)
-      { if (soap_push_namespace(soap, np->id, ns[np->index].out))
-          return soap->error;
-      }
-      else if (soap_push_namespace(soap, np->id, ns[np->index].ns))
-        return soap->error;
-    }
-    if (np->ns)
-      SOAP_FREE(np->ns);
-    nq = np;
-    np = np->next;
-    SOAP_FREE(nq);
-  }
-  if (ns)
-  { int i;
-    for (i = 0; ns[i].id; i++)
-    { if (ns[i].out)
-      { SOAP_FREE(ns[i].out);
-        ns[i].out = NULL;
-      }
-    }
-    SOAP_FREE(ns);
-  }
-  soap->level = level; /* restore level */
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_set_local_namespaces(struct soap *soap)
-{ if (soap->namespaces && !soap->local_namespaces)
-  { register struct Namespace *ns;
-    register size_t n = 1;
-    for (ns = soap->namespaces; ns->id; ns++)
-      n++;
-    if (n > 3)
-    { n *= sizeof(struct Namespace);
-      ns = (struct Namespace*)SOAP_MALLOC(n);
-      if (ns)
-      { memcpy(ns, soap->namespaces, n);
-        ns[0].id = "SOAP-ENV";
-        ns[1].id = "SOAP-ENC";
-        ns[2].id = "xsi";
-        if (ns[0].ns)
-        { if (!strcmp(ns[0].ns, soap_env1))
-            soap->version = 1;
-          else
-            soap->version = 2;
-        }
-        soap->local_namespaces = ns;
-      }
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element(struct soap *soap, const char *tag, int id, const char *type)
-{ struct Namespace *ns = soap->local_namespaces;
-  register const char *s;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' id='%d' type='%s'\n", tag, id, type?type:""));
-/**/
-#ifdef WITH_DOM
-  if (soap->mode & SOAP_XML_DOM)
-  { register struct soap_dom_element *p, *e = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
-    e->next = NULL;
-    e->prnt = soap->dom;
-    e->nstr = NULL;
-    e->name = soap_strdup(soap, tag); /* check EOM? */
-    e->data = NULL;
-    e->type = 0;
-    e->node = NULL;
-    e->elts = NULL;
-    e->atts = NULL;
-    if (soap->dom)
-    { p = soap->dom->elts;
-      if (p)
-      { while (p->next)
-          p = p->next;
-        p->next = e;
-      }
-      else
-        soap->dom->elts = e;
-    }
-    soap->dom = e;
-  }
-  else
-#endif
-{
-  soap->level++;
-  if (!soap->ns && !(soap->mode & SOAP_XML_CANONICAL))
-    if (soap_send(soap, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"))
-      return soap->error;
-  if (soap_send_raw(soap, "<", 1))
-    return soap->error;
-  s = tag;
-  if (ns && soap->part != SOAP_IN_ENVELOPE && (soap->part == SOAP_IN_HEADER || !soap->encodingStyle))
-  { register const char *t = strchr(s, ':');
-    if (t)
-    { s = t + 1;
-      for (ns++; ns->id; ns++)
-      { if ((ns->out || ns->ns) && !strncmp(ns->id, tag, t - tag) && !ns->id[t - tag])
-        { if (soap_send(soap, s) || soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns))
-            return soap->error;
-         s = NULL;
-          break;
-        }
-      }
-    }
-  }
-  if (s)
-    if (soap_send(soap, tag))
-      return soap->error;
-}
-/**/
-  if (!soap->ns)
-  { for (ns = soap->local_namespaces; ns && ns->id; ns++)
-    { if (*ns->id && (ns->out || ns->ns))
-      { sprintf(soap->tmpbuf, "xmlns:%s", ns->id);
-        if (soap_attribute(soap, soap->tmpbuf, ns->out ? ns->out : ns->ns))
-          return soap->error;
-      }
-    }   
-    soap->ns = 1;
-  }
-  if (id > 0)
-  { sprintf(soap->tmpbuf, "_%d", id);
-    if (soap_attribute(soap, "id", soap->tmpbuf))
-      return soap->error;
-  }
-  if (type && *type)
-  { if (soap_attribute(soap, "xsi:type", type))
-      return soap->error;
-  }
-  if (soap->null && soap->position > 0)
-  { int i;
-    sprintf(soap->tmpbuf, "[%d", soap->positions[0]);
-    for (i = 1; i < soap->position; i++)
-      sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ",%d", soap->positions[i]);
-    strcat(soap->tmpbuf, "]");
-    if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf))
-      return soap->error;
-  }
-  if (soap->mustUnderstand)
-  { if (soap->actor && *soap->actor)
-    { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor))
-        return soap->error;
-    }
-    if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1"))
-      return soap->error;
-    soap->mustUnderstand = 0;
-  }
-  if (soap->encoding)
-  { if (soap->encodingStyle)
-    { if (!*soap->encodingStyle && soap->local_namespaces)
-      { if (soap->local_namespaces[1].out)
-          soap->encodingStyle = soap->local_namespaces[1].out;
-        else
-          soap->encodingStyle = soap->local_namespaces[1].ns;
-      }
-      if (soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle))
-        return soap->error;
-    }
-    soap->encoding = 0;
-  }
-  soap->null = 0;
-  soap->position = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type)
-{ if (*tag == '-')
-    return SOAP_OK;
-  if (soap_element(soap, tag, id, type))
-    return soap->error;
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRRCHR
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_strrchr(const char *s, int t)
-{ register char *r = NULL;
-  while (*s)
-    if (*s++ == t)
-      r = (char*)s - 1;
-  return r;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRTOL
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_strtol(const char *s, char **t, int b)
-{ register long n = 0;
-  register int c;
-  while (*s > 0 && *s <= 32)
-    s++;
-  if (b == 10)
-  { short neg = 0;
-    if (*s == '-')
-    { s++;
-      neg = 1;
-    }
-    else if (*s == '+')
-      s++;
-    while ((c = *s) && c >= '0' && c <= '9')
-    { if (n > 214748364)
-        break;
-      n *= 10;
-      n += c - '0';
-      s++;
-    }
-    if (neg)
-      n = -n;
-  }
-  else /* b == 16 and value is always positive */
-  { while ((c = *s))
-    { if (c >= '0' && c <= '9')
-        c -= '0';
-      else if (c >= 'A' && c <= 'F')
-        c -= 'A' - 10;
-      else if (c >= 'a' && c <= 'f')
-        c -= 'a' - 10;
-      if (n > 0x07FFFFFF)
-        break;
-      n <<= 4;
-      n += c;
-      s++;
-    }
-  }
-  if (t)
-    *t = (char*)s;
-  return n;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRTOUL
-SOAP_FMAC1
-unsigned long
-SOAP_FMAC2
-soap_strtoul(const char *s, char **t, int b)
-{ unsigned long n = 0;
-  register int c;
-  while (*s > 0 && *s <= 32)
-    s++;
-  if (b == 10)
-  { if (*s == '+')
-      s++;
-    while ((c = *s) && c >= '0' && c <= '9')
-    { if (n > 429496729)
-        break;
-      n *= 10;
-      n += c - '0';
-      s++;
-    }
-  }
-  else /* b == 16 */
-  { while ((c = *s))
-    { if (c >= '0' && c <= '9')
-        c -= '0';
-      else if (c >= 'A' && c <= 'F')
-        c -= 'A' - 10;
-      else if (c >= 'a' && c <= 'f')
-        c -= 'a' - 10;
-      if (n > 0x0FFFFFFF)
-        break;
-      n <<= 4;
-      n += c;
-      s++;
-    }
-  }
-  if (t)
-    *t = (char*)s;
-  return n;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset)
-{ if (soap_element(soap, tag, id, "SOAP-ENC:Array"))
-    return soap->error;
-  if (soap->version == 2)
-  { const char *s;
-    s = soap_strrchr(type, '[');
-    if ((size_t)(s - type) < sizeof(soap->tmpbuf))
-    { strncpy(soap->tmpbuf, type, s - type);
-      soap->tmpbuf[s - type] = '\0';
-      if (type && *type && (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)))
-        return soap->error;
-      if (s && (soap_attribute(soap, "SOAP-ENC:arraySize", s + 1)))
-        return soap->error;
-    }
-  }
-  else
-  { if (offset && (soap_attribute(soap, "SOAP-ENC:offset", offset)))
-      return soap->error;
-    if (type && *type && (soap_attribute(soap, "SOAP-ENC:arrayType", type)))
-      return soap->error;
-  }
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_start_end_out(struct soap *soap, const char *tag)
-{ register struct soap_attribute *tp;
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { for (tp = soap->attributes; tp; tp = tp->next)
-    { if (tp->visible)
-      { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
-       a->next = soap->dom->atts;
-        a->nstr = NULL;
-        a->name = soap_strdup(soap, tp->name); /* check EOM */
-        a->data = soap_strdup(soap, tp->value); /* check EOM */
-        a->wide = NULL;
-       soap->dom->atts = a;
-        tp->visible = 0;
-      }
-    }
-    return SOAP_OK;
-  }
-#endif
-/**/
-  for (tp = soap->attributes; tp; tp = tp->next)
-  { if (tp->visible)
-    { if (soap_send_raw(soap, " ", 1)
-       || soap_send(soap, tp->name))
-        return soap->error;
-      if (tp->visible == 2 && tp->value)
-        if (soap_send_raw(soap, "=\"", 2)
-        || soap_string_out(soap, tp->value, 1)
-        || soap_send_raw(soap, "\"", 1))
-          return soap->error;
-      tp->visible = 0;
-    }
-  }
-  if (tag)
-  { soap->level--;
-#ifndef WITH_LEAN
-    if (soap->mode & SOAP_XML_CANONICAL)
-    { if (soap_send_raw(soap, ">", 1)
-       || soap_element_end_out(soap, tag))
-        return soap->error;
-      return SOAP_OK;
-    }
-#endif
-    return soap_send_raw(soap, "/>", 2);
-  }
-  return soap_send_raw(soap, ">", 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_end_out(struct soap *soap, const char *tag)
-{ if (*tag == '-')
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag));
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { if (soap->dom->prnt)
-      soap->dom = soap->dom->prnt;
-    return SOAP_OK;
-  }
-#endif
-/**/
-  if (soap->part != SOAP_IN_ENVELOPE && (soap->part == SOAP_IN_HEADER || !soap->encodingStyle) && soap->local_namespaces)
-  { const char *s = strchr(tag, ':');
-    if (s && strncmp(tag, "SOAP-ENV", s - tag))
-      tag = s + 1;
-  }
-  soap->level--;
-  if (soap_send_raw(soap, "</", 2)
-   || soap_send(soap, tag)
-   || soap_send_raw(soap, ">", 1))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_ref(struct soap *soap, const char *tag, int id, int href)
-{ int n = 0;
-  if (soap_element(soap, tag, id, NULL))
-    return soap->error;
-  if (soap->version == 2)
-    n = 1;
-  sprintf(soap->tmpbuf, "#_%d", href);
-  if (soap_attribute(soap, "href" + n, soap->tmpbuf + n)
-   || soap_element_start_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_href(struct soap *soap, const char *tag, int id, const char *href)
-{ if (soap_element(soap, tag, id, NULL)
-   || soap_attribute(soap, "href", href)
-   || soap_element_start_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_null(struct soap *soap, const char *tag, int id, const char *type)
-{ struct soap_attribute *tp;
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (tp->visible)
-      break;
-  if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL))
-  { if (soap_element(soap, tag, id, type))
-      return soap->error;
-    if (soap->part != SOAP_IN_HEADER && soap->encodingStyle)
-      if (soap_attribute(soap, "xsi:nil", "true"))
-        return soap->error;
-    return soap_element_start_end_out(soap, tag);
-  }
-  soap->null = 1;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_result(struct soap *soap, const char *tag)
-{ if (soap->version == 2 && soap->encodingStyle)
-    if (soap_element(soap, "SOAP-RPC:result", 0, NULL)
-     || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc)
-     || soap_element_start_end_out(soap, NULL)
-     || soap_string_out(soap, tag, 0)
-     || soap_element_end_out(soap, "SOAP-RPC:result"))
-      return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_attribute(struct soap *soap, const char *name, const char *value)
-{ 
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
-    a->next = soap->dom->atts;
-    a->nstr = NULL;
-    a->name = soap_strdup(soap, name); /* check EOM */
-    a->data = soap_strdup(soap, value); /* check EOM */
-    a->wide = NULL;
-    soap->dom->atts = a;
-    return SOAP_OK;
-  }
-#endif
-/**/
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { if (soap_set_attr(soap, name, value))
-      return soap->error;
-  }
-  else
-#endif
-  { if (soap_send_raw(soap, " ", 1)
-     || soap_send(soap, name))
-      return soap->error;
-    if (value)
-      if (soap_send_raw(soap, "=\"", 2)
-       || soap_string_out(soap, value, 1)
-       || soap_send_raw(soap, "\"", 1))
-        return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_begin_in(struct soap *soap, const char *tag)
-{ if (tag && *tag == '-')
-    return SOAP_OK;
-  if (!soap_peek_element(soap))
-  { if (soap->other)
-      return soap->error = SOAP_TAG_MISMATCH;
-    if (!(soap->error = soap_match_tag(soap, soap->tag, tag)))
-    { if (tag && !soap->encodingStyle)
-      { const char *s = strchr(tag, ':');
-        if (s)
-          soap_push_default_namespace(soap, tag, s - tag);
-      }
-      soap->peeked = 0;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:"" ));
-      if (soap->body)
-        soap->level++;
-    }
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_end_in(struct soap *soap, const char *tag)  
-{ register wchar c;
-  register char *s;
-  register const char *t;
-  if (tag && *tag == '-')
-    return SOAP_OK;
-  soap->level--;
-  soap_pop_namespace(soap);
-  if (soap->peeked)
-  { if (*soap->tag == '\0')
-    { soap->peeked = 0;
-      soap->error = SOAP_OK;
-    }
-    else
-      return soap->error = SOAP_SYNTAX_ERROR;
-  }
-  else
-  { while (((c = soap_get(soap)) != TT))
-    { if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      if (c == LT)
-        return soap->error = SOAP_SYNTAX_ERROR;
-    }
-  }
-  s = soap->tag;
-  do c = soap_get(soap);
-  while (soap_blank(c));
-  do
-  { *s++ = (char)c;
-    c = soap_get(soap);
-  } while (soap_notblank(c));
-  *s = '\0';
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  while (soap_blank(c))
-    c = soap_get(soap);
-  if (c != GT)
-    return soap->error = SOAP_SYNTAX_ERROR;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:""));
-  if (!tag)
-    return SOAP_OK;
-  if ((s = strchr(soap->tag, ':')))
-    s++;
-  else
-    s = soap->tag;
-  if ((t = strchr(tag, ':')))
-    t++;
-  else
-    t = tag;
-  if (!SOAP_STRCMP(s, t))
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element does not match\n"));
-  return soap->error = SOAP_SYNTAX_ERROR;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_attribute *
-SOAP_FMAC2
-soap_attr(struct soap *soap, const char *name)
-{ register struct soap_attribute *tp;
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (!soap_match_tag(soap, tp->name, name))
-      return tp;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char *
-SOAP_FMAC2
-soap_attr_value(struct soap *soap, const char *name)
-{ register struct soap_attribute *tp = soap_attr(soap, name);
-  if (tp && tp->visible == 2)
-    return tp->value;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_attr(struct soap *soap, const char *name, const char *value)
-{ register struct soap_attribute *tp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value?value:""));
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (!strcmp(tp->name, name))
-      break;
-  if (!tp)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name));
-    if (!(tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(name))))
-      return soap->error = SOAP_EOM;
-    tp->ns = NULL;
-#ifndef WITH_LEAN
-    if (soap->mode & SOAP_XML_CANONICAL)
-    { struct soap_attribute **tpp = &soap->attributes;
-      const char *s = strchr(name, ':');
-      if (!strncmp(name, "xmlns", 5))
-      { for (; *tpp; tpp = &(*tpp)->next)
-          if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0)
-            break;
-      }
-      else if (!s)
-      { for (; *tpp; tpp = &(*tpp)->next)
-          if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0))
-            break;
-      }
-      else
-      { int k;
-        for (; *tpp; tpp = &(*tpp)->next)
-       { if (!strncmp((*tpp)->name, "xmlns:", 6) && !strncmp((*tpp)->name + 6, name, s - name) && !(*tpp)->name[6 + s - name])
-         { if (!tp->ns)
-            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Canonicalization: prefix %s=%p(%s)\n", name, (*tpp)->ns, (*tpp)->ns));
-             tp->ns = (*tpp)->ns;
-           }
-         }
-          else if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0)))
-            break;
-        }
-      }
-      tp->next = *tpp;
-      *tpp = tp;
-    }
-    else
-#endif
-    { tp->next = soap->attributes;
-      soap->attributes = tp;
-    }
-    strcpy(tp->name, name);
-    tp->value = NULL;
-  }
-  else if (value && tp->value && tp->size <= strlen(value))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value));
-    SOAP_FREE(tp->value);
-    tp->value = NULL;
-    tp->ns = NULL;
-  }
-  if (value)
-  { if (!tp->value)
-    { tp->size = strlen(value) + 1;
-      if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
-        return soap->error = SOAP_EOM;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value of %s (%p)\n", tp->name, tp->value));
-    }
-    strcpy(tp->value, value);
-    if (!strncmp(tp->name, "xmlns:", 6))
-      tp->ns = tp->value;
-    tp->visible = 2;
-  }
-  else
-    tp->visible = 1;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_attr(struct soap *soap)
-{ register struct soap_attribute *tp;
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { while (soap->attributes)
-    { tp = soap->attributes->next;
-      SOAP_FREE(soap->attributes->value);
-      SOAP_FREE(soap->attributes);
-      soap->attributes = tp;
-    }
-  }
-  else
-#endif
-  { for (tp = soap->attributes; tp; tp = tp->next)
-      tp->visible = 0;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int
-soap_getattrval(struct soap *soap, char *s, size_t n, wchar d)
-{ size_t i;
-  wchar c;
-  for (i = 0; i < n; i++)
-  { c = soap_getutf8(soap);
-    switch (c)
-    {
-    case TT:
-      *s++ = '<';
-      soap_unget(soap, '/');
-      break;
-    case LT:
-      *s++ = '<';
-      break;
-    case GT:
-      if (d == ' ')
-      { soap_unget(soap, c);
-        *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '>';
-      break;
-    case QT:
-      if (c == d)
-      { *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '"';
-      break;
-    case AP:
-      if (c == d)
-      { *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '\'';
-      break;
-    case '\t':
-    case '\n':
-    case '\r':
-    case ' ':
-    case '/':
-      if (d == ' ')
-      { soap_unget(soap, c);
-        *s = '\0';
-        return SOAP_OK;
-      }
-    default:
-      if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      *s++ = (char)c;
-    }
-  }
-  return soap->error = SOAP_EOM;
-}
-#endif
-
-/******************************************************************************/
-#ifdef WITH_FAST
-#ifndef PALM_2
-static int 
-soap_append_lab(struct soap *soap, const char *s, size_t n)
-{ if (soap->labidx + n >= soap->lablen)
-  { register char *t = soap->labbuf;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, old size=%lu", (unsigned long)soap->lablen));
-    if (soap->lablen == 0)
-      soap->lablen = SOAP_LABLEN;
-    while (soap->labidx + n >= soap->lablen)
-      soap->lablen <<= 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, ", new size=%lu\n", (unsigned long)soap->lablen));
-    soap->labbuf = (char*)SOAP_MALLOC(soap->lablen);
-    if (!soap->labbuf)
-    { if (t)
-        free(t);
-      return soap->error = SOAP_EOM;
-    }
-    if (t && soap->labidx)
-    { memcpy(soap->labbuf, t, soap->labidx);
-      free(t);
-    }
-  }
-  if (s)
-  { memcpy(soap->labbuf + soap->labidx, s, n);
-    soap->labidx += n;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_peek_element(struct soap *soap)
-{ struct soap_attribute *tp;
-  const char *t;
-  register char *s;
-  register wchar c;
-  register int i;
-  if (soap->peeked)
-  { if (*soap->tag == '\0')
-      return soap->error = SOAP_NO_TAG;
-    return SOAP_OK;
-  }
-  soap->peeked = 1;
-  for (;;)
-  { while (((c = soap_get(soap)) != LT) && c != TT)
-    { if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-    }
-    if (c == TT)
-    { *soap->tag = '\0';
-      return soap->error = SOAP_NO_TAG; /* ending tag found */
-    }
-    s = soap->tag;
-    do c = soap_get(soap);
-    while (soap_blank(c));
-    i = sizeof(soap->tag);
-    while (c != '/' && soap_notblank(c))
-    { if (--i > 0)
-        *s++ = (char)c;
-      c = soap_get(soap);
-    }
-    while (soap_blank(c))
-      c = soap_get(soap);
-    *s = '\0';
-    if (*soap->tag != '?')
-      break;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI <%s?>\n", soap->tag));
-    while ((int)c != EOF && c != GT && c != '?')
-    { s = soap->tmpbuf;
-      i = sizeof(soap->tmpbuf) - 2;
-      while (c != '=' && c != GT && c != '?' && soap_notblank(c))
-      { if (--i > 0)
-          *s++ = (char)c;
-        c = soap_get(soap);
-      }
-      while (soap_blank(c))
-        c = soap_get(soap);
-      if (c == '=')
-      { *s++ = '=';
-       do c = soap_get(soap);
-        while (soap_blank(c));
-        if (c != QT && c != AP)
-        { soap_unget(soap, c);
-          c = ' '; /* blank delimiter */
-        }
-        if (soap_getattrval(soap, s, i, c) == SOAP_EOM)
-         while (soap_getattrval(soap, soap->tmpbuf, sizeof(soap->tmpbuf), c) == SOAP_EOM)
-           ;
-        else if (!strcmp(soap->tag, "?xml") && (!soap_tag_cmp(soap->tmpbuf, "encoding=iso-8859-1") || !soap_tag_cmp(soap->tmpbuf, "encoding=latin1")))
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML latin1 encoding\n"));
-          soap->mode |= SOAP_C_LATIN;
-        }
-      }
-      do c = soap_get(soap);
-      while (soap_blank(c));
-    }
-  }
-  soap->id[0] = '\0';
-  soap->href[0] = '\0';
-  soap->type[0] = '\0';
-  soap->arrayType[0] = '\0';
-  soap->arraySize[0] = '\0';
-  soap->arrayOffset[0] = '\0';
-  soap->other = 0;
-  soap->root = -1;
-  soap->position = 0;
-  soap->null = 0;
-  soap->mustUnderstand = 0;
-  soap_clr_attr(soap);
-  soap_pop_namespace(soap);
-  while ((int)c != EOF && c != GT && c != '/')
-  { s = soap->tmpbuf;
-    i = sizeof(soap->tmpbuf);
-    while (c != '=' && c != '/' && soap_notblank(c))
-    { if (--i > 0)
-        *s++ = (char)c;
-      c = soap_get(soap);
-    }
-    *s = '\0';
-    if (i == sizeof(soap->tmpbuf))
-      return soap->error = SOAP_SYNTAX_ERROR;
-    if (!strncmp(soap->tmpbuf, "xmlns:", 6))
-    { soap->tmpbuf[5] = '\0';
-      t = soap->tmpbuf + 6;
-    }
-    else if (!strcmp(soap->tmpbuf, "xmlns"))
-      t = SOAP_STR_EOS;
-    else
-      t = NULL;
-    tp = soap_attr(soap, soap->tmpbuf);
-    if (!tp)
-    { tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(soap->tmpbuf));
-      if (!tp)
-        return soap->error = SOAP_EOM;
-      strcpy(tp->name, soap->tmpbuf);
-      tp->value = NULL;
-      tp->size = 0;
-      tp->next = soap->attributes;
-      soap->attributes = tp;
-    }
-    while (soap_blank(c))
-      c = soap_get(soap);
-    if (c == '=')
-    { do c = soap_get(soap);
-      while (soap_blank(c));
-      if (c != QT && c != AP)
-      { soap_unget(soap, c);
-        c = ' '; /* blank delimiter */
-      }
-      if (soap_getattrval(soap, tp->value, tp->size, c))
-      {
-#ifdef WITH_FAST
-        if (soap->error != SOAP_EOM)
-          return soap->error;
-        soap->error = SOAP_OK;
-       soap->labidx = 0;
-       if (soap_append_lab(soap, tp->value, tp->size))
-         return soap->error;
-       SOAP_FREE(tp->value);
-       for (;;)
-       { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c))
-         { if (soap->error != SOAP_EOM)
-             return soap->error;
-            soap->error = SOAP_OK;
-           soap->labidx = soap->lablen;
-           if (soap_append_lab(soap, NULL, 0))
-             return soap->error;
-         }
-         else
-           break;
-       }
-        tp->size = soap->lablen;
-       if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
-         return soap->error = SOAP_EOM;
-        memcpy(tp->value, soap->labbuf, soap->lablen);
-#else
-       size_t n;
-        if (soap->error != SOAP_EOM)
-          return soap->error;
-        soap->error = SOAP_OK;
-        if (soap_new_block(soap))
-          return soap->error;
-        for (;;)
-        { if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
-            return soap->error;
-          if (soap_getattrval(soap, s, SOAP_BLKLEN, c))
-          { if (soap->error != SOAP_EOM)
-              return soap->error;
-            soap->error = SOAP_OK;
-          }
-          else
-            break;
-        }
-       n = tp->size + soap->blist->size;
-        if (!(s = (char*)SOAP_MALLOC(n)))
-          return soap->error = SOAP_EOM;
-        if (tp->value)
-        { memcpy(s, tp->value, tp->size);
-          SOAP_FREE(tp->value);
-        }
-        soap_save_block(soap, s + tp->size);
-        tp->value = s;
-        tp->size = n;
-#endif
-      }
-      do c = soap_get(soap);
-      while (soap_blank(c));
-      tp->visible = 2; /* seen this attribute w/ value */
-    }
-    else
-      tp->visible = 1; /* seen this attribute w/o value */
-    if (t && tp->value)
-    { if (soap_push_namespace(soap, t, tp->value))
-        return soap->error;
-      tp->visible = 0;
-    }
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  for (tp = soap->attributes; tp; tp = tp->next)
-  { if (tp->visible && tp->value)
-    { if (!strcmp(tp->name, "id"))
-      { if (soap->part != SOAP_IN_HEADER || !soap->dot_net_bug)
-        { *soap->id = '#';
-          strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2);
-        }
-      }
-      else if (soap->version == 1 && !strcmp(tp->name, "href"))
-        strncpy(soap->href, tp->value, sizeof(soap->href) - 1);
-      else if (soap->version == 2 && !strcmp(tp->name, "ref"))
-      { *soap->href = '#';
-        strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2);
-      }
-      else if (!soap_match_tag(soap, tp->name, "xsi:type"))
-        strncpy(soap->type, tp->value, sizeof(soap->type) - 1);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType"))
-      { s = soap_strrchr(tp->value, '[');
-        if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType))
-        { strncpy(soap->arrayType, tp->value, s - tp->value);
-          soap->arrayType[s - tp->value] = '\0';
-          strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1);
-        }
-        else
-          strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
-      }
-      else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:itemType"))
-        strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
-      else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize"))
-        strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:offset"))
-        strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset));
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:position"))
-        soap->position = soap_getposition(tp->value, soap->positions);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:root"))
-        soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true")));
-      else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")
-            || !soap_match_tag(soap, tp->name, "SOAP-ENV:role"))
-      { if ((!soap->actor || strcmp(soap->actor, tp->value))
-         && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")
-         && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next"))
-          soap->other = 1;
-      }
-      else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
-            && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
-        soap->mustUnderstand = 1;
-      else if ((!soap_match_tag(soap, tp->name, "xsi:null")
-             || !soap_match_tag(soap, tp->name, "xsi:nil"))
-            && (!strcmp(tp->value, "1")
-             || !strcmp(tp->value, "true")))
-        soap->null = 1;
-    }
-  }
-  if (!(soap->body = (c != '/')))
-    do c = soap_get(soap);
-    while (soap_blank(c));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_retry(struct soap *soap)
-{ soap->peeked = 1;
-  soap->error = SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_revert(struct soap *soap)
-{ soap->peeked = 1;
-  if (soap->body)
-    soap->level--;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting last element (level=%u)\n", soap->level));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_string_out(struct soap *soap, const char *s, int flag)
-{ register const char *t;
-  register wchar c;
-  register wchar mask = 0x80000000;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->data = soap_strdup(soap, s); /* check EOM */
-    return SOAP_OK;
-  }
-#endif
-  if (soap->mode & SOAP_C_UTFSTRING)
-    mask = 0;
-  t = s;
-  while ((c = *t++))
-  { switch (c)
-    { 
-    case 9:
-      if (flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#x9;", 5))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case 10:
-      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xA;", 5))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case 13:
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xD;", 5))
-        return soap->error;
-      s = t;
-      break;
-    case '&':
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&amp;", 5))
-        return soap->error;
-      s = t;
-      break;
-    case '<':
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&lt;", 4))
-        return soap->error;
-      s = t;
-      break;
-    case '>':
-      if (!flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&gt;", 4))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case '"':
-      if (flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&quot;", 6))
-         return soap->error;
-        s = t;
-      }
-      break;
-    default:
-#ifdef HAVE_MBTOWC
-      if (soap->mode & SOAP_C_MBSTRING)
-      { wchar_t wc;
-        register int m = mbtowc(&wc, t - 1, MB_CUR_MAX);
-        if (m > 0 && wc != c)
-        { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, wc))
-            return soap->error;
-         s = t + m - 1;
-         continue;
-        }
-      }
-#endif
-      if (c & mask)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c))
-          return soap->error;
-        s = t;
-      }
-    }
-  }
-  return soap_send_raw(soap, s, t - s - 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_string_in(struct soap *soap, int flag)
-{ register char *s;
-  char *t = NULL;
-  register size_t i;
-  register int n = 0;
-  register int m = 0;
-  register wchar c;
-#ifdef HAVE_WCTOMB
-  char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8];
-#else
-  char buf[8];
-#endif
-#ifdef WITH_CDATA
-  if (!flag)
-  { register int state = 0;
-#ifdef WITH_FAST
-    soap->labidx = 0;                  /* use look-aside buffer */
-#else
-    if (soap_new_block(soap))
-      return NULL;
-#endif
-    for (;;)
-    { 
-#ifdef WITH_FAST
-      register size_t k;
-      if (soap_append_lab(soap, NULL, 0))      /* allocate more space in look-aside buffer if necessary */
-        return NULL;
-      s = soap->labbuf + soap->labidx; /* space to populate */
-      k = soap->lablen - soap->labidx; /* number of bytes available */
-      soap->labidx = soap->lablen;     /* claim this space */
-#else
-      register size_t k = SOAP_BLKLEN;
-      if (!(s = (char*)soap_push_block(soap, k)))
-        return NULL;
-#endif
-      for (i = 0; i < k; i++)
-      { if (m > 0)
-        { *s++ = *t++; /* copy multibyte characters */
-         m--;
-          continue;
-        }
-        c = soap_getchar(soap);
-       if ((int)c == EOF)
-          goto end;
-        if (c >= 0x80 && !(soap->mode & SOAP_C_LATIN))
-        { soap_unget(soap, c);
-         c = soap_getutf8(soap);
-         if (soap->mode & SOAP_C_UTFSTRING)
-          { if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < AP)
-            { c &= 0x7FFFFFFF;
-              t = buf;
-              if (c < 0x0800)
-                *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-              else
-              { if (c < 0x010000)
-                  *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-                else
-                { if (c < 0x200000)
-                    *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-                  else
-                  { if (c < 0x04000000)
-                      *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-                    else
-                    { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-                      *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-                    }
-                    *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-                  }     
-                  *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-                }
-                *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-              }
-              *t++ = (char)(0x80 | (c & 0x3F));
-             m = (int)(t - buf) - 1;
-              t = buf;
-              *s++ = *t++;
-              continue;
-           }
-          }
-        }
-       switch (state)
-        { case 1:
-            if (c == ']')
-             state = 4;
-           *s++ = c;
-           continue;
-         case 2:
-           if (c == '-')
-              state = 6;
-           *s++ = c;
-           continue;
-         case 3:
-           if (c == '?')
-             state = 8;
-           *s++ = c;
-           continue;
-          /* CDATA */
-         case 4:
-           if (c == ']')
-              state = 5;
-           else
-             state = 1;
-           *s++ = c;
-           continue;
-         case 5:
-           if (c == '>')
-             state = 0;
-           else
-             state = 1;
-           *s++ = c;
-           continue;
-          /* comment */
-          case 6:
-            if (c == '-')
-             state = 7;
-           else
-             state = 2;
-           *s++ = c;
-           continue;
-          case 7:
-            if (c == '>')
-             state = 0;
-           else
-             state = 2;
-           *s++ = c;
-           continue;
-          /* PI */
-         case 8:
-            if (c == '>')
-             state = 0;
-           else
-             state = 3;
-           *s++ = c;
-           continue;
-        }
-        switch (c)
-        {
-        case '/':
-          if (n > 0)
-          { c = soap_get1(soap);
-            if (c == '>')
-              n--;
-            soap_unget(soap, c);
-          }
-          *s++ = '/';
-          break;
-        case '<':
-         c = soap_get1(soap);
-         if (c == '/')
-         { if (n == 0)
-           { c = TT;
-             goto end;
-           }
-           n--;
-         }
-         else if (c == '!')
-         { c = soap_get1(soap);
-           if (c == '[')
-            { do c = soap_get1(soap);
-              while ((int)c != EOF && c != '[');
-              if ((int)c == EOF)
-                 goto end;
-             t = (char*)"![CDATA[";
-             state = 1;
-           }
-            else if (c == '-')
-           { if ((c = soap_get1(soap)) == '-')
-               state = 2;
-             t = (char*)"!-";
-             soap_unget(soap, c);
-           }
-           else
-           { t = (char*)"!";
-             soap_unget(soap, c);
-           }
-           *s++ = '<';
-           break;
-         }
-         else if (c == '?')
-           state = 3;
-         else
-           n++;
-          soap_unget(soap, c);
-          *s++ = '<';
-          break;
-        case '>':
-          *s++ = '>';
-          break;
-        case '"':
-          *s++ = '"';
-          break;
-        default:
-#ifdef HAVE_WCTOMB
-          if (soap->mode & SOAP_C_MBSTRING)
-          { m = wctomb(buf, c & 0x7FFFFFFF);
-            if (m >= 1)
-            { t = buf;
-              *s++ = *t++;
-              m--;
-            }
-            else
-              *s++ = SOAP_UNKNOWN_CHAR;
-          }
-          else
-#endif
-            *s++ = (char)(c & 0xFF);
-        }
-      }
-    }
-  }
-#endif
-#ifdef WITH_FAST
-  soap->labidx = 0;                    /* use look-aside buffer */
-#else
-  if (soap_new_block(soap))
-    return NULL;
-#endif
-  for (;;)
-  { 
-#ifdef WITH_FAST
-    register size_t k;
-    if (soap_append_lab(soap, NULL, 0))        /* allocate more space in look-aside buffer if necessary */
-      return NULL;
-    s = soap->labbuf + soap->labidx;   /* space to populate */
-    k = soap->lablen - soap->labidx;   /* number of bytes available */
-    soap->labidx = soap->lablen;       /* claim this space */
-#else
-    register size_t k = SOAP_BLKLEN;
-    if (!(s = (char*)soap_push_block(soap, k)))
-      return NULL;
-#endif
-    for (i = 0; i < k; i++)
-    { if (m > 0)
-      { *s++ = *t++;   /* copy multibyte characters */
-        m--;
-        continue;
-      }
-      if (soap->mode & SOAP_C_UTFSTRING)
-      { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < AP)
-        { c &= 0x7FFFFFFF;
-          t = buf;
-          if (c < 0x0800)
-            *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-          else
-          { if (c < 0x010000)
-              *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-            else
-            { if (c < 0x200000)
-                *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-              else
-              { if (c < 0x04000000)
-                  *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-                else
-                { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-                  *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-                }
-                *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-              }     
-              *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-            }
-            *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-          }
-          *t++ = (char)(0x80 | (c & 0x3F));
-         m = (int)(t - buf) - 1;
-          t = buf;
-          *s++ = *t++;
-          continue;
-        }
-      }
-      else if (soap->mode & SOAP_C_LATIN)
-        c = soap_get(soap);
-      else
-        c = soap_getutf8(soap);
-      switch (c)
-      {
-      case TT:
-        if (n == 0)
-          goto end;
-        n--;
-        *s++ = '<';
-        soap_unget(soap, '/');
-        break;
-      case LT:
-        n++;
-        *s++ = '<';
-        break;
-      case GT:
-        *s++ = '>';
-        break;
-      case QT:
-        *s++ = '"';
-        break;
-      case AP:
-        *s++ = '\'';
-        break;
-      case '/':
-        if (n > 0)
-        { c = soap_get(soap);
-          if (c == GT)
-            n--;
-          soap_unget(soap, c);
-        }
-        *s++ = '/';
-        break;
-      case '<':
-        if (flag)
-          *s++ = '<';
-        else
-        { *s++ = '&';
-          t = (char*)"lt;";
-        }
-        break;
-      case '>':
-        if (flag)
-          *s++ = '>';
-        else
-        { *s++ = '&';
-          t = (char*)"gt;";
-        }
-        break;
-      case '"':
-        if (flag)
-          *s++ = '"';
-        else
-        { *s++ = '&';
-          t = (char*)"quot;";
-        }
-        break;
-      default:
-        if ((int)c == EOF)
-          goto end;
-#ifdef HAVE_WCTOMB
-        if (soap->mode & SOAP_C_MBSTRING)
-        { m = wctomb(buf, c & 0x7FFFFFFF);
-          if (m >= 1)
-          { t = buf;
-            *s++ = *t++;
-            m--;
-          }
-          else
-            *s++ = SOAP_UNKNOWN_CHAR;
-        }
-        else
-#endif
-          *s++ = (char)(c & 0xFF);
-      }
-    }
-  }
-end:
-  soap_unget(soap, c);
-  *s = '\0';
-#ifdef WITH_FAST
-  t = soap_strdup(soap, soap->labbuf);
-#else
-  soap_size_block(soap, i+1);
-  t = soap_save_block(soap, NULL);
-#endif
-  if (flag == 2)
-    if (soap_s2QName(soap, t, &t))
-      return NULL;
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_wstring_out(struct soap *soap, const wchar_t *s, int flag)
-{ const char *t;
-  char tmp;
-  register wchar c;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->wide = NULL; /* soap_malloc() ??? */
-    return SOAP_OK;
-  }
-#endif
-  while ((c = *s++))
-  { switch (c)
-    { 
-    case 9:
-      if (flag)
-        t = "&#x9;";
-      else
-        t = "\t";
-      break;
-    case 10:
-      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
-        t = "&#xA;";
-      else
-        t = "\n";
-      break;
-    case 13:
-      t = "&#xD;";
-      break;
-    case '&':
-      t = "&amp;";
-      break;
-    case '<':
-      t = "&lt;";
-      break;
-    case '>':
-      if (flag)
-        t = ">";
-      else
-       t = "&gt;";
-      break;
-    case '"':
-      if (flag)
-        t = "&quot;";
-      else
-        t = "\"";
-      break;
-    default:
-      if (c > 0 && c < 0x80)
-      { tmp = (char)c;
-        if (soap_send_raw(soap, &tmp, 1))
-          return soap->error;
-      }
-      else if (soap_pututf8(soap, (unsigned long)c))
-        return soap->error;
-      continue;
-    }
-    if (soap_send(soap, t))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t *
-SOAP_FMAC2
-soap_wstring_in(struct soap *soap, int flag)
-{ wchar_t *s;
-  register int i, n = 0;
-  register wchar c;
-  const char *t = NULL;
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { if (!(s = (wchar_t*)soap_push_block(soap, sizeof(wchar_t)*SOAP_BLKLEN)))
-      return NULL;
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { if (t)
-      { *s++ = (wchar_t)*t++;
-        if (!*t)
-          t = NULL;
-        continue;
-      }
-      if (soap->mode & SOAP_C_LATIN)
-        c = soap_get(soap);
-      else
-        c = soap_getutf8(soap);
-      switch (c)
-      {
-      case TT:
-        if (n == 0)
-          goto end;
-        n--;
-        *s++ = '<';
-        soap_unget(soap, '/');
-        break;
-      case LT:
-        n++;
-        *s++ = '<';
-        break;
-      case GT:
-        *s++ = '>';
-        break;
-      case QT:
-        *s++ = '"';
-        break;
-      case AP:
-        *s++ = '\'';
-        break;
-      case '/':
-        if (n > 0)
-        { c = soap_getutf8(soap);
-          if (c == GT)
-            n--;
-          soap_unget(soap, c);
-        }
-        *s++ = '/';
-        break;
-      case '<':
-        if (flag)
-          *s++ = (wchar)'<';
-        else
-        { *s++ = (wchar)'&';
-          t = "lt;";
-        }
-        break;
-      case '>':
-        if (flag)
-          *s++ = (wchar)'>';
-        else
-        { *s++ = (wchar)'&';
-          t = "gt;";
-        }
-        break;
-      case '"':
-        if (flag)
-          *s++ = (wchar)'"';
-        else
-        { *s++ = (wchar)'&';
-          t = "quot;";
-        }
-        break;
-      default:
-        if ((int)c == EOF)
-          goto end;
-        *s++ = (wchar_t)c & 0x7FFFFFFF;
-      }
-    }
-  }
-end:
-  soap_unget(soap, c);
-  *s = '\0';
-  soap_size_block(soap, sizeof(wchar_t) * (i + 1));
-  return (wchar_t*)soap_save_block(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_int2s(struct soap *soap, int n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n)
-{ long m = (long)*p;
-  return soap_outlong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2int(struct soap *soap, const char *s, int *p)
-{ if (s)
-  { char *r;
-    *p = (int)soap_strtol(s, &r, 10);
-    if (*r)
-      return soap->error = SOAP_TYPE;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int *
-SOAP_FMAC2
-soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0);
-  if (p && soap->body && !*soap->href)
-    soap_s2int(soap, soap_value(soap), p);
-  else
-    p = (int*)soap_id_forward(soap, soap->href, p, t, sizeof(int));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_long2s(struct soap *soap, long n)
-{ sprintf(soap->tmpbuf, "%ld", n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2long(struct soap *soap, const char *s, long *p)
-{ if (s)
-  { char *r;
-    *p = soap_strtol(s, &r, 10);
-    if (*r)
-      return soap->error = SOAP_TYPE;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-long *
-SOAP_FMAC2
-soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0);
-  if (p && soap->body && !*soap->href)
-    soap_s2long(soap, soap_value(soap), p);
-  else
-    p = (long*)soap_id_forward(soap, soap->href, p, t, sizeof(long));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_LONG642s(struct soap *soap, LONG64 n)
-{ sprintf(soap->tmpbuf, SOAP_LONG_FORMAT, n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_LONG642s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p)
-{ if (s && sscanf(s, SOAP_LONG_FORMAT, p) != 1)
-    return soap->error = SOAP_TYPE;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-LONG64 *
-SOAP_FMAC2
-soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":integer")
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":negativeInteger")
-   && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":long")
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0);
-  if (soap->body && !*soap->href)
-    soap_s2LONG64(soap, soap_value(soap), p);
-  else
-    p = (LONG64*)soap_id_forward(soap, soap->href, p, t, sizeof(LONG64));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_byte2s(struct soap *soap, char n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n)
-{ long m = (long)*p;
-  return soap_outlong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2byte(struct soap *soap, const char *s, char *p)
-{ if (s)
-  { long n;
-    char *r;
-    n = soap_strtol(s, &r, 10);
-    if (*r || n < -128 || n > 127)
-      return soap->error = SOAP_TYPE;
-    *p = (char)n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0);
-  if (soap->body && !*soap->href)
-    soap_s2byte(soap, soap_value(soap), p);
-  else
-    p = (char*)soap_id_forward(soap, soap->href, p, t, sizeof(char));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_short2s(struct soap *soap, short n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n)
-{ long m = (long)*p;
-  return soap_outlong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2short(struct soap *soap, const char *s, short *p)
-{ if (s)
-  { long n;
-    char *r;
-    n = soap_strtol(s, &r, 10);
-    if (*r || n < -32768 || n > 32767)
-      return soap->error = SOAP_TYPE;
-    *p = (char)n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-short *
-SOAP_FMAC2
-soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0);
-  if (soap->body && !*soap->href)
-    soap_s2short(soap, soap_value(soap), p);
-  else
-    p = (short*)soap_id_forward(soap, soap->href, p, t, sizeof(short));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_float2s(struct soap *soap, float n)
-{ const char *s;
-  if (isnan(n))
-    s = "NaN";
-  else if (n >= FLT_PINFTY)
-    s = "INF";
-  else if (n <= FLT_NINFTY)
-    s = "-INF";
-  else
-  { sprintf(soap->tmpbuf, soap->float_format, n);
-    s = soap->tmpbuf;
-  }
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_float2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2float(struct soap *soap, const char *s, float *p)
-{ if (s)
-  { if (!soap_tag_cmp(s, "INF"))
-      *p = FLT_PINFTY;
-    else if (!soap_tag_cmp(s, "+INF"))
-      *p = FLT_PINFTY;
-    else if (!soap_tag_cmp(s, "-INF"))
-      *p = FLT_NINFTY;
-    else if (!soap_tag_cmp(s, "NaN"))
-      *p = FLT_NAN;
-    else
-    {
-#ifdef HAVE_STRTOD
-      char *r;
-      *p = (float)strtod(s, &r);
-      if (*r)
-#endif
-        if (sscanf(s, soap->float_format, p) != 1)
-          return soap->error = SOAP_TYPE;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int soap_isnumeric(struct soap *soap, const char *type)
-{ if (soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":float")
-   && soap_match_tag(soap, soap->type, ":double")
-   && soap_match_tag(soap, soap->type, ":decimal")
-   && soap_match_tag(soap, soap->type, ":integer")
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":negativeInteger")
-   && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":long")
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte")
-   && soap_match_tag(soap, soap->type, ":unsignedLong")
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return SOAP_ERR;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-float *
-SOAP_FMAC2
-soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type != '\0' && soap_isnumeric(soap, type))
-    return NULL;
-  p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0);
-  if (soap->body && !*soap->href)
-    soap_s2float(soap, soap_value(soap), p);
-  else
-    p = (float*)soap_id_forward(soap, soap->href, p, t, sizeof(float));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_double2s(struct soap *soap, double n)
-{ const char *s;
-  if (isnan(n))
-    s = "NaN";
-  else if (n >= DBL_PINFTY)
-    s = "INF";
-  else if (n <= DBL_NINFTY)
-    s = "-INF";
-  else
-  { sprintf(soap->tmpbuf, soap->double_format, n);
-    s = soap->tmpbuf;
-  }
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_double2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2double(struct soap *soap, const char *s, double *p)
-{ if (s)
-  { if (!soap_tag_cmp(s, "INF"))
-      *p = DBL_PINFTY;
-    else if (!soap_tag_cmp(s, "+INF"))
-      *p = DBL_PINFTY;
-    else if (!soap_tag_cmp(s, "-INF"))
-      *p = DBL_NINFTY;
-    else if (!soap_tag_cmp(s, "NaN"))
-      *p = DBL_NAN;
-    else
-    {
-#ifdef HAVE_STRTOD
-      char *r;
-      *p = strtod(s, &r);
-      if (*r)
-#endif
-        if (sscanf(s, soap->double_format, p) != 1)
-          return soap->error = SOAP_TYPE;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-double *
-SOAP_FMAC2
-soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type != '\0' && soap_isnumeric(soap, type))
-    return NULL;
-  p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0);
-  if (soap->body && !*soap->href)
-    soap_s2double(soap, soap_value(soap), p);
-  else
-    p = (double*)soap_id_forward(soap, soap->href, p, t, sizeof(double));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedByte2s(struct soap *soap, unsigned char n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n)
-{ unsigned long m = (unsigned long)*p;
-  return soap_outunsignedLong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p)
-{ if (s)
-  { unsigned long n;
-    char *r;
-    n = soap_strtoul(s, &r, 10);
-    if (*r || n > 255)
-      return soap->error = SOAP_TYPE;
-    *p = (unsigned char)n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned char *
-SOAP_FMAC2
-soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0);
-  if (soap->body && !*soap->href)
-    soap_s2unsignedByte(soap, soap_value(soap), p);
-  else
-    p = (unsigned char*)soap_id_forward(soap, soap->href, p, t, sizeof(unsigned char));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedShort2s(struct soap *soap, unsigned short n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n)
-{ unsigned long m = (unsigned long)*p;
-  return soap_outunsignedLong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p)
-{ if (s)
-  { unsigned long n;
-    char *r;
-    n = soap_strtoul(s, &r, 10);
-    if (*r || n > 65535)
-      return soap->error = SOAP_TYPE;
-    *p = (unsigned short)n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-unsigned short *
-SOAP_FMAC2
-soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0);
-  if (soap->body && !*soap->href)
-    soap_s2unsignedShort(soap, soap_value(soap), p);
-  else
-    p = (unsigned short*)soap_id_forward(soap, soap->href, p, t, sizeof(unsigned short));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedInt2s(struct soap *soap, unsigned int n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n)
-{ unsigned long m = (unsigned long)*p;
-  return soap_outunsignedLong(soap, tag, id, &m, type, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p)
-{ if (s)
-  { char *r;
-    *p = (unsigned int)soap_strtoul(s, &r, 10);
-    if (*r)
-      return soap->error = SOAP_TYPE;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned int *
-SOAP_FMAC2
-soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0);
-  if (soap->body && !*soap->href)
-    soap_s2unsignedInt(soap, soap_value(soap), p);
-  else
-    p = (unsigned int*)soap_id_forward(soap, soap->href, p, t, sizeof(unsigned int));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedLong2s(struct soap *soap, unsigned long n)
-{ sprintf(soap->tmpbuf, "%lu", n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p)
-{ if (s)
-  { char *r;
-    *p = soap_strtoul(s, &r, 10);
-    if (*r)
-      return soap->error = SOAP_TYPE;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned long *
-SOAP_FMAC2
-soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0);
-  if (soap->body && !*soap->href)
-    soap_s2unsignedLong(soap, soap_value(soap), p);
-  else
-    p = (unsigned long*)soap_id_forward(soap, soap->href, p, t, sizeof(unsigned long));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_ULONG642s(struct soap *soap, ULONG64 n)
-{ sprintf(soap->tmpbuf, SOAP_ULONG_FORMAT, n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_ULONG642s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p)
-{ if (s && sscanf(s, SOAP_ULONG_FORMAT, p) != 1)
-    return soap->error = SOAP_TYPE;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-ULONG64 *
-SOAP_FMAC2
-soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":unsignedLong")
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0);
-  if (soap->body && !*soap->href)
-    soap_s2ULONG64(soap, soap_value(soap), p);
-  else
-    p = (ULONG64*)soap_id_forward(soap, soap->href, p, t, sizeof(ULONG64));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2string(struct soap *soap, const char *s, char **t)
-{ *t = NULL;
-  if (s && !(*t = soap_strdup(soap, s)))
-    return soap->error = SOAP_EOM;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2QName(struct soap *soap, const char *s, char **t)
-{ if (s)
-  { struct soap_nlist *np = soap->nlist;
-    const char *p = strchr(s, ':');
-    if (p)
-    { int n = p - s;
-      while (np && (np->index == -2 || strncmp(np->id, s, n) || np->id[n]))
-        np = np->next;
-      p++;
-    }
-    else
-    { while (np && *np->id)
-        np = np->next;
-      p = s;
-    }
-    if (np)
-    { if (np->index >= 0 && soap->local_namespaces)
-      { const char *q = soap->local_namespaces[np->index].id;
-        if (q)
-        { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(q) + 2)))
-            sprintf(*t, "%s:%s", q, p);
-          return SOAP_OK;
-        }
-      }
-      if (np->ns)
-      { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(np->ns) + 4)))
-          sprintf(*t, "\"%s\":%s", np->ns, p);
-        return SOAP_OK;
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined (index=%d, URI=%s)\n", s, np->index, np->ns?np->ns:""));
-      return soap->error = SOAP_NAMESPACE; 
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined, assuming empty namespace\n", s));
-    if ((*t = (char*)soap_malloc(soap, strlen(p) + 4)))
-      sprintf(*t, "\"\":%s", p);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_QName2s(struct soap *soap, const char *s)
-{ struct Namespace *p;
-  char *t;
-  int n;
-  if (!s || *s != '"')
-    return s;
-  s++;
-  if ((p = soap->local_namespaces))
-  { for (; p->id; p++)
-    { if (p->ns)
-        if (!soap_tag_cmp(s, p->ns))
-          break;
-      if (p->in)
-        if (!soap_tag_cmp(s, p->in))
-          break;
-    }
-    if (p && p->id)
-    { s = strchr(s, '"');
-      if (s)
-      { t = (char*)soap_malloc(soap, strlen(p->id) + strlen(s));
-        strcpy(t, p->id);
-       strcat(t, s + 1);
-        return t;
-      }
-    }
-  }
-  t = (char*)strchr(s, '"');
-  if (t)
-    n = t - s;
-  else
-    n = 0;
-  t = soap_strdup(soap, s);
-  t[n] = '\0';
-  sprintf(soap->tmpbuf, "xmlns:_%lu", soap->idnum++);
-  soap_set_attr(soap, soap->tmpbuf, t);
-  s = strchr(s, '"');
-  if (s)
-  { t = (char*)soap_malloc(soap, strlen(soap->tmpbuf) + strlen(s) - 6);
-    strcpy(t, soap->tmpbuf + 6);
-    strcat(t, s + 1);
-  }
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) 
-{ if (!*p)
-  { if (soap_element_null(soap, tag, id, type))
-      return soap->error;
-  }
-  else
-  { struct soap_plist *pp;
-    int i = soap_pointer_lookup(soap, *p, n, &pp);
-    if (id > 0)
-    { if (i)
-      { if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        soap_set_embedded(soap, pp);
-      }
-      else
-      { i = soap_pointer_enter(soap, *p, n, &pp);
-        if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        if (soap->mode & SOAP_IO_LENGTH)
-          pp->mark1 = 0;
-        else
-          pp->mark2 = 0;
-      }
-    }
-    else if (i)
-    { if (soap_is_embedded(soap, pp))
-      { if (soap_element_ref(soap, tag, 0, i))
-          return soap->error;
-      }
-      else if (soap_is_single(soap, pp))
-      { if (soap_element_begin_out(soap, tag, 0, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-      }
-      else
-      { if (soap_element_begin_out(soap, tag, i, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        soap_set_embedded(soap, pp);
-      }
-    }
-    else
-    { soap_pointer_enter(soap, *p, n, &pp);
-      if (soap_element_begin_out(soap, tag, id, type) || soap_string_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-        return soap->error;
-      if (soap->mode & SOAP_IO_LENGTH)
-        pp->mark1 = 0;
-      else
-        pp->mark2 = 0;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char **
-SOAP_FMAC2
-soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { p = (char**)soap_id_enter(soap, soap->id, p, t, sizeof(char**), 0);
-    if (p)
-      *p = NULL;
-  }
-  else if (soap->body && !*soap->href)
-  { if (soap_match_tag(soap, soap->type, "PointerTostring") == 0)
-    { p = (char**)soap_id_enter(soap, soap->id, p, t, sizeof(char**), 0);
-      p = (char**)soap_instring(soap, "string", p, type, t, flag);
-    }
-    else
-    { if (!p)
-        if ((p = (char**)soap_id_enter(soap, SOAP_STR_EOS, p, t, sizeof(char**), 0)) == NULL)
-          return NULL;
-      *p = (char*)soap_id_enter(soap, soap->id, soap_string_in(soap, flag), t, 0, 0);
-    }
-  }
-  else
-    p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char*), 0);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) 
-{ if (!*p)
-  { if (soap_element_null(soap, tag, id, type))
-      return soap->error;
-  }
-  else
-  { struct soap_plist *pp;
-    int i = soap_pointer_lookup(soap, *p, n, &pp);
-    if (id > 0)
-    { if (i)
-      { if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        soap_set_embedded(soap, pp);
-      }
-      else
-      { i = soap_pointer_enter(soap, *p, n, &pp);
-        if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        if (soap->mode & SOAP_IO_LENGTH)
-          pp->mark1 = 0;
-        else
-          pp->mark2 = 0;
-      }
-    }
-    else if (i)
-    { if (soap_is_embedded(soap, pp))
-      { if (soap_element_ref(soap, tag, 0, i))
-          return soap->error;
-      }
-      else if (soap_is_single(soap, pp))
-      { if (soap_element_begin_out(soap, tag, 0, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-      }
-      else
-      { if (soap_element_begin_out(soap, tag, i, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-          return soap->error;
-        soap_set_embedded(soap, pp);
-      }
-    }
-    else
-    { if (soap_element_begin_out(soap, tag, id, type) || soap_wstring_out(soap, *p, 0) || soap_element_end_out(soap, tag))
-        return soap->error;
-      if (soap->mode & SOAP_IO_LENGTH)
-        pp->mark1 = 0;
-      else
-        pp->mark2 = 0;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t **
-SOAP_FMAC2
-soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { p = (wchar_t**)soap_id_enter(soap, soap->id, p, t, sizeof(wchar_t**), 0);
-    if (p)
-      *p = NULL;
-  }
-  else if (soap->body && !*soap->href)
-  { if (soap_match_tag(soap, soap->type, "PointerTostring") == 0)
-      p = (wchar_t**)soap_inwstring(soap, "string", (wchar_t**)soap_id_enter(soap, soap->id, p, t, sizeof(wchar_t**), 0), type, t);
-    else
-    { if (!p)
-        if (!(p = (wchar_t**)soap_id_enter(soap, SOAP_STR_EOS, p, t, sizeof(wchar_t**), 0)))
-          return NULL;
-      *p = (wchar_t*)soap_id_enter(soap, soap->id, soap_wstring_in(soap, 1), t, 0, 0);
-    }
-  }
-  else
-    p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t*), 0);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static time_t
-soap_timegm(struct tm *T)
-{
-#if defined(HAVE_TIMEGM)
-  return timegm(T);
-#elif defined(HAVE_GETTIMEOFDAY)
-  struct timezone t;
-  struct timeval tv;
-  gettimeofday(&tv, &t); /* doesn't work properly on Solaris */
-  T->tm_min -= t.tz_minuteswest;
-  T->tm_isdst = (t.tz_dsttime != 0);
-  return mktime(T);
-/* WR[ */
-  /* The following define was added for VxWorks*/
-#elif defined(HAVE_MKTIME)
-  /* FOR VXWORKS:
-  vxWorks does not seem to have any variable representation of time zones, but
-  timezone information can be set in INSTALL_DIR/target/h/private/timeP.h header
-  file, by setting the ZONEBUFFER define.  The ZONEBUFFER define follows this 
-  format:
-  
-    name_of_zone:<(unused)>:time_in_minutes_from_UTC:daylight_start:daylight_end 
-    
-  To calculate local time, the value of time_in_minutes_from_UTC is subtracted
-  from UTC; time_in_minutes_from_UTC must be positive. Daylight information is 
-  expressed as mmddhh (month-day-hour), for example: 
-
-    UTC::0:040102:100102
-    
-  */
-  return mktime(T);
-/* ]WR */
-#elif defined(HAVE_FTIME)
-  struct timeb t;
-  t.timezone = 0;
-  t.dstflag = -1;
-  ftime(&t);
-  T->tm_min -= t.timezone;
-  T->tm_isdst = t.dstflag; /* doesn't work properly on Solaris */
-  return mktime(T);
-#else
-#warning "time_t (de)serialization is not MT safe on this platform"
-  time_t t;
-  char *tz = getenv("TZ");
-  putenv("TZ=UTC");
-  tzset();
-  t = mktime(T);
-  if (tz)
-  { char tmp[16];
-    strcpy(tmp, "TZ=");
-    strncat(tmp, tz, 12);
-    tmp[15] = '\0';
-    putenv(tmp);
-  }
-  else
-    putenv("TZ=");
-  tzset();
-  return t;
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_dateTime2s(struct soap *soap, time_t n)
-{ struct tm T;
-  struct tm *pT = &T;
-#if defined(HAVE_GMTIME_R)
-  if (gmtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PGMTIME_R)
-  if (gmtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-#elif defined(HAVE_PGMTIME)
-  if (gmtime(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-/* ]WR */
-#elif defined(HAVE_GMTIME)
-  if ((pT = gmtime(&n)))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-#elif defined(HAVE_GETTIMEOFDAY)
-  struct timezone t;
-#if defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { struct timeval tv;
-    gettimeofday(&tv, &t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.tz_minuteswest/60-(t.tz_dsttime!=0), abs(t.tz_minuteswest)%60);
-  }
-#else
-  if ((pT = localtime(&n)))
-  { struct timeval tv;
-    gettimeofday(&tv, &t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.tz_minuteswest/60-(t.tz_dsttime!=0), abs(t.tz_minuteswest)%60);
-  }
-#endif
-#elif defined(HAVE_FTIME)
-  struct timeb t;
-#if defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { ftime(&t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60-(t.dstflag!=0), abs(t.timezone)%60);
-  }
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PLOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf+strlen(soap->tmpbuf), "%+03d:%02d", t.timezone/60, abs(t.timezone)%60);
-  }
-/* ]WR */
-#else
-  if ((pT = localtime(&n)))
-  { ftime(&t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60-(t.dstflag!=0), abs(t.timezone)%60);
-  }
-#endif
-#elif defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PLOCALTIME_R)
-  if (localtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-/* ]WR */
-#else
-  if ((pT = localtime(&n)))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-#endif
-  else
-    strcpy(soap->tmpbuf, "1969-12-31T23:59:59Z");
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_dateTime2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2dateTime(struct soap *soap, const char *s, time_t *p)
-{ if (s)
-  { struct tm T;
-    char zone[16];
-    memset(&T, 0, sizeof(struct tm));
-    zone[sizeof(zone)-1] = '\0';
-    sscanf(s, "%d-%d-%dT%d:%d:%d%15s", &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone);
-    if (T.tm_year == 1)
-      T.tm_year = 70;
-    else
-      T.tm_year -= 1900;
-    T.tm_mon--;
-    if (*zone)
-    { if (*zone == '.')
-      { for (s = zone + 1; *s; s++)
-          if (*s < '0' || *s > '9')
-            break;
-      }
-      else
-        s = zone;
-      if (*s != 'Z')
-      { int h = 0, m = 0;
-        sscanf(s, "%d:%d", &h, &m);
-        T.tm_hour -= h;
-        if (h >= 0)
-          T.tm_min -= m;
-        else
-          T.tm_min += m;
-      }
-      *p = soap_timegm(&T);
-    }
-    else
-      *p = mktime(&T); /* no time zone: suppose it is localtime? */
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-time_t *
-SOAP_FMAC2
-soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char * type, int t)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (soap->null)
-  { if (soap->mode & SOAP_XML_NIL)
-    { soap->error = SOAP_NULL;
-      return NULL;
-    }
-    return p;
-  }
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":dateTime"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0);
-  if (soap->body && !*soap->href)
-    soap_s2dateTime(soap, soap_value(soap), p);
-  else
-    p = (time_t*)soap_id_forward(soap, soap->href, p, t, sizeof(time_t));
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outliteral(struct soap *soap, const char *tag, char *const*p)
-{ int i;
-  const char *t = NULL;
-  if (tag && *tag != '-')
-  { if ((t = strchr(tag, ':')))
-    { strncpy(soap->tmpbuf, tag, t-tag);
-      soap->tmpbuf[t-tag] = '\0';
-      for (i = 0; soap->local_namespaces[i].id; i++)
-        if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
-          break;
-      t++;
-      sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
-    }
-    else
-    { t = tag;
-      sprintf(soap->tmpbuf, "<%s>", tag);
-    }
-    if (soap_send(soap, soap->tmpbuf))
-      return soap->error;
-  }
-  if (p && *p)
-  { if (soap_send(soap, *p))
-      return soap->error;
-  }
-  if (t)
-  { sprintf(soap->tmpbuf, "</%s>", t);
-    return soap_send(soap, soap->tmpbuf);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char **
-SOAP_FMAC2
-soap_inliteral(struct soap *soap, const char *tag, char **p)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (!p)
-    if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
-      return NULL;
-  if (soap->null)
-    *p = NULL;
-  else if (soap->body)
-    *p = soap_string_in(soap, 0);
-  else
-    *p = NULL;
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p)
-{ int i;
-  const char *t = NULL;
-  wchar_t c;
-  const wchar_t *s;
-  if (tag && *tag != '-')
-  { if (tag && (t = strchr(tag, ':')))
-    { strncpy(soap->tmpbuf, tag, t-tag);
-      soap->tmpbuf[t-tag] = '\0';
-      for (i = 0; soap->local_namespaces[i].id; i++)
-        if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
-          break;
-      t++;
-      sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
-    }
-    else
-    { t = tag;
-      sprintf(soap->tmpbuf, "<%s>", tag);
-    }
-    if (soap_send(soap, soap->tmpbuf))
-      return soap->error;
-  }
-  if (p)
-  { s = *p;
-    while ((c = *s++))
-      if (soap_pututf8(soap, (unsigned char)c))
-        return soap->error;
-  }
-  if (t)
-  { sprintf(soap->tmpbuf, "</%s>", t);
-    return soap_send(soap, soap->tmpbuf);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t **
-SOAP_FMAC2
-soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p)
-{ if (soap_element_begin_in(soap, tag))
-    return NULL;
-  if (!p)
-    if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
-      return NULL;
-  if (soap->null)
-    *p = NULL;
-  else if (soap->body)
-    *p = soap_wstring_in(soap, 0);
-  else
-    *p = NULL;
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_value(struct soap *soap)
-{ size_t i;
-  wchar c = 0;
-  char *s;
-  s = soap->tmpbuf;
-  for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++)
-  { c = soap_get(soap);
-    if (c == TT || (int)c == EOF || soap_blank(c))
-      break;
-    *s++ = (char)c;
-  }
-  if ((int)c == EOF || c == TT)
-    soap_unget(soap, c);
-  *s = '\0';
-  return soap->tmpbuf; /* return non-null pointer */
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getline(struct soap *soap, char *s, int len)
-{ int i = len;
-  wchar c = 0;
-  for (;;)
-  { while (--i > 0)
-    { c = soap_getchar(soap);
-      if (c == '\r' || c == '\n' || (int)c == EOF)
-        break;
-      *s++ = (char)c;
-    }
-    *s = '\0';
-    while (c != '\n' && (int)c != EOF)
-      c = soap_getchar(soap);
-    if ((int)c == EOF)
-      return SOAP_EOF;
-    if (i+1 == len) /* empty line: end of HTTP header */
-      break;
-    c = soap_unget(soap, soap_getchar(soap));
-    if (c != ' ' && c != '\t') /* HTTP line continuation? */
-      break;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static size_t
-soap_begin_dime(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-  { size_t count;
-    sprintf(soap->id, soap->dime_id_format, 0);
-    soap->dime_id = soap->id;
-    if (soap->local_namespaces)
-    { if (soap->local_namespaces[0].out)
-        soap->dime_type = (char*)soap->local_namespaces[0].out;
-      else
-        soap->dime_type = (char*)soap->local_namespaces[0].ns;
-    }
-    soap->dime_options = NULL;
-    count = soap->dime_size + 12 + ((soap->count+3)&(~3)) + ((strlen(soap->dime_id)+3)&(~3)) + ((strlen(soap->dime_type)+3)&(~3));
-    soap->dime_size = soap->count;
-    if (soap->dime_count)
-      soap->dime_flags = SOAP_DIME_MB | SOAP_DIME_ABSURI;
-    else
-      soap->dime_flags = SOAP_DIME_MB | SOAP_DIME_ME | SOAP_DIME_ABSURI;
-    return count;
-  }
-#endif
-  return soap->count;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static int
-soap_putdimefield(struct soap *soap, const char *s, size_t n)
-{ if (soap_send_raw(soap, s, n))
-    return soap->error;
-  return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_dime_option(struct soap *soap, unsigned short type, const char *option)
-{ size_t n;
-  char *s = NULL;
-  if (option)
-  { n = strlen(option);
-    s = (char*)soap_malloc(soap, n + 5);
-    if (s)
-    { s[0] = type >> 8;
-      s[1] = type & 0xFF;
-      s[2] = n >> 8;
-      s[3] = n & 0xFF;
-      strcpy(s + 4, option);
-    }
-  }
-  return s;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putdimehdr(struct soap *soap)
-{ unsigned char tmp[12];
-  size_t optlen = 0, idlen = 0, typelen = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime_id?soap->dime_id:""));
-  if (soap->dime_options)
-    optlen = (((unsigned char)soap->dime_options[2] << 8) | ((unsigned char)soap->dime_options[3])) + 4;
-  if (soap->dime_id)
-    idlen = strlen(soap->dime_id);
-  if (soap->dime_type)
-    typelen = strlen(soap->dime_type);
-  tmp[0] = SOAP_DIME_VERSION | (soap->dime_flags & 0x7);
-  tmp[1] = soap->dime_flags & 0xF0;
-  tmp[2] = optlen >> 8;
-  tmp[3] = optlen & 0xFF;
-  tmp[4] = idlen >> 8;
-  tmp[5] = idlen & 0xFF;
-  tmp[6] = typelen >> 8;
-  tmp[7] = typelen & 0xFF;
-  tmp[8] = soap->dime_size >> 24;
-  tmp[9] = (soap->dime_size >> 16) & 0xFF;
-  tmp[10] = (soap->dime_size >> 8) & 0xFF;
-  tmp[11] = soap->dime_size & 0xFF;
-  if (soap_send_raw(soap, (char*)tmp, 12)
-   || soap_putdimefield(soap, soap->dime_options, optlen)
-   || soap_putdimefield(soap, soap->dime_id, idlen)
-   || soap_putdimefield(soap, soap->dime_type, typelen))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putdime(struct soap *soap, int i, char *id, char *type, char *options, void *ptr, size_t size)
-{ void *h;
-  if (id)
-    soap->dime_id = id;
-  else
-  { sprintf(soap->id, soap->dime_id_format, i);
-    soap->dime_id = soap->id;
-  }
-  soap->dime_type = type;
-  soap->dime_options = options;
-  soap->dime_size = size;
-  soap->dime_flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA;
-  if (soap->fdimereadopen && ((h = soap->fdimereadopen(soap, (void*)ptr, soap->dime_id, type, options)) || soap->error))
-  { size_t n;
-    if (!h)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n"));
-      return soap->error;
-    }
-    if (!size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE))
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n"));
-      n = sizeof(soap->tmpbuf);
-      do 
-      { size = soap->fdimeread(soap, h, soap->tmpbuf, n);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size));
-        if (size == n)
-          soap->dime_flags |= SOAP_DIME_CF;
-        else
-       { soap->dime_flags &= ~SOAP_DIME_CF;
-          if (--soap->dime_count == 0)  
-            soap->dime_flags |= SOAP_DIME_ME;
-        }
-       soap->dime_size = size;
-        if (soap_putdimehdr(soap)
-        || soap_send_raw(soap, soap->tmpbuf, size)
-        || soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime_size&3))
-          break;
-        if (soap->dime_id)
-       { soap->dime_flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA);
-          soap->dime_id = NULL;
-          soap->dime_type = NULL;
-          soap->dime_options = NULL;
-        }  
-       } while (size >= n);
-    }
-    else
-    { if (--soap->dime_count == 0)
-        soap->dime_flags |= SOAP_DIME_ME;
-      if (soap_putdimehdr(soap))
-        return soap->error;
-      do
-      { if (size < sizeof(soap->tmpbuf))
-          n = size;
-        else
-          n = sizeof(soap->tmpbuf);
-        if (!(n = soap->fdimeread(soap, h, soap->tmpbuf, n)))
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)soap->dime_size));
-          soap->error = SOAP_EOF;
-         break;
-        }
-        if (soap_send_raw(soap, soap->tmpbuf, n))
-          break;
-        size -= n;
-      } while (size);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
-      soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime_size&3);
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
-    if (soap->fdimereadclose)
-      soap->fdimereadclose(soap, h);
-    return soap->error;
-  }
-  if (--soap->dime_count == 0)
-     soap->dime_flags |= SOAP_DIME_ME;
-  if (soap_putdimehdr(soap))
-     return soap->error;
-  return soap_putdimefield(soap, (char*)ptr, size);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static char *
-soap_getdimefield(struct soap *soap, size_t n)
-{ register wchar c;
-  register int i;
-  register char *s;
-  char *p = NULL;
-  if (n)
-  { p = (char*)soap_malloc(soap, n + 1);
-    if (p)
-    { s = p;
-      for (i = n; i > 0; i--)
-      { if ((int)(c = soap_get1(soap)) == EOF)
-        { soap->error = SOAP_EOF;
-          return NULL;
-        }
-        *s++ = (char)c;
-      }
-      *s = '\0';
-      if ((soap->error = soap_move(soap, -(long)n&3)))
-        return NULL;
-    }
-    else
-      soap->error = SOAP_EOM;
-  }
-  return p;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getdimehdr(struct soap *soap)
-{ register wchar c;
-  register char *s;
-  register int i;
-  unsigned char tmp[12];
-  size_t optlen, idlen, typelen;
-  if (!(soap->mode & SOAP_ENC_DIME))
-    return soap->error = SOAP_EOD;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n"));
-  if (soap->dime_buflen || soap->dime_chunksize)
-  { if (soap_move(soap, (long)(soap->dime_size - soap_tell(soap))))
-      return soap->error = SOAP_EOF;
-    soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n"));
-    return SOAP_OK;
-  }
-  s = (char*)tmp;
-  for (i = 12; i > 0; i--)
-  { if ((int)(c = soap_getchar(soap)) == EOF)
-      return soap->error = SOAP_EOF;
-    *s++ = (char)c;
-  }
-  if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION)
-    return soap->error = SOAP_DIME_MISMATCH;
-  soap->dime_flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0);
-  optlen = (tmp[2] << 8) | tmp[3];
-  idlen = (tmp[4] << 8) | tmp[5];
-  typelen = (tmp[6] << 8) | tmp[7];
-  soap->dime_size = (tmp[8] << 24) | (tmp[9] << 16) | (tmp[10] << 8) | tmp[11];
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%u flags=0x%X\n", (unsigned int)soap->dime_size, soap->dime_flags));
-  if (!(soap->dime_options = soap_getdimefield(soap, optlen)) && soap->error)
-    return soap->error;
-  if (!(soap->dime_id = soap_getdimefield(soap, idlen)) && soap->error)
-    return soap->error;
-  if (!(soap->dime_type = soap_getdimefield(soap, typelen)) && soap->error)
-    return soap->error;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id=%s, type=%s, options=%s\n", soap->dime_id?soap->dime_id:"", soap->dime_type?soap->dime_type:"", soap->dime_options?soap->dime_options+4:""));
-  if (soap->dime_flags & SOAP_DIME_ME)
-    soap->mode &= ~SOAP_ENC_DIME;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getdime(struct soap *soap)
-{ if (soap_getdimehdr(soap))
-    return soap->error;
-  if (soap->fdimewriteopen && ((soap->dime_ptr = (char*)soap->fdimewriteopen(soap, soap->dime_id, soap->dime_type, soap->dime_options)) || soap->error))
-  { char *id, *type, *options;
-    size_t size, n;
-    if (!soap->dime_ptr)
-      return soap->error;
-    id = soap->dime_id;
-    type = soap->dime_type;
-    options = soap->dime_options;
-    for (;;)
-    { size = soap->dime_size;
-      for (;;)
-      { n = soap->buflen - soap->bufidx;
-        if (size < n)
-          n = size;
-        if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime_ptr, soap->buf + soap->bufidx, n)))
-          break;
-       size -= n;
-       if (!size)
-       { soap->bufidx += n;
-         break;
-       }
-       if (soap_recv(soap))
-        { soap->error = SOAP_EOF;
-         goto end;
-        }
-      }
-      if (soap_move(soap, -(long)soap->dime_size&3))
-      { soap->error = SOAP_EOF;
-       break;
-      }
-      if (!(soap->dime_flags & SOAP_DIME_CF))
-        break;
-      if (soap_getdimehdr(soap))
-        break;
-    }
-end:
-    if (soap->fdimewriteclose)
-      soap->fdimewriteclose(soap, (void*)soap->dime_ptr);
-    soap->dime_size = 0;
-    soap->dime_id = id;
-    soap->dime_type = type;
-    soap->dime_options = options;
-  }
-  else if (soap->dime_flags & SOAP_DIME_CF)
-  { char *id, *type, *options;
-    register wchar c;
-    register char *s;
-    register int i;
-    id = soap->dime_id;
-    type = soap->dime_type;
-    options = soap->dime_options;
-    if (soap_new_block(soap))
-      return SOAP_EOM;
-    for (;;)
-    { s = (char*)soap_push_block(soap, soap->dime_size);
-      if (!s)
-        return soap->error = SOAP_EOM;
-      for (i = soap->dime_size; i > 0; i--)
-      { if ((int)(c = soap_get1(soap)) == EOF)
-          return soap->error = SOAP_EOF;
-        *s++ = (char)c;
-      }
-      if (soap_move(soap, -(long)soap->dime_size&3))
-        return soap->error = SOAP_EOF;
-      if (!(soap->dime_flags & SOAP_DIME_CF))
-        break;
-      if (soap_getdimehdr(soap))
-        return soap->error;
-    }
-    soap->dime_size = soap->blist->size++; /* allocate one more for '\0' */
-    if (!(soap->dime_ptr = soap_save_block(soap, NULL)))
-      return soap->error;
-    soap->dime_ptr[soap->dime_size] = '\0'; /* make 0-terminated to enable string-based attachments */
-    soap->dime_id = id;
-    soap->dime_type = type;
-    soap->dime_options = options;
-  }
-  else
-    soap->dime_ptr = soap_getdimefield(soap, soap->dime_size);
-  return soap->error;
-}
-#endif
-#endif
-
-/******************************************************************************/
-
-#ifdef WITH_COOKIES
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_encode_cookie(const char *s, char *t, int len)
-{ register int c;
-  register int n = len;
-  while ((c = *s++) && --n > 0)
-  { if (c > ' ' && c < 128 && c != ';' && c != ',')
-      *t++ = c;
-    else if (n > 2)
-    { *t++ = '%';
-      *t++ = (c >> 4) + (c > 159 ? '7' : '0');
-      c &= 0xF;
-      *t++ = c + (c > 9 ? '7' : '0');
-      n -= 2;
-    }
-    else
-      break;
-  }
-  *t = '\0';
-  return len - n;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_decode_cookie(char *buf, int len, const char *val)
-{ const char *s;
-  char *t;
-  for (s = val; *s; s++)
-    if (*s != ' ' && *s != '=')
-      break;
-  if (*s == '"')
-  { t = buf;
-    s++;
-    while (*s && *s != '"' && --len)
-      *t++ = *s++;
-    *t = '\0';
-    do s++;
-    while (*s && *s != ';' && *s != '=');
-  }
-  else
-  { t = buf;
-    while (*s && *s != ';' && *s != '=' && --len)
-      switch (*s)
-      { case ' ':
-          s++;
-          break;
-        case '%':
-          *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4)
-               + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0');
-          s += 3;
-          break;
-        default:
-          *t++ = *s++;
-      }
-    *t = '\0';
-  }
-  return s;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  size_t n;
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!path)
-    path = soap->cookie_path;
-  if (*path == '/')
-    path++;
-  n = strlen(path);
-  for (p = soap->cookies; p; p = p->next)
-    if (!strcmp(p->name, name)
-     && domain
-     && p->domain
-     && !strcmp(p->domain, domain)
-     && !strncmp(p->path, path, n))
-      break;
-  return p;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path)
-{ struct soap_cookie **p, *q;
-  int n;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie: %s=%s domain=%s path=%s\n", name, value?value:"", domain?domain:"", path?path:""));
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!path)
-    path = soap->cookie_path;
-  if (!path)
-  { soap_set_receiver_error(soap, "Cookie path not set", NULL, SOAP_HTTP_ERROR);
-    return NULL;
-  }
-  if (*path == '/')
-    path++;
-  q = soap_cookie(soap, name, domain, path);
-  if (!q)
-  { if ((q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-    { if ((q->name = (char*)SOAP_MALLOC(strlen(name)+1)))
-        strcpy(q->name, name);
-      q->value = NULL;
-      q->domain = NULL;
-      q->path = NULL;
-      q->expire = -1;
-      q->version = 0;
-      q->secure = 0;
-      q->env = 0;
-      q->modified = 0;
-      for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--)
-        if (!strcmp((*p)->name, name) && (*p)->path && strcmp((*p)->path, path) < 0)
-          break;
-      if (n)
-      { q->next = *p;
-        *p = q;
-      }
-      else
-      { SOAP_FREE(q->name);
-        SOAP_FREE(q);
-        q = NULL;
-      }
-    }
-  }
-  else
-    q->modified = 1;
-  if (q)
-  { if (q->value)
-    { SOAP_FREE(q->value);
-      q->value = NULL;
-    }
-    if (q->domain)
-    { SOAP_FREE(q->domain);
-      q->domain = NULL;
-    }
-    if (q->path)
-    { SOAP_FREE(q->path);
-      q->path = NULL;
-    }
-    if (value && *value && (q->value = (char*)SOAP_MALLOC(strlen(value)+1)))
-      strcpy(q->value, value);
-    if (domain && *domain && (q->domain = (char*)SOAP_MALLOC(strlen(domain)+1)))
-      strcpy(q->domain, domain);
-    if (path && *path && (q->path = (char*)SOAP_MALLOC(strlen(path)+1)))
-      strcpy(q->path, path);
-    q->session = 1;
-  }
-  return q;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie **p, *q;
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!domain)
-  { soap_set_receiver_error(soap, "Cookie domain not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
-    return;
-  }
-  if (!path)
-    path = soap->cookie_path;
-  if (!path)
-  { soap_set_receiver_error(soap, "Cookie path not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
-    return;
-  }
-  if (*path == '/')
-    path++;
-  for (p = &soap->cookies, q = *p; q; q = *p)
-    if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path)))
-    { if (q->value)
-        SOAP_FREE(q->value);
-      if (q->domain)
-        SOAP_FREE(q->domain);
-      if (q->path)
-        SOAP_FREE(q->path);
-      *p = q->next;
-      SOAP_FREE(q);
-    }
-    else
-      p = &q->next;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-    return p->value;
-  return NULL;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-    return p->expire;
-  return -1;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->expire = expire;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->session = 1;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->session = 0;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putsetcookies(struct soap *soap)
-{ struct soap_cookie *p;
-  char *s, tmp[4096];
-  const char *t;
-  for (p = soap->cookies; p; p = p->next)
-    if (p->modified || !p->env)
-    { s = tmp;
-      if (p->name)
-        s += soap_encode_cookie(p->name, s, tmp-s+4064);
-      if (p->value)
-      { *s++ = '=';
-        s += soap_encode_cookie(p->value, s, tmp-s+4064);
-      }
-      if (p->domain && (int)strlen(p->domain) < tmp-s+4064)
-        sprintf(s, ";Domain=%s", p->domain);
-      else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064)
-        sprintf(s, ";Domain=%s", soap->cookie_domain);
-      strcpy(s, ";Path=/");
-      if (p->path)
-        t = p->path;
-      else
-        t = soap->cookie_path;
-      if (t)
-      { if (*t == '/')
-          t++;
-        if ((int)strlen(t) < tmp-s+4064)
-          strcat(s, t);
-      }
-      s += strlen(s);
-      if (p->version > 0)
-      { sprintf(s, ";Version=%u", p->version);
-        s += strlen(s);
-      }
-      if (p->expire >= 0)
-      { sprintf(s, ";Max-Age=%ld", p->expire);
-        s += strlen(s);
-      }
-      if (p->secure)
-        strcpy(s, ";Secure");
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp));
-      if (soap->fposthdr(soap, "Set-Cookie", tmp))
-        return soap->error;
-    }
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure)
-{ struct soap_cookie **p, *q;
-  unsigned int version = 0;
-  time_t now = time(NULL);
-  char *s, tmp[4096];
-  p = &soap->cookies;
-  while ((q = *p))
-  { if (q->expire && now > q->expire)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name));
-      SOAP_FREE(q->name);
-      if (q->value)
-        SOAP_FREE(q->value);
-      if (q->domain)
-        SOAP_FREE(q->domain);
-      if (q->path)
-        SOAP_FREE(q->path);
-      *p = q->next;
-      SOAP_FREE(q);
-    }
-    else if ((!q->domain || !strcmp(q->domain, domain))
-          && (!q->path || !strncmp(q->path, path, strlen(q->path)))
-          && (!q->secure || secure))
-    { s = tmp;
-      if (q->version != version)
-      { sprintf(s, "$Version=%u;", q->version);
-        version = q->version;
-      }
-      if (q->name)
-        s += soap_encode_cookie(q->name, s, tmp-s+4080);
-      if (q->value)
-      { *s++ = '=';
-        s += soap_encode_cookie(q->value, s, tmp-s+4080);
-      }
-      if (q->path && (int)strlen(q->path) < tmp-s+4080)
-      { sprintf(s, ";$Path=/%s", q->path);
-        s += strlen(s);
-      }
-      if (q->domain && (int)strlen(q->domain) < tmp-s+4080)
-        sprintf(s, ";$Domain=%s", q->domain);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp));
-      if (soap->fposthdr(soap, "Cookie", tmp))
-        return soap->error;
-      p = &q->next;
-    }
-    else
-      p = &q->next;
-  }
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_getcookies(struct soap *soap, const char *val)
-{ struct soap_cookie *p = NULL, *q;
-  const char *s;
-  char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
-  char *domain = NULL;
-  char *path = NULL;
-  unsigned int version = 0;
-  time_t now = time(NULL);
-  if (!val)
-    return;
-  s = val;
-  while (*s)
-  { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-    if (!soap_tag_cmp(tmp, "$Version"))
-    { if ((s = soap_decode_cookie(tmp, sizeof(tmp), s)))
-      { if (p)
-          p->version = (int)atol(tmp);
-        else
-          version = (int)atol(tmp);
-      }
-    }
-    else if (!soap_tag_cmp(tmp, "$Path"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(t, tmp);
-      }
-      else
-        t = NULL;
-      if (p)
-      { if (p->path)
-          SOAP_FREE(p->path);
-        p->path = t;
-      }
-      else
-      { if (path)
-          SOAP_FREE(path);
-        path = t;
-      }
-    }
-    else if (!soap_tag_cmp(tmp, "$Domain"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(t, tmp);
-      }
-      else
-        t = NULL;
-      if (p)
-      { if (p->domain)
-          SOAP_FREE(p->domain);
-       p->domain = t;
-      }
-      else
-      { if (domain)
-          SOAP_FREE(domain);
-        domain = t;
-      }
-    }
-    else if (p && !soap_tag_cmp(tmp, "Path"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      if (p->path)
-        SOAP_FREE(p->path);
-      if (*tmp)
-      { if ((p->path = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(p->path, tmp);
-      }
-      else
-        p->path = NULL;
-    }
-    else if (p && !soap_tag_cmp(tmp, "Domain"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      if (p->domain)
-        SOAP_FREE(p->domain);
-      if (*tmp)
-      { if ((p->domain = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(p->domain, tmp);
-      }
-      else
-        p->domain = NULL;
-    }
-    else if (p && !soap_tag_cmp(tmp, "Version"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      p->version = (unsigned int)atol(tmp);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Max-Age"))
-    { s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      p->expire = now + atol(tmp);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Expires"))
-    { struct tm T;
-      char a[3]; 
-      static const char mns[] = "anebarprayunulugepctovec";
-      s = soap_decode_cookie(tmp, sizeof(tmp), s);
-      memset(&T, 0, sizeof(struct tm));
-      a[0] = tmp[4];
-      a[1] = tmp[5];
-      a[2] = '\0';
-      T.tm_mday = (int)atol(a);
-      a[0] = tmp[8];
-      a[1] = tmp[9];
-      T.tm_mon = (strstr(mns, a) - mns) / 2;
-      a[0] = tmp[11];
-      a[1] = tmp[12];
-      T.tm_year = 100 + (int)atol(a);
-      a[0] = tmp[13];
-      a[1] = tmp[14];
-      T.tm_hour = (int)atol(a);
-      a[0] = tmp[16];
-      a[1] = tmp[17];
-      T.tm_min = (int)atol(a);
-      a[0] = tmp[19];
-      a[1] = tmp[20];
-      T.tm_sec = (int)atol(a);
-      p->expire = soap_timegm(&T);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Secure"))
-      p->secure = 1;
-    else
-    { if (p)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
-        if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
-        { q->version = p->version;
-          q->expire = p->expire;
-          q->secure = p->secure;
-          q->env = 1;
-        }
-        if (p->name)
-          SOAP_FREE(p->name);
-        if (p->value)
-          SOAP_FREE(p->value);
-        if (p->domain)
-          SOAP_FREE(p->domain);
-        if (p->path)
-          SOAP_FREE(p->path);
-        SOAP_FREE(p);
-      }
-      if ((p = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-      { p->name = (char*)SOAP_MALLOC(strlen(tmp)+1);
-        strcpy(p->name, tmp);
-        s = soap_decode_cookie(tmp, sizeof(tmp), s);
-        if (*tmp)
-        { p->value = (char*)SOAP_MALLOC(strlen(tmp)+1);
-          strcpy(p->value, tmp);
-        }
-        else
-          p->value = NULL;
-        p->domain = domain;
-        p->path = path;
-        p->expire = 0;
-        p->secure = 0;
-        p->version = version;
-      }
-    }
-    if (*s == ';')
-      s++;
-  }
-  if (p)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
-    if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
-    { q->version = p->version;
-      q->expire = p->expire;
-      q->secure = p->secure;
-    }
-    if (p->name)
-      SOAP_FREE(p->name);
-    if (p->value)
-      SOAP_FREE(p->value);
-    if (p->domain)
-      SOAP_FREE(p->domain);
-    if (p->path)
-      SOAP_FREE(p->path);
-    SOAP_FREE(p);
-  }
-  if (domain)
-    SOAP_FREE(domain);
-  if (path)
-    SOAP_FREE(path);
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getenv_cookies(struct soap *soap)
-{ struct soap_cookie *p;
-  const char *s;
-  char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
-  if (!(s = getenv("HTTP_COOKIE")))
-    return SOAP_ERR;
-  do
-  { s = soap_decode_cookie(key, sizeof(key), s);
-    s = soap_decode_cookie(val, sizeof(val), s);
-    p = soap_set_cookie(soap, key, val, NULL, NULL);
-    if (p)
-      p->env = 1;
-    if (*s == ';')
-      s++;
-  } while (*s);
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_copy_cookies(struct soap *soap)
-{ struct soap_cookie *p, **q, *r;
-  q = &r;
-  for (p = soap->cookies; p; p = p->next)
-  { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-      return r;
-    **q = *p;
-    if (p->name)
-    { if (((*q)->name = (char*)SOAP_MALLOC(strlen(p->name)+1)))
-        strcpy((*q)->name, p->name);
-    }
-    if (p->value)
-    { if (((*q)->value = (char*)SOAP_MALLOC(strlen(p->value)+1)))
-        strcpy((*q)->value, p->value);
-    }
-    if (p->domain)
-    { if (((*q)->domain = (char*)SOAP_MALLOC(strlen(p->domain)+1)))
-        strcpy((*q)->domain, p->domain);
-    }
-    if (p->path)
-    { if (((*q)->path = (char*)SOAP_MALLOC(strlen(p->path)+1)))
-        strcpy((*q)->path, p->path);
-    }
-    q = &(*q)->next;
-  }
-  *q = NULL;
-  return r;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_free_cookies(struct soap *soap)
-{ struct soap_cookie *p;
-  for (p = soap->cookies; p; p = soap->cookies)
-  { soap->cookies = p->next;
-    SOAP_FREE(p->name);
-    if (p->value)
-      SOAP_FREE(p->value);
-    if (p->domain)
-      SOAP_FREE(p->domain);
-    if (p->path)
-      SOAP_FREE(p->path);
-    SOAP_FREE(p);
-  }
-}
-
-/******************************************************************************/
-#endif /* WITH_COOKIES */
-
-/******************************************************************************/
-#ifdef WITH_GZIP
-#ifndef PALM_2
-static int
-soap_getgzipheader(struct soap *soap)
-{ int i;
-  wchar c, f = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n"));
-  for (i = 0; i < 9; i++)
-  { if ((int)(c = soap_get1(soap) == EOF))
-      return soap->error = SOAP_EOF;
-    if (i == 2)
-      f = c;
-  }
-  if (f & 0x04) /* FEXTRA */
-  { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--)
-      if ((int)soap_get1(soap) == EOF)
-        return soap->error = SOAP_EOF;
-  }
-  if (f & 0x08) /* FNAME */
-    do
-      c = soap_get1(soap);
-    while (c && (int)c != EOF);
-  if ((int)c != EOF && (f & 0x10)) /* FCOMMENT */
-    do
-      c = soap_get1(soap);
-    while (c && (int)f != EOF);
-  if ((int)c != EOF && (f & 0x01)) /* FHCRC */
-  { if ((int)(c = soap_get1(soap)) != EOF)
-      c = soap_get1(soap);
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_begin_recv(struct soap *soap)
-{ wchar c;
-  soap_set_local_namespaces(soap);
-  soap->version = 0;   /* don't assume we're parsing SOAP content by default */
-  soap_free_iht(soap);
-  if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK)
-    soap->omode |= SOAP_IO_CHUNK;
-  soap->imode &= ~SOAP_IO;
-  soap->mode = soap->imode;
-  if (!soap->keep_alive)
-  { soap->buflen = 0;
-    soap->bufidx = 0;
-  }
-  if (!(soap->mode & SOAP_IO_KEEPALIVE))
-    soap->keep_alive = 0;
-  soap->ahead = 0;
-  soap->peeked = 0;
-  soap->level = 0;
-  soap->part = SOAP_BEGIN;
-  soap->alloced = 0;
-  soap->count = 0;
-  soap->length = 0;
-  soap->cdata = 0;
-  *soap->endpoint = '\0';
-  soap->userid = NULL;
-  soap->passwd = NULL;
-  soap->action = NULL;
-  soap->dime_chunksize = 0;
-  soap->dime_buflen = 0;
-#ifdef WIN32
-#ifndef UNDER_CE
-#ifndef WITH_FASTCGI
-  if (!soap_valid_socket(soap->socket))
-#ifdef __BORLANDC__
-    setmode((SOAP_SOCKET)soap->recvfd, O_BINARY);
-#else
-    _setmode((SOAP_SOCKET)soap->recvfd, _O_BINARY);
-#endif
-#endif
-#endif
-#endif
-#ifdef WITH_ZLIB
-  soap->mode &= ~SOAP_ENC_ZLIB;
-  soap->zlib_in = SOAP_ZLIB_NONE;
-  soap->zlib_out = SOAP_ZLIB_NONE;
-  soap->d_stream.next_in = Z_NULL;
-  soap->d_stream.avail_in = 0;
-  soap->d_stream.next_out = (Byte*)soap->buf;
-  soap->d_stream.avail_out = SOAP_BUFLEN;
-  soap->z_ratio_in = 1.0;
-#endif
-  c = soap_getchar(soap);
-  if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20)
-    soap->mode |= SOAP_ENC_DIME;
-#ifdef WITH_GZIP
-  else if (c == 0x1F)
-  { if (soap_getgzipheader(soap))
-      return soap->error;
-    if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
-      return soap->error = SOAP_ZLIB_ERROR;
-    soap->zlib_state = SOAP_ZLIB_INFLATE;
-    soap->mode |= SOAP_ENC_ZLIB;
-    soap->zlib_in = SOAP_ZLIB_GZIP;
-    soap->z_crc = crc32(0L, NULL, 0);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
-    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-    /* should not chunk over plain transport, so why bother to check? */
-    /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */
-    /*   soap->z_buflen = soap->bufidx; */
-    /* else */
-    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-    soap->d_stream.avail_in = soap->buflen - soap->bufidx;
-    soap->z_buflen = soap->buflen;
-    soap->buflen = soap->bufidx;
-  }  
-#endif
-  else
-  { if (c == 0xEF && !(soap->mode & SOAP_C_LATIN))
-    { soap_unget(soap, c);
-      c = soap_getutf8(soap);
-      if (c == 0xFEFF)
-        c = soap_getchar(soap);
-    }
-    while (soap_blank(c))
-      c = soap_getchar(soap);
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  soap_unget(soap, c);
-  if (c != '<' && !(soap->mode & (SOAP_ENC_DIME | SOAP_ENC_ZLIB)))
-  { soap->mode &= ~SOAP_IO;
-    if ((soap->error = soap->fparse(soap)))
-    { if (soap->error == 307)  /* HTTP redirect */
-      { soap_getline(soap, soap->endpoint, sizeof(soap->endpoint));
-        soap->keep_alive = 0; /* force close when soap_closesock() */
-      }
-      return soap->error;
-    }
-    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    { soap->chunkbuflen = soap->buflen;
-      soap->buflen = soap->bufidx;
-      soap->chunksize = 0;
-    }
-#ifdef WITH_ZLIB
-    if (soap->zlib_in)
-    { /* fparse should not use soap_unget */
-#ifdef WITH_GZIP
-      c = soap_get1(soap);
-      if (c == 0x1F)
-      { if (soap_getgzipheader(soap))
-          return soap->error;
-        if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
-          return soap->error = SOAP_ZLIB_ERROR;
-        soap->zlib_state = SOAP_ZLIB_INFLATE;
-        soap->z_crc = crc32(0L, NULL, 0);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
-      }
-      else
-      { soap_revget1(soap);
-#else
-      {
-#endif
-        if (inflateInit(&soap->d_stream) != Z_OK)
-          return soap->error = SOAP_ZLIB_ERROR;
-        soap->zlib_state = SOAP_ZLIB_INFLATE;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n"));
-      }
-      soap->mode |= SOAP_ENC_ZLIB;
-      memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-      soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-      soap->d_stream.avail_in = soap->buflen - soap->bufidx;
-      soap->z_buflen = soap->buflen;
-      soap->buflen = soap->bufidx;
-    }
-#endif
-  }
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-  { if (soap_getdimehdr(soap))
-      return soap->error;
-    if (soap->dime_flags & SOAP_DIME_CF)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n"));
-      soap->dime_chunksize = soap->dime_size;
-      if (soap->buflen - soap->bufidx >= soap->dime_chunksize)
-      { soap->dime_buflen = soap->buflen;
-        soap->buflen = soap->bufidx + soap->dime_chunksize;
-      }
-      else
-        soap->dime_chunksize -= soap->buflen - soap->bufidx;
-    }
-    soap->count = soap->buflen - soap->bufidx;
-  }
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_parse(struct soap *soap)
-{ char header[SOAP_HDRLEN], *s;
-  unsigned short g = 0, k;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for response...\n"));
-  *soap->endpoint = '\0';
-  soap->length = 0;
-  do
-  { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
-      return SOAP_EOF;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf));
-    for (;;)
-    { if (soap_getline(soap, header, SOAP_HDRLEN))
-        return SOAP_EOF;
-      if (!*header)
-        break;
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header));
-      s = strchr(header, ':');
-      if (s)
-      { *s = '\0';
-        do s++;
-        while (*s && *s <= 32);
-        if ((soap->error = soap->fparsehdr(soap, header, s)))
-          return soap->error;
-      }
-    }
-    if ((s = strchr(soap->msgbuf, ' ')))
-      k = (unsigned short)soap_strtoul(s, NULL, 10);
-    else
-      k = 0;
-  } while (k == 100);
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing\n"));
-  s = strstr(soap->msgbuf, "HTTP/");
-  if (s && s[7] != '1')
-  { if (soap->keep_alive == 1)
-      soap->keep_alive = 0;
-    if (k == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* k == 0 for HTTP request */
-    { soap->imode |= SOAP_IO_CHUNK;
-      soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE;
-    }
-  }
-  if (soap->keep_alive < 0)
-    soap->keep_alive = 1;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive));
-  if (s && (((g = !strncmp(soap->msgbuf, "GET ", 4))) || !strncmp(soap->msgbuf, "POST ", 5)))
-  { size_t m = strlen(soap->endpoint);
-    size_t n = m + (s - soap->msgbuf) - 5 - (!g);
-    if (n >= sizeof(soap->endpoint))
-      n = sizeof(soap->endpoint) - 1;
-    strncpy(soap->path, soap->msgbuf + 4 + (!g), n - m);
-    soap->path[n - m] = '\0';
-    strcat(soap->endpoint, soap->path);
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint));
-    if (g)
-    { soap->error = soap->fget(soap);
-      if (soap->error == SOAP_OK)
-        soap->error = SOAP_STOP; /* prevents further processing */
-      return soap->error;
-    }
-    return SOAP_OK;
-  }
-  if (k == 0 || (k >= 200 && k <= 299) || k == 400 || k == 500)
-    return SOAP_OK;
-  return soap_set_receiver_error(soap, "HTTP error", soap->msgbuf, k);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_parse_header(struct soap *soap, const char *key, const char *val)
-{ if (!soap_tag_cmp(key, "Host"))
-  { 
-#ifdef WITH_OPENSSL
-    if (soap->imode & SOAP_ENC_SSL)
-      strcpy(soap->endpoint, "https://");
-    else
-#endif
-    strcpy(soap->endpoint, "http://");
-    strncat(soap->endpoint, val, sizeof(soap->endpoint) - 8);
-    soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
-  }
-  else if (!soap_tag_cmp(key, "Content-Type"))
-  { if (!soap_tag_cmp(val, "*application/dime*"))
-      soap->mode |= SOAP_ENC_DIME;
-  }
-  else if (!soap_tag_cmp(key, "Content-Length"))
-    soap->length = soap_strtoul(val, NULL, 10);
-  else if (!soap_tag_cmp(key, "Content-Encoding"))
-  { if (!soap_tag_cmp(val, "deflate*"))
-#ifdef WITH_ZLIB
-      soap->zlib_in = SOAP_ZLIB_DEFLATE;
-#else
-      return SOAP_ZLIB_ERROR;
-#endif
-    else if (!soap_tag_cmp(val, "gzip*"))
-#ifdef WITH_GZIP
-      soap->zlib_in = SOAP_ZLIB_GZIP;
-#else
-      return SOAP_ZLIB_ERROR;
-#endif
-  }
-#ifdef WITH_ZLIB
-  else if (!soap_tag_cmp(key, "Accept-Encoding"))
-  {
-#ifdef WITH_GZIP
-    if (strchr(val, '*') || !soap_tag_cmp(val, "*gzip*"))
-      soap->zlib_out = SOAP_ZLIB_GZIP;
-    else
-#endif
-    if (strchr(val, '*') || !soap_tag_cmp(val, "*deflate*"))
-      soap->zlib_out = SOAP_ZLIB_DEFLATE;
-    else
-      soap->zlib_out = SOAP_ZLIB_NONE;
-  }
-#endif
-  else if (!soap_tag_cmp(key, "Transfer-Encoding"))
-  { soap->mode &= ~SOAP_IO;
-    if (!soap_tag_cmp(val, "chunked*"))
-      soap->mode |= SOAP_IO_CHUNK;
-  }
-  else if (!soap_tag_cmp(key, "Connection"))
-  { if (!soap_tag_cmp(val, "keep-alive*"))
-      soap->keep_alive = -soap->keep_alive;
-    else if (!soap_tag_cmp(val, "close*"))
-      soap->keep_alive = 0;
-  }
-#ifndef WITH_LEAN
-  else if (!soap_tag_cmp(key, "Authorization"))
-  { if (!soap_tag_cmp(val, "basic *"))
-    { size_t n;
-      char *s;
-      soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n);
-      soap->tmpbuf[n] = '\0';
-      if ((s = strchr(soap->tmpbuf, ':')))
-      { *s = '\0';
-       soap->userid = soap_strdup(soap, soap->tmpbuf);
-       soap->passwd = soap_strdup(soap, s + 1);
-      }
-    }
-  }
-#endif
-  else if (!soap_tag_cmp(key, "SOAPAction"))
-  { if (val[0] && val[1])
-    { soap->action = soap_strdup(soap, val + 1);
-      soap->action[strlen(soap->action) - 1] = '\0';
-    }
-  }
-/* [ Deal with .NET bug (invalid XML id-ref) */
-  else if (!soap_tag_cmp(key, "Server"))
-  { if (!soap_tag_cmp(val, "Microsoft-IIS*"))
-      soap->dot_net_bug = 1;
-  }
-  else if (!soap_tag_cmp(key, "User-Agent"))
-  { if (!soap_tag_cmp(val, "*.NET CLR*") || !soap_tag_cmp(val, "*MS Web Services Client Protocol*"))
-      soap->dot_net_bug = 1;
-  }
-/* ] */
-#ifdef WITH_COOKIES
-  else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Set-Cookie"))
-    soap_getcookies(soap, val);
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_begin_out(struct soap *soap)
-{ soap->part = SOAP_IN_ENVELOPE;
-  return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_end_out(struct soap *soap)
-{ if (soap_element_end_out(soap, "SOAP-ENV:Envelope"))
-    return soap->error;
-  soap->part = SOAP_END_ENVELOPE;
-#ifndef WITH_LEANER
-  if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME))
-    return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->count&3);
-#endif
-  return SOAP_OK;
-} 
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_begin_in(struct soap *soap)
-{ soap->part = SOAP_IN_ENVELOPE;
-  if (soap_element_begin_in(soap, "SOAP-ENV:Envelope"))
-    return soap->error = SOAP_VERSIONMISMATCH;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_end_in(struct soap *soap)
-{ if (soap_element_end_in(soap, "SOAP-ENV:Envelope"))
-    return soap->error;
-  soap->part = SOAP_END_ENVELOPE;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_begin_out(struct soap *soap)
-{ soap->part = SOAP_IN_BODY;
-  if (soap->version == 1)
-    soap->encoding = 1;
-  if (soap_element(soap, "SOAP-ENV:Body", 0, NULL))
-    return soap->error;
-  if (soap_attribute(soap, "id", "_0"))
-    return soap->error;
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_end_out(struct soap *soap)
-{ if (soap_element_end_out(soap, "SOAP-ENV:Body"))
-    return soap->error;
-  soap->part = SOAP_IN_BODY;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_begin_in(struct soap *soap)
-{ soap->part = SOAP_IN_BODY;
-  return soap_element_begin_in(soap, "SOAP-ENV:Body");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_end_in(struct soap *soap)
-{ if (soap_element_end_in(soap, "SOAP-ENV:Body"))
-    return soap->error;
-  soap->part = SOAP_END_BODY;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_header(struct soap *soap)
-{ if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH)
-    soap->error = SOAP_OK;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_endpoint(struct soap *soap, const char *endpoint)
-{ register const char *s;
-  register size_t i, n;
-  *soap->endpoint = '\0';
-  *soap->host = '\0';
-  *soap->path = '\0';
-  soap->port = 80;
-  if (!endpoint || !*endpoint)
-    return;
-#ifdef WITH_OPENSSL
-  if (!strncmp(endpoint, "https:", 6))
-    soap->port = 443;
-#endif
-  strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1);
-  s = strchr(endpoint, ':');
-  if (s && s[1] == '/' && s[2] == '/')
-    s += 3;
-  else
-    s = endpoint;
-  n = strlen(s);
-  if (n >= sizeof(soap->host))
-    n = sizeof(soap->host) - 1;
-/* WR[ */
-#ifdef WITH_IPV6
-  if ('[' == s[0])
-  {
-    s++;
-    for (i = 0; i < n; i++)
-    { soap->host[i] = s[i];
-      if (']' == s[i])
-      {
-        s++;
-        break; 
-      }
-    }
-  }
-  else
-  {
-    for (i = 0; i < n; i++)
-    { soap->host[i] = s[i];
-      if (s[i] == '/' || s[i] == ':')
-        break; 
-    }
-  }
-#else /* WITH_IPV6 */
-/* ]WR */
-  for (i = 0; i < n; i++)
-  { soap->host[i] = s[i];
-    if (s[i] == '/' || s[i] == ':')
-      break; 
-  }
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-  soap->host[i] = '\0';
-  if (s[i] == ':')
-  { soap->port = (int)atol(s + i + 1);
-    for (i++; i < n; i++)
-      if (s[i] == '/')
-        break;
-  }
-  if (s[i])
-  { strncpy(soap->path, s + i + 1, sizeof(soap->path));
-    soap->path[sizeof(soap->path) - 1] = '\0';
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_connect(struct soap *soap, const char *endpoint, const char *action)
-{ return soap_connect_command(soap, SOAP_POST, endpoint, action);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action)
-{ char host[sizeof(soap->host)];
-  int port;
-  size_t count;
-  strcpy(host, soap->host); /* save to compare */
-  port = soap->port; /* save to compare */
-  soap_set_endpoint(soap, endpoint);
-  if (action)
-    soap->action = soap_strdup(soap, action);
-  if (soap->fconnect)
-  {
-    if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port)))
-      return soap->error;
-  }
-  else if (*soap->host)
-  { soap->status = http_command;
-    if (!soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port)
-    { soap->keep_alive = 0; /* force close */
-      soap_closesock(soap);
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
-      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
-      if (soap->error)
-        return soap->error;
-      soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0);
-    }
-    else if (!soap->keep_alive || soap_poll(soap))
-    { soap->keep_alive = 0; /* force close */
-      soap_closesock(soap);
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
-      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
-      if (soap->error)
-        return soap->error;
-    }
-  }
-  count = soap_begin_dime(soap);
-  if (soap_begin_send(soap))
-    return soap->error;
-  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint)
-  { unsigned int k = soap->mode;
-    soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
-    if ((k & SOAP_IO) != SOAP_IO_FLUSH)
-      soap->mode |= SOAP_IO_BUFFER;
-    if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count)))
-      return soap->error;
-    if ((k & SOAP_IO) == SOAP_IO_CHUNK)
-    { if (soap_flush(soap))
-        return soap->error;
-    }
-    soap->mode = k;
-  }
-  if (http_command != SOAP_POST)
-    return soap_end_send(soap);
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-    return soap_putdimehdr(soap);
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2base64(struct soap *soap, const unsigned char *s, char *t, size_t n)
-{ register size_t i;
-  register unsigned long m;
-  if (!t)
-    return SOAP_EOM;
-  t[0] = '\0';
-  if (!s)
-    return SOAP_OK;
-  for (; n > 2; n -= 3, s += 3)
-  { m = ((unsigned long)((unsigned char*)s)[0] << 16) | ((unsigned long)((unsigned char*)s)[1] << 8) | (unsigned long)((unsigned char*)s)[2];
-    for (i = 4; i > 0; m >>= 6)
-      t[--i] = soap_base64o[m & 0x3F];
-    t += 4;
-  }
-  t[0] = '\0';
-  if (n > 0)
-  { m = 0;
-    for (i = 0; i < n; i++)
-      m = (m << 8) | *s++;
-    for (; i < 3; i++)
-      m <<= 8;
-    for (i++; i > 0; m >>= 6)
-      t[--i] = soap_base64o[m & 0x3F];
-    for (i = 3; i > n; i--)
-      t[i] = '=';
-    t[4] = '\0';
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_base642s(struct soap *soap, const char *s, char *t, size_t l, size_t *n)
-{ register int i, j, c;
-  register unsigned long m;
-  char *p = t;
-  if (n)
-    *n = 0;
-  for (;;)
-  { for (i = 0; i < SOAP_BLKLEN; i++)
-    { m = 0;
-      j = 0;
-      while (j < 4)
-      { c = *s++;
-        if (c == '=' || !c)
-        { i *= 3;
-          switch (j)
-          { case 2:
-              *t++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *t++ = (char)((m >> 10) & 0xFF);
-              *t++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-           *n += i;
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      }
-      *t++ = (char)((m >> 16) & 0xFF);
-      *t++ = (char)((m >> 8) & 0xFF);
-      *t++ = (char)(m & 0xFF);
-      if (l < 3)
-      { if (n)
-         *n += i;
-        return p;
-      }
-      l -= 3;
-    }
-    if (n)
-      *n += 3 * SOAP_BLKLEN;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_puthttphdr(struct soap *soap, int status, size_t count)
-{ const char *s;
-  if (status == SOAP_FILE)
-    s = soap->http_content;
-  else if (status == SOAP_HTML)
-    s = "text/html; charset=utf-8";
-  else if (soap->mode & SOAP_ENC_DIME)
-    s = "application/dime";
-  else if (soap->version == 2)
-    s = "application/soap+xml; charset=utf-8";
-  else
-    s = "text/xml; charset=utf-8";
-  soap->error = soap->fposthdr(soap, "Content-Type", s);
-  if (soap->error)
-    return soap->error;
-#ifdef WITH_ZLIB
-  if (soap->omode & SOAP_ENC_ZLIB)
-#ifdef WITH_GZIP
-    soap->error = soap->fposthdr(soap, "Content-Encoding", "gzip");
-#else
-    soap->error = soap->fposthdr(soap, "Content-Encoding", "deflate");
-#endif
-#endif
-  if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)
-    soap->error = soap->fposthdr(soap, "Transfer-Encoding", "chunked");
-  else if (count > 0)
-  { sprintf(soap->tmpbuf, "%lu", (unsigned long)count);
-    soap->error = soap->fposthdr(soap, "Content-Length", soap->tmpbuf);
-  }
-  if (soap->error)
-    return soap->error;
-  return soap->error = soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_get(struct soap *soap)
-{ return SOAP_GET_METHOD;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count)
-{ const char *s;
-  if (soap->status == SOAP_GET)
-  { s = "GET";
-    count = 0;
-  }
-  else
-    s = "POST";
-#ifndef PALM
-  if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)))
-#else
-  if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8))
-#endif
-    return SOAP_OK;
-  if (soap->proxy_host)
-    sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version);
-  else
-    sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, path, soap->http_version);
-  if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-    return soap->error;
-  if (port != 80)
-    sprintf(soap->tmpbuf, "%s:%d", host, port);
-  else
-    strcpy(soap->tmpbuf, host); 
-  if ((soap->error = soap->fposthdr(soap, "Host", soap->tmpbuf))
-   || (soap->error = soap->fposthdr(soap, "User-Agent", "gSOAP/2.6"))
-   || (soap->error = soap_puthttphdr(soap, SOAP_OK, count)))
-    return soap->error;
-#ifdef WITH_ZLIB
-#ifdef WITH_GZIP
-  if ((soap->error = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate")))
-#else
-  if ((soap->error = soap->fposthdr(soap, "Accept-Encoding", "deflate")))
-#endif
-    return soap->error;
-#endif
-#ifndef WITH_LEAN
-  if (soap->userid && soap->passwd && strlen(soap->userid) + strlen(soap->passwd) < 761)
-  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd);
-    strcpy(soap->tmpbuf, "Basic ");
-    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-    if ((soap->error = soap->fposthdr(soap, "Authorization", soap->tmpbuf)))
-      return soap->error;
-  }
-  if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
-  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
-    strcpy(soap->tmpbuf, "Basic ");
-    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-    if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
-      return soap->error;
-  }
-#endif
-#ifdef WITH_COOKIES
-#ifdef WITH_OPENSSL
-  if (soap_putcookies(soap, host, path, soap->ssl != NULL))
-    return soap->error;
-#else
-  if (soap_putcookies(soap, host, path, 0))
-    return soap->error;
-#endif
-#endif
-  if (action)
-  { sprintf(soap->tmpbuf, "\"%s\"", action);
-    if ((soap->error = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf)))
-      return soap->error;
-  }
-  return soap->error = soap->fposthdr(soap, NULL, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_post_header(struct soap *soap, const char *key, const char *val)
-{ if (key)
-  { if (soap_send(soap, key))
-      return soap->error;
-    if (val && (soap_send(soap, ": ") || soap_send(soap, val)))
-      return soap->error;
-  }
-  return soap_send(soap, "\r\n");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_response(struct soap *soap, int status, size_t count)
-{
-/* WR[ */
-#ifdef WMW_RPM_IO
-  if (soap->rpmreqid)
-      {
-      httpOutputEnable(soap->rpmreqid);
-      }
-#endif  /* WMW_RPM_IO */
-/* ]WR */
-  if (!status || status == SOAP_HTML || status == SOAP_FILE)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "OK 200\n"));
-/* WR[ */
-#ifdef WMW_RPM_IO
-    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
-#else
-/* ]WR */
-    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
-/* WR[ */
-#endif /* WMW_RPM_IO */
-/* ]WR */
-    { sprintf(soap->tmpbuf, "HTTP/%s 200 OK", soap->http_version);
-      if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return soap->error;
-    }
-    else if ((soap->error = soap->fposthdr(soap, "Status", "200 OK")))
-      return soap->error;
-  }
-  else if (status > 200 && status < 600)
-  { sprintf(soap->tmpbuf, "HTTP/%s %d %s", soap->http_version, status, http_error(soap, status));
-    if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-      return soap->error;
-    if (status == 401)
-      if ((soap->error = soap->fposthdr(soap, "WWW-Authenticate", "Basic realm=\"gSOAP Service\"")))
-        return soap->error;
-  }
-  else
-  { const char *s = *soap_faultcode(soap);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error\n"));
-    if (soap->version == 2 && !strcmp(s, "SOAP-ENV:Sender"))
-      s = "400 Bad Request";
-    else
-      s = "500 Internal Server Error";
-/* WR[ */
-#ifdef WMW_RPM_IO
-    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
-#else
-/* ]WR */
-    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
-/* WR[ */
-#endif /* WMW_RPM_IO */
-/* ]WR */
-    { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s);
-      if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return soap->error;
-    }
-    else if ((soap->error = soap->fposthdr(soap, "Status", s)))
-      return soap->error;
-  }
-  if ((soap->error = soap->fposthdr(soap, "Server", "gSOAP/2.6"))
-   || (soap->error = soap_puthttphdr(soap, status, count)))
-    return soap->error;
-#ifdef WITH_COOKIES
-  if (soap_putsetcookies(soap))
-    return soap->error;
-#endif
-  return soap->error = soap->fposthdr(soap, NULL, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_response(struct soap *soap, int status)
-{ register size_t count;
-  if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */))
-   && (status == SOAP_HTML || status == SOAP_FILE))
-  { soap->omode &= ~SOAP_IO;
-    soap->omode |= SOAP_IO_STORE;
-  }
-  soap->status = status;
-  count = soap_begin_dime(soap);
-  if (soap_begin_send(soap))
-    return soap->error;
-  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML))
-  { register int n = soap->mode;
-    soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
-    if ((n & SOAP_IO) != SOAP_IO_FLUSH)
-      soap->mode |= SOAP_IO_BUFFER;
-    if ((soap->error = soap->fresponse(soap, status, count)))
-      return soap->error;
-    if ((n & SOAP_IO) == SOAP_IO_CHUNK)
-    { if (soap_flush(soap))
-        return soap->error;
-    }
-    soap->mode = n;
-  }
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-    return soap_putdimehdr(soap);
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_fault(struct soap *soap)
-{ const char **c = soap_faultcode(soap);
-  const char **s = soap_faultstring(soap);
-  if (!*c)
-  { if (soap->version == 2)
-      *c = "SOAP-ENV:Sender";
-    else
-      *c = "SOAP-ENV:Client";
-  }
-  if (*s)
-    return;
-  switch (soap->error)
-  { case SOAP_CLI_FAULT:
-      *s = "Client fault";
-      break;
-    case SOAP_SVR_FAULT:
-      *s = "Server fault";
-      break;
-    case SOAP_TAG_MISMATCH:
-      sprintf(soap->msgbuf, "Tag mismatch: element '%s' does not correspond to expected element", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_TYPE:
-      sprintf(soap->msgbuf, "Data type '%s' mismatch in element '%s'", soap->type, soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_SYNTAX_ERROR:
-      *s = "XML syntax error";
-      break;
-    case SOAP_NO_TAG:
-      *s = "No XML element tag found";
-      break;
-    case SOAP_MUSTUNDERSTAND:
-      *c = "SOAP-ENV:MustUnderstand";
-      sprintf(soap->msgbuf, "The data in element '%s' must be understood but cannot be handled", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_VERSIONMISMATCH:
-      *c = "SOAP-ENV:VersionMismatch";
-      *s = "SOAP version mismatch or invalid SOAP message";
-      break;
-    case SOAP_DATAENCODINGUNKNOWN:
-      *c = "SOAP-ENV:DataEncodingUnknown";
-      *s = "Unsupported SOAP data encoding";
-      break;
-    case SOAP_DIME_MISMATCH:
-      *s = "DIME version mismatch";
-      break;
-    case SOAP_NAMESPACE:
-      sprintf(soap->msgbuf, "Namespace URI mismatch in element '%s'", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_OBJ_MISMATCH:
-      *s = "Object mismatch";
-      break;
-    case SOAP_FATAL_ERROR:
-      *s = "Fatal error";
-      break;
-    case SOAP_NO_METHOD:
-      sprintf(soap->msgbuf, "Method '%s' not implemented", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_GET_METHOD:
-      *s = "HTTP GET method not implemented";
-      break;
-    case SOAP_EOM:
-      *s = "Out of memory";
-      break;
-    case SOAP_IOB:
-      *s = "Array index out of bounds";
-      break;
-    case SOAP_NULL:
-      sprintf(soap->msgbuf, "Cannot create nilable object for type '%s' in element '%s'", soap->type, soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_MULTI_ID:
-      *s = "Non-unique id attribute";
-      break;
-    case SOAP_MISSING_ID:
-      *s = "Missing id: referenced data is missing or had to be ignored";
-      break;
-    case SOAP_HREF:
-      *s = "Invalid XML: object reference with href attribute is incompatible with actual object referred to";
-      break;
-    case SOAP_FAULT:
-      break;
-    case SOAP_TCP_ERROR:
-      *s = tcp_error(soap);
-      break;
-    case SOAP_HTTP_ERROR:
-      *s = "HTTP error";
-      break;
-    case SOAP_SSL_ERROR:
-      *s = "SSL error";
-      break;
-    case SOAP_PLUGIN_ERROR:
-      *s = "Plugin registry error";
-      break;
-    case SOAP_DIME_ERROR:
-      *s = "DIME error";
-      break;
-    case SOAP_ZLIB_ERROR:
-#ifdef WITH_ZLIB
-      sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream.msg?soap->d_stream.msg:"");
-      *s = soap->msgbuf;
-#else
-      *s = "Zlib not installed for required message (de)compression";
-#endif
-      break;
-    case SOAP_EOD:
-      *s = "End of DIME error";
-      break;
-    case SOAP_REQUIRED:
-      *s = "Validation failure: XML attribute required";
-      break;
-    case SOAP_OCCURS:
-      *s = "Validation failure: XML element occurs count";
-      break;
-    case SOAP_EOF:
-      sprintf(soap->msgbuf, "End of file or no input: '%s'", soap_strerror(soap));
-      *s = soap->msgbuf;
-      break;
-    default:
-      if (soap->error > 200 && soap->error < 600)
-      { sprintf(soap->msgbuf, "HTTP Error: '%s'", http_error(soap, soap->error));
-        *s = soap->msgbuf;
-      }
-      else
-        *s = "Unknown error code";
-    }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send_fault(struct soap *soap)
-{ register int status = soap->error;
-  if (status == SOAP_STOP)
-    return status;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error));
-  soap->keep_alive = 0; /* to terminate connection */
-  soap_set_fault(soap);
-  if ((status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) && soap_poll(soap) == SOAP_OK)
-  { soap->error = SOAP_OK;
-    soap_serializeheader(soap);
-    soap_serializefault(soap);
-    soap_begin_count(soap);
-    if (soap->mode & SOAP_IO_LENGTH)
-    { soap_envelope_begin_out(soap);
-      soap_putheader(soap);
-      soap_body_begin_out(soap);
-      soap_putfault(soap);
-      soap_body_end_out(soap);
-      soap_envelope_end_out(soap);
-    }
-    if (soap_response(soap, status)
-     || soap_envelope_begin_out(soap)
-     || soap_putheader(soap)
-     || soap_body_begin_out(soap)
-     || soap_putfault(soap)
-     || soap_body_end_out(soap)
-     || soap_envelope_end_out(soap))
-      return soap_closesock(soap);
-    soap_end_send(soap);
-  }
-  soap_closesock(soap);
-  return soap->error = status;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_fault(struct soap *soap)
-{ register int status = soap->error;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Receiving SOAP Fault\n"));
-  soap->error = SOAP_OK;
-  if (soap_getfault(soap))
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed. Is this a SOAP message at all?\n"));
-    *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client");
-    soap->error = status;
-    soap_set_fault(soap);
-  }
-  else
-  { register const char *s = *soap_faultcode(soap);
-    if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver"))
-      status = SOAP_SVR_FAULT; 
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender"))
-      status = SOAP_CLI_FAULT;
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand"))
-      status = SOAP_MUSTUNDERSTAND;
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch"))
-      status = SOAP_VERSIONMISMATCH;
-    else
-    { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Fault code %s\n", s));
-      status = SOAP_FAULT;
-    }
-    if (soap_body_end_in(soap)
-     || soap_envelope_end_in(soap)
-     || soap_end_recv(soap))
-      return soap_closesock(soap);
-    soap->error = status;
-  }
-  return soap_closesock(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-soap_strerror(struct soap *soap)
-{ int err = soap->errnum;
-  if (!err)
-    err = soap_errno;
-  if (err)
-  {
-#ifndef UNDER_CE
-    return strerror(err);
-#else
-    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)&soap->werrorstr, 256, NULL);
-    wcstombs(soap->errorstr, soap->werrorstr, 256);
-    return soap->errorstr;
-#endif
-  }
-  return "Operation interrupted or timed out";
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_set_error(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail, int soaperror)
-{ *soap_faultcode(soap) = faultcode;
-  *soap_faultstring(soap) = faultstring;
-  if (faultdetail && *faultdetail)
-  { register const char **s = soap_faultdetail(soap);
-    if (s)
-      *s = faultdetail;
-  }
-  return soap->error = soaperror;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
-{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail, soaperror);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
-{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail, soaperror);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail)
-{ char *s = NULL, *t = NULL;
-  if (faultstring)
-    s = soap_strdup(soap, faultstring);
-  if (faultdetail)
-    t = soap_strdup(soap, faultdetail);
-  return soap_set_error(soap, faultcode, s, t, SOAP_FAULT);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
-{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
-{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_print_fault(struct soap *soap, FILE *fd)
-{ if (soap->error)
-  { const char **s;
-    if (!*soap_faultcode(soap))
-      soap_set_fault(soap);
-    fprintf(fd, "SOAP FAULT: %s\n\"%s\"\n", *soap_faultcode(soap), *soap_faultstring(soap));
-    s = soap_faultdetail(soap);
-    if (s && *s)
-      fprintf(fd, "Detail: %s\n", *s);
-  }
-}
-#endif
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_print_fault_location(struct soap *soap, FILE *fd)
-{ 
-#ifndef WITH_LEAN
-  int c;
-  if (soap->error && soap->buflen > 0)
-  { if (soap->bufidx == 0)
-      soap->bufidx = 1;
-    c = soap->buf[soap->bufidx - 1];
-    soap->buf[soap->bufidx - 1] = '\0';
-    soap->buf[soap->buflen - 1] = '\0';
-    if (soap->bufidx < soap->buflen)
-      fprintf(fd, "%s%c\n** HERE **\n%s\n", soap->buf, c, soap->buf + soap->bufidx);
-    else
-      fprintf(fd, "%s%c\n** HERE **\n", soap->buf, c);
-  }
-#endif
-}
-#endif
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg)
-{ register struct soap_plugin *p;
-  register int r;
-  if (!(p = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin))))
-    return soap->error = SOAP_EOM;
-  p->id = NULL;
-  p->data = NULL;
-  p->fcopy = NULL;
-  p->fdelete = NULL;
-  r = fcreate(soap, p, arg);
-  if (!r && p->fdelete)
-  { p->next = soap->plugins;
-    soap->plugins = p;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id));
-    return SOAP_OK;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id?p->id:"?", r));
-  SOAP_FREE(p);
-  return r;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void *
-fplugin(struct soap *soap, const char *id)
-{ register struct soap_plugin *p;
-  for (p = soap->plugins; p; p = p->next)
-    if (p->id == id || !strcmp(p->id, id))
-      return p->data;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void *
-SOAP_FMAC2
-soap_lookup_plugin(struct soap *soap, const char *id)
-{ return soap->fplugin(soap, id);
-}
-#endif
-
-/******************************************************************************/
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/org.glite.lb.server/examples/stdsoap2_2.7.0c.c b/org.glite.lb.server/examples/stdsoap2_2.7.0c.c
deleted file mode 100644 (file)
index 2f97766..0000000
+++ /dev/null
@@ -1,11629 +0,0 @@
-/*
-
-stdsoap2.c[pp] 2.7.0c
-
-Runtime environment.
-
-gSOAP XML Web services tools
-Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved.
-
-Contributors:
-
-Wind River Systems, Inc., for the following additions (marked WR[...]):
-  - vxWorks compatible
-  - Support for IPv6.
-
---------------------------------------------------------------------------------
-gSOAP public license.
-
-The contents of this file are subject to the gSOAP Public License Version 1.3
-(the "License"); you may not use this file except in compliance with the
-License. You may obtain a copy of the License at
-http://www.cs.fsu.edu/~engelen/soaplicense.html
-Software distributed under the License is distributed on an "AS IS" basis,
-WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-for the specific language governing rights and limitations under the License.
-
-The Initial Developer of the Original Code is Robert A. van Engelen.
-Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved.
---------------------------------------------------------------------------------
-GPL license.
-
-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
-
-Author contact information:
-engelen@genivia.com / engelen@acm.org
---------------------------------------------------------------------------------
-
-Installation note:
-
-Win32 build needs winsock.dll (Visual C++ "wsock32.lib")
-To do this in Visual C++ 6.0, go to "Project", "settings", select the "Link"
-tab (the project file needs to be selected in the file view) and add
-"wsock32.lib" to the "Object/library modules" entry
-
-On Mac OS X with gcc (GCC) 3.1 20020420 (prerelease) you MUST compile with
--fstack_check when using -O2 because gcc 3.1 has a bug that smashes the stack
-when locally allocated data exceeds 64K.
-
-*/
-
-#include "stdsoap2.h"
-
-#ifdef __cplusplus
-SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.7.0c 2004-09-27 12:00:00 GMT")
-extern "C" {
-#else
-SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.7.0c 2004-09-27 12:00:00 GMT")
-#endif
-
-/* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale) */
-#ifndef SOAP_UNKNOWN_CHAR
-#define SOAP_UNKNOWN_CHAR (127)
-#endif
-
-/*      EOF=-1 */
-#define SOAP_LT (soap_wchar)(-2) /* XML character '<' */
-#define SOAP_TT (soap_wchar)(-3) /* XML character '</' */
-#define SOAP_GT (soap_wchar)(-4) /* XML character '>' */
-#define SOAP_QT (soap_wchar)(-5) /* XML character '"' */
-#define SOAP_AP (soap_wchar)(-6) /* XML character ''' */
-
-#define soap_blank(c)          ((c) >= 0 && (c) <= 32)
-#define soap_notblank(c)       ((c) > 32)
-#define soap_hash_ptr(p)       (((unsigned long)(p) >> 3) & (SOAP_PTRHASH - 1))
-
-static int soap_isxdigit(int);
-static soap_wchar soap_char(struct soap*);
-static soap_wchar soap_getchunkchar(struct soap*);
-static void soap_update_ptrs(struct soap*, char*, char*, long);
-static int soap_has_copies(struct soap*, const char*, const char*);
-static struct soap_ilist *soap_hlookup(struct soap*, const char*);
-static void soap_init_iht(struct soap*);
-static void soap_free_iht(struct soap*);
-static void soap_init_pht(struct soap*);
-static void soap_free_pht(struct soap*);
-static int soap_set_error(struct soap*, const char*, const char*, const char*, int);
-static const char *soap_set_validation_fault(struct soap*, const char*, const char*);
-static int soap_copy_fault(struct soap*, const char*, const char*, const char*);
-static int soap_getattrval(struct soap*, char*, size_t, soap_wchar);
-static void soap_set_local_namespaces(struct soap*);
-static int soap_isnumeric(struct soap*, const char*);
-static void *fplugin(struct soap*, const char*);
-static const char *soap_decode(char*, size_t, const char*, const char*);
-
-#ifndef WITH_LEAN
-static time_t soap_timegm(struct tm*);
-#endif
-
-#ifdef SOAP_DEBUG
-static void soap_init_logs(struct soap*);
-static void soap_close_logfile(struct soap*, int);
-static void soap_set_logfile(struct soap*, int, const char*);
-#endif
-
-#ifdef WITH_FAST
-static int soap_append_lab(struct soap*, const char*, size_t);
-#endif
-
-#ifndef WITH_LEANER
-static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t);
-static int soap_putdimefield(struct soap*, const char*, size_t);
-static char *soap_getdimefield(struct soap*, size_t);
-static void soap_select_mime_boundary(struct soap*);
-static int soap_valid_mime_boundary(struct soap*);
-#endif
-
-#ifdef WITH_GZIP
-static int soap_getgziphdr(struct soap*);
-#endif
-
-#ifdef WITH_OPENSSL
-static int ssl_auth_init(struct soap*);
-static int ssl_verify_callback(int, X509_STORE_CTX*);
-static int ssl_password(char*, int, int, void *);
-/* This callback is included for future references. It should not be deleted
-static DH *ssl_tmp_dh(SSL*, int, int);
-*/
-#endif
-
-static const char *soap_strerror(struct soap*);
-static const char *tcp_error(struct soap*);
-static const char *http_error(struct soap*, int);
-static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t);
-static int http_get(struct soap*);
-static int http_send_header(struct soap*, const char*);
-static int http_post_header(struct soap*, const char*, const char*);
-static int http_response(struct soap*, int, size_t);
-static int http_parse(struct soap*);
-static int http_parse_header(struct soap*, const char*, const char*);
-#ifndef MAC_CARBON
-static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr);
-static int tcp_connect(struct soap*, const char *endpoint, const char *host, int port);
-static int tcp_accept(struct soap*, int, struct sockaddr*, int*);
-static int tcp_disconnect(struct soap*);
-static int tcp_closesocket(struct soap*, SOAP_SOCKET);
-static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int);
-static int fsend(struct soap*, const char*, size_t);
-static size_t frecv(struct soap*, char*, size_t);
-#endif
-
-/* WR[ */
-#ifdef VXWORKS
-static int vx_nonblocking = TRUE; /* ioctl argument */
-#endif
-/* ]WR */
-
-#ifndef PALM_2
-static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/";
-static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/";
-static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope";
-static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding";
-static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc";
-#endif
-
-#ifndef PALM_1
-const struct soap_double_nan soap_double_nan = {0xFFFFFFFF, 0xFFFFFFFF};
-static const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-static const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63";
-#endif
-
-static const char soap_padding[3] = "\0\0";
-#define SOAP_STR_PADDING (soap_padding)
-#define SOAP_STR_EOS (soap_padding)
-
-#ifndef WITH_LEAN
-static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */
-{ { 160, "nbsp" },
-  { 161, "iexcl" },
-  { 162, "cent" },
-  { 163, "pound" },
-  { 164, "curren" },
-  { 165, "yen" },
-  { 166, "brvbar" },
-  { 167, "sect" },
-  { 168, "uml" },
-  { 169, "copy" },
-  { 170, "ordf" },
-  { 171, "laquo" },
-  { 172, "not" },
-  { 173, "shy" },
-  { 174, "reg" },
-  { 175, "macr" },
-  { 176, "deg" },
-  { 177, "plusmn" },
-  { 178, "sup2" },
-  { 179, "sup3" },
-  { 180, "acute" },
-  { 181, "micro" },
-  { 182, "para" },
-  { 183, "middot" },
-  { 184, "cedil" },
-  { 185, "sup1" },
-  { 186, "ordm" },
-  { 187, "raquo" },
-  { 188, "frac14" },
-  { 189, "frac12" },
-  { 190, "frac34" },
-  { 191, "iquest" },
-  { 192, "Agrave" },
-  { 193, "Aacute" },
-  { 194, "Acirc" },
-  { 195, "Atilde" },
-  { 196, "Auml" },
-  { 197, "Aring" },
-  { 198, "AElig" },
-  { 199, "Ccedil" },
-  { 200, "Egrave" },
-  { 201, "Eacute" },
-  { 202, "Ecirc" },
-  { 203, "Euml" },
-  { 204, "Igrave" },
-  { 205, "Iacute" },
-  { 206, "Icirc" },
-  { 207, "Iuml" },
-  { 208, "ETH" },
-  { 209, "Ntilde" },
-  { 210, "Ograve" },
-  { 211, "Oacute" },
-  { 212, "Ocirc" },
-  { 213, "Otilde" },
-  { 214, "Ouml" },
-  { 215, "times" },
-  { 216, "Oslash" },
-  { 217, "Ugrave" },
-  { 218, "Uacute" },
-  { 219, "Ucirc" },
-  { 220, "Uuml" },
-  { 221, "Yacute" },
-  { 222, "THORN" },
-  { 223, "szlig" },
-  { 224, "agrave" },
-  { 225, "aacute" },
-  { 226, "acirc" },
-  { 227, "atilde" },
-  { 228, "auml" },
-  { 229, "aring" },
-  { 230, "aelig" },
-  { 231, "ccedil" },
-  { 232, "egrave" },
-  { 233, "eacute" },
-  { 234, "ecirc" },
-  { 235, "euml" },
-  { 236, "igrave" },
-  { 237, "iacute" },
-  { 238, "icirc" },
-  { 239, "iuml" },
-  { 240, "eth" },
-  { 241, "ntilde" },
-  { 242, "ograve" },
-  { 243, "oacute" },
-  { 244, "ocirc" },
-  { 245, "otilde" },
-  { 246, "ouml" },
-  { 247, "divide" },
-  { 248, "oslash" },
-  { 249, "ugrave" },
-  { 250, "uacute" },
-  { 251, "ucirc" },
-  { 252, "uuml" },
-  { 253, "yacute" },
-  { 254, "thorn" },
-  { 255, "yuml" },
-  {   0, NULL }
-};
-#endif
-
-#ifndef WITH_LEAN
-static const struct soap_code_map h_error_codes[] =
-{
-#ifdef HOST_NOT_FOUND   
-  { HOST_NOT_FOUND, "Host not found" },
-#endif
-#ifdef TRY_AGAIN
-  { TRY_AGAIN, "Try Again" },
-#endif
-#ifdef NO_RECOVERY  
-  { NO_RECOVERY, "No Recovery" },
-#endif
-#ifdef NO_DATA
-  { NO_DATA, "No Data" },
-#endif
-#ifdef NO_ADDRESS
-  { NO_ADDRESS, "No Address" },
-#endif
-  { 0, NULL }
-};
-#endif
-
-#ifndef WITH_LEAN
-static const struct soap_code_map h_http_error_codes[] =
-{ { 201, "Created" },
-  { 202, "Accepted" },
-  { 203, "Non-Authoritative Information" },
-  { 204, "No Content" },
-  { 205, "Reset Content" },
-  { 206, "Partial Content" },
-  { 300, "Multiple Choices" },
-  { 301, "Moved Permanently" },
-  { 302, "Found" },
-  { 303, "See Other" },
-  { 304, "Not Modified" },
-  { 305, "Use Proxy" },
-  { 307, "Temporary Redirect" },
-  { 400, "Bad Request" },
-  { 401, "Unauthorized" },
-  { 402, "Payment Required" },
-  { 403, "Forbidden" },
-  { 404, "Not Found" },
-  { 405, "Method Not Allowed" },
-  { 406, "Not Acceptable" },
-  { 407, "Proxy Authentication Required" },
-  { 408, "Request Time-out" },
-  { 409, "Conflict" },
-  { 410, "Gone" },
-  { 411, "Length Required" },
-  { 412, "Precondition Failed" },
-  { 413, "Request Entity Too Large" },
-  { 414, "Request-URI Too Large" },
-  { 415, "Unsupported Media Type" },
-  { 416, "Requested range not satisfiable" },
-  { 417, "Expectation Failed" },
-  { 500, "Internal Server Error" },
-  { 501, "Not Implemented" },
-  { 502, "Bad Gateway" },
-  { 503, "Service Unavailable" },
-  { 504, "Gateway Time-out" },
-  { 505, "HTTP Version not supported" },
-  {   0, NULL }
-};
-#endif
-
-#ifdef WITH_OPENSSL
-static const struct soap_code_map h_ssl_error_codes[] =
-{
-#define _SSL_ERROR(e) { e, #e }
-  _SSL_ERROR(SSL_ERROR_SSL),
-  _SSL_ERROR(SSL_ERROR_ZERO_RETURN),
-  _SSL_ERROR(SSL_ERROR_WANT_READ),
-  _SSL_ERROR(SSL_ERROR_WANT_WRITE),
-  _SSL_ERROR(SSL_ERROR_WANT_CONNECT),
-  _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP),
-  _SSL_ERROR(SSL_ERROR_SYSCALL),
-  { 0, NULL }
-};
-#endif
-
-#ifndef WITH_LEANER
-static const struct soap_code_map mime_codes[] =
-{ { SOAP_MIME_7BIT,            "7bit" },
-  { SOAP_MIME_8BIT,            "8bit" },
-  { SOAP_MIME_BINARY,          "binary" },
-  { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" },
-  { SOAP_MIME_BASE64,          "base64" },
-  { SOAP_MIME_IETF_TOKEN,      "ietf-token" },
-  { SOAP_MIME_X_TOKEN,         "x-token" },
-  { 0,                         NULL }
-};
-#endif
-
-#ifdef WIN32
-static int tcp_done = 0;
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-fsend(struct soap *soap, const char *s, size_t n)
-{ register int nwritten;
-#if defined(__cplusplus) && !defined(UNDER_CE)
-  if (soap->os)
-  { soap->os->write(s, n);
-    if (soap->os->good())
-      return SOAP_OK;
-    return SOAP_EOF;
-  }
-#endif
-  while (n)
-  { if (soap_valid_socket(soap->socket))
-    { 
-#ifndef WITH_LEAN
-      if (soap->send_timeout)
-      { struct timeval timeout;
-        fd_set fd;
-        if (soap->send_timeout > 0)
-        { timeout.tv_sec = soap->send_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->send_timeout/1000000;
-          timeout.tv_usec = -soap->send_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        for (;;)
-        { register int r = select((SOAP_SOCKET)(soap->socket + 1), NULL, &fd, &fd, &timeout);
-          if (r > 0)
-            break;
-          if (!r)
-          { soap->errnum = 0;
-            return SOAP_EOF;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            return SOAP_EOF;
-          }
-        }
-      }
-#endif
-#ifdef WITH_OPENSSL
-      if (soap->ssl)
-        nwritten = SSL_write(soap->ssl, s, n);
-      else
-#endif
-#ifndef PALM
-        nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
-#else
-        nwritten = send((SOAP_SOCKET)soap->socket, (void*)s, n, soap->socket_flags);
-#endif
-      if (nwritten <= 0)
-      {
-#ifdef WITH_OPENSSL
-       int err;
-        if (soap->ssl && (err = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-          return SOAP_EOF;
-#endif
-        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EWOULDBLOCK && soap_socket_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_socket_errno;
-          return SOAP_EOF;
-        }
-        nwritten = 0; /* and call write() again */
-      }
-    }
-    else
-    {
-#ifdef WITH_FASTCGI
-      nwritten = fwrite((void*)s, 1, n, stdout);
-      fflush(stdout);
-#else
-#ifdef UNDER_CE
-      nwritten = fwrite(s, 1, n, soap->sendfd);
-#else
-/* WR[ */
-#ifdef VXWORKS
-#ifdef WMW_RPM_IO
-      if (soap->rpmreqid)
-          {
-          httpBlockPut(soap->rpmreqid, s, n); 
-          nwritten = n;
-          }
-      else
-          {
-          nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
-          }
-#else
-      nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
-#endif /* WMW_RPM_IO */
-#else
-/* ]WR */
-      nwritten = write((SOAP_SOCKET)soap->sendfd, s, n);
-/* WR[ */
-#endif
-/* ]WR */
-#endif
-#endif
-      if (nwritten <= 0)
-      { if (soap_errno != SOAP_EINTR && soap_errno != SOAP_EWOULDBLOCK && soap_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_errno;
-          return SOAP_EOF;
-        }
-        nwritten = 0; /* and call write() again */
-      }
-    }
-    n -= nwritten;
-    s += nwritten;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_flush_raw(struct soap *soap, const char *s, size_t n)
-{ if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-  { register char *t;
-    if (!(t = (char*)soap_push_block(soap, n)))
-      return soap->error = SOAP_EOM;
-    memcpy(t, s, n);
-    if (soap->fpreparesend)
-      return soap->fpreparesend(soap, s, n);
-    return SOAP_OK;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-  { char t[16];
-    sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n);
-    DBGMSG(SENT, t, strlen(t));
-    if ((soap->error = soap->fsend(soap, t, strlen(t))))
-      return soap->error;
-    soap->chunksize += n;
-  }
-  DBGMSG(SENT, s, n);
-  return soap->error = soap->fsend(soap, s, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_flush(struct soap *soap)
-{ if (soap->bufidx)
-  {
-#ifdef WITH_ZLIB
-    if (soap->mode & SOAP_ENC_ZLIB)
-    { soap->d_stream.next_in = (Byte*)soap->buf;
-      soap->d_stream.avail_in = (unsigned int)soap->bufidx;
-#ifdef WITH_GZIP
-      soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->bufidx);
-#endif
-      do
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream.avail_in));
-        if (deflate(&soap->d_stream, Z_NO_FLUSH) != Z_OK)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-          return soap->error = SOAP_ZLIB_ERROR;
-        }
-        if (!soap->d_stream.avail_out)
-        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN))
-            return soap->error;
-          soap->d_stream.next_out = (Byte*)soap->z_buf;
-          soap->d_stream.avail_out = SOAP_BUFLEN;
-        }
-      } while (soap->d_stream.avail_in);
-    }
-    else
-#endif
-    if (soap_flush_raw(soap, soap->buf, soap->bufidx))
-      return soap->error;
-    soap->bufidx = 0;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send_raw(struct soap *soap, const char *s, size_t n)
-{ if (!n)
-    return SOAP_OK;
-  if (soap->mode & SOAP_IO_LENGTH)
-  { soap->count += n;
-    if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE)
-      return soap->fpreparesend(soap, s, n);
-    return SOAP_OK;
-  }
-  if (soap->mode & SOAP_IO)
-  { register size_t i = SOAP_BUFLEN - soap->bufidx;
-    while (n >= i)
-    { memcpy(soap->buf + soap->bufidx, s, i);
-      soap->bufidx = SOAP_BUFLEN;
-      if (soap_flush(soap))
-        return soap->error;
-      s += i;
-      n -= i;
-      i = SOAP_BUFLEN;
-    }
-    memcpy(soap->buf + soap->bufidx, s, n);
-    soap->bufidx += n;
-    return SOAP_OK;
-  }
-  return soap_flush_raw(soap, s, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send(struct soap *soap, const char *s)
-{ if (s)
-    return soap_send_raw(soap, s, strlen(s));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send2(struct soap *soap, const char *s1, const char *s2)
-{ if (soap_send(soap, s1))
-    return soap->error;
-  return soap_send(soap, s2);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3)
-{ if (soap_send(soap, s1)
-   || soap_send(soap, s2))
-    return soap->error;
-  return soap_send(soap, s3);
-}
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static size_t
-frecv(struct soap *soap, char *s, size_t n)
-{ register int r;
-  soap->errnum = 0;
-#if defined(__cplusplus) && !defined(UNDER_CE)
-  if (soap->is)
-  { if (soap->is->good())
-      return soap->is->read(s, n).gcount();
-    return 0;
-  }
-#endif
-  if (soap_valid_socket(soap->socket))
-  { for (;;)
-    { 
-#ifndef WITH_LEAN
-      struct timeval timeout;
-      fd_set fd;
-      if (soap->recv_timeout)
-      { if (soap->recv_timeout > 0)
-        { timeout.tv_sec = soap->recv_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->recv_timeout/1000000;
-          timeout.tv_usec = -soap->recv_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        for (;;)
-        { r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-          if (r > 0)
-            break;
-          if (r == 0)
-            return 0;
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            return 0;
-          }
-        }
-      }
-#endif
-#ifdef WITH_OPENSSL
-      if (soap->ssl)
-      { int err;
-       r = SSL_read(soap->ssl, s, n);
-        if ((err = SSL_get_error(soap->ssl, r)) == SSL_ERROR_NONE)
-          return (size_t)r;
-       if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-          return 0;
-      }
-      else
-#endif
-      { r = recv((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
-        if (r >= 0)
-          return (size_t)r;
-        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_socket_errno;
-          return 0;
-        }
-      }
-#ifndef WITH_LEAN
-      { struct timeval timeout;
-        fd_set fd;
-        timeout.tv_sec = 0;
-        timeout.tv_usec = 10000;
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-        if (r < 0 && soap_socket_errno != SOAP_EINTR)
-        { soap->errnum = soap_socket_errno;
-          return 0;
-        }
-      }
-#endif
-    }
-  }
-#ifdef WITH_FASTCGI
-  return fread(s, 1, n, stdin);
-#else
-#ifdef UNDER_CE
-  return fread(s, 1, n, soap->recvfd);
-#else
-/* WR[ */
-#ifdef WMW_RPM_IO
-  if (soap->rpmreqid)
-    r = httpBlockRead(soap->rpmreqid, s, n);
-  else
-    r = read(soap->recvfd, s, n);
-  if (r >= 0)
-    return r;
-  return 0;
-#else
-/* ]WR */
-  r = read((SOAP_SOCKET)soap->recvfd, s, n);
-  if (r >= 0)
-    return (size_t)r;
-  soap->errnum = soap_errno;
-  return 0;
-/* WR[ */
-#endif
-/* ]WR */
-#endif
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static soap_wchar
-soap_getchunkchar(struct soap *soap)
-{ if (soap->bufidx < soap->buflen)
-    return soap->buf[soap->bufidx++];
-  soap->bufidx = 0;
-  soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)soap->buflen));
-  DBGMSG(RECV, soap->buf, soap->buflen);
-  if (soap->buflen)
-    return soap->buf[soap->bufidx++];
-  return EOF;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_isxdigit(int c)
-{ switch (c)
-  { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
-    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-      return 1;
-  }
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_raw(struct soap *soap)
-{ register size_t ret;
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { if (soap->d_stream.next_out == Z_NULL)
-      return EOF;
-    if (soap->d_stream.avail_in || !soap->d_stream.avail_out)
-    { register int r;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n"));
-      soap->d_stream.next_out = (Byte*)soap->buf;
-      soap->d_stream.avail_out = SOAP_BUFLEN;
-      r = inflate(&soap->d_stream, Z_NO_FLUSH);
-      if (r == Z_OK || r == Z_STREAM_END)
-      { soap->bufidx = 0;
-        soap->buflen = SOAP_BUFLEN - soap->d_stream.avail_out;
-        if (soap->zlib_in == SOAP_ZLIB_GZIP)
-          soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
-        if (r == Z_STREAM_END)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-          soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
-          soap->d_stream.next_out = Z_NULL;
-        }
-        if (soap->buflen)
-        { soap->count += soap->buflen;
-          return SOAP_OK;
-        }
-      }
-      else if (r != Z_BUF_ERROR)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-        soap->d_stream.next_out = Z_NULL;
-        return EOF;
-      }
-    }
-zlib_again:
-    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize)
-    { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
-      soap->buflen = soap->z_buflen;
-    }
-  }
-#endif
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */
-  { 
-chunk_again:
-    if (soap->chunksize)
-    { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));
-      DBGMSG(RECV, soap->buf, ret);
-      soap->bufidx = 0;
-      soap->chunksize -= ret;
-    }
-    else
-    { register soap_wchar c;
-      char *t, tmp[8];
-      t = tmp;
-      if (!soap->chunkbuflen)
-      { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
-        DBGMSG(RECV, soap->buf, ret);
-        soap->bufidx = 0;
-        if (!ret)
-          return EOF;
-      }
-      else
-        soap->bufidx = soap->buflen;
-      soap->buflen = soap->chunkbuflen;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (%u %u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));
-      while (!soap_isxdigit((int)(c = soap_getchunkchar(soap))))
-        if ((int)c == EOF)
-         return EOF;
-      do
-        *t++ = (char)c;
-      while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && t - tmp < 7);
-      while ((int)c != EOF && c != '\n')
-        c = soap_getchunkchar(soap);
-      if ((int)c == EOF)
-        return EOF;
-      *t = '\0';
-      soap->chunksize = soap_strtoul(tmp, &t, 16);
-      if (!soap->chunksize)
-      { soap->chunkbuflen = 0;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n"));
-       while ((int)c != EOF && c != '\n')
-          c = soap_getchunkchar(soap);
-        return EOF;
-      }
-      soap->buflen = soap->bufidx + soap->chunksize;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to %u (%u %s)\n", (unsigned int)soap->buflen, (unsigned int)soap->bufidx, tmp));
-      if (soap->buflen > soap->chunkbuflen)
-      { soap->buflen = soap->chunkbuflen;
-        soap->chunksize -= soap->buflen - soap->bufidx;
-        soap->chunkbuflen = 0;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%lu bytes left)\n", (unsigned long)(soap->buflen - soap->bufidx)));
-      }
-      else if (soap->chunkbuflen)
-        soap->chunksize = 0;
-      ret = soap->buflen - soap->bufidx;
-      if (!ret)
-        goto chunk_again;
-    }
-  }
-  else
-  { soap->bufidx = 0;
-    soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
-    DBGMSG(RECV, soap->buf, ret);
-  }
-  if (soap->fpreparerecv && (soap->error = soap->fpreparerecv(soap, soap->buf, ret)))
-    return soap->error;
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { register int r;
-    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-    soap->d_stream.avail_in = (unsigned int)ret;
-    soap->d_stream.next_out = (Byte*)soap->buf;
-    soap->d_stream.avail_out = SOAP_BUFLEN;
-    r = inflate(&soap->d_stream, Z_NO_FLUSH);
-    if (r == Z_OK || r == Z_STREAM_END)
-    { soap->bufidx = 0;
-      soap->z_buflen = soap->buflen;
-      soap->buflen = ret = SOAP_BUFLEN - soap->d_stream.avail_out;
-      if (soap->zlib_in == SOAP_ZLIB_GZIP)
-        soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)ret));
-      if (!ret)
-        goto zlib_again;
-      if (r == Z_STREAM_END)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-        soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
-        soap->d_stream.next_out = Z_NULL;
-      }
-    }
-    else
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream.msg?soap->d_stream.msg:""));
-      soap->d_stream.next_out = Z_NULL;
-      return EOF;
-    }
-  }
-#endif
-  soap->count += ret;
-  return !ret;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-  { if (soap->dime.buflen)
-    { char *s;
-      int i;
-      unsigned char tmp[12];
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n"));
-      soap->count += soap->dime.buflen - soap->buflen;
-      soap->buflen = soap->dime.buflen;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3));
-      for (i = -(long)soap->dime.size&3; i > 0; i--)
-      { soap->bufidx++;
-        if (soap->bufidx >= soap->buflen)
-          if (soap_recv_raw(soap))
-            return EOF;
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n"));
-      s = (char*)tmp;
-      for (i = 12; i > 0; i--)
-      { *s++ = soap->buf[soap->bufidx++];
-        if (soap->bufidx >= soap->buflen)
-          if (soap_recv_raw(soap))
-            return EOF;
-      }
-      soap->dime.flags = tmp[0] & 0x7;
-      soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size));
-      if (soap->dime.flags & SOAP_DIME_CF)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n"));
-        soap->dime.chunksize = soap->dime.size;
-        if (soap->buflen - soap->bufidx >= soap->dime.size)
-        { soap->dime.buflen = soap->buflen;
-          soap->buflen = soap->bufidx + soap->dime.chunksize;
-        }
-        else
-          soap->dime.chunksize -= soap->buflen - soap->bufidx;
-      }
-      else
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n"));
-        soap->dime.buflen = 0;
-        soap->dime.chunksize = 0;
-      }
-      soap->count = soap->buflen - soap->bufidx;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count));
-      return SOAP_OK;
-    }
-    if (soap->dime.chunksize)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize));
-      if (soap_recv_raw(soap))
-        return EOF;
-      if (soap->buflen - soap->bufidx >= soap->dime.chunksize)
-      { soap->dime.buflen = soap->buflen;
-        soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize;
-        soap->buflen = soap->bufidx + soap->dime.chunksize;
-      }
-      else
-        soap->dime.chunksize -= soap->buflen - soap->bufidx;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%u\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned int)soap->count));
-      return SOAP_OK;
-    }
-  }
-#endif
-  return soap_recv_raw(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_getchar(struct soap *soap)
-{ register soap_wchar c;
-  if (soap->ahead)
-  { c = soap->ahead;
-    soap->ahead = 0;
-    return c;
-  }
-  return soap_get1(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const struct soap_code_map*
-SOAP_FMAC2
-soap_code(const struct soap_code_map *map, const char *str)
-{ while (map->string)
-  { if (!strcmp(str, map->string)) /* case sensitive */
-      return map;
-    map++;
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_int_code(const struct soap_code_map *map, const char *str, long other)
-{ while (map->string)
-  { if (!soap_tag_cmp(str, map->string)) /* case insensitive */
-      return map->code;
-    map++;
-  }
-  return other;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_str_code(const struct soap_code_map *map, long code)
-{ while (map->code != code && map->string)
-    map++;
-  return map->string;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static soap_wchar
-soap_char(struct soap *soap)
-{ char tmp[8];
-  register int i;
-  register soap_wchar c;
-  register char *s = tmp;
-  for (i = 0; i < 7; i++)
-  { c = soap_get1(soap);
-    if (c == ';' || (int)c == EOF)
-      break;
-    *s++ = (char)c;
-  }
-  *s = '\0';
-  if (*tmp == '#')
-  { if (tmp[1] == 'x' || tmp[1] == 'X')
-      return soap_strtol(tmp + 2, NULL, 16);
-    return atol(tmp + 1);
-  }
-  if (!strcmp(tmp, "lt"))
-    return '<';
-  if (!strcmp(tmp, "gt"))
-    return '>';
-  if (!strcmp(tmp, "amp"))
-    return '&';
-  if (!strcmp(tmp, "quot"))
-    return '"';
-  if (!strcmp(tmp, "apos"))
-    return '\'';
-#ifndef WITH_LEAN
-  return (soap_wchar)soap_int_code(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR);
-#else
-  return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_get(struct soap *soap)
-{ register soap_wchar c;
-  c = soap->ahead;
-  if (c)
-    soap->ahead = 0;
-  else
-    c = soap_get1(soap);
-  for (;;)
-  { if (soap->cdata)
-    { if (c == ']')
-      { c = soap_get1(soap);
-        if (c == ']')
-        { soap->cdata = 0;
-          soap_get1(soap); /* skip > */
-          c = soap_get1(soap);
-        }
-       else
-        { soap_revget1(soap);
-          return ']';
-        }
-      }
-      else
-        return c;
-    }
-    switch (c)
-    { case '<':
-        do c = soap_get1(soap);
-        while (soap_blank(c));
-        if (c == '!' || c == '?' || c == '%')
-        { if (c == '!')
-          { c = soap_get1(soap);
-            if (c == '[')
-            { do c = soap_get1(soap);
-              while ((int)c != EOF && c != '[');
-              if ((int)c == EOF)
-                break;
-              soap->cdata = 1;
-              c = soap_get1(soap);
-             continue;
-            }
-            if (c == '-' && (c = soap_get1(soap)) == '-')
-            { do
-              { c = soap_get1(soap);
-                if (c == '-' && (c = soap_get1(soap)) == '-')
-                  break;
-              } while ((int)c != EOF);
-            }
-          }
-          while ((int)c != EOF && c != '>')
-            c = soap_get1(soap);
-         if ((int)c == EOF)
-           break;
-          c = soap_get1(soap);
-          continue;
-        }
-        if (c == '/')
-          return SOAP_TT;
-        soap_revget1(soap);
-        return SOAP_LT;
-      case '>':
-        return SOAP_GT;
-      case '"':
-        return SOAP_QT;
-      case '\'':
-        return SOAP_AP;
-      case '&':
-        return soap_char(soap) | 0x80000000;
-    }
-    break;
-  }
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_advance(struct soap *soap)
-{ register soap_wchar c;
-  while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
-    ;
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_skip(struct soap *soap)
-{ register soap_wchar c;
-  do c = soap_get(soap);
-  while (soap_blank(c));
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_move(struct soap *soap, long n)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %ld bytes forward\n", (long)n));
-  for (; n > 0; n--)
-    if ((int)soap_getchar(soap) == EOF)
-      return SOAP_EOF;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_tell(struct soap *soap)
-{ return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pututf8(struct soap *soap, register unsigned long c)
-{ char tmp[16];
-  if (c > 0 && c < 0x80)
-  { *tmp = (char)c;
-    return soap_send_raw(soap, tmp, 1);
-  }
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { register char *t = tmp;
-    if (c < 0x0800)
-      *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-    else
-    { if (c < 0x010000)
-        *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-      else
-      { if (c < 0x200000)
-          *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-        else
-        { if (c < 0x04000000)
-            *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-          else
-          { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-            *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-          }
-          *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-        }     
-        *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-      }
-      *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-    }
-    *t++ = (char)(0x80 | (c & 0x3F));
-    *t = '\0';
-  }
-  else
-#endif
-    sprintf(tmp, "&#%lu;", c);
-  return soap_send(soap, tmp);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_getutf8(struct soap *soap)
-{ register soap_wchar c, c1, c2, c3, c4;
-  c = soap_get(soap);
-  if (c < 0x80 || (soap->mode & SOAP_ENC_LATIN))
-    return c;
-  c1 = soap_get(soap);
-  if (c1 < 0x80)
-  { soap_unget(soap, c1);
-    return c;
-  }
-  c1 &= 0x3F;
-  if (c < 0xE0)
-    return ((soap_wchar)(c & 0x1F) << 6) | c1;
-  c2 = (soap_wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xF0)
-    return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2;
-  c3 = (soap_wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xF8)
-    return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
-  c4 = (soap_wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xFC)
-    return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4;
-  return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_puthex(struct soap *soap, const unsigned char *s, int n)
-{ /* TODO: serialize to DOM (as an option) using new soap_s2hex() */
-  char d[2];
-  register int i;
-  for (i = 0; i < n; i++)
-  { register int m = *s++;
-    d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0'));
-    m &= 0x0F;
-    d[1] = (char)(m + (m > 9 ? '7' : '0'));
-    if (soap_send_raw(soap, d, 2))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-unsigned char*
-SOAP_FMAC2
-soap_gethex(struct soap *soap, int *n)
-{
-#ifdef WITH_FAST
-  soap->labidx = 0;
-  for (;;)
-  { register char *s;
-    register int i, k;
-    if (soap_append_lab(soap, NULL, 0))
-      return NULL;
-    s = soap->labbuf + soap->labidx;
-    k = soap->lablen - soap->labidx;
-    soap->labidx = soap->lablen;
-    for (i = 0; i < k; i++)
-    { register char d1, d2;
-      register soap_wchar c;
-      c = soap_get(soap);
-      if (soap_isxdigit(c))
-      { d1 = (char)c;
-        c = soap_get(soap); 
-       if (soap_isxdigit(c))
-          d2 = (char)c;
-        else 
-        { soap->error = SOAP_TYPE;
-          return NULL;
-        }
-      }
-      else
-      { unsigned char *p;
-        soap_unget(soap, c);
-        if (n)
-          *n = (int)(soap->lablen - k + i);
-        p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i);
-       if (p)
-         memcpy(p, soap->labbuf, soap->lablen - k + i);
-        return p;
-      }
-      *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
-    }
-  }
-#else
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { register int i;
-    register char *s = (char*)soap_push_block(soap, SOAP_BLKLEN);
-    if (!s)
-    { soap_end_block(soap);
-      return NULL;
-    }
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { register char d1, d2;
-      register soap_wchar c = soap_get(soap);
-      if (soap_isxdigit(c))
-      { d1 = (char)c;
-        c = soap_get(soap); 
-       if (soap_isxdigit(c))
-          d2 = (char)c;
-        else 
-        { soap_end_block(soap);
-         soap->error = SOAP_TYPE;
-          return NULL;
-        }
-      }
-      else
-      { unsigned char *p;
-        soap_unget(soap, c);
-        if (n)
-          *n = soap_size_block(soap, i);
-        p = (unsigned char*)soap_save_block(soap, NULL, 0);
-        return p;
-      }
-      *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putbase64(struct soap *soap, const unsigned char *s, int n)
-{ register int i;
-  register unsigned long m;
-  char d[4];
-  if (!s)
-    return SOAP_OK;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { if (!(soap->dom->data = soap_s2base64(soap, s, soap->dom->data, n)))
-      return soap->error;
-    return SOAP_OK;
-  }
-#endif
-  for (; n > 2; n -= 3, s += 3)
-  { m = s[0];
-    m = (m << 8) | s[1];
-    m = (m << 8) | s[2];
-    for (i = 4; i > 0; m >>= 6)
-      d[--i] = soap_base64o[m & 0x3F];
-    if (soap_send_raw(soap, d, 4))
-      return soap->error;
-  }
-  if (n > 0)
-  { m = 0;
-    for (i = 0; i < n; i++)
-      m = (m << 8) | *s++;
-    for (; i < 3; i++)
-      m <<= 8;
-    for (i++; i > 0; m >>= 6)
-      d[--i] = soap_base64o[m & 0x3F];
-    for (i = 3; i > n; i--)
-      d[i] = '=';
-    if (soap_send_raw(soap, d, 4))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-unsigned char*
-SOAP_FMAC2
-soap_getbase64(struct soap *soap, int *n, int malloc_flag)
-{ 
-#ifdef WITH_FAST
-  soap->labidx = 0;
-  for (;;)
-  { register int i, k;
-    register char *s;
-    if (soap_append_lab(soap, NULL, 2))
-      return NULL;
-    s = soap->labbuf + soap->labidx;
-    k = 3 * ((soap->lablen - soap->labidx) / 3);
-    soap->labidx = 3 * (soap->lablen / 3);
-    if (!s)
-      return NULL;
-    for (i = 0; i < k; i += 3)
-    { register unsigned long m = 0;
-      register int j = 0;
-      do
-      { register soap_wchar c = soap_get(soap);
-        if (c == '=' || c < 0)
-        { unsigned char *p;
-          switch (j)
-          { case 2:
-              *s++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *s++ = (char)((m >> 10) & 0xFF);
-              *s++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-            *n = (int)(soap->lablen - k + i);
-          p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i);
-         if (p)
-           memcpy(p, soap->labbuf, soap->lablen - k + i);
-          if (c >= 0)
-          { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
-              ;
-         }
-          soap_unget(soap, c);
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      } while (j < 4);
-      *s++ = (char)((m >> 16) & 0xFF);
-      *s++ = (char)((m >> 8) & 0xFF);
-      *s++ = (char)(m & 0xFF);
-    }
-  }
-#else
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { register int i;
-    register char *s = (char*)soap_push_block(soap, 3 * SOAP_BLKLEN); /* must be multiple of 3 */
-    if (!s)
-    { soap_end_block(soap);
-      return NULL;
-    }
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { register unsigned long m = 0;
-      register int j = 0;
-      do
-      { register soap_wchar c = soap_get(soap);
-        if (c == '=' || c < 0)
-        { unsigned char *p;
-          i *= 3;
-          switch (j)
-          { case 2:
-              *s++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *s++ = (char)((m >> 10) & 0xFF);
-              *s++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-           *n = (int)soap_size_block(soap, i);
-          p = (unsigned char*)soap_save_block(soap, NULL, 0);
-          if (c >= 0)
-          { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
-              ;
-         }
-          soap_unget(soap, c);
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      } while (j < 4);
-      *s++ = (char)((m >> 16) & 0xFF);
-      *s++ = (char)((m >> 8) & 0xFF);
-      *s++ = (char)(m & 0xFF);
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_strdup(struct soap *soap, const char *s)
-{ char *t = NULL;
-  if (s && (t = (char*)soap_malloc(soap, strlen(s) + 1)))
-    strcpy(t, s);
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_new_block(struct soap *soap)
-{ struct soap_blist *p;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist));
-  if (!(p = (struct soap_blist*)SOAP_MALLOC(sizeof(struct soap_blist))))
-    return SOAP_EOM;   
-  p->next = soap->blist; 
-  p->ptr = NULL;
-  p->size = 0;
-  soap->blist = p;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_push_block(struct soap *soap, size_t n)
-{ char *p;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)soap->blist->size + (unsigned int)n));
-  if (!(p = (char*)SOAP_MALLOC(n + sizeof(char*) + sizeof(size_t))))
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  *(char**)p = soap->blist->ptr;
-  *(size_t*)(p + sizeof(char*)) = n;
-  soap->blist->ptr = p;
-  soap->blist->size += n;
-  return p + sizeof(char*) + sizeof(size_t);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_pop_block(struct soap *soap)
-{ char *p;
-  if (!soap->blist->ptr)
-    return;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n"));
-  p = soap->blist->ptr;
-  soap->blist->size -= *(size_t*)(p + sizeof(char*));
-  soap->blist->ptr = *(char**)p;
-  SOAP_FREE(p);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_update_ptrs(struct soap *soap, char *start, char *end, long offset)
-{ int i;
-  register struct soap_ilist *ip;
-  register struct soap_flist *fp;
-  register void *p, **q;
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", ip->id, ip->ptr, (char*)ip->ptr + offset));
-        ip->ptr = (char*)ip->ptr + offset;
-      }
-      for (q = &ip->link; q; q = (void**)p)
-      { p = *q;
-        if (p && (char*)p >= start && (char*)p < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p));
-          *q = (char*)p + offset;
-        }
-      }
-      for (q = &ip->copy; q; q = (void**)p)
-      { p = *q;
-        if (p && (char*)p >= start && (char*)p < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p\n", ip->id, p));
-          *q = (char*)p + offset;
-        }
-      }
-      for (fp = ip->flist; fp; fp = fp->next)
-      { if ((char*)fp->ptr >= start && (char*)fp->ptr < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' %p\n", ip->id, fp));
-          fp->ptr = (char*)fp->ptr + offset;
-        }
-      }
-    }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_has_copies(struct soap *soap, register const char *start, register const char *end)
-{ register int i;
-  register struct soap_ilist *ip;
-  register struct soap_flist *fp;
-  register const char *p;
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = ip->next)
-    { for (p = (const char*)ip->copy; p; p = *(const char**)p)
-        if (p >= start && p < end)
-          return SOAP_ERR;
-      for (fp = ip->flist; fp; fp = fp->next)
-        if ((const char*)fp->ptr >= start && (const char*)fp->ptr < end)
-         return SOAP_ERR;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_resolve(struct soap *soap)
-{ register int i;
-  register struct soap_ilist *ip;
-  register struct soap_flist *fp;
-  short flag;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->ptr)
-      { register void *p, **q, *r;
-        q = (void**)ip->link;
-        ip->link = NULL;
-        r = ip->ptr;
-        DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s'\n", ip->id));
-        while (q)
-        { p = *q;
-          *q = r;
-          DBGLOG(TEST,SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, r));
-          q = (void**)p;
-        }
-      }
-      else if (*ip->id == '#')
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing data for id='%s'\n", ip->id));
-        strcpy(soap->id, ip->id + 1);
-        return soap->error = SOAP_MISSING_ID;
-      }
-    }
-  }
-  do
-  { flag = 0;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n"));
-    for (i = 0; i < SOAP_IDHASH; i++)
-    { for (ip = soap->iht[i]; ip; ip = ip->next)
-      { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size))
-        { if (ip->copy)
-          { register void *p, **q = (void**)ip->copy;
-            DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id));
-            ip->copy = NULL;
-            do
-            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size));
-             p = *q;
-              memcpy(q, ip->ptr, ip->size);
-              q = (void**)p;
-            } while (q);
-           flag = 1;
-         }
-          for (fp = ip->flist; fp; fp = ip->flist)
-          { register unsigned int k = fp->level;
-           register void *p = ip->ptr;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d location=%p level=%u,%u id='%s'\n", ip->type, p, ip->level, fp->level, ip->id));
-           while (ip->level < k)
-            { register void **q = (void**)soap_malloc(soap, sizeof(void*));  
-             if (!q)
-               return soap->error;
-             *q = p;
-              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level, new location=%p holds=%p...\n", q, *q));
-              p = (void*)q;
-              k--;
-            }
-           if (fp->fcopy)
-             fp->fcopy(soap, ip->type, fp->type, fp->ptr, p, ip->size);
-           else
-             soap_fcopy(soap, ip->type, fp->type, fp->ptr, p, ip->size);
-           ip->flist = fp->next;
-           SOAP_FREE(fp);
-           flag = 1;
-         }
-        }
-      }
-    }
-  } while (flag);
-#ifdef SOAP_DEBUG
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->copy || ip->flist)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the developers\n", ip->id));
-      }
-    }
-  }
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n"));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_size_block(struct soap *soap, size_t n)
-{ if (soap->blist->ptr)
-  { soap->blist->size -= *(size_t*)(soap->blist->ptr + sizeof(char*)) - n;
-    *(size_t*)(soap->blist->ptr + sizeof(char*)) = n;
-  }
-  return soap->blist->size;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_first_block(struct soap *soap)
-{ char *p, *q, *r;
-  p = soap->blist->ptr;
-  if (!p)
-    return NULL;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block\n"));
-  r = NULL;
-  do
-  { q = *(char**)p;
-    *(char**)p = r;
-    r = p;
-    p = q;
-  } while (p);
-  soap->blist->ptr = r;
-  return r + sizeof(char*) + sizeof(size_t);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_next_block(struct soap *soap)
-{ char *p;
-  p = soap->blist->ptr;
-  if (p)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n"));
-    soap->blist->ptr = *(char**)p;
-    SOAP_FREE(p);
-    if (soap->blist->ptr)
-      return soap->blist->ptr + sizeof(char*) + sizeof(size_t);
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_block_size(struct soap *soap)
-{ return *(size_t*)(soap->blist->ptr + sizeof(char*));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_end_block(struct soap *soap)
-{ struct soap_blist *bp;
-  char *p, *q;
-  bp = soap->blist;
-  if (bp)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n"));
-    for (p = bp->ptr; p; p = q)
-    { q = *(char**)p;
-      SOAP_FREE(p);
-    }
-    soap->blist = bp->next;
-    SOAP_FREE(bp);
-  }
-  DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n"));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_save_block(struct soap *soap, char *p, int flag)
-{ register size_t n;
-  register char *q, *s;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)soap->blist->size, soap->blist->ptr, p));
-  if (soap->blist->size)
-  { if (!p)
-      p = (char*)soap_malloc(soap, soap->blist->size);
-    if (p)
-    { for (s = p, q = soap_first_block(soap); q; q = soap_next_block(soap))
-      { n = soap_block_size(soap);
-        if (flag)
-         soap_update_ptrs(soap, q, q + n, (long)s - (long)q); /* pointers s and q may or may not be related */
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s));
-        memcpy(s, q, n);
-        s += n;
-      }
-    }
-    else
-      soap->error = SOAP_EOM;
-  }
-  soap_end_block(soap);
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsize(struct soap *soap, const char *type, int size)
-{ return soap_putsizes(soap, type, &size, 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsizes(struct soap *soap, const char *type, const int *size, int dim)
-{ return soap_putsizesoffsets(soap, type, size, NULL, dim);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim)
-{ int i;
-  if (!type)
-    return NULL;
-  if (soap->version == 2)
-  { sprintf(soap->type, "%s[%d", type, size[0]);
-    for (i = 1; i < dim; i++)
-      sprintf(soap->type + strlen(soap->type), " %d", size[i]);
-  }
-  else
-  { if (offset)
-    { sprintf(soap->type, "%s[%d", type, size[0] + offset[0]);
-      for (i = 1; i < dim; i++)
-        sprintf(soap->type + strlen(soap->type), ",%d", size[i] + offset[i]);
-    }
-    else
-    { sprintf(soap->type, "%s[%d", type, size[0]);
-      for (i = 1; i < dim; i++)
-        sprintf(soap->type + strlen(soap->type), ",%d", size[i]);
-    }
-    strcat(soap->type, "]");
-  }
-  return soap->type;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putoffset(struct soap *soap, int offset)
-{ return soap_putoffsets(soap, &offset, 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putoffsets(struct soap *soap, const int *offset, int dim)
-{ register int i;
-  sprintf(soap->arrayOffset, "[%d", offset[0]);
-  for (i = 1; i < dim; i++)
-    sprintf(soap->arrayOffset + strlen(soap->arrayOffset), ",%d", offset[i]);
-  strcat(soap->arrayOffset, "]");
-  return soap->arrayOffset;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_size(const int *size, int dim)
-{ register int i, n = size[0];
-  for (i = 1; i < dim; i++)
-    n *= size[i];
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getoffsets(const char *attr, const int *size, int *offset, int dim)
-{ register int i, j = 0;
-  if (offset)
-    for (i = 0; i < dim && attr && *attr; i++)
-    { attr++;
-      j *= size[i];
-      j += offset[i] = (int)atol(attr);
-      attr = strchr(attr, ',');
-    }
-  else
-    for (i = 0; i < dim && attr && *attr; i++)
-    { attr++;
-      j *= size[i];
-      j += (int)atol(attr);
-      attr = strchr(attr, ',');
-    }
-  return j;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getsize(const char *attr1, const char *attr2, int *j)
-{ register int n, k;
-  char *s;
-  *j = 0;
-  if (!*attr1)
-    return -1;
-  n = 1;
-  do
-  { attr1++;
-    k = (int)soap_strtol(attr1, &s, 10);
-    n *= k;
-    if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1)
-      return -1;
-    attr1 = strchr(s, ',');
-    if (!attr1)
-      attr1 = strchr(s, ' ');
-    if (attr2 && *attr2)
-    { attr2++;
-      *j *= k;
-      k = (int)soap_strtol(attr2, &s, 10);
-      *j += k;
-      if (k < 0)
-        return -1;
-      attr2 = s;
-    }
-  } while (attr1 && *attr1 != ']');
-  return n - *j;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getsizes(const char *attr, int *size, int dim)
-{ register int i, k, n;
-  if (!*attr)
-    return -1;
-  i = strlen(attr);
-  n = 1;
-  do
-  { for (i = i-1; i >= 0; i--)
-      if (attr[i] == '[' || attr[i] == ',' || attr[i] == ' ')
-        break;
-    k = (int)atol(attr + i + 1);
-    n *= size[--dim] = k;
-    if (k < 0 || n > SOAP_MAXARRAYSIZE)
-      return -1;
-  } while (i >= 0 && attr[i] != '[');
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getposition(const char *attr, int *pos)
-{ register int i, n;
-  if (!*attr)
-    return -1;
-  n = 0;
-  i = 1;
-  do
-  { pos[n++] = (int)atol(attr + i);
-    while (attr[i] && attr[i] != ',' && attr[i] != ']')
-      i++;
-    if (attr[i] == ',')
-      i++;
-  } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']');
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_push_namespace(struct soap *soap, const char *id, const char *ns)
-{ register struct soap_nlist *np;
-  register struct Namespace *p;
-  np = (struct soap_nlist*)SOAP_MALLOC(sizeof(struct soap_nlist) + strlen(id));
-  if (!np)
-    return soap->error = SOAP_EOM;
-  np->next = soap->nlist;
-  soap->nlist = np;
-  strcpy(np->id, id);
-  np->level = soap->level;
-  np->index = -1;
-  np->ns = NULL;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns));
-  p = soap->local_namespaces;
-  if (p)
-  { register short i = 0;
-    for (; p->id; p++, i++)
-    { if (p->ns && !strcmp(ns, p->ns))
-      { if (p->out)
-        { SOAP_FREE(p->out);
-          p->out = NULL;
-        }
-        break;
-      }
-      if (p->out)
-      { if (!SOAP_STRCMP(ns, p->out))
-          break;
-      }
-      else if (p->in)
-      { if (!soap_tag_cmp(ns, p->in))
-        { if ((p->out = (char*)SOAP_MALLOC(strlen(ns) + 1)))
-            strcpy(p->out, ns);
-          break;
-        }
-      }
-    }
-    if (p && p->id)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id));
-      np->index = i;
-    }
-  }
-  if (!p || !p->id)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns));
-    np->ns = (char*)SOAP_MALLOC(strlen(ns) + 1);
-    if (!np->ns)
-      return soap->error = SOAP_EOM;
-    strcpy(np->ns, ns);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_pop_namespace(struct soap *soap)
-{ register struct soap_nlist *np;
-  while (soap->nlist && soap->nlist->level >= soap->level)
-  { np = soap->nlist->next;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Popped namespace binding (level=%u) '%s'\n", soap->level, soap->nlist->id));
-    if (soap->nlist->ns)
-      SOAP_FREE(soap->nlist->ns);
-    SOAP_FREE(soap->nlist);
-    soap->nlist = np;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_namespace(struct soap *soap, const char *id1, const char *id2, int n1, int n2) 
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && (strncmp(np->id, id1, n1) || np->id[n1]))
-    np = np->next;
-  if (np)
-  { if (np->index < 0 || (np->index >= 0 && soap->local_namespaces[np->index].id && (strncmp(soap->local_namespaces[np->index].id, id2, n2) || soap->local_namespaces[np->index].id[n2])))
-      return SOAP_NAMESPACE;
-    return SOAP_OK;
-  }
-  if (n1 == 3 && n1 == n2 && !strcmp(id1, "xml") && !strcmp(id1, id2))
-    return SOAP_OK;
-  return SOAP_SYNTAX_ERROR; 
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_default_namespace(struct soap *soap)
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && np->index >= -1)
-    np = np->next;
-  if (np)
-    return np->id;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_tag_cmp(register const char *s, register const char *t)
-{ for (; *s && *s != '"'; s++, t++)
-    if (tolower(*s) != tolower(*t))
-      if (*t != '-')
-      { if (*t != '*')
-          return 1;
-        if (*++t)
-        { register int c = tolower(*t);
-          for (; *s && *s != '"'; s++)
-          { if (tolower(*s) == c)
-              if (!soap_tag_cmp(s + 1, t + 1))
-                return 0;
-          }
-          break;
-        }
-        else
-          return 0;
-      }
-  if (*t == '*' && !t[1])
-    return 0;
-  return *t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_tag(struct soap *soap, const char *tag1, const char *tag2)
-{ register const char *s, *t;
-  if (!tag1 || !tag2 || !*tag2)
-    return SOAP_OK;
-  s = strchr(tag1, ':');
-  t = strchr(tag2, ':');
-  if (t)
-  { if (s)
-    { if (t[1] && SOAP_STRCMP(s + 1, t + 1))
-        return SOAP_TAG_MISMATCH;
-      if (t != tag2 && soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
-        return SOAP_TAG_MISMATCH;
-      }
-    } 
-    else if (SOAP_STRCMP(tag1, t + 1))
-      return SOAP_TAG_MISMATCH;
-    else if (t != tag2 && soap_match_namespace(soap, tag1, tag2, 0, t - tag2))
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
-      return SOAP_TAG_MISMATCH;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2));
-    return SOAP_OK;
-  }
-  if (s)
-  { if (SOAP_STRCMP(s + 1, tag2))
-      return SOAP_TAG_MISMATCH;
-    if (!soap->encodingStyle)
-    { t = soap_default_namespace(soap);
-      if (!t || soap_match_namespace(soap, tag1, t, s - tag1, strlen(t)))
-        return SOAP_TAG_MISMATCH;
-    }
-  }
-  else if (SOAP_STRCMP(tag1, tag2))
-    return SOAP_TAG_MISMATCH;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_array(struct soap *soap, const char *type)
-{ if (*soap->arrayType)
-    if (soap_match_tag(soap, soap->arrayType, type)
-     && soap_match_tag(soap, soap->arrayType, "xsd:anyType")
-     && soap_match_tag(soap, soap->arrayType, "xsd:ur-type")
-    )
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type));
-      return SOAP_TAG_MISMATCH;
-    }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-
-#ifdef WITH_OPENSSL
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid)
-{ int err;
-  soap->keyfile = keyfile;
-  soap->password = password;
-  soap->cafile = cafile;
-  soap->capath = capath;
-  if (dhfile)
-  { soap->dhfile = dhfile;
-    soap->rsa = 0;
-  }
-  else
-  { soap->dhfile = NULL;
-    soap->rsa = 1;
-  }
-  soap->randfile = randfile;
-  soap->require_client_auth = (flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION);
-  if (!(err = soap->fsslauth(soap)))
-    if (sid)
-      SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, strlen(sid));
-  return err; 
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile)
-{ soap->keyfile = keyfile;
-  soap->password = password;
-  soap->cafile = cafile;
-  soap->capath = capath;
-  soap->dhfile = NULL;
-  soap->rsa = 0;
-  soap->randfile = randfile;
-  soap->require_server_auth = (flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION);
-  return soap->fsslauth(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-ssl_init()
-{ static int done = 0;
-  if (!done)
-  { done = 1;
-    SSL_library_init();
-#ifndef WITH_LEAN
-    SSL_load_error_strings();
-#endif
-    if (!RAND_load_file("/dev/urandom", 1024))
-    { int r;
-#ifdef HAVE_RAND_R
-      unsigned int s = (unsigned int)time(NULL);
-#endif
-      char buf[SOAP_BUFLEN];
-      RAND_seed(buf, sizeof(buf));
-      while (!RAND_status())
-      {
-#ifdef HAVE_RAND_R
-        r = rand_r(&s);
-#else
-        r = rand();
-#endif
-        RAND_seed(&r, sizeof(int));
-      }
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char *
-ssl_error(struct soap *soap, int ret)
-{ int err = SSL_get_error(soap->ssl, ret);
-  const char *msg = soap_str_code(h_ssl_error_codes, err);
-  if (msg)
-    strcpy(soap->msgbuf, msg);
-  else
-    return ERR_error_string(err, soap->msgbuf);
-  if (ERR_peek_error())
-  { unsigned long r;
-    strcat(soap->msgbuf, "\n");
-    while ((r = ERR_get_error()))
-      ERR_error_string_n(r, soap->msgbuf + strlen(soap->msgbuf), sizeof(soap->msgbuf) - strlen(soap->msgbuf));
-  } 
-  else
-  { switch (ret)
-    { case 0:
-        strcpy(soap->msgbuf, "EOF was observed that violates the protocol. The client probably provided invalid authentication information.");
-        break;
-      case -1:
-        sprintf(soap->msgbuf, "Error observed by underlying BIO: %s", strerror(errno));  
-        break;
-    }
-  }
-  return soap->msgbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_password(char *buf, int num, int rwflag, void *userdata)
-{ if (num < (int)strlen((char*)userdata) + 1)
-    return 0;
-  return strlen(strcpy(buf, (char*)userdata));
-}
-#endif
-
-/******************************************************************************/
-/* This callback is included for future references. It should not be deleted
-#ifndef PALM_1
-static DH *
-ssl_tmp_dh(SSL *ssl, int is_export, int keylength)
-{ static DH *dh512 = NULL;
-  static DH *dh1024 = NULL;
-  DH *dh;
-  switch (keylength)
-  { case 512:
-      if (!dh512)
-      { BIO *bio = BIO_new_file("dh512.pem", "r");
-        if (bio)
-        { dh512 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-          BIO_free(bio);
-          return dh512;
-        }
-      }
-      else
-        return dh512;
-    default:
-      if (!dh1024)
-      { BIO *bio = BIO_new_file("dh1024.pem", "r");
-        if (bio)
-        { dh1024 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-          BIO_free(bio);
-        }
-      }
-      dh = dh1024;
-  }
-  return dh;
-}
-#endif
-*/
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_auth_init(struct soap *soap)
-{ ssl_init();
-  if (!soap->ctx)
-    if (!(soap->ctx = SSL_CTX_new(SSLv23_method())))
-      return soap_set_receiver_error(soap, "SSL error", "Can't setup context", SOAP_SSL_ERROR);
-  if (soap->randfile)
-  { if (!RAND_load_file(soap->randfile, -1))
-      return soap_set_receiver_error(soap, "SSL error", "Can't load randomness", SOAP_SSL_ERROR);
-  }
-  if (soap->cafile || soap->capath)
-    if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath))
-      return soap_set_receiver_error(soap, "SSL error", "Can't read CA file and/or directory", SOAP_SSL_ERROR);
-  if (!SSL_CTX_set_default_verify_paths(soap->ctx))
-    return soap_set_receiver_error(soap, "SSL error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR);
-  if (soap->keyfile)
-  { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile))
-      return soap_set_receiver_error(soap, "SSL error", "Can't read certificate key file", SOAP_SSL_ERROR);
-    if (soap->password)
-    { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password);
-      SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password);
-      if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
-        return soap_set_receiver_error(soap, "SSL error", "Can't read key file", SOAP_SSL_ERROR);
-    }
-  }
-  if (soap->rsa)
-  { RSA *rsa = RSA_generate_key(512, RSA_F4, NULL, NULL);
-    if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa))
-    { if (rsa)
-        RSA_free(rsa);
-      return soap_set_receiver_error(soap, "SSL error", "Can't set RSA key", SOAP_SSL_ERROR);
-    }
-    RSA_free(rsa);
-  }
-  else if (soap->dhfile)
-  { DH *dh = 0;
-    BIO *bio;
-    bio = BIO_new_file(soap->dhfile, "r");
-    if (!bio)
-      return soap_set_receiver_error(soap, "SSL error", "Can't read DH file", SOAP_SSL_ERROR);
-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-    BIO_free(bio);
-    if (SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0)
-    { if (dh)
-        DH_free(dh);
-      return soap_set_receiver_error(soap, "SSL error", "Can't set DH parameters", SOAP_SSL_ERROR);
-    }
-    DH_free(dh);
-  }
-  SSL_CTX_set_options(soap->ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2);
-  SSL_CTX_set_verify(soap->ctx, soap->require_client_auth ? (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) : soap->require_server_auth ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, soap->fsslverify);
-#if (OPENSSL_VERSION_NUMBER < 0x00905100L)
-  SSL_CTX_set_verify_depth(soap->ctx, 1); 
-#else
-  SSL_CTX_set_verify_depth(soap->ctx, 9); 
-#endif  
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_verify_callback(int ok, X509_STORE_CTX *store)
-{
-#ifdef SOAP_DEBUG
-  if (!ok) 
-  { char data[256];
-    X509 *cert = X509_STORE_CTX_get_current_cert(store);
-    fprintf(stderr, "SSL Verify error with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(X509_STORE_CTX_get_error(store)));
-    X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data));
-    fprintf(stderr, "certificate issuer %s\n", data);
-    X509_NAME_oneline(X509_get_subject_name(cert), data, sizeof(data));
-    fprintf(stderr, "certificate subject %s\n", data);
-  }
-#endif
-  /* return 1 to always continue, but unsafe progress will be terminated by SSL */
-  return ok;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_accept(struct soap *soap)
-{ int i, r;
-  if (!soap_valid_socket(soap->socket))
-    return soap_set_receiver_error(soap, "SSL error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR);
-  if (!soap->ssl)
-  { soap->ssl = SSL_new(soap->ctx);
-    if (!soap->ssl)
-      return soap_set_receiver_error(soap, "SSL error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
-  }
-  else
-    SSL_clear(soap->ssl);
-  soap->imode |= SOAP_ENC_SSL;
-  soap->omode |= SOAP_ENC_SSL;
-#ifdef WIN32
-  { u_long nonblocking = 1;
-    ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &nonblocking);
-  }
-#else
-  fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)|O_NONBLOCK);
-#endif
-  soap->bio = BIO_new_socket((SOAP_SOCKET)soap->socket, BIO_NOCLOSE);
-  SSL_set_bio(soap->ssl, soap->bio, soap->bio);
-  i = 100; /* 100 * 0.1 ms retries */
-  while ((r = SSL_accept(soap->ssl)) <= 0)
-  { int err = SSL_get_error(soap->ssl, r);
-    if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
-    { struct timeval timeout;
-      fd_set fd;
-      if (i-- <= 0)
-        break;
-      timeout.tv_sec = 0;
-      timeout.tv_usec = 100000;
-      FD_ZERO(&fd);
-      FD_SET((SOAP_SOCKET)soap->socket, &fd);
-      r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-      if (r < 0 && soap_socket_errno != SOAP_EINTR)
-      { soap->errnum = soap_socket_errno;
-        return SOAP_EOF;
-      }
-    }
-    else
-    { soap->errnum = err;
-      break;
-    }
-  }
-#ifdef WIN32
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
-  }
-#else
-  fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
-#endif
-  if (r <= 0)
-  { soap_set_receiver_error(soap, ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
-    soap_closesock(soap);
-    return SOAP_SSL_ERROR;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#endif /* WITH_OPENSSL */
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-tcp_init(struct soap *soap)
-{ soap->errmode = 1;
-#ifdef WIN32
-  if (tcp_done)
-    return 0;
-  else
-  { WSADATA w;
-    if (WSAStartup(MAKEWORD(1, 1), &w))
-      return -1;
-    tcp_done = 1;
-  }
-#endif
-#ifdef PALM
-  errno = 0;
-  h_errno = 0;
-  AppNetRefnum = 0;
-  NetUInit();
-  AppNetTimeout = 10000;
-  NetLibOpen(AppNetRefnum, &h_errno);
-#endif
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_done(struct soap *soap)
-{ 
-#ifdef SOAP_DEBUG
-  int i;
-#endif
-  soap_free(soap);
-  while (soap->clist)
-  { struct soap_clist *p = soap->clist->next;
-    SOAP_FREE(soap->clist);
-    soap->clist = p;
-  }
-  soap->keep_alive = 0; /* to force close the socket */
-  soap_closesock(soap);
-#ifdef WITH_COOKIES
-  soap_free_cookies(soap);
-#endif
-  while (soap->plugins)
-  { register struct soap_plugin *p = soap->plugins->next;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id));
-    if (soap->plugins->fcopy || !soap->copy)
-      soap->plugins->fdelete(soap, soap->plugins);
-    SOAP_FREE(soap->plugins);
-    soap->plugins = p;
-  }
-  soap->fplugin = fplugin;
-  soap->fpost = http_post;
-  soap->fget = http_get;
-  soap->fposthdr = http_post_header;
-  soap->fresponse = http_response;
-  soap->fparse = http_parse;
-  soap->fparsehdr = http_parse_header;
-#ifndef MAC_CARBON
-#ifndef WITH_IPV6
-  soap->fresolve = tcp_gethost;
-#else
-  soap->fresolve = NULL;
-#endif
-  soap->faccept = tcp_accept;
-  soap->fopen = tcp_connect;
-  soap->fclose = tcp_disconnect;
-  soap->fclosesocket = tcp_closesocket;
-  soap->fshutdownsocket = tcp_shutdownsocket;
-  soap->fsend = fsend;
-  soap->frecv = frecv;
-  soap->fpoll = soap_poll;
-#else
-  soap->fpoll = NULL;
-#endif
-  soap->fprepareinit = NULL;
-  soap->fpreparesend = NULL;
-  soap->fpreparerecv = NULL;
-  soap->fignore = NULL;
-  soap->fserveloop = NULL;
-#ifdef WITH_OPENSSL
-  if (soap->session)
-  { SSL_SESSION_free(soap->session);
-    soap->session = NULL;
-  }
-#endif
-  if (!soap->copy)
-  { if (soap_valid_socket(soap->master))
-    { soap->fclosesocket(soap, (SOAP_SOCKET)soap->master);
-      soap->master = SOAP_INVALID_SOCKET;
-    }
-#ifdef WITH_OPENSSL
-    if (soap->ctx)
-    { SSL_CTX_free(soap->ctx);
-      soap->ctx = NULL;
-    }
-#endif
-  }
-#ifdef SOAP_DEBUG
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-  { soap_close_logfile(soap, i);
-    if (soap->logfile[i])
-    { SOAP_FREE((void*)soap->logfile[i]);
-      soap->logfile[i] = NULL;
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_cleanup(struct soap *soap)
-{ soap_done(soap);
-#ifdef WIN32
-  if (!tcp_done)
-    return;
-  tcp_done = 0;
-  WSACleanup();
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-tcp_error(struct soap *soap)
-{ register const char *msg = NULL;
-  switch (soap->errmode)
-  { case 0:
-      msg = soap_strerror(soap);
-      break;
-    case 1:
-      msg = "WSAStartup failed";
-      break;
-    case 2:
-    {
-#ifndef WITH_LEAN
-      msg = soap_str_code(h_error_codes, soap->errnum);
-      if (!msg)
-#endif
-      { sprintf(soap->msgbuf, "TCP error %d", soap->errnum);
-        msg = soap->msgbuf;
-      }
-    }
-  }
-  return msg;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-http_error(struct soap *soap, int status)
-{ register const char *msg = NULL;
-#ifndef WITH_LEAN
-  msg = soap_str_code(h_http_error_codes, status);
-  if (!msg)
-#endif
-  { sprintf(soap->msgbuf, "HTTP error %d", status);
-    msg = soap->msgbuf;
-  }
-  return msg;
-}
-#endif
-
-/******************************************************************************/
-/* WR[ */
-#ifndef WITH_IPV6
-/* ]WR */
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr)
-{ unsigned long iadd;
-  struct hostent hostent, *host = &hostent;
-/* WR[ */
-#ifdef VXWORKS
-  int hostint;
-  char *addrcopy = (char*)malloc(strlen(addr) + 1); /*copy of addr. */
-  /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */
-  strncpy(addrcopy, addr, strlen(addr)+1);
-  iadd = inet_addr(addrcopy);
-#else
-/* ]WR */
-#if defined(_AIXVERSION_431) || defined(TRU64)
-  struct hostent_data ht_data;
-#endif
-  iadd = inet_addr(addr);
-/* WR[ */
-#endif
-/* ]WR */
-  if ((int)iadd != -1)
-  { memcpy(inaddr, &iadd, sizeof(iadd));
-/* WR[ */
-#ifdef VXWORKS
-    free(addrcopy);
-#endif
-/* ]WR */
-    return SOAP_OK;
-  }
-#if defined(__GLIBC__)
-  if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0)
-    host = NULL;
-#elif defined(_AIXVERSION_431) || defined(TRU64)
-  memset((void*)&ht_data, 0, sizeof(ht_data));
-  if (gethostbyname_r(addr, &hostent, &ht_data) < 0)
-  { host = NULL;
-    soap->errnum = h_errno;
-  }
-#elif defined(HAVE_GETHOSTBYNAME_R)
-  host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum);
-/* WR[ */
-#elif defined(VXWORKS)
-  /* If the DNS resolver library resolvLib has been configured in the vxWorks
-   * image, a query for the host IP address is sent to the DNS server, if the
-   * name was not found in the local host table. */
-  hostint = hostGetByName(addrcopy);
-  if (hostint == ERROR)
-  { host = NULL;
-    soap->errnum = soap_errno; 
-  }
-  free(addrcopy);  /*free() is placed after the error checking to assure that
-                   * errno captured is that from hostGetByName() */
-/* ]WR */
-#else
-  if (!(host = gethostbyname(addr)))
-    soap->errnum = h_errno;
-#endif
-  if (!host)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n"));
-    return SOAP_ERR;
-  }
-/* WR[ */
-#ifdef VXWORKS
-  inaddr->s_addr = hostint;
-#else
-/* ]WR */
-  memcpy(inaddr, host->h_addr, host->h_length);
-/* WR[ */
-#endif
-/* ]WR */
-  return SOAP_OK;
-}
-#endif
-#endif
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port)
-{ struct sockaddr_in sockaddr;
-/* WR[ */
-#ifdef WITH_IPV6
-  struct addrinfo *addrinfo;
-  struct addrinfo hints;
-  struct addrinfo resaddr;
-  struct sockaddr_storage addrstorage;
-  int err;
-#endif /* WITH_IPV6 */
-/* ]WR */
-  register int fd;
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  if (soap_valid_socket(soap->socket))
-    soap->fclosesocket(soap, (SOAP_SOCKET)soap->socket);
-  soap->socket = SOAP_INVALID_SOCKET;
-  if (tcp_init(soap))
-  { soap_set_sender_error(soap, tcp_error(soap), "TCP initialization failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  soap->errmode = 0;
-/* WR[ */
-#ifdef WITH_IPV6
-  memset((void*)&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
-  hints.ai_socktype = SOCK_STREAM;
-  soap->errmode = 2;
-  if (soap->proxy_host)
-    err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &addrinfo);
-  else
-    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
-  if (addrinfo)
-  { resaddr = *addrinfo;
-    addrstorage = *((struct sockaddr_storage *) addrinfo->ai_addr);
-    resaddr.ai_addr = (struct sockaddr *) &addrstorage;
-    freeaddrinfo(addrinfo);
-  }
-  if (err)
-  { soap_set_sender_error(soap, gai_strerror(err), 
-    "TCP getaddrinfo on proxy host failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  fd = (int)socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol); /* modified to use fd */
-  soap->errmode = 0;
-#else /* WITH_IPV6 */
-/* ]WR */
-  fd = (int)socket(AF_INET, SOCK_STREAM, 0);
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-  if (fd < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP socket failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#ifdef SOCKET_CLOSE_ON_EXEC
-#ifdef WIN32
-#ifndef UNDER_CE
-  SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0);
-#endif
-#else
-  fcntl (fd, F_SETFD, 1);
-#endif
-#endif
-#ifndef WITH_LEAN
-  if (soap->connect_flags & SO_LINGER)
-  { struct linger linger;
-    memset((void*)&linger, 0, sizeof(linger));
-    linger.l_onoff = 1;
-    linger.l_linger = 0;
-    if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
-    { soap->errnum = soap_socket_errno;
-      soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR);
-      soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-      return -1;
-    }
-  }
-  if ((soap->connect_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (soap->keep_alive && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-#ifdef TCP_NODELAY
-  if (setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-#endif
-#endif
-/* WR[ */
-#ifndef WITH_IPV6
-/* ]WR */
-  memset((void*)&sockaddr, 0, sizeof(sockaddr));
-  sockaddr.sin_family = AF_INET;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Open socket %d to host='%s'\n", fd, host));
-  soap->errmode = 2;
-  if (soap->proxy_host)
-  { if (soap->fresolve(soap, soap->proxy_host, &sockaddr.sin_addr))
-    { soap_set_sender_error(soap, tcp_error(soap), "TCP get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR);
-      soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-      return -1;
-    }
-    sockaddr.sin_port = htons((short)soap->proxy_port);
-  }
-  else
-  { if (soap->fresolve(soap, host, &sockaddr.sin_addr))
-    { soap_set_sender_error(soap, tcp_error(soap), "TCP get host by name failed in tcp_connect()", SOAP_TCP_ERROR);
-      soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-      return -1;
-    }
-    sockaddr.sin_port = htons((short)port);
-  }
-  soap->errmode = 0;
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  if (soap->connect_timeout)
-#if defined(WIN32)
-  { u_long nonblocking = 1;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  { vx_nonblocking = TRUE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
-#endif
-  else
-#if defined(WIN32)
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  { vx_nonblocking = FALSE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-  for (;;)
-  { 
-/* WR[ */
-#ifdef WITH_IPV6
-    if (connect((SOAP_SOCKET)fd, resaddr.ai_addr, resaddr.ai_addrlen)) /* modified to use fd */
-#else /* WITH_IPV6 */
-    if (connect((SOAP_SOCKET)fd, (struct sockaddr*)&sockaddr, sizeof(sockaddr)))
-#endif /* WITH_IPV6 */
-/* ]WR */
-    { 
-#ifndef WITH_LEAN
-      if (soap->connect_timeout && (soap_socket_errno == SOAP_EINPROGRESS || soap_socket_errno == SOAP_EWOULDBLOCK))
-      { struct timeval timeout;
-#if defined(SOCKLEN_T)
-        SOCKLEN_T n = sizeof(struct sockaddr_in);
-#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
-        socklen_t n = sizeof(struct sockaddr_in);
-#elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
-        int n = sizeof(struct sockaddr_in);
-#else
-        size_t n = sizeof(struct sockaddr_in);
-#endif
-        fd_set fds;
-        if (soap->connect_timeout > 0)
-        { timeout.tv_sec = soap->connect_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->connect_timeout/1000000;
-          timeout.tv_usec = -soap->connect_timeout%1000000;
-        }
-        FD_ZERO(&fds);
-        FD_SET((SOAP_SOCKET)fd, &fds);
-        for (;;)
-        { int r = select((SOAP_SOCKET)(fd + 1), NULL, &fds, NULL, &timeout);
-          if (r > 0)
-           break;
-          if (!r)
-          { soap->errnum = 0;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
-            soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-            soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-            return -1;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-            soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-            soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-            return -1;
-          }
-        }
-       n = sizeof(soap->errnum);
-        if (!getsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &n) && !soap->errnum)
-          break;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-        soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-        soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-        return -1;
-      }
-      else
-#endif
-      if (soap_socket_errno != SOAP_EINTR)
-      { soap->errnum = soap_socket_errno;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-        soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-        soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-        return -1;
-      }
-    }  
-    else
-      break;
-  }
-#ifndef WITH_LEAN
-  if (soap->connect_timeout)
-#if defined(WIN32)
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  { vx_nonblocking = FALSE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-  soap->socket = fd;
-#ifdef WITH_OPENSSL
-  soap->imode &= ~SOAP_ENC_SSL;
-  soap->omode &= ~SOAP_ENC_SSL;
-  if (!strncmp(endpoint, "https:", 6))
-  { int r;
-    if (soap->proxy_host)
-    { unsigned int k = soap->omode; /* make sure we only parse HTTP */
-      size_t n = soap->count; /* save the content length */
-      soap->omode &= ~0xFF; /* mask IO and ENC */
-      soap->omode |= SOAP_IO_BUFFER;
-      soap_begin_send(soap);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to proxy server\n"));
-      sprintf(soap->tmpbuf, "CONNECT %s:%d HTTP/%s", host, port, soap->http_version);
-      if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return -1;
-#ifndef WITH_LEAN
-      if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
-      { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
-        strcpy(soap->tmpbuf, "Basic ");
-        soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-        if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
-          return soap->error;
-      }
-#endif
-      if ((soap->error = soap->fposthdr(soap, NULL, NULL))
-       || soap_flush(soap))
-        return -1;
-      soap->omode = k;
-      k = soap->imode;
-      soap->imode &= ~0xFF; /* mask IO and ENC */
-      if (soap_begin_recv(soap))
-        return -1;
-      soap->imode = k;
-      soap->count = n;
-      soap_begin_send(soap);
-    }
-    if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
-    { soap_set_sender_error(soap, "SSL error", "SSL authentication failed in tcp_connect(): check password, key file, and ca file.", SOAP_SSL_ERROR);
-      return -1;
-    }
-    soap->ssl = SSL_new(soap->ctx);
-    if (!soap->ssl)
-    { soap->error = SOAP_SSL_ERROR;
-      return -1;
-    }
-    if (soap->session)
-    { if (!strcmp(soap->session_host, host) && soap->session_port == port)
-        SSL_set_session(soap->ssl, soap->session);
-      SSL_SESSION_free(soap->session);
-      soap->session = NULL;
-    }
-    soap->imode |= SOAP_ENC_SSL;
-    soap->omode |= SOAP_ENC_SSL;
-    soap->bio = BIO_new_socket((SOAP_SOCKET)fd, BIO_NOCLOSE);
-    SSL_set_bio(soap->ssl, soap->bio, soap->bio);
-#ifndef WITH_LEAN
-    if (soap->connect_timeout)
-#ifdef WIN32
-    { u_long nonblocking = 1;
-      ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
-    }
-#else
-      fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
-#endif
-#endif
-    for (;;)
-    { if ((r = SSL_connect(soap->ssl)) <= 0)
-      { int err = SSL_get_error(soap->ssl, r);
-        if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-        { soap_set_sender_error(soap, ssl_error(soap, r), "SSL connect failed in tcp_connect()", SOAP_SSL_ERROR);
-          return -1;
-        }
-        if (soap->connect_timeout)
-        { struct timeval timeout;
-          fd_set fds;
-          if (soap->connect_timeout > 0)
-          { timeout.tv_sec = soap->connect_timeout;
-            timeout.tv_usec = 0;
-          }
-          else
-          { timeout.tv_sec = -soap->connect_timeout/1000000;
-            timeout.tv_usec = -soap->connect_timeout%1000000;
-          }
-          FD_ZERO(&fds);
-          FD_SET((SOAP_SOCKET)(soap->socket), &fds);
-          for (;;)
-          { int r = select((SOAP_SOCKET)(soap->socket + 1), &fds, NULL, &fds, &timeout);
-            if (r > 0)
-             break;
-            if (!r)
-            { soap->errnum = 0;
-              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
-              soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-              return -1;
-            }
-          }
-         continue;
-        }
-      }
-      break;
-    }
-#ifndef WITH_LEAN
-    if (soap->connect_timeout)
-#ifdef WIN32
-    { u_long blocking = 0;
-      ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-    }
-#else
-      fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-    if (soap->require_server_auth)
-    { X509 *peer;
-      int err;
-      if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK)
-      { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate cannot be verified in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-      peer = SSL_get_peer_certificate(soap->ssl);
-      if (!peer)
-      { soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-      X509_NAME_get_text_by_NID(X509_get_subject_name(peer), NID_commonName, soap->msgbuf, sizeof(soap->msgbuf));
-      X509_free(peer);
-      if (soap_tag_cmp(soap->msgbuf, host))
-      { soap_set_sender_error(soap, "SSL error", "SSL certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-    }
-  }
-#endif
-  return fd;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_bind(struct soap *soap, const char *host, int port, int backlog)
-{ struct sockaddr_in sockaddr;
-/* WR[ */
-#ifdef WITH_IPV6
-  struct addrinfo *addrinfo;
-  struct addrinfo hints;
-  struct addrinfo resaddr;
-  struct sockaddr_storage addrstorage;
-  int err;
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  if (soap_valid_socket(soap->master))
-  { soap->fclosesocket(soap, (SOAP_SOCKET)soap->master);
-    soap->master = SOAP_INVALID_SOCKET;
-  }
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->errmode = 1;
-  if (tcp_init(soap))
-  { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-/* WR[ */
-#ifdef WITH_IPV6
-  memset((void*)&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
-  hints.ai_socktype = SOCK_STREAM;
-  hints.ai_flags = AI_PASSIVE;
-  soap->errmode = 2;
-  if (host)
-    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
-  else
-    err = getaddrinfo(NULL, soap_int2s(soap, port), &hints, &addrinfo);
-  if (NULL != addrinfo)
-  {
-    resaddr = *addrinfo;
-    addrstorage = *((struct sockaddr_storage *) addrinfo->ai_addr);
-    resaddr.ai_addr = (struct sockaddr *) &addrstorage;
-    freeaddrinfo(addrinfo);
-  }
-  if (err)
-  { soap_set_receiver_error(soap, gai_strerror(err), "TCP getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  soap->errmode = 0;
-  if ((soap->master = socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol)) < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#else /* WITH_IPV6 */
-/* ]WR */
-  soap->errmode = 0;
-  if ((soap->master = (int)socket(AF_INET, SOCK_STREAM, 0)) < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifdef SOCKET_CLOSE_ON_EXEC
-#ifdef WIN32
-#ifndef UNDER_CE
-  SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0);
-#endif
-#else
-  fcntl (soap->master, F_SETFD, 1);
-#endif
-#endif
-#ifndef WITH_LEAN
-  if (soap->bind_flags && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#ifdef TCP_NODELAY
-  if (setsockopt((SOAP_SOCKET)soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#endif
-#endif
-/* WR[ */
-#ifdef WITH_IPV6
-  soap->errmode = 0;
-  if (bind(soap->master, resaddr.ai_addr, resaddr.ai_addrlen) || listen(soap->master, backlog))
-  { 
-    soap->errnum = soap_socket_errno;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
-    soap_closesock(soap);
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }  
-#else /* WITH_IPV6 */
-/* ]WR */
-  memset((void*)&sockaddr, 0, sizeof(sockaddr));
-  sockaddr.sin_family = AF_INET;
-  soap->errmode = 2;
-  if (host)
-  { if (soap->fresolve(soap, host, &sockaddr.sin_addr))
-    { soap_set_receiver_error(soap, tcp_error(soap), "TCP get host by name failed in soap_bind()", SOAP_TCP_ERROR);
-      return -1;
-    }
-  }
-  else
-    sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
-  sockaddr.sin_port = htons((short)port);
-  soap->errmode = 0;
-  if (bind((SOAP_SOCKET)soap->master, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) || listen((SOAP_SOCKET)soap->master, backlog))
-  { soap->errnum = soap_socket_errno;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
-    soap_closesock(soap);
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }  
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifdef WITH_OPENSSL
-  if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
-    return -1;
-#endif
-  return soap->master;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_poll(struct soap *soap)
-{ 
-#ifndef WITH_LEAN
-  struct timeval timeout;
-  fd_set sfd,rfd;
-  int r;
-  timeout.tv_sec = 0;
-  timeout.tv_usec = 0;
-  FD_ZERO(&rfd);
-  FD_ZERO(&sfd);
-  if (soap->socket >= 0)
-  { FD_SET(soap->socket, &rfd);
-    FD_SET(soap->socket, &sfd);
-    r = select(soap->socket + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  else if (soap->master >= 0)
-  { FD_SET(soap->master, &rfd);
-    r = select(soap->master + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  else
-  { FD_SET(soap->sendfd, &sfd);
-    FD_SET(soap->recvfd, &rfd);
-    r = select((soap->sendfd > soap->recvfd ? soap->sendfd : soap->recvfd) + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  if (r > 0)
-  {
-#ifdef WITH_OPENSSL
-    if (soap->ssl)
-    { if ((soap->socket >= 0) && FD_ISSET(soap->socket, &rfd))
-      { char buf = '\0';
-       if (SSL_peek(soap->ssl, &buf, 1) <= 0)
-         return SOAP_EOF;
-      }
-    }
-#endif   
-    return SOAP_OK;
-  }
-  if (r < 0 && (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno != SOAP_EINTR)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR);
-    return soap->error = SOAP_TCP_ERROR;
-  }
-  else
-    soap->errnum = soap_errno;
-  return SOAP_EOF;
-#else
-  return SOAP_OK;
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_accept(struct soap *soap, int s, struct sockaddr *a, int *n)
-{ int fd;
-#if defined(SOCKLEN_T)
-  fd = (int)accept((SOAP_SOCKET)s, a, (SOCKLEN_T*)n);
-#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
-  fd = (int)accept((SOAP_SOCKET)s, a, (socklen_t*)n);
-#elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
-  fd = (int)accept((SOAP_SOCKET)s, a, n);
-#else
-  fd = (int)accept((SOAP_SOCKET)s, a, (size_t*)n);
-#endif
-#ifdef SOCKET_CLOSE_ON_EXEC
-#ifdef WIN32
-#ifndef UNDER_CE
-  SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0);
-#endif
-#else
-  fcntl(fd, F_SETFD, FD_CLOEXEC);
-#endif
-#endif
-  return fd;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_accept(struct soap *soap)
-{ 
-/* WR[ */
-#ifdef WITH_IPV6
-  struct sockaddr_storage sockaddr;
-#else /* WITH_IPV6 */
-/* ]WR */
-  struct sockaddr_in sockaddr;
-/* WR[ */
-#endif
-/* ]WR */
-  int n = (int)sizeof(struct sockaddr);
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  soap->error = SOAP_OK;
-  memset((void*)&sockaddr, 0, sizeof(sockaddr));
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->errmode = 0;
-  if (soap_valid_socket(soap->master))
-  { for (;;)
-    { 
-#ifndef WITH_LEAN
-      if (soap->accept_timeout)
-      { struct timeval timeout;
-        fd_set fd;
-        if (soap->accept_timeout > 0)
-        { timeout.tv_sec = soap->accept_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->accept_timeout/1000000;
-          timeout.tv_usec = -soap->accept_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->master, &fd);
-        for (;;)
-        { int r = select((SOAP_SOCKET)(soap->master + 1), &fd, &fd, NULL, &timeout);
-          if (r > 0)
-            break;
-          if (!r)
-          { soap->errnum = 0;
-            soap_set_receiver_error(soap, "Timeout", "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            soap_closesock(soap);
-            soap_set_sender_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-          }
-        }
-#if defined(WIN32)
-       { u_long nonblocking = 1;
-          ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &nonblocking);
-        }
-#elif defined(VXWORKS)
-        { vx_nonblocking = TRUE;
-          ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-        }
-#else
-        fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)|O_NONBLOCK);
-#endif
-      }
-      else
-#if defined(WIN32)
-      { u_long blocking = 0;
-        ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
-      }
-/* WR[ */
-#elif defined(VXWORKS)
-      { vx_nonblocking = FALSE;
-        ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-      }
-/* ]WR */
-#else
-        fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-      if ((soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&sockaddr, &n)) >= 0)
-      {
-/* WR[ */
-#ifdef WITH_IPV6
-/* Use soap->host to store the numeric form of the remote host */
-        getnameinfo((struct sockaddr*)&sockaddr, n, soap->host, sizeof(soap->host), NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV); 
-        soap->ip = 0; /* info stored in soap->host */
-        soap->port = 0; /* info stored in soap->host */
-#else /* WITH_IPV6 */
-/* ]WR */
-        soap->ip = ntohl(sockaddr.sin_addr.s_addr);
-        soap->port = (int)ntohs(sockaddr.sin_port);
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-        soap->keep_alive = ((soap->imode & SOAP_IO_KEEPALIVE) != 0);
-#ifndef WITH_LEAN
-       if (soap->accept_flags & SO_LINGER)
-        { struct linger linger;
-          memset((void*)&linger, 0, sizeof(linger));
-          linger.l_onoff = 1;
-          linger.l_linger = 0;
-         if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
-          { soap->errnum = soap_socket_errno;
-           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-         }
-        }
-        if ((soap->accept_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-#ifdef TCP_NODELAY
-        if (setsockopt((SOAP_SOCKET)soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-#endif
-#endif
-        if (soap->accept_timeout)
-        {
-#if defined(WIN32)
-          u_long blocking = 0;
-          ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
-          ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
-/* WR[ */
-#elif defined(VXWORKS)
-          vx_nonblocking = FALSE;
-          ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-          ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)(&vx_nonblocking));
-/* ]WR */
-#else
-          fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
-          fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
-#endif
-       }
-        return soap->socket;
-      }
-      if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
-      { soap->errnum = soap_socket_errno;
-        soap_set_receiver_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-        return -1;
-      }
-    }
-  }
-  else
-  { soap_set_receiver_error(soap, tcp_error(soap), "TCP no master socket in soap_accept()", SOAP_TCP_ERROR);
-    return -1;
-  }
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_disconnect(struct soap *soap)
-{
-#ifdef WITH_OPENSSL
-  if (soap->ssl)
-  { int r, s = 0;
-    if (soap->session)
-      SSL_SESSION_free(soap->session);
-    if (*soap->host)
-    { soap->session = SSL_get1_session(soap->ssl);
-      if (soap->session)
-      { strcpy(soap->session_host, soap->host);
-        soap->session_port = soap->port;
-      }
-    }
-    r = SSL_shutdown(soap->ssl);
-    if (r != 1)
-    { s = ERR_get_error();
-      if (s)
-      { if (soap_valid_socket(soap->socket))
-        { soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1);
-          soap->socket = SOAP_INVALID_SOCKET;
-        }
-        r = SSL_shutdown(soap->ssl);
-      }
-    }
-    DBGLOG(TEST, if (s) SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r)));
-    SSL_free(soap->ssl);
-    soap->ssl = NULL;
-    if (s)
-      return SOAP_SSL_ERROR;
-    ERR_remove_state(0);
-  }
-#endif
-  if (soap_valid_socket(soap->socket))
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Closing socket %d\n", soap->socket));
-    soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 2);
-    soap->fclosesocket(soap, (SOAP_SOCKET)soap->socket);
-    soap->socket = SOAP_INVALID_SOCKET;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_closesocket(struct soap *soap, SOAP_SOCKET fd)
-{ return closesocket(fd);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how)
-{ return shutdown(fd, how);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_closesock(struct soap *soap)
-{ register int status = soap->error;
-#ifndef MAC_CARBON
-  if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive)
-  { if ((soap->error = soap->fclose(soap)))
-      return soap->error;
-    soap->socket = SOAP_INVALID_SOCKET;
-  }
-#endif
-#ifdef WITH_ZLIB
-  if (soap->zlib_state == SOAP_ZLIB_DEFLATE)
-    deflateEnd(&soap->d_stream);
-  else if (soap->zlib_state == SOAP_ZLIB_INFLATE)
-    inflateEnd(&soap->d_stream);
-  soap->zlib_state = SOAP_ZLIB_NONE;
-#endif
-  return soap->error = status;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_hash(register const char *s)
-{ register size_t h = 0;
-  while (*s)
-    h = 65599*h + *s++;
-  return h % SOAP_IDHASH;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_init_pht(struct soap *soap)
-{ register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing pointer hashtable\n"));
-  for (i = 0; i < (int)SOAP_PTRHASH; i++)
-    soap->pht[i] = NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new()
-{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
-  if (soap)
-    soap_init(soap);
-  return soap;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new1(int mode)
-{ return soap_new2(mode, mode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new2(int imode, int omode)
-{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
-  if (soap)
-    soap_init2(soap, imode, omode);
-  return soap;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_free_pht(struct soap *soap)
-{ register struct soap_plist *pp, *next;
-  register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n"));
-  for (i = 0; i < (int)SOAP_PTRHASH; i++)
-  { for (pp = soap->pht[i]; pp; pp = next)
-    { next = pp->next;
-      SOAP_FREE(pp);
-    }
-    soap->pht[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type)
-{ register int i;
-  struct soap_plist *pp;
-  if (soap->version != 1)
-    soap->encoding = 1;
-  if (a)
-    i = soap_array_pointer_lookup(soap, p, a, n, type, &pp);
-  else
-    i = soap_pointer_lookup(soap, p, type, &pp);
-  if (i)
-  { if (soap_is_embedded(soap, pp)
-     || soap_is_single(soap, pp))
-      return 0;
-    soap_set_embedded(soap, pp);
-  }
-  return i;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp)
-{ register struct soap_plist *pp;
-  *ppp = NULL;
-  if (p)
-    for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next)
-      if (pp->ptr == p && pp->type == type)
-      { *ppp = pp;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id));
-        return pp->id;
-      }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
-{ register int h;
-  register struct soap_plist *pp = *ppp = (struct soap_plist*)SOAP_MALLOC(sizeof(struct soap_plist));
-  if (!pp)
-    return 0;
-  if (a)
-    h = soap_hash_ptr(a->__ptr);
-  else
-    h = soap_hash_ptr(p);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%d dim=%d type=%d id=%lu\n", p, a?a->__ptr:NULL, a?a->__size:0, n, type, soap->idnum+1));
-  pp->next = soap->pht[h];
-  pp->type = type;
-  pp->mark1 = 0;
-  pp->mark2 = 0;
-  pp->ptr = p;
-  pp->array = a;
-  soap->pht[h] = pp;
-  pp->id = ++soap->idnum;
-  return pp->id;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_pointer_lookup(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
-{ register struct soap_plist *pp;
-  *ppp = NULL;
-  if (!p || !a->__ptr)
-    return 0;
-  for (pp = soap->pht[soap_hash_ptr(a->__ptr)]; pp; pp = pp->next)
-  { if (pp->type == type && pp->array && pp->array->__ptr == a->__ptr)
-    { register int i;
-      for (i = 0; i < n; i++)
-        if (((const int*)&pp->array->__size)[i] != ((const int*)&a->__size)[i])
-         break;
-      if (i == n)
-      { *ppp = pp;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a->__ptr, type, pp->id));
-        return pp->id;
-      }
-    }
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a->__ptr, type));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_begin_count(struct soap *soap)
-{ soap_clr_attr(soap);
-  soap_set_local_namespaces(soap);
-#ifndef WITH_LEANER
-  if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME))
-    soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME;
-  else
-#endif
-  { soap->mode = soap->omode;
-    if ((soap->mode & SOAP_IO) == SOAP_IO_STORE
-     || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) && !soap->fpreparesend))
-      soap->mode &= ~SOAP_IO_LENGTH;
-    else
-      soap->mode |= SOAP_IO_LENGTH;
-  }
-  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
-  { if (!(soap->mode & SOAP_ENC_DIME))
-      soap->mode &= ~SOAP_IO_LENGTH;
-    if (soap->mode & SOAP_ENC_XML)
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH))
-    soap->mode |= SOAP_XML_TREE;
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_MIME)
-    soap_select_mime_boundary(soap);
-  soap->dime.list = soap->dime.last;   /* keep track of last DIME attachment */
-#endif
-  soap->count = 0;
-  soap->ns = 0;
-  soap->null = 0;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  soap->encoding = 0;
-  soap->part = SOAP_BEGIN;
-  soap->idnum = 0;
-  soap->dime.count = 0; /* count # of attachments */
-  soap->dime.size = 0; /* accumulate total size of attachments */
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
-  if (soap->fprepareinit && (soap->mode & SOAP_IO) != SOAP_IO_STORE)
-    soap->fprepareinit(soap);   
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_begin_send(struct soap *soap)
-{ soap->error = SOAP_OK;
-  soap_clr_attr(soap);
-  soap_set_local_namespaces(soap);
-  soap->mode = (soap->omode & ~SOAP_IO_LENGTH) | (soap->mode & SOAP_ENC_DIME);
-  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
-  { if (soap->mode & SOAP_ENC_XML)
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket))
-  { if (soap->count || (soap->mode & SOAP_ENC_XML))
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    soap_new_block(soap);
-  if (!(soap->mode & SOAP_IO_KEEPALIVE))
-    soap->keep_alive = 0;
-  if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH))
-    soap->mode |= SOAP_XML_TREE;
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_MIME)
-    soap_select_mime_boundary(soap);
-#endif
-#ifdef WIN32
-#ifndef UNDER_CE
-#ifndef WITH_FASTCGI
-  if (!soap_valid_socket(soap->socket)) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */
-#ifdef __BORLANDC__
-    setmode((SOAP_SOCKET)soap->sendfd, O_BINARY);
-#else
-    _setmode((SOAP_SOCKET)soap->sendfd, _O_BINARY);
-#endif
-#endif
-#endif
-#endif
-  if (soap->mode & SOAP_IO)
-  { soap->bufidx = 0;
-    soap->buflen = 0;
-  }
-  soap->chunksize = 0;
-  soap->ns = 0;
-  soap->null = 0;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  soap->encoding = 0;
-  soap->part = SOAP_BEGIN;
-  soap->idnum = 0;
-  soap->level = 0;
-#ifdef WITH_ZLIB
-  soap->z_ratio_out = 1.0;
-  if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE)
-  {
-#ifdef WITH_GZIP
-    memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10);
-    soap->d_stream.next_out = (Byte*)soap->z_buf + 10;
-    soap->d_stream.avail_out = SOAP_BUFLEN - 10;
-    soap->z_crc = crc32(0L, NULL, 0);
-    if (deflateInit2(&soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK)
-#else
-    soap->d_stream.next_out = (Byte*)soap->z_buf;
-    soap->d_stream.avail_out = SOAP_BUFLEN;
-    if (deflateInit(&soap->d_stream, soap->z_level) != Z_OK)
-#endif
-      return soap->error = SOAP_ZLIB_ERROR;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n"));
-    soap->zlib_state = SOAP_ZLIB_DEFLATE;
-  }
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
-  if (soap->fprepareinit && (soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    soap->fprepareinit(soap);   
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_embedded(struct soap *soap, const void *p, int t)
-{ struct soap_plist *pp;
-  if (soap_pointer_lookup(soap, p, t, &pp))
-  { pp->mark1 = 1;
-    pp->mark2 = 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t));
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_reference(struct soap *soap, const void *p, int t)
-{ struct soap_plist *pp;
-  if (!p || (soap->mode & SOAP_XML_TREE))
-    return 1;
-  if (soap_pointer_lookup(soap, p, t, &pp))
-  { if (pp->mark1 == 0)
-    { pp->mark1 = 2;
-      pp->mark2 = 2;
-    }
-  }
-  else if (soap_pointer_enter(soap, p, NULL, 0, t, &pp))
-  { pp->mark1 = 0;
-    pp->mark2 = 0;
-  }
-  else
-    return 1;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2));
-  return pp->mark1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_reference(struct soap *soap, const void *p, const struct soap_array *a, int n, int t)
-{ register int i;
-  struct soap_plist *pp;
-  if (!p)
-    return 1;
-  i = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
-  if (i)
-  { if (pp->mark1 == 0)
-    { pp->mark1 = 2;
-      pp->mark2 = 2;
-    }
-  }
-  else if (!soap_pointer_enter(soap, p, a, n, t, &pp))
-    return 1;
-  else
-  { pp->mark1 = 0;
-    pp->mark2 = 0;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p dim=%d type=%d (%d %d)\n", p, a->__ptr, n, t, (int)pp->mark1, (int)pp->mark2));
-  return pp->mark1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embedded_id(struct soap *soap, int id, const void *p, int t)
-{ struct soap_plist *pp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id));
-  if (soap->mode & SOAP_XML_TREE)
-    return id;
-  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER)
-  { if (id < 0)
-    { id = soap_pointer_lookup(soap, p, t, &pp);
-      if (id)
-      { if (soap->mode & SOAP_IO_LENGTH)
-          pp->mark1 = 2;
-        else
-          pp->mark2 = 2;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2));
-      }
-      return -1;
-    }
-    return id;
-  }
-  if (id < 0)
-    id = soap_pointer_lookup(soap, p, t, &pp);
-  else if (id && !soap_pointer_lookup(soap, p, t, &pp))
-    return 0;
-  if (id && pp)
-  { if (soap->mode & SOAP_IO_LENGTH)
-      pp->mark1 = 1;
-    else
-      pp->mark2 = 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2));
-  }
-  return id;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_embedded(struct soap *soap, struct soap_plist *pp)
-{ if (!pp)
-    return 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2));
-  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER)
-  { if (soap->mode & SOAP_IO_LENGTH)
-      return pp->mark1 != 0;
-    return pp->mark2 != 0;
-  }
-  if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 1;
-  return pp->mark2 == 1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_single(struct soap *soap, struct soap_plist *pp)
-{ if (soap->part == SOAP_IN_HEADER)
-    return 1;
-  if (!pp)
-    return 0;
-  if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 0;
-  return pp->mark2 == 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_embedded(struct soap *soap, struct soap_plist *pp)
-{ if (!pp)
-    return;
-  if (soap->mode & SOAP_IO_LENGTH)
-    pp->mark1 = 1;
-  else
-    pp->mark2 = 1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_dime(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, const char *aid, const char *atype, const char *aoptions, int n, const char *type, int t) 
-{ struct soap_plist *pp;
-  if (!p || !a->__ptr || (!aid && !atype))
-    return soap_element_id(soap, tag, id, p, a, n, type, t);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid?aid:"", id, atype?atype:""));
-  if (id < 0)
-    id = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
-  if (!aid)
-  { sprintf(soap->tmpbuf, soap->dime_id_format, id);
-    aid = soap_strdup(soap, soap->tmpbuf);
-  }
-  if (soap_element_href(soap, tag, 0, "href", aid))
-    return soap->error;
-  if (soap->mode & SOAP_IO_LENGTH)
-  { if (pp->mark1 != 3)
-    { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size);
-      if (!content)
-        return soap->error = SOAP_EOM;
-      content->id = aid;
-      content->type = atype;
-      content->options = aoptions;
-      pp->mark1 = 3;
-    }
-  }
-  else
-    pp->mark2 = 3;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_init_iht(struct soap *soap)
-{ register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing ID hashtable\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-    soap->iht[i] = NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_free_iht(struct soap *soap)
-{ register int i;
-  register struct soap_ilist *ip, *p;
-  register struct soap_flist *fp, *fq;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = p)
-    { for (fp = ip->flist; fp; fp = fq)
-      { fq = fp->next;
-        SOAP_FREE(fp);
-      }
-      p = ip->next;
-      SOAP_FREE(ip);
-    }
-    soap->iht[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static struct soap_ilist *
-soap_hlookup(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next)
-    if (!strcmp(ip->id, id))
-      return ip;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_ilist *
-SOAP_FMAC2
-soap_lookup(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  ip = soap_hlookup(soap, id);
-#ifndef WITH_LEANER
-  if (!ip && *id != '#' && !strchr(id, ':')) /* try content id "cid:" with DIME attachments */
-  { char cid[SOAP_TAGLEN];
-    strcpy(cid, "cid:");
-    strncat(cid + 4, id, sizeof(cid) - 5);
-    cid[sizeof(cid) - 1] = '\0';
-    ip = soap_hlookup(soap, cid);
-  }
-#endif
-  return ip;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_ilist *
-SOAP_FMAC2
-soap_enter(struct soap *soap, const char *id)
-{ register size_t h;
-  register struct soap_ilist *ip;
-  ip = (struct soap_ilist*)SOAP_MALLOC(sizeof(struct soap_ilist) + strlen(id));
-  if (ip)
-  { h = soap_hash(id);
-    strcpy(ip->id, id);
-    ip->next = soap->iht[h];
-    soap->iht[h] = ip;
-    return ip;
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_malloc(struct soap *soap, size_t n)
-{ register char *p;
-  if (!n)
-    return NULL;
-  if (!soap)
-    return SOAP_MALLOC(n);
-  n += (-(long)n) & 7;
-  if (!(p = (char*)SOAP_MALLOC(n + sizeof(void*) + sizeof(size_t))))
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  /* keep chain of alloced cells for later destruction */
-  soap->alloced = 1;
-  *(void**)(p + n) = soap->alist;
-  *(size_t*)(p + n + sizeof(void*)) = n;
-  soap->alist = p + n;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Malloc %u bytes at location %p\n", (unsigned int)n, p));
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_dealloc(struct soap *soap, void *p)
-{ if (!soap)
-    return;
-  if (p)
-  { register char **q;
-    for (q = (char**)&soap->alist; *q; q = *(char***)q)
-    { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
-      { *q = **(char***)q;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p));
-        SOAP_FREE(p);
-        return;
-      }
-    }
-    soap_delete(soap, p);
-  }
-  else
-  { register char *q;
-    while (soap->alist)
-    { q = (char*)soap->alist;
-      soap->alist = *(void**)q;
-      q -= *(size_t*)(q + sizeof(void*));
-      SOAP_FREE(q);
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Dealloc all data done\n"));
-  }
-  /* we must assume these were deallocated: */
-  soap->action = NULL;
-  soap->fault = NULL;
-  soap->header = NULL;
-  soap->authrealm = NULL;
-#ifndef WITH_LEANER
-  soap_clr_mime(soap);
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_delete(struct soap *soap, void *p)
-{ register struct soap_clist **cp = &soap->clist;
-  if (p)
-  { while (*cp)
-    { if (p == (*cp)->ptr)
-      { register struct soap_clist *q = *cp;
-        *cp = q->next;
-        q->fdelete(q);
-        SOAP_FREE(q);
-        return;
-      }
-      cp = &(*cp)->next;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p));
-  }
-  else
-  { while (*cp)
-    { register struct soap_clist *q = *cp;
-      *cp = q->next;
-      if (q->ptr == (void*)soap->fault)
-        soap->fault = NULL; /* this was deallocated */
-      else if (q->ptr == (void*)soap->header)
-        soap->header = NULL; /* this was deallocated */
-      q->fdelete(q);
-      SOAP_FREE(q);
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_clist *
-SOAP_FMAC2
-soap_link(struct soap *soap, void *p, int t, int n, void (*fdelete)(struct soap_clist*))
-{ register struct soap_clist *cp;
-  if ((cp = (struct soap_clist*)SOAP_MALLOC(sizeof(struct soap_clist))))
-  { cp->next = soap->clist;
-    cp->type = t;
-    cp->size = n; 
-    cp->ptr = p;
-    cp->fdelete = fdelete;
-    soap->clist = cp;
-  }
-  return cp;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_unlink(struct soap *soap, const void *p)
-{ register char **q;
-  register struct soap_clist **cp;
-  if (!soap || !p)
-    return;
-  for (q = (char**)&soap->alist; *q; q = *(char***)q)
-  { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
-    { *q = **(char***)q;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p));
-      return;
-    }
-  }
-  for (cp = &soap->clist; *cp; cp = &(*cp)->next)
-  { if (p == (*cp)->ptr)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p));
-      q = (char**)*cp;
-      *cp = (*cp)->next;
-      SOAP_FREE(q);
-      return;
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_lookup_type(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  if (id && *id)
-  { ip = soap_lookup(soap, id);
-    if (ip)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type));
-      return ip->type;
-    }
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k)
-{ struct soap_ilist *ip;
-  void **q;
-  if (!id || !*id)
-    return p;
-  soap->alloced = 0;
-  if (!p)
-    p = (void**)soap_malloc(soap, sizeof(void*));
-  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
-  if (!ip)
-  { ip = soap_enter(soap, id); /* new hash table entry for string id */
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d %p (%u bytes)\n", id, t, p, (unsigned int)n));
-    ip->type = t;
-    ip->size = n; 
-    ip->link = p;
-    ip->copy = NULL;
-    ip->flist = NULL;
-    ip->ptr = NULL;
-    ip->level = k;
-    *p = NULL;
-  }
-  else if (ip->ptr)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes)\n", id, t, ip->ptr, (unsigned int)n));
-    if (ip->type != t)
-    { strcpy(soap->id, id);
-      soap->error = SOAP_HREF;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility: id type=%d href type=%d\n", ip->type, t));
-      return NULL;
-    }
-    while (ip->level < k)
-    { q = (void**)soap_malloc(soap, sizeof(void*));  
-      if (!q)
-        return NULL;
-      *p = (void*)q;
-      p = q;
-      k--;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    *p = ip->ptr;
-  }
-  else if (ip->level > k)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving level %u pointers to href='%s'\n", ip->level, id));
-    while (ip->level > k)
-    { void *s, **r = &ip->link;
-      q = (void**)ip->link;
-      while (q)
-      { *r = (void*)soap_malloc(soap, sizeof(void*));
-        s = *q;
-        *q = *r;
-        r = (void**)*r;
-        q = (void**)s;
-      }
-      *r = NULL;
-      ip->size = n; 
-      ip->copy = NULL;
-      ip->level = ip->level - 1;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    q = (void**)ip->link;
-    ip->link = p;
-    *p = (void*)q;
-  }
-  else
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes)\n", id, t, p, (unsigned int)n));
-    while (ip->level < k)
-    { q = (void**)soap_malloc(soap, sizeof(void*));  
-      *p = q;
-      p = q;
-      k--;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    q = (void**)ip->link;
-    ip->link = p;
-    *p = (void*)q;
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_forward(struct soap *soap, const char *href, void *p, int st, int tt, size_t n, unsigned int k, void (*fcopy)(struct soap*, int, int, void*, const void*, size_t))
-{ struct soap_ilist *ip;
-  if (!p || !href || !*href)
-    return p;
-  ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */
-  if (!ip)
-  { ip = soap_enter(soap, href); /* new hash table entry for string id */
-    ip->type = st;
-    ip->size = n;
-    ip->link = NULL;
-    ip->copy = NULL;
-    ip->ptr = NULL;
-    ip->level = 0;
-    ip->flist = NULL;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, st, (unsigned long)n, k, p));
-  }
-  else if (ip->type != st || (ip->level == k && ip->size != n))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, st, (unsigned long)n));
-    strcpy(soap->id, href);
-    soap->error = SOAP_HREF;
-    return NULL;
-  }
-  if (fcopy || n < sizeof(void*) || *href != '#')
-  { register struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(sizeof(struct soap_flist));
-    if (!fp)
-    { soap->error = SOAP_EOM;
-      return NULL;
-    }
-    fp->next = ip->flist;
-    fp->type = tt;
-    fp->ptr = p;
-    fp->level = k;
-    if (fcopy)
-      fp->fcopy = fcopy;
-    else
-      fp->fcopy = soap_fcopy;
-    ip->flist = fp;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u href='%s'\n", st, tt, (unsigned long)n, p, k, href));
-  }
-  else
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, st, href));
-    *(void**)p = ip->copy;
-    ip->copy = p;
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*))
-{ struct soap_ilist *ip;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k));
-  soap->alloced = 0;
-  if (!p)
-  { if (finstantiate)
-      p = finstantiate(soap, t, type, arrayType, &n);
-    else
-      p = soap_malloc(soap, n);
-    if (p)
-      soap->alloced = 1;
-  }
-  if (!id || !*id)
-    return p;
-  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s for location=%p'\n", id, p));
-  if (!ip)
-  { ip = soap_enter(soap, id); /* new hash table entry for string id */
-    ip->type = t;
-    ip->link = NULL;
-    ip->copy = NULL;
-    ip->flist = NULL;
-    ip->size = n;
-    ip->ptr = p;
-    ip->level = k;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu level=%u location=%p\n", id, t, (unsigned long)n, k, p));
-  }
-  else if ((ip->type != t || (ip->level == k && ip->size != n)) && (ip->copy || ip->flist))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n));
-    strcpy(soap->id, id);
-    soap->error = SOAP_HREF;
-    return NULL;
-  }
-  else if (ip->ptr)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id));
-    strcpy(soap->id, id);
-    soap->error = SOAP_MULTI_ID;
-    return NULL;
-  }
-  else 
-  { ip->size = n;
-    ip->ptr = p;
-    ip->level = k;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update entry id='%s' type=%d location=%p size=%lu level=%u\n", id, t, p, n, k));
-  }
-  return ip->ptr;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_fcopy(struct soap *soap, int st, int tt, void *p, const void *q, size_t n)
-{ DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Copying data type=%d (target type=%d) %p -> %p (%lu bytes)\n", st, tt, q, p, (unsigned long)n));
-  memcpy(p, q, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_end_send(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  if (soap->dime.list)
-  { /* SOAP body referenced attachments must appear first */
-    soap->dime.last->next = soap->dime.first;
-    soap->dime.first = soap->dime.list->next;
-    soap->dime.list->next = NULL;
-    soap->dime.last = soap->dime.list;
-  }
-  if (soap_putdime(soap) || soap_putmime(soap))
-    return soap->error;
-  soap->mime.list = NULL;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->dime.list = NULL;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send\n"));
-  if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */
-  { if (soap_flush(soap))
-#ifdef WITH_ZLIB
-    { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE)
-      { soap->zlib_state = SOAP_ZLIB_NONE;
-        deflateEnd(&soap->d_stream);
-      }
-      return soap->error;
-    }
-#else
-      return soap->error;
-#endif
-#ifdef WITH_ZLIB
-    if (soap->mode & SOAP_ENC_ZLIB)
-    { int r;
-      soap->d_stream.avail_in = 0;
-      do
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n"));
-        r = deflate(&soap->d_stream, Z_FINISH);
-        if (soap->d_stream.avail_out != SOAP_BUFLEN)
-        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream.avail_out))
-          { soap->zlib_state = SOAP_ZLIB_NONE;
-            deflateEnd(&soap->d_stream);
-            return soap->error;
-         }
-          soap->d_stream.next_out = (Byte*)soap->z_buf;
-          soap->d_stream.avail_out = SOAP_BUFLEN;
-        }
-      } while (r == Z_OK);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-      soap->z_ratio_out = (float)soap->d_stream.total_out / (float)soap->d_stream.total_in;
-      soap->mode &= ~SOAP_ENC_ZLIB;
-      soap->zlib_state = SOAP_ZLIB_NONE;
-      if (deflateEnd(&soap->d_stream) != Z_OK || r != Z_STREAM_END)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-#ifdef WITH_GZIP
-      soap->z_buf[0] = soap->z_crc & 0xFF;
-      soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF;
-      soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF;
-      soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF;
-      soap->z_buf[4] = soap->d_stream.total_in & 0xFF;
-      soap->z_buf[5] = (soap->d_stream.total_in >> 8) & 0xFF;
-      soap->z_buf[6] = (soap->d_stream.total_in >> 16) & 0xFF;
-      soap->z_buf[7] = (soap->d_stream.total_in >> 24) & 0xFF;
-      if (soap_flush_raw(soap, soap->z_buf, 8))
-        return soap->error;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc));
-#endif
-    }
-#endif
-    if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    { char *p;
-      if (!(soap->mode & SOAP_ENC_XML))
-      { soap->mode--;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size));
-        if (soap->status >= SOAP_POST)
-          soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size);
-        else if (soap->status != SOAP_STOP)
-          soap->error = soap->fresponse(soap, soap->status, soap->blist->size);
-        if (soap->error || soap_flush(soap))
-          return soap->error;
-        soap->mode++;
-      }
-      for (p = soap_first_block(soap); p; p = soap_next_block(soap))
-      { DBGMSG(SENT, p, soap_block_size(soap));
-        if ((soap->error = soap->fsend(soap, p, soap_block_size(soap))))
-        { soap_end_block(soap);
-          return soap->error;
-        }
-      }
-      soap_end_block(soap);
-    }
-    else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    { DBGMSG(SENT, "\r\n0\r\n\r\n", 7);
-      if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7)))
-        return soap->error;
-    }
-  }
-#ifdef WITH_OPENSSL
-  if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive)
-    soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
-#else
-  if (soap_valid_socket(soap->socket) && !soap->keep_alive)
-    soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send message ok\n"));
-  soap->part = SOAP_END;
-  soap->count = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_end_recv(struct soap *soap)
-{ soap->part = SOAP_END;
-#ifndef WITH_LEANER
-  if ((soap->mode & SOAP_ENC_MIME) && soap_getmime(soap))
-    return soap->error;
-  soap->mime.list = soap->mime.first;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->dime.list = soap->dime.first;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-#endif
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n"));
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { soap->mode &= ~SOAP_ENC_ZLIB;
-    memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
-    soap->bufidx = (char*)soap->d_stream.next_in - soap->z_buf;
-    soap->buflen = soap->z_buflen;
-    soap->zlib_state = SOAP_ZLIB_NONE;
-    if (inflateEnd(&soap->d_stream) != Z_OK)
-      return soap->error = SOAP_ZLIB_ERROR;
-#ifdef WITH_GZIP
-    if (soap->zlib_in == SOAP_ZLIB_GZIP)
-    { soap_wchar c;
-      short i;
-      for (i = 0; i < 8; i++)
-      { if ((int)(c = soap_getchar(soap)) == EOF)
-          return soap->error = SOAP_EOF;
-        soap->z_buf[i] = (char)c;
-      }
-      if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24)))
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-      if (soap->d_stream.total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24)))
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: incorrect message length\n"));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-    }
-#endif
-  }
-#endif
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    while ((int)soap_getchar(soap) != EOF) /* advance to last chunk */
-      ;
-  if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap)))
-    return soap->error;
-  return soap_resolve(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_free(struct soap *soap)
-{ register struct soap_nlist *np;
-  register struct soap_attribute *tp;
-  register struct Namespace *ns;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n"));
-  while (soap->nlist)
-  { np = soap->nlist->next;
-    if (soap->nlist->ns)
-      SOAP_FREE(soap->nlist->ns);
-    SOAP_FREE(soap->nlist);
-    soap->nlist = np;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n"));
-  while (soap->blist)
-    soap_end_block(soap);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attributes\n"));
-  while (soap->attributes)
-  { tp = soap->attributes->next;
-    if (soap->attributes->value)
-      SOAP_FREE(soap->attributes->value);
-    SOAP_FREE(soap->attributes);
-    soap->attributes = tp;
-  }
-#ifdef WITH_FAST
-  if (soap->labbuf)
-    SOAP_FREE(soap->labbuf);
-  soap->labbuf = NULL;
-  soap->lablen = 0;
-  soap->labidx = 0;
-#endif
-  soap_free_pht(soap);
-  soap_free_iht(soap);
-  ns = soap->local_namespaces;
-  if (ns)
-  { for (; ns->id; ns++)
-    { if (ns->out)
-      { SOAP_FREE(ns->out);
-       if (soap->encodingStyle == ns->out)
-          soap->encodingStyle = SOAP_STR_EOS;
-        ns->out = NULL;
-      }
-      if (soap->encodingStyle == ns->ns)
-        soap->encodingStyle = SOAP_STR_EOS;
-    }
-    SOAP_FREE(soap->local_namespaces);
-    soap->local_namespaces = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-static void
-soap_init_logs(struct soap *soap)
-{ int i;
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-  { soap->logfile[i] = NULL;
-    soap->fdebug[i] = NULL;
-  }
-  soap_set_recv_logfile(soap, "RECV.log");
-  soap_set_sent_logfile(soap, "SENT.log");
-  soap_set_test_logfile(soap, "TEST.log");
-}
-#endif
-
-/******************************************************************************/
-#if !defined(WITH_LEAN) || defined(SOAP_DEBUG)
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_open_logfile(struct soap *soap, int i)
-{ if (soap->logfile[i])
-    soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a");
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-static void
-soap_close_logfile(struct soap *soap, int i)
-{ if (soap->fdebug[i])
-  { fclose(soap->fdebug[i]);
-    soap->fdebug[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_close_logfiles(struct soap *soap)
-{ int i;
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-    soap_close_logfile(soap, i);
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-static void
-soap_set_logfile(struct soap *soap, int i, const char *logfile)
-{ char *s = NULL;
-  soap_close_logfile(soap, i);
-  if (soap->logfile[i])
-    SOAP_FREE((void*)soap->logfile[i]);
-  if (logfile)
-    if ((s = (char*)SOAP_MALLOC(strlen(logfile) + 1)))
-      strcpy(s, logfile);
-  soap->logfile[i] = s;
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_recv_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_RECV, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_sent_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_SENT, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_test_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_TEST, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_copy(struct soap *soap)
-{ return soap_copy_context((struct soap*)SOAP_MALLOC(sizeof(struct soap)), soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_copy_context(struct soap *copy, struct soap *soap)
-{ if (copy)
-  { register struct soap_plugin *p;
-    memcpy(copy, soap, sizeof(struct soap));
-    copy->copy = 1;
-    copy->user = NULL;
-    copy->userid = NULL;
-    copy->passwd = NULL;
-    copy->nlist = NULL;
-    copy->blist = NULL;
-    copy->clist = NULL;
-    copy->alist = NULL;
-    copy->attributes = NULL;
-    copy->local_namespaces = NULL;
-    soap_set_local_namespaces(copy);
-    soap_init_iht(copy);
-    soap_init_pht(copy);
-    copy->header = NULL;
-    copy->fault = NULL;
-    copy->action = NULL;
-    *copy->host = '\0';
-#ifndef WITH_LEAN
-#ifdef WITH_COOKIES
-    copy->cookies = soap_copy_cookies(soap);
-#else
-    copy->cookies = NULL;
-#endif
-#endif
-#ifdef SOAP_DEBUG
-    soap_init_logs(copy);
-#endif
-    copy->plugins = NULL;
-    for (p = soap->plugins; p; p = p->next)
-    { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin));
-      if (!q)
-        return NULL;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id));
-      *q = *p;
-      if (p->fcopy && (soap->error = p->fcopy(soap, q, p)))
-      { SOAP_FREE(q);
-        return NULL;
-      }
-      q->next = copy->plugins;
-      copy->plugins = q;
-    }
-  }
-  else
-    soap->error = SOAP_EOM;
-  return copy;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init(struct soap *soap)
-{ soap->version = 0;
-  soap_imode(soap, SOAP_IO_DEFAULT);
-  soap_omode(soap, SOAP_IO_DEFAULT);
-  soap->copy = 0;
-  soap->plugins = NULL;
-  soap->user = NULL;
-  soap->userid = NULL;
-  soap->passwd = NULL;
-  soap->fpost = http_post;
-  soap->fget = http_get;
-  soap->fposthdr = http_post_header;
-  soap->fresponse = http_response;
-  soap->fparse = http_parse;
-  soap->fparsehdr = http_parse_header;
-  soap->fconnect = NULL;
-  soap->fdisconnect = NULL;
-#ifndef MAC_CARBON
-#ifndef WITH_IPV6
-  soap->fresolve = tcp_gethost;
-#else
-  soap->fresolve = NULL;
-#endif
-  soap->faccept = tcp_accept;
-  soap->fopen = tcp_connect;
-  soap->fclose = tcp_disconnect;
-  soap->fclosesocket = tcp_closesocket;
-  soap->fshutdownsocket = tcp_shutdownsocket;
-  soap->fsend = fsend;
-  soap->frecv = frecv;
-  soap->fpoll = soap_poll;
-#else
-  soap->fpoll = NULL;
-#endif
-  soap->fprepareinit = NULL;
-  soap->fpreparesend = NULL;
-  soap->fpreparerecv = NULL;
-  soap->fignore = NULL;
-  soap->fserveloop = NULL;
-  soap->fplugin = fplugin;
-  soap->fdimereadopen = NULL;
-  soap->fdimewriteopen = NULL;
-  soap->fdimereadclose = NULL;
-  soap->fdimewriteclose = NULL;
-  soap->fdimeread = NULL;
-  soap->fdimewrite = NULL;
-  soap->float_format = "%.8g"; /* .8 preserves single FP precision as much as possible, but might not be very efficient */
-  soap->double_format = "%.17lg"; /* .17 preserves double FP precision as much as possible, but might not be very efficient */
-  soap->dime_id_format = "cid:id%d"; /* default DIME id format */
-  soap->http_version = "1.1";
-  soap->actor = NULL;
-  soap->max_keep_alive = SOAP_MAXKEEPALIVE;
-  soap->keep_alive = 0;
-  soap->recv_timeout = 0;
-  soap->send_timeout = 0;
-  soap->connect_timeout = 0;
-  soap->accept_timeout = 0;
-  soap->socket_flags = 0;
-  soap->connect_flags = 0;
-  soap->bind_flags = 0;
-  soap->accept_flags = 0;
-  soap->ip = 0;
-  soap->labbuf = NULL;
-  soap->lablen = 0;
-  soap->labidx = 0;
-  soap->encodingStyle = SOAP_STR_EOS;
-#ifndef WITH_NONAMESPACES
-  soap->namespaces = namespaces;
-#else
-  soap->namespaces = NULL;
-#endif
-  soap->local_namespaces = NULL;
-  soap->nlist = NULL;
-  soap->blist = NULL;
-  soap->clist = NULL;
-  soap->alist = NULL;
-  soap->attributes = NULL;
-  soap->header = NULL;
-  soap->fault = NULL;
-  soap->master = SOAP_INVALID_SOCKET;
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->os = NULL;
-  soap->is = NULL;
-  soap->dom = NULL;
-  soap->dime.list = NULL;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-  soap->mime.list = NULL;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->mime.boundary = NULL;
-  soap->mime.start = NULL;
-#ifndef UNDER_CE
-  soap->recvfd = 0;
-  soap->sendfd = 1;
-#else
-  soap->recvfd = stdin;
-  soap->sendfd = stdout;
-#endif 
-  soap->host[0] = '\0';
-  soap->port = 0;
-  soap->action = NULL;
-  soap->proxy_host = NULL;
-  soap->proxy_port = 8080;
-  soap->proxy_userid = NULL;
-  soap->proxy_passwd = NULL;
-  soap->authrealm = NULL;
-  soap->prolog = NULL;
-#ifdef WITH_OPENSSL
-  soap->fsslauth = ssl_auth_init;
-  soap->fsslverify = ssl_verify_callback;
-  soap->bio = NULL;
-  soap->ssl = NULL;
-  soap->ctx = NULL;
-  soap->require_server_auth = 0;
-  soap->require_client_auth = 0;
-  soap->rsa = 0;
-  soap->keyfile = NULL;
-  soap->password = NULL;
-  soap->dhfile = NULL;
-  soap->cafile = NULL;
-  soap->capath = NULL;
-  soap->randfile = NULL;
-  soap->session = NULL;
-#endif
-#ifdef WITH_ZLIB
-  soap->zlib_state = SOAP_ZLIB_NONE;
-  soap->zlib_in = SOAP_ZLIB_NONE;
-  soap->zlib_out = SOAP_ZLIB_NONE;
-  soap->d_stream.zalloc = NULL;
-  soap->d_stream.zfree = NULL;
-  soap->d_stream.opaque = NULL;
-  soap->z_level = 6;
-#endif
-#ifndef WITH_LEAN
-  soap->cookies = NULL;
-  soap->cookie_domain = NULL;
-  soap->cookie_path = NULL;
-  soap->cookie_max = 32;
-#endif
-#ifdef SOAP_DEBUG
-  soap_init_logs(soap);
-#endif
-/* WR[ */
-#ifdef WMW_RPM_IO
-  soap->rpmreqid = NULL;
-#endif /* WMW_RPM_IO */
-/* ]WR */
-  soap_init_iht(soap);
-  soap_init_pht(soap);
-  soap_begin(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init1(struct soap *soap, int mode)
-{ soap_init2(soap, mode, mode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init2(struct soap *soap, int imode, int omode)
-{ soap_init(soap);
-  soap_imode(soap, imode);
-  soap_omode(soap, omode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_begin(struct soap *soap)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing\n"));
-  if (!soap->keep_alive)
-  { soap->buflen = 0;
-    soap->bufidx = 0;
-  }
-  soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0);
-  soap->null = 0;
-  soap->position = 0;
-  soap->encoding = 0;
-  soap->mustUnderstand = 0;
-  soap->mode = 0;
-  soap->ns = 0;
-  soap->part = SOAP_BEGIN;
-  soap->alloced = 0;
-  soap->count = 0;
-  soap->length = 0;
-  soap->cdata = 0;
-  soap->error = SOAP_OK;
-  soap->peeked = 0;
-  soap->ahead = 0;
-  soap->idnum = 0;
-  soap->level = 0;
-  soap->endpoint[0] = '\0';
-  soap->dime.chunksize = 0;
-  soap->dime.buflen = 0;
-  soap_free(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_end(struct soap *soap)
-{ register struct soap_clist *cp;
-  soap_free(soap);
-  soap_dealloc(soap, NULL);
-  while (soap->clist)
-  { cp = soap->clist->next;
-    SOAP_FREE(soap->clist);
-    soap->clist = cp;
-  }
-  soap_closesock(soap);
-#ifdef SOAP_DEBUG
-  soap_close_logfiles(soap);
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_namespaces(struct soap *soap, struct Namespace *p)
-{ struct Namespace *ns = soap->local_namespaces;
-  struct soap_nlist *np, *nq, *nr;
-  unsigned int level = soap->level;
-  soap->namespaces = p;
-  soap->local_namespaces = NULL;
-  soap_set_local_namespaces(soap);
-  /* reverse the list */
-  np = soap->nlist;
-  soap->nlist = NULL;
-  if (np)
-  { nq = np->next;
-    np->next = NULL;
-    while (nq)
-    { nr = nq->next;
-      nq->next = np;
-      np = nq;
-      nq = nr;
-    }
-  }
-  while (np)
-  { soap->level = np->level; /* preserve element nesting level */
-    if (np->ns)
-    { if (soap_push_namespace(soap, np->id, np->ns))
-        return soap->error;
-    }
-    else if (np->index >= 0 && ns)
-    { if (ns[np->index].out)
-      { if (soap_push_namespace(soap, np->id, ns[np->index].out))
-          return soap->error;
-      }
-      else if (soap_push_namespace(soap, np->id, ns[np->index].ns))
-        return soap->error;
-    }
-    if (np->ns)
-      SOAP_FREE(np->ns);
-    nq = np;
-    np = np->next;
-    SOAP_FREE(nq);
-  }
-  if (ns)
-  { int i;
-    for (i = 0; ns[i].id; i++)
-    { if (ns[i].out)
-      { SOAP_FREE(ns[i].out);
-        ns[i].out = NULL;
-      }
-    }
-    SOAP_FREE(ns);
-  }
-  soap->level = level; /* restore level */
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-soap_set_local_namespaces(struct soap *soap)
-{ if (soap->namespaces && !soap->local_namespaces)
-  { register const struct Namespace *ns1;
-    register struct Namespace *ns2;
-    register size_t n = 1;
-    for (ns1 = soap->namespaces; ns1->id; ns1++)
-      n++;
-    if (n > 3)
-    { n *= sizeof(struct Namespace);
-      ns2 = (struct Namespace*)SOAP_MALLOC(n);
-      if (ns2)
-      { memcpy(ns2, soap->namespaces, n);
-        ns2[0].id = "SOAP-ENV";
-        ns2[1].id = "SOAP-ENC";
-        ns2[2].id = "xsi";
-        if (ns2[0].ns)
-        { if (!strcmp(ns2[0].ns, soap_env1))
-            soap->version = 1;
-          else
-            soap->version = 2;
-        }
-        soap->local_namespaces = ns2;
-      }
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element(struct soap *soap, const char *tag, int id, const char *type)
-{ struct Namespace *ns = soap->local_namespaces;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' id='%d' type='%s'\n", tag, id, type?type:""));
-/**/
-#ifdef WITH_DOM
-  if (soap->mode & SOAP_XML_DOM)
-  { register struct soap_dom_element *p, *e = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
-    e->next = NULL;
-    e->prnt = soap->dom;
-    e->nstr = NULL;
-    e->name = soap_strdup(soap, tag); /* check EOM? */
-    e->data = NULL;
-    e->type = 0;
-    e->node = NULL;
-    e->elts = NULL;
-    e->atts = NULL;
-    if (soap->dom)
-    { p = soap->dom->elts;
-      if (p)
-      { while (p->next)
-          p = p->next;
-        p->next = e;
-      }
-      else
-        soap->dom->elts = e;
-    }
-    soap->dom = e;
-  }
-  else
-#endif
-{
-  soap->level++;
-  if (!soap->ns && !(soap->mode & SOAP_XML_CANONICAL))
-    if (soap_send(soap, soap->prolog ? soap->prolog : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"))
-      return soap->error;
-  if (soap_send_raw(soap, "<", 1)
-   || soap_send(soap, tag))
-    return soap->error;
-}
-/**/
-  if (!soap->ns)
-  { for (ns = soap->local_namespaces; ns && ns->id; ns++)
-    { if (*ns->id && (ns->out || ns->ns))
-      { sprintf(soap->tmpbuf, "xmlns:%s", ns->id);
-        if (soap_attribute(soap, soap->tmpbuf, ns->out ? ns->out : ns->ns))
-          return soap->error;
-      }
-    }   
-    soap->ns = 1;
-  }
-  if (id > 0)
-  { sprintf(soap->tmpbuf, "_%d", id);
-    if (soap_attribute(soap, "id", soap->tmpbuf))
-      return soap->error;
-  }
-  if (type && *type)
-  { if (soap_attribute(soap, "xsi:type", type))
-      return soap->error;
-  }
-  if (soap->null && soap->position > 0)
-  { int i;
-    sprintf(soap->tmpbuf, "[%d", soap->positions[0]);
-    for (i = 1; i < soap->position; i++)
-      sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ",%d", soap->positions[i]);
-    strcat(soap->tmpbuf, "]");
-    if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf))
-      return soap->error;
-  }
-  if (soap->mustUnderstand)
-  { if (soap->actor && *soap->actor)
-    { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor))
-        return soap->error;
-    }
-    if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1"))
-      return soap->error;
-    soap->mustUnderstand = 0;
-  }
-  if (soap->encoding)
-  { if (soap->encodingStyle && soap->local_namespaces)
-    { if (!*soap->encodingStyle)
-      { if (soap->local_namespaces[1].out)
-          soap->encodingStyle = soap->local_namespaces[1].out;
-        else
-          soap->encodingStyle = soap->local_namespaces[1].ns;
-      }
-      if (soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle))
-        return soap->error;
-    }
-    soap->encoding = 0;
-  }
-  soap->null = 0;
-  soap->position = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type)
-{ if (*tag == '-')
-    return SOAP_OK;
-  if (soap_element(soap, tag, id, type))
-    return soap->error;
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRRCHR
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_strrchr(const char *s, int t)
-{ register char *r = NULL;
-  while (*s)
-    if (*s++ == t)
-      r = (char*)s - 1;
-  return r;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRTOL
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_strtol(const char *s, char **t, int b)
-{ register long n = 0;
-  register int c;
-  while (*s > 0 && *s <= 32)
-    s++;
-  if (b == 10)
-  { short neg = 0;
-    if (*s == '-')
-    { s++;
-      neg = 1;
-    }
-    else if (*s == '+')
-      s++;
-    while ((c = *s) && c >= '0' && c <= '9')
-    { if (n > 214748364)
-        break;
-      n *= 10;
-      n += c - '0';
-      s++;
-    }
-    if (neg)
-      n = -n;
-  }
-  else /* b == 16 and value is always positive */
-  { while ((c = *s))
-    { if (c >= '0' && c <= '9')
-        c -= '0';
-      else if (c >= 'A' && c <= 'F')
-        c -= 'A' - 10;
-      else if (c >= 'a' && c <= 'f')
-        c -= 'a' - 10;
-      if (n > 0x07FFFFFF)
-        break;
-      n <<= 4;
-      n += c;
-      s++;
-    }
-  }
-  if (t)
-    *t = (char*)s;
-  return n;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRTOUL
-SOAP_FMAC1
-unsigned long
-SOAP_FMAC2
-soap_strtoul(const char *s, char **t, int b)
-{ unsigned long n = 0;
-  register int c;
-  while (*s > 0 && *s <= 32)
-    s++;
-  if (b == 10)
-  { if (*s == '+')
-      s++;
-    while ((c = *s) && c >= '0' && c <= '9')
-    { if (n > 429496729)
-        break;
-      n *= 10;
-      n += c - '0';
-      s++;
-    }
-  }
-  else /* b == 16 */
-  { while ((c = *s))
-    { if (c >= '0' && c <= '9')
-        c -= '0';
-      else if (c >= 'A' && c <= 'F')
-        c -= 'A' - 10;
-      else if (c >= 'a' && c <= 'f')
-        c -= 'a' - 10;
-      if (n > 0x0FFFFFFF)
-        break;
-      n <<= 4;
-      n += c;
-      s++;
-    }
-  }
-  if (t)
-    *t = (char*)s;
-  return n;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset)
-{ if (soap_element(soap, tag, id, "SOAP-ENC:Array"))
-    return soap->error;
-  if (soap->version == 2)
-  { const char *s;
-    s = soap_strrchr(type, '[');
-    if ((size_t)(s - type) < sizeof(soap->tmpbuf))
-    { strncpy(soap->tmpbuf, type, s - type);
-      soap->tmpbuf[s - type] = '\0';
-      if (type && *type && (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)))
-        return soap->error;
-      if (s && (soap_attribute(soap, "SOAP-ENC:arraySize", s + 1)))
-        return soap->error;
-    }
-  }
-  else
-  { if (offset && (soap_attribute(soap, "SOAP-ENC:offset", offset)))
-      return soap->error;
-    if (type && *type && (soap_attribute(soap, "SOAP-ENC:arrayType", type)))
-      return soap->error;
-  }
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_start_end_out(struct soap *soap, const char *tag)
-{ register struct soap_attribute *tp;
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { for (tp = soap->attributes; tp; tp = tp->next)
-    { if (tp->visible)
-      { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
-       a->next = soap->dom->atts;
-        a->nstr = NULL;
-        a->name = soap_strdup(soap, tp->name); /* check EOM */
-        a->data = soap_strdup(soap, tp->value); /* check EOM */
-        a->wide = NULL;
-       soap->dom->atts = a;
-        tp->visible = 0;
-      }
-    }
-    return SOAP_OK;
-  }
-#endif
-/**/
-  for (tp = soap->attributes; tp; tp = tp->next)
-  { if (tp->visible)
-    { if (soap_send2(soap, " ", tp->name))
-        return soap->error;
-      if (tp->visible == 2 && tp->value)
-        if (soap_send_raw(soap, "=\"", 2)
-        || soap_string_out(soap, tp->value, 1)
-        || soap_send_raw(soap, "\"", 1))
-          return soap->error;
-      tp->visible = 0;
-    }
-  }
-  if (tag)
-  { soap->level--;
-#ifndef WITH_LEAN
-    if (soap->mode & SOAP_XML_CANONICAL)
-    { if (soap_send_raw(soap, ">", 1)
-       || soap_element_end_out(soap, tag))
-        return soap->error;
-      return SOAP_OK;
-    }
-#endif
-    return soap_send_raw(soap, "/>", 2);
-  }
-  return soap_send_raw(soap, ">", 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_end_out(struct soap *soap, const char *tag)
-{ if (*tag == '-')
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag));
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { if (soap->dom->prnt)
-      soap->dom = soap->dom->prnt;
-    return SOAP_OK;
-  }
-#endif
-/**/
-  soap->level--;
-  if (soap_send_raw(soap, "</", 2)
-   || soap_send(soap, tag))
-    return soap->error;
-  return soap_send_raw(soap, ">", 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_ref(struct soap *soap, const char *tag, int id, int href)
-{ register int n = 0;
-  if (soap->version == 2)
-    n = 1;
-  sprintf(soap->href, "#_%d", href);
-  return soap_element_href(soap, tag, id, "href" + n, soap->href + n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val));
-  if (soap_element(soap, tag, id, NULL)
-   || soap_attribute(soap, ref, val)
-   || soap_element_start_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_null(struct soap *soap, const char *tag, int id, const char *type)
-{ struct soap_attribute *tp;
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (tp->visible)
-      break;
-  if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL))
-  { if (soap_element(soap, tag, id, type))
-      return soap->error;
-    if (soap->part != SOAP_IN_HEADER && soap->encodingStyle)
-      if (soap_attribute(soap, "xsi:nil", "true"))
-        return soap->error;
-    return soap_element_start_end_out(soap, tag);
-  }
-  soap->null = 1;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, int n, const char *type, int t) 
-{ struct soap_plist *pp;
-  if (!p)
-  { soap_element_null(soap, tag, id, type);
-    return -1;
-  }
-  if (soap->mode & SOAP_XML_TREE)
-    return 0;
-  if (id < 0)
-  { if (a)
-      id = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
-    else
-      id = soap_pointer_lookup(soap, p, t, &pp);
-    if (id)
-    { if (soap_is_embedded(soap, pp))
-      { soap_element_ref(soap, tag, 0, id);
-        return -1;
-      }
-      if (soap_is_single(soap, pp))
-        return 0;
-      soap_set_embedded(soap, pp);
-    }
-  }
-  return id;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_result(struct soap *soap, const char *tag)
-{ if (soap->version == 2 && soap->encodingStyle)
-    if (soap_element(soap, "SOAP-RPC:result", 0, NULL)
-     || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc)
-     || soap_element_start_end_out(soap, NULL)
-     || soap_string_out(soap, tag, 0)
-     || soap_element_end_out(soap, "SOAP-RPC:result"))
-      return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_attribute(struct soap *soap, const char *name, const char *value)
-{ 
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
-    a->next = soap->dom->atts;
-    a->nstr = NULL;
-    a->name = soap_strdup(soap, name); /* check EOM */
-    a->data = soap_strdup(soap, value); /* check EOM */
-    a->wide = NULL;
-    soap->dom->atts = a;
-    return SOAP_OK;
-  }
-#endif
-/**/
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { if (soap_set_attr(soap, name, value))
-      return soap->error;
-  }
-  else
-#endif
-  { if (soap_send2(soap, " ", name))
-      return soap->error;
-    if (value)
-      if (soap_send_raw(soap, "=\"", 2)
-       || soap_string_out(soap, value, 1)
-       || soap_send_raw(soap, "\"", 1))
-        return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_begin_in(struct soap *soap, const char *tag, int nillable)
-{ if (!soap_peek_element(soap))
-  { if (soap->other)
-      return soap->error = SOAP_TAG_MISMATCH;
-    if (tag && *tag == '-')
-      return SOAP_OK;
-    if (!(soap->error = soap_match_tag(soap, soap->tag, tag)))
-    { soap->peeked = 0;
-      if (soap->body)
-        soap->level++;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:"" ));
-      if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT))
-        return soap->error = SOAP_NULL;
-    }
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_end_in(struct soap *soap, const char *tag)  
-{ register soap_wchar c;
-  register char *s;
-  register const char *t;
-  if (tag && *tag == '-')
-    return SOAP_OK;
-  soap->level--;
-  soap_pop_namespace(soap);
-  if (soap->peeked)
-  { if (*soap->tag == '\0')
-    { soap->peeked = 0;
-      if (soap->error == SOAP_NO_TAG || soap->error == SOAP_TAG_END)
-        soap->error = SOAP_OK;
-    }
-    else
-      return soap->error = SOAP_TAG_END;
-  }
-  else
-  { while (((c = soap_get(soap)) != SOAP_TT))
-    { if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      if (c == SOAP_LT)
-        return soap->error = SOAP_TAG_END;
-    }
-  }
-  s = soap->tag;
-  do c = soap_get(soap);
-  while (soap_blank(c));
-  do
-  { *s++ = (char)c;
-    c = soap_get(soap);
-  } while (soap_notblank(c));
-  *s = '\0';
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  while (soap_blank(c))
-    c = soap_get(soap);
-  if (c != SOAP_GT)
-    return soap->error = SOAP_SYNTAX_ERROR;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:""));
-  if (!tag)
-    return SOAP_OK;
-  if ((s = strchr(soap->tag, ':')))
-    s++;
-  else
-    s = soap->tag;
-  if ((t = strchr(tag, ':')))
-    t++;
-  else
-    t = tag;
-  if (!SOAP_STRCMP(s, t))
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element tag name does not match\n"));
-  return soap->error = SOAP_SYNTAX_ERROR;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char *
-SOAP_FMAC2
-soap_attr_value(struct soap *soap, const char *name, int flag)
-{ register struct soap_attribute *tp;
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (!soap_match_tag(soap, tp->name, name))
-      break;
-  if (tp && tp->visible == 2)
-  { if (flag == 2 && (soap->mode & SOAP_XML_STRICT))
-      soap->error = SOAP_PROHIBITED;
-    else
-      return tp->value;
-  }
-  else if (flag == 1 && (soap->mode & SOAP_XML_STRICT))
-    soap->error = SOAP_REQUIRED;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_attr(struct soap *soap, const char *name, const char *value)
-{ register struct soap_attribute *tp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value?value:""));
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (!strcmp(tp->name, name))
-      break;
-  if (!tp)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name));
-    if (!(tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(name))))
-      return soap->error = SOAP_EOM;
-    tp->ns = NULL;
-#ifndef WITH_LEAN
-    if (soap->mode & SOAP_XML_CANONICAL)
-    { struct soap_attribute **tpp = &soap->attributes;
-      const char *s = strchr(name, ':');
-      if (!strncmp(name, "xmlns", 5))
-      { for (; *tpp; tpp = &(*tpp)->next)
-          if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0)
-            break;
-      }
-      else if (!s)
-      { for (; *tpp; tpp = &(*tpp)->next)
-          if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0))
-            break;
-      }
-      else
-      { int k;
-        for (; *tpp; tpp = &(*tpp)->next)
-       { if (!strncmp((*tpp)->name, "xmlns:", 6) && !strncmp((*tpp)->name + 6, name, s - name) && !(*tpp)->name[6 + s - name])
-         { if (!tp->ns)
-            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Canonicalization: prefix %s=%p(%s)\n", name, (*tpp)->ns, (*tpp)->ns));
-             tp->ns = (*tpp)->ns;
-           }
-         }
-          else if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0)))
-            break;
-        }
-      }
-      tp->next = *tpp;
-      *tpp = tp;
-    }
-    else
-#endif
-    { tp->next = soap->attributes;
-      soap->attributes = tp;
-    }
-    strcpy(tp->name, name);
-    tp->value = NULL;
-  }
-  else if (value && tp->value && tp->size <= strlen(value))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value));
-    SOAP_FREE(tp->value);
-    tp->value = NULL;
-    tp->ns = NULL;
-  }
-  if (value)
-  { if (!tp->value)
-    { tp->size = strlen(value) + 1;
-      if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
-        return soap->error = SOAP_EOM;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value of %s (%p)\n", tp->name, tp->value));
-    }
-    strcpy(tp->value, value);
-    if (!strncmp(tp->name, "xmlns:", 6))
-      tp->ns = tp->value;
-    tp->visible = 2;
-  }
-  else
-    tp->visible = 1;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_attr(struct soap *soap)
-{ register struct soap_attribute *tp;
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { while (soap->attributes)
-    { tp = soap->attributes->next;
-      SOAP_FREE(soap->attributes->value);
-      SOAP_FREE(soap->attributes);
-      soap->attributes = tp;
-    }
-  }
-  else
-#endif
-  { for (tp = soap->attributes; tp; tp = tp->next)
-      tp->visible = 0;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int
-soap_getattrval(struct soap *soap, char *s, size_t n, soap_wchar d)
-{ size_t i;
-  soap_wchar c;
-  for (i = 0; i < n; i++)
-  { c = soap_getutf8(soap);
-    switch (c)
-    {
-    case SOAP_TT:
-      *s++ = '<';
-      soap_unget(soap, '/');
-      break;
-    case SOAP_LT:
-      *s++ = '<';
-      break;
-    case SOAP_GT:
-      if (d == ' ')
-      { soap_unget(soap, c);
-        *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '>';
-      break;
-    case SOAP_QT:
-      if (c == d)
-      { *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '"';
-      break;
-    case SOAP_AP:
-      if (c == d)
-      { *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '\'';
-      break;
-    case '\t':
-    case '\n':
-    case '\r':
-    case ' ':
-    case '/':
-      if (d == ' ')
-      { soap_unget(soap, c);
-        *s = '\0';
-        return SOAP_OK;
-      }
-    default:
-      if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      *s++ = (char)c;
-    }
-  }
-  return soap->error = SOAP_EOM;
-}
-#endif
-
-/******************************************************************************/
-#ifdef WITH_FAST
-#ifndef PALM_2
-static int 
-soap_append_lab(struct soap *soap, const char *s, size_t n)
-{ if (soap->labidx + n >= soap->lablen)
-  { register char *t = soap->labbuf;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, old size=%lu", (unsigned long)soap->lablen));
-    if (soap->lablen == 0)
-      soap->lablen = SOAP_LABLEN;
-    while (soap->labidx + n >= soap->lablen)
-      soap->lablen <<= 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, ", new size=%lu\n", (unsigned long)soap->lablen));
-    soap->labbuf = (char*)SOAP_MALLOC(soap->lablen);
-    if (!soap->labbuf)
-    { if (t)
-        free(t);
-      return soap->error = SOAP_EOM;
-    }
-    if (t && soap->labidx)
-    { memcpy(soap->labbuf, t, soap->labidx);
-      free(t);
-    }
-  }
-  if (s)
-  { memcpy(soap->labbuf + soap->labidx, s, n);
-    soap->labidx += n;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_peek_element(struct soap *soap)
-{ register struct soap_attribute *tp;
-  const char *t;
-  register char *s;
-  register soap_wchar c;
-  register int i;
-  if (soap->error == SOAP_NO_TAG || soap->error == SOAP_TAG_END || soap->error == SOAP_TAG_MISMATCH)
-    soap->error = SOAP_OK;     /* retry */
-  if (soap->peeked)
-  { if (*soap->tag == '\0')
-      return soap->error = SOAP_NO_TAG;
-    return SOAP_OK;
-  }
-  soap->peeked = 1;
-  for (;;)
-  { while (((c = soap_getutf8(soap)) != SOAP_LT) && c != SOAP_TT)
-    { if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-    }
-    if (c == SOAP_TT)
-    { *soap->tag = '\0';
-      return soap->error = SOAP_NO_TAG; /* ending tag found */
-    }
-    s = soap->tag;
-    do c = soap_get(soap);
-    while (soap_blank(c));
-    i = sizeof(soap->tag);
-    while (c != '/' && soap_notblank(c))
-    { if (--i > 0)
-        *s++ = (char)c;
-      c = soap_get(soap);
-    }
-    while (soap_blank(c))
-      c = soap_get(soap);
-    *s = '\0';
-    if (*soap->tag != '?')
-      break;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI <%s?>\n", soap->tag));
-    while ((int)c != EOF && c != SOAP_GT && c != '?')
-    { s = soap->tmpbuf;
-      i = sizeof(soap->tmpbuf) - 2;
-      while (c != '=' && c != SOAP_GT && c != '?' && soap_notblank(c))
-      { if (--i > 0)
-          *s++ = (char)c;
-        c = soap_get(soap);
-      }
-      while (soap_blank(c))
-        c = soap_get(soap);
-      if (c == '=')
-      { *s++ = '=';
-       do c = soap_get(soap);
-        while (soap_blank(c));
-        if (c != SOAP_QT && c != SOAP_AP)
-        { soap_unget(soap, c);
-          c = ' '; /* blank delimiter */
-        }
-        if (soap_getattrval(soap, s, i, c) == SOAP_EOM)
-         while (soap_getattrval(soap, soap->tmpbuf, sizeof(soap->tmpbuf), c) == SOAP_EOM)
-           ;
-        else if (!strcmp(soap->tag, "?xml") && (!soap_tag_cmp(soap->tmpbuf, "encoding=iso-8859-1") || !soap_tag_cmp(soap->tmpbuf, "encoding=latin1")))
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML latin1 encoding\n"));
-          soap->mode |= SOAP_ENC_LATIN;
-        }
-      }
-      do c = soap_get(soap);
-      while (soap_blank(c));
-    }
-  }
-  soap->id[0] = '\0';
-  soap->href[0] = '\0';
-  soap->type[0] = '\0';
-  soap->arrayType[0] = '\0';
-  soap->arraySize[0] = '\0';
-  soap->arrayOffset[0] = '\0';
-  soap->other = 0;
-  soap->root = -1;
-  soap->position = 0;
-  soap->null = 0;
-  soap->mustUnderstand = 0;
-  soap_clr_attr(soap);
-  while ((int)c != EOF && c != SOAP_GT && c != '/')
-  { s = soap->tmpbuf;
-    i = sizeof(soap->tmpbuf);
-    while (c != '=' && c != '/' && soap_notblank(c))
-    { if (--i > 0)
-        *s++ = (char)c;
-      c = soap_get(soap);
-    }
-    *s = '\0';
-    if (i == sizeof(soap->tmpbuf))
-      return soap->error = SOAP_SYNTAX_ERROR;
-    if (!strncmp(soap->tmpbuf, "xmlns:", 6))
-    { soap->tmpbuf[5] = '\0';
-      t = soap->tmpbuf + 6;
-    }
-    else if (!strcmp(soap->tmpbuf, "xmlns"))
-      t = SOAP_STR_EOS;
-    else
-      t = NULL;
-    for (tp = soap->attributes; tp; tp = tp->next)
-      if (!SOAP_STRCMP(tp->name, soap->tmpbuf))
-        break;
-    if (!tp)
-    { tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(soap->tmpbuf));
-      if (!tp)
-        return soap->error = SOAP_EOM;
-      strcpy(tp->name, soap->tmpbuf);
-      tp->value = NULL;
-      tp->size = 0;
-      tp->next = soap->attributes;
-      soap->attributes = tp;
-    }
-    while (soap_blank(c))
-      c = soap_get(soap);
-    if (c == '=')
-    { do c = soap_get(soap);
-      while (soap_blank(c));
-      if (c != SOAP_QT && c != SOAP_AP)
-      { soap_unget(soap, c);
-        c = ' '; /* blank delimiter */
-      }
-      if (soap_getattrval(soap, tp->value, tp->size, c))
-      {
-#ifdef WITH_FAST
-        if (soap->error != SOAP_EOM)
-          return soap->error;
-        soap->error = SOAP_OK;
-       soap->labidx = 0;
-       if (soap_append_lab(soap, tp->value, tp->size))
-         return soap->error;
-       SOAP_FREE(tp->value);
-       for (;;)
-       { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c))
-         { if (soap->error != SOAP_EOM)
-             return soap->error;
-            soap->error = SOAP_OK;
-           soap->labidx = soap->lablen;
-           if (soap_append_lab(soap, NULL, 0))
-             return soap->error;
-         }
-         else
-           break;
-       }
-        tp->size = soap->lablen;
-       if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
-         return soap->error = SOAP_EOM;
-        memcpy(tp->value, soap->labbuf, soap->lablen);
-#else
-       size_t n;
-        if (soap->error != SOAP_EOM)
-          return soap->error;
-        soap->error = SOAP_OK;
-        if (soap_new_block(soap))
-          return soap->error;
-        for (;;)
-        { if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
-            return soap->error;
-          if (soap_getattrval(soap, s, SOAP_BLKLEN, c))
-          { if (soap->error != SOAP_EOM)
-              return soap->error;
-            soap->error = SOAP_OK;
-          }
-          else
-            break;
-        }
-       n = tp->size + soap->blist->size;
-        if (!(s = (char*)SOAP_MALLOC(n)))
-          return soap->error = SOAP_EOM;
-        if (tp->value)
-        { memcpy(s, tp->value, tp->size);
-          SOAP_FREE(tp->value);
-        }
-        soap_save_block(soap, s + tp->size, 0);
-        tp->value = s;
-        tp->size = n;
-#endif
-      }
-      do c = soap_get(soap);
-      while (soap_blank(c));
-      tp->visible = 2; /* seen this attribute w/ value */
-    }
-    else
-      tp->visible = 1; /* seen this attribute w/o value */
-    if (t && tp->value)
-    { if (soap_push_namespace(soap, t, tp->value))
-        return soap->error;
-      tp->visible = 0;
-    }
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  for (tp = soap->attributes; tp; tp = tp->next)
-  { if (tp->visible && tp->value)
-    { if (!strcmp(tp->name, "id"))
-      { *soap->id = '#';
-        strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2);
-        soap->id[sizeof(soap->id)-1] = '\0';
-      }
-      else if (!strcmp(tp->name, "href"))
-      { strncpy(soap->href, tp->value, sizeof(soap->href) - 1);
-        soap->href[sizeof(soap->href)-1] = '\0';
-      }
-      else if ((soap->version == 2 || (soap->mode & SOAP_XML_GRAPH)) && !strcmp(tp->name, "ref"))
-      { *soap->href = '#';
-        strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2);
-        soap->href[sizeof(soap->href)-1] = '\0';
-      }
-      else if (!soap_match_tag(soap, tp->name, "xsi:type"))
-      { strncpy(soap->type, tp->value, sizeof(soap->type) - 1);
-        soap->type[sizeof(soap->type)-1] = '\0';
-      }
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType"))
-      { s = soap_strrchr(tp->value, '[');
-        if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType))
-        { strncpy(soap->arrayType, tp->value, s - tp->value);
-          soap->arrayType[s - tp->value] = '\0';
-          strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1);
-        }
-        else
-          strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
-        soap->arraySize[sizeof(soap->arrayType)-1] = '\0';
-        soap->arrayType[sizeof(soap->arrayType)-1] = '\0';
-      }
-      else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:itemType"))
-        strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
-      else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize"))
-        strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:offset"))
-        strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset));
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:position"))
-        soap->position = soap_getposition(tp->value, soap->positions);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:root"))
-        soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true")));
-      else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")
-            || !soap_match_tag(soap, tp->name, "SOAP-ENV:role"))
-      { if ((!soap->actor || strcmp(soap->actor, tp->value))
-         && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")
-         && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next"))
-          soap->other = 1;
-      }
-      else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
-            && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
-        soap->mustUnderstand = 1;
-      else if ((!soap_match_tag(soap, tp->name, "xsi:null")
-             || !soap_match_tag(soap, tp->name, "xsi:nil"))
-            && (!strcmp(tp->value, "1")
-             || !strcmp(tp->value, "true")))
-        soap->null = 1;
-    }
-  }
-  if (!(soap->body = (c != '/')))
-    do c = soap_get(soap);
-    while (soap_blank(c));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_retry(struct soap *soap)
-{ soap->peeked = 1;
-  soap->error = SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_revert(struct soap *soap)
-{ if (!soap->peeked)
-  { soap->peeked = 1;
-    if (soap->body)
-      soap->level--;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting last element (level=%u)\n", soap->level));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_string_out(struct soap *soap, const char *s, int flag)
-{ register const char *t;
-  register soap_wchar c;
-  register soap_wchar mask = 0x80000000;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->data = soap_strdup(soap, s); /* check EOM */
-    return SOAP_OK;
-  }
-#endif
-  if (soap->mode & SOAP_C_UTFSTRING)
-    mask = 0;
-  t = s;
-  while ((c = *t++))
-  { switch (c)
-    { 
-    case 9:
-      if (flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#x9;", 5))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case 10:
-      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xA;", 5))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case 13:
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xD;", 5))
-        return soap->error;
-      s = t;
-      break;
-    case '&':
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&amp;", 5))
-        return soap->error;
-      s = t;
-      break;
-    case '<':
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&lt;", 4))
-        return soap->error;
-      s = t;
-      break;
-    case '>':
-      if (!flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&gt;", 4))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case '"':
-      if (flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&quot;", 6))
-         return soap->error;
-        s = t;
-      }
-      break;
-    default:
-#ifdef HAVE_MBTOWC
-      if (soap->mode & SOAP_C_MBSTRING)
-      { wchar_t wc;
-        register int m = mbtowc(&wc, t - 1, MB_CUR_MAX);
-        if (m > 0 && wc != c)
-        { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, wc))
-            return soap->error;
-         s = t + m - 1;
-         continue;
-        }
-      }
-#endif
-      if (c & mask)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c))
-          return soap->error;
-        s = t;
-      }
-    }
-  }
-  return soap_send_raw(soap, s, t - s - 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_string_in(struct soap *soap, int flag, long minlen, long maxlen)
-{ register char *s;
-  char *t = NULL;
-  register size_t i;
-  register long l = 0;
-  register int n = 0;
-  register int m = 0;
-  register soap_wchar c;
-#ifdef HAVE_WCTOMB
-  char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8];
-#else
-  char buf[8];
-#endif
-#ifdef WITH_CDATA
-  if (!flag)
-  { register int state = 0;
-#ifdef WITH_FAST
-    soap->labidx = 0;                  /* use look-aside buffer */
-#else
-    if (soap_new_block(soap))
-      return NULL;
-#endif
-    for (;;)
-    { 
-#ifdef WITH_FAST
-      register size_t k;
-      if (soap_append_lab(soap, NULL, 0))      /* allocate more space in look-aside buffer if necessary */
-        return NULL;
-      s = soap->labbuf + soap->labidx; /* space to populate */
-      k = soap->lablen - soap->labidx; /* number of bytes available */
-      soap->labidx = soap->lablen;     /* claim this space */
-#else
-      register size_t k = SOAP_BLKLEN;
-      if (!(s = (char*)soap_push_block(soap, k)))
-        return NULL;
-#endif
-      for (i = 0; i < k; i++)
-      { if (m > 0)
-        { *s++ = *t++; /* copy multibyte characters */
-         m--;
-          continue;
-        }
-        c = soap_getchar(soap);
-       if ((int)c == EOF)
-          goto end;
-        if (c >= 0x80 && !(soap->mode & SOAP_ENC_LATIN))
-        { soap_unget(soap, c);
-         c = soap_getutf8(soap);
-         if (soap->mode & SOAP_C_UTFSTRING)
-          { if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP)
-            { c &= 0x7FFFFFFF;
-              t = buf;
-              if (c < 0x0800)
-                *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-              else
-              { if (c < 0x010000)
-                  *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-                else
-                { if (c < 0x200000)
-                    *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-                  else
-                  { if (c < 0x04000000)
-                      *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-                    else
-                    { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-                      *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-                    }
-                    *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-                  }     
-                  *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-                }
-                *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-              }
-              *t++ = (char)(0x80 | (c & 0x3F));
-             m = (int)(t - buf) - 1;
-              t = buf;
-              *s++ = *t++;
-              continue;
-           }
-          }
-        }
-       switch (state)
-        { case 1:
-            if (c == ']')
-             state = 4;
-           *s++ = c;
-           continue;
-         case 2:
-           if (c == '-')
-              state = 6;
-           *s++ = c;
-           continue;
-         case 3:
-           if (c == '?')
-             state = 8;
-           *s++ = c;
-           continue;
-          /* CDATA */
-         case 4:
-           if (c == ']')
-              state = 5;
-           else
-             state = 1;
-           *s++ = c;
-           continue;
-         case 5:
-           if (c == '>')
-             state = 0;
-           else
-             state = 1;
-           *s++ = c;
-           continue;
-          /* comment */
-          case 6:
-            if (c == '-')
-             state = 7;
-           else
-             state = 2;
-           *s++ = c;
-           continue;
-          case 7:
-            if (c == '>')
-             state = 0;
-           else
-             state = 2;
-           *s++ = c;
-           continue;
-          /* PI */
-         case 8:
-            if (c == '>')
-             state = 0;
-           else
-             state = 3;
-           *s++ = c;
-           continue;
-        }
-        switch (c)
-        {
-        case '/':
-          if (n > 0)
-          { c = soap_get1(soap);
-            if (c == '>')
-              n--;
-            soap_unget(soap, c);
-          }
-          *s++ = '/';
-          break;
-        case '<':
-         c = soap_get1(soap);
-         if (c == '/')
-         { if (n == 0)
-           { c = SOAP_TT;
-             goto end;
-           }
-           n--;
-         }
-         else if (c == '!')
-         { c = soap_get1(soap);
-           if (c == '[')
-            { do c = soap_get1(soap);
-              while ((int)c != EOF && c != '[');
-              if ((int)c == EOF)
-                 goto end;
-             t = (char*)"![CDATA[";
-             m = 8;
-             state = 1;
-           }
-            else if (c == '-')
-           { if ((c = soap_get1(soap)) == '-')
-               state = 2;
-             t = (char*)"!-";
-             m = 2;
-             soap_unget(soap, c);
-           }
-           else
-           { t = (char*)"!";
-             m = 1;
-             soap_unget(soap, c);
-           }
-           *s++ = '<';
-           break;
-         }
-         else if (c == '?')
-           state = 3;
-         else
-           n++;
-          soap_unget(soap, c);
-          *s++ = '<';
-          break;
-        case '>':
-          *s++ = '>';
-          break;
-        case '"':
-          *s++ = '"';
-          break;
-        default:
-#ifdef HAVE_WCTOMB
-          if (soap->mode & SOAP_C_MBSTRING)
-          { m = wctomb(buf, c & 0x7FFFFFFF);
-            if (m >= 1)
-            { t = buf;
-              *s++ = *t++;
-              m--;
-            }
-            else
-              *s++ = SOAP_UNKNOWN_CHAR;
-          }
-          else
-#endif
-            *s++ = (char)(c & 0xFF);
-        }
-       l++;
-        if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen)
-        { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
-          soap->error = SOAP_LENGTH;
-          return NULL;
-        }
-      }
-    }
-  }
-#endif
-#ifdef WITH_FAST
-  soap->labidx = 0;                    /* use look-aside buffer */
-#else
-  if (soap_new_block(soap))
-    return NULL;
-#endif
-  for (;;)
-  { 
-#ifdef WITH_FAST
-    register size_t k;
-    if (soap_append_lab(soap, NULL, 0))        /* allocate more space in look-aside buffer if necessary */
-      return NULL;
-    s = soap->labbuf + soap->labidx;   /* space to populate */
-    k = soap->lablen - soap->labidx;   /* number of bytes available */
-    soap->labidx = soap->lablen;       /* claim this space */
-#else
-    register size_t k = SOAP_BLKLEN;
-    if (!(s = (char*)soap_push_block(soap, k)))
-      return NULL;
-#endif
-    for (i = 0; i < k; i++)
-    { if (m > 0)
-      { *s++ = *t++;   /* copy multibyte characters */
-        m--;
-        continue;
-      }
-      if (soap->mode & SOAP_C_UTFSTRING)
-      { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP)
-        { c &= 0x7FFFFFFF;
-          t = buf;
-          if (c < 0x0800)
-            *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-          else
-          { if (c < 0x010000)
-              *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-            else
-            { if (c < 0x200000)
-                *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-              else
-              { if (c < 0x04000000)
-                  *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-                else
-                { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-                  *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-                }
-                *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-              }     
-              *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-            }
-            *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-          }
-          *t++ = (char)(0x80 | (c & 0x3F));
-         m = (int)(t - buf) - 1;
-          t = buf;
-          *s++ = *t++;
-          continue;
-        }
-      }
-      else
-        c = soap_getutf8(soap);
-      switch (c)
-      {
-      case SOAP_TT:
-        if (n == 0)
-          goto end;
-        n--;
-        *s++ = '<';
-        t = (char*)"/";
-       m = 1;
-        break;
-      case SOAP_LT:
-        n++;
-        *s++ = '<';
-        break;
-      case SOAP_GT:
-        *s++ = '>';
-        break;
-      case SOAP_QT:
-        *s++ = '"';
-        break;
-      case SOAP_AP:
-        *s++ = '\'';
-        break;
-      case '/':
-        if (n > 0)
-        { c = soap_get(soap);
-          if (c == SOAP_GT)
-            n--;
-          soap_unget(soap, c);
-        }
-        *s++ = '/';
-        break;
-      case '<' | 0x80000000:
-        if (flag)
-          *s++ = '<';
-        else
-        { *s++ = '&';
-          t = (char*)"lt;";
-         m = 3;
-        }
-        break;
-      case '>' | 0x80000000:
-        if (flag)
-          *s++ = '>';
-        else
-        { *s++ = '&';
-          t = (char*)"gt;";
-         m = 3;
-        }
-        break;
-      case '"' | 0x80000000:
-        if (flag)
-          *s++ = '"';
-        else
-        { *s++ = '&';
-          t = (char*)"quot;";
-         m = 5;
-        }
-        break;
-      case '\'' | 0x80000000:
-        if (flag)
-          *s++ = '\'';
-        else
-        { *s++ = '&';
-          t = (char*)"apos;";
-         m = 5;
-        }
-        break;
-      default:
-        if ((int)c == EOF)
-          goto end;
-#ifdef HAVE_WCTOMB
-        if (soap->mode & SOAP_C_MBSTRING)
-        { m = wctomb(buf, c & 0x7FFFFFFF);
-          if (m >= 1)
-          { t = buf;
-            *s++ = *t++;
-            m--;
-          }
-          else
-            *s++ = SOAP_UNKNOWN_CHAR;
-        }
-        else
-#endif
-          *s++ = (char)(c & 0xFF);
-      }
-      l++;
-      if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen)
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
-        soap->error = SOAP_LENGTH;
-        return NULL;
-      }
-    }
-  }
-end:
-  soap_unget(soap, c);
-  *s = '\0';
-#ifdef WITH_FAST
-  t = soap_strdup(soap, soap->labbuf);
-#else
-  soap_size_block(soap, i+1);
-  t = soap_save_block(soap, NULL, 0);
-#endif
-  if ((soap->mode & SOAP_XML_STRICT) && l < minlen)
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen));
-    soap->error = SOAP_LENGTH;
-    return NULL;
-  }
-  if (flag == 2)
-    if (soap_s2QName(soap, t, &t))
-      return NULL;
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_wstring_out(struct soap *soap, const wchar_t *s, int flag)
-{ const char *t;
-  char tmp;
-  register soap_wchar c;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->wide = NULL; /* soap_malloc() ??? */
-    return SOAP_OK;
-  }
-#endif
-  while ((c = *s++))
-  { switch (c)
-    { 
-    case 9:
-      if (flag)
-        t = "&#x9;";
-      else
-        t = "\t";
-      break;
-    case 10:
-      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
-        t = "&#xA;";
-      else
-        t = "\n";
-      break;
-    case 13:
-      t = "&#xD;";
-      break;
-    case '&':
-      t = "&amp;";
-      break;
-    case '<':
-      t = "&lt;";
-      break;
-    case '>':
-      if (flag)
-        t = ">";
-      else
-       t = "&gt;";
-      break;
-    case '"':
-      if (flag)
-        t = "&quot;";
-      else
-        t = "\"";
-      break;
-    default:
-      if (c > 0 && c < 0x80)
-      { tmp = (char)c;
-        if (soap_send_raw(soap, &tmp, 1))
-          return soap->error;
-      }
-      else if (soap_pututf8(soap, (unsigned long)c))
-        return soap->error;
-      continue;
-    }
-    if (soap_send(soap, t))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t *
-SOAP_FMAC2
-soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen)
-{ wchar_t *s;
-  register int i, n = 0;
-  register long l = 0;
-  register soap_wchar c;
-  const char *t = NULL;
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { if (!(s = (wchar_t*)soap_push_block(soap, sizeof(wchar_t)*SOAP_BLKLEN)))
-      return NULL;
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { if (t)
-      { *s++ = (wchar_t)*t++;
-        if (!*t)
-          t = NULL;
-        continue;
-      }
-      c = soap_getutf8(soap);
-      switch (c)
-      {
-      case SOAP_TT:
-        if (n == 0)
-          goto end;
-        n--;
-        *s++ = '<';
-        soap_unget(soap, '/');
-        break;
-      case SOAP_LT:
-        n++;
-        *s++ = '<';
-        break;
-      case SOAP_GT:
-        *s++ = '>';
-        break;
-      case SOAP_QT:
-        *s++ = '"';
-        break;
-      case SOAP_AP:
-        *s++ = '\'';
-        break;
-      case '/':
-        if (n > 0)
-        { c = soap_getutf8(soap);
-          if (c == SOAP_GT)
-            n--;
-          soap_unget(soap, c);
-        }
-        *s++ = '/';
-        break;
-      case '<':
-        if (flag)
-          *s++ = (soap_wchar)'<';
-        else
-        { *s++ = (soap_wchar)'&';
-          t = "lt;";
-        }
-        break;
-      case '>':
-        if (flag)
-          *s++ = (soap_wchar)'>';
-        else
-        { *s++ = (soap_wchar)'&';
-          t = "gt;";
-        }
-        break;
-      case '"':
-        if (flag)
-          *s++ = (soap_wchar)'"';
-        else
-        { *s++ = (soap_wchar)'&';
-          t = "quot;";
-        }
-        break;
-      default:
-        if ((int)c == EOF)
-          goto end;
-        *s++ = (wchar_t)c & 0x7FFFFFFF;
-      }
-      l++;
-      if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen)
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
-        soap->error = SOAP_LENGTH;
-        return NULL;
-      }
-    }
-  }
-end:
-  soap_unget(soap, c);
-  *s = '\0';
-  soap_size_block(soap, sizeof(wchar_t) * (i + 1));
-  if ((soap->mode & SOAP_XML_STRICT) && l < minlen)
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen));
-    soap->error = SOAP_LENGTH;
-    return NULL;
-  }
-  return (wchar_t*)soap_save_block(soap, NULL, 0);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_int2s(struct soap *soap, int n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2int(struct soap *soap, const char *s, int *p)
-{ if (s)
-  { char *r;
-    *p = (int)soap_strtol(s, &r, 10);
-    if (*r)
-      soap->error = SOAP_TYPE;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int *
-SOAP_FMAC2
-soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2int(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (int*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(int), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_long2s(struct soap *soap, long n)
-{ sprintf(soap->tmpbuf, "%ld", n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2long(struct soap *soap, const char *s, long *p)
-{ if (s)
-  { char *r;
-    *p = soap_strtol(s, &r, 10);
-    if (*r)
-      soap->error = SOAP_TYPE;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-long *
-SOAP_FMAC2
-soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2long(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (long*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(long), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_LONG642s(struct soap *soap, LONG64 n)
-{ sprintf(soap->tmpbuf, SOAP_LONG_FORMAT, n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_LONG642s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p)
-{ if (s && sscanf(s, SOAP_LONG_FORMAT, p) != 1)
-    soap->error = SOAP_TYPE;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-LONG64 *
-SOAP_FMAC2
-soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":integer")
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":negativeInteger")
-   && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":long")
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2LONG64(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (LONG64*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(LONG64), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_byte2s(struct soap *soap, char n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2byte(struct soap *soap, const char *s, char *p)
-{ if (s)
-  { long n;
-    char *r;
-    n = soap_strtol(s, &r, 10);
-    if (*r || n < -128 || n > 127)
-      soap->error = SOAP_TYPE;
-    *p = (char)n;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2byte(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (char*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(char), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_short2s(struct soap *soap, short n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2short(struct soap *soap, const char *s, short *p)
-{ if (s)
-  { long n;
-    char *r;
-    n = soap_strtol(s, &r, 10);
-    if (*r || n < -32768 || n > 32767)
-      soap->error = SOAP_TYPE;
-    *p = (short)n;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-short *
-SOAP_FMAC2
-soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2short(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (short*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(short), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_float2s(struct soap *soap, float n)
-{ const char *s;
-  if (isnan(n))
-    s = "NaN";
-  else if (n >= FLT_PINFTY)
-    s = "INF";
-  else if (n <= FLT_NINFTY)
-    s = "-INF";
-  else
-  { sprintf(soap->tmpbuf, soap->float_format, n);
-    s = soap->tmpbuf;
-  }
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_float2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2float(struct soap *soap, const char *s, float *p)
-{ if (s)
-  { if (!soap_tag_cmp(s, "INF"))
-      *p = FLT_PINFTY;
-    else if (!soap_tag_cmp(s, "+INF"))
-      *p = FLT_PINFTY;
-    else if (!soap_tag_cmp(s, "-INF"))
-      *p = FLT_NINFTY;
-    else if (!soap_tag_cmp(s, "NaN"))
-      *p = FLT_NAN;
-    else
-    {
-#ifdef HAVE_STRTOD
-      char *r;
-      *p = (float)strtod(s, &r);
-      if (*r)
-#endif
-        if (sscanf(s, soap->float_format, p) != 1)
-          soap->error = SOAP_TYPE;
-    }
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int soap_isnumeric(struct soap *soap, const char *type)
-{ if (soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":float")
-   && soap_match_tag(soap, soap->type, ":double")
-   && soap_match_tag(soap, soap->type, ":decimal")
-   && soap_match_tag(soap, soap->type, ":integer")
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":negativeInteger")
-   && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":long")
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte")
-   && soap_match_tag(soap, soap->type, ":unsignedLong")
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return SOAP_ERR;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-float *
-SOAP_FMAC2
-soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type != '\0' && soap_isnumeric(soap, type))
-    return NULL;
-  p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2float(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (float*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(float), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_double2s(struct soap *soap, double n)
-{ const char *s;
-  if (isnan(n))
-    s = "NaN";
-  else if (n >= DBL_PINFTY)
-    s = "INF";
-  else if (n <= DBL_NINFTY)
-    s = "-INF";
-  else
-  { sprintf(soap->tmpbuf, soap->double_format, n);
-    s = soap->tmpbuf;
-  }
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_double2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2double(struct soap *soap, const char *s, double *p)
-{ if (s)
-  { if (!soap_tag_cmp(s, "INF"))
-      *p = DBL_PINFTY;
-    else if (!soap_tag_cmp(s, "+INF"))
-      *p = DBL_PINFTY;
-    else if (!soap_tag_cmp(s, "-INF"))
-      *p = DBL_NINFTY;
-    else if (!soap_tag_cmp(s, "NaN"))
-      *p = DBL_NAN;
-    else
-    {
-#ifdef HAVE_STRTOD
-      char *r;
-      *p = strtod(s, &r);
-      if (*r)
-#endif
-        if (sscanf(s, soap->double_format, p) != 1)
-          soap->error = SOAP_TYPE;
-    }
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-double *
-SOAP_FMAC2
-soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type != '\0' && soap_isnumeric(soap, type))
-    return NULL;
-  p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2double(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (double*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(double), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedByte2s(struct soap *soap, unsigned char n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p)
-{ if (s)
-  { unsigned long n;
-    char *r;
-    n = soap_strtoul(s, &r, 10);
-    if (*r || n > 255)
-      soap->error = SOAP_TYPE;
-    *p = (unsigned char)n;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned char *
-SOAP_FMAC2
-soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2unsignedByte(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (unsigned char*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned char), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedShort2s(struct soap *soap, unsigned short n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p)
-{ if (s)
-  { unsigned long n;
-    char *r;
-    n = soap_strtoul(s, &r, 10);
-    if (*r || n > 65535)
-      soap->error = SOAP_TYPE;
-    *p = (unsigned short)n;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-unsigned short *
-SOAP_FMAC2
-soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2unsignedShort(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (unsigned short*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned short), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedInt2s(struct soap *soap, unsigned int n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p)
-{ if (s)
-  { char *r;
-    *p = (unsigned int)soap_strtoul(s, &r, 10);
-    if (*r)
-      soap->error = SOAP_TYPE;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned int *
-SOAP_FMAC2
-soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2unsignedInt(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (unsigned int*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned int), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedLong2s(struct soap *soap, unsigned long n)
-{ sprintf(soap->tmpbuf, "%lu", n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p)
-{ if (s)
-  { char *r;
-    *p = soap_strtoul(s, &r, 10);
-    if (*r)
-      soap->error = SOAP_TYPE;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned long *
-SOAP_FMAC2
-soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2unsignedLong(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (unsigned long*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned long), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_ULONG642s(struct soap *soap, ULONG64 n)
-{ sprintf(soap->tmpbuf, SOAP_ULONG_FORMAT, n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_ULONG642s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p)
-{ if (s && sscanf(s, SOAP_ULONG_FORMAT, p) != 1)
-    soap->error = SOAP_TYPE;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-ULONG64 *
-SOAP_FMAC2
-soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":unsignedLong")
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2ULONG64(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (ULONG64*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(ULONG64), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2string(struct soap *soap, const char *s, char **t)
-{ *t = NULL;
-  if (s && !(*t = soap_strdup(soap, s)))
-    soap->error = SOAP_EOM;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2QName(struct soap *soap, const char *s, char **t)
-{ if (s)
-  { struct soap_nlist *np;
-    const char *p;
-    if (!strncmp(s, "xml:", 4))
-    { *t = soap_strdup(soap, s);
-      return SOAP_OK;
-    }
-    np = soap->nlist;
-    p = strchr(s, ':');
-    if (p)
-    { register int n = p - s;
-      while (np && (strncmp(np->id, s, n) || np->id[n]))
-        np = np->next;
-      p++;
-    }
-    else
-    { while (np && *np->id)
-        np = np->next;
-      p = s;
-    }
-    if (np)
-    { if (np->index >= 0 && soap->local_namespaces)
-      { register const char *q = soap->local_namespaces[np->index].id;
-        if (q)
-        { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(q) + 2)))
-            sprintf(*t, "%s:%s", q, p);
-          return SOAP_OK;
-        }
-      }
-      if (np->ns)
-      { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(np->ns) + 4)))
-          sprintf(*t, "\"%s\":%s", np->ns, p);
-        return SOAP_OK;
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined (index=%d, URI=%s)\n", s, np->index, np->ns?np->ns:""));
-      return soap->error = SOAP_NAMESPACE; 
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined, assuming empty namespace\n", s));
-    if ((*t = (char*)soap_malloc(soap, strlen(p) + 4)))
-      sprintf(*t, "\"\":%s", p);
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_QName2s(struct soap *soap, const char *s)
-{ struct Namespace *p;
-  char *t;
-  int n;
-  if (!s || *s != '"')
-    return s;
-  s++;
-  if ((p = soap->local_namespaces))
-  { for (; p->id; p++)
-    { if (p->ns)
-        if (!soap_tag_cmp(s, p->ns))
-          break;
-      if (p->in)
-        if (!soap_tag_cmp(s, p->in))
-          break;
-    }
-    if (p && p->id)
-    { s = strchr(s, '"');
-      if (s)
-      { t = (char*)soap_malloc(soap, strlen(p->id) + strlen(s));
-        strcpy(t, p->id);
-       strcat(t, s + 1);
-        return t;
-      }
-    }
-  }
-  t = (char*)strchr(s, '"');
-  if (t)
-    n = t - s;
-  else
-    n = 0;
-  t = soap_strdup(soap, s);
-  t[n] = '\0';
-  sprintf(soap->tmpbuf, "xmlns:_%lu", soap->idnum++);
-  soap_set_attr(soap, soap->tmpbuf, t);
-  s = strchr(s, '"');
-  if (s)
-  { t = (char*)soap_malloc(soap, strlen(soap->tmpbuf) + strlen(s) - 6);
-    strcpy(t, soap->tmpbuf + 6);
-    strcat(t, s + 1);
-  }
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) 
-{ id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n);
-  if (id < 0
-   || soap_element_begin_out(soap, tag, id, type)
-   || soap_string_out(soap, *p, 0)
-   || soap_element_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char **
-SOAP_FMAC2
-soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen)
-{ if (soap_element_begin_in(soap, tag, 1))
-    return NULL;
-  if (!p)
-    if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
-      return NULL;
-  if (soap->body)
-  { *p = soap_string_in(soap, flag, minlen, maxlen);
-    if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), 0, NULL, NULL, NULL))
-      return NULL;
-  }
-  else
-    *p = NULL;
-  p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) 
-{ id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n);
-  if (id < 0
-   || soap_element_begin_out(soap, tag, id, type)
-   || soap_wstring_out(soap, *p, 0)
-   || soap_element_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t **
-SOAP_FMAC2
-soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen)
-{ if (soap_element_begin_in(soap, tag, 1))
-    return NULL;
-  if (!p)
-    if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
-      return NULL;
-  if (soap->body)
-  { *p = soap_wstring_in(soap, 1, minlen, maxlen);
-    if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), 0, NULL, NULL, NULL))
-      return NULL;
-  }
-  else
-    *p = NULL;
-  p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static time_t
-soap_timegm(struct tm *T)
-{
-#if defined(HAVE_TIMEGM)
-  return timegm(T);
-#elif defined(HAVE_GETTIMEOFDAY)
-  struct timezone t;
-  struct timeval tv;
-  memset((void*)&t, 0, sizeof(t));
-  gettimeofday(&tv, &t);
-  T->tm_min -= t.tz_minuteswest - (t.tz_dsttime != 0)*60;
-  T->tm_isdst = 0;
-  return mktime(T);
-/* WR[ */
-  /* The following define was added for VxWorks*/
-#elif defined(HAVE_MKTIME)
-  /* FOR VXWORKS:
-  vxWorks does not seem to have any variable representation of time zones, but
-  timezone information can be set in INSTALL_DIR/target/h/private/timeP.h header
-  file, by setting the ZONEBUFFER define.  The ZONEBUFFER define follows this 
-  format:
-    name_of_zone:<(unused)>:time_in_minutes_from_UTC:daylight_start:daylight_end 
-  To calculate local time, the value of time_in_minutes_from_UTC is subtracted
-  from UTC; time_in_minutes_from_UTC must be positive. Daylight information is 
-  expressed as mmddhh (month-day-hour), for example: 
-    UTC::0:040102:100102
-  */
-  return mktime(T);
-/* ]WR */
-#elif defined(HAVE_FTIME)
-  struct timeb t;
-  memset((void*)&t, 0, sizeof(t));
-  t.timezone = 0;
-  t.dstflag = -1;
-  ftime(&t);
-  T->tm_min -= t.timezone - (t.dstflag != 0)*60;
-  T->tm_isdst = 0;
-  return mktime(T);
-#else
-#warning "time_t (de)serialization is not MT safe on this platform"
-  time_t t;
-  char *tz = getenv("TZ");
-  putenv("TZ=UTC");
-  tzset();
-  t = mktime(T);
-  if (tz)
-  { char tmp[16];
-    strcpy(tmp, "TZ=");
-    strncat(tmp, tz, 12);
-    tmp[15] = '\0';
-    putenv(tmp);
-  }
-  else
-    putenv("TZ=");
-  tzset();
-  return t;
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_dateTime2s(struct soap *soap, time_t n)
-{ struct tm T;
-  struct tm *pT = &T;
-#if defined(HAVE_GMTIME_R)
-  if (gmtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PGMTIME_R)
-  if (gmtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-#elif defined(HAVE_PGMTIME)
-  if (gmtime(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-/* ]WR */
-#elif defined(HAVE_GMTIME)
-  if ((pT = gmtime(&n)))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-#elif defined(HAVE_GETTIMEOFDAY)
-  struct timezone tz;
-  memset((void*)&tz, 0, sizeof(tz));
-#if defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { struct timeval tv;
-    gettimeofday(&tv, &tz);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(tz.tz_dsttime!=0), abs(tz.tz_minuteswest)%60);
-  }
-#else
-  if ((pT = localtime(&n)))
-  { struct timeval tv;
-    gettimeofday(&tv, &tz);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(tz.tz_dsttime!=0), abs(tz.tz_minuteswest)%60);
-  }
-#endif
-#elif defined(HAVE_FTIME)
-  struct timeb t;
-  memset((void*)&t, 0, sizeof(t));
-#if defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { ftime(&t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(t.dstflag!=0), abs(t.timezone)%60);
-  }
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PLOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf+strlen(soap->tmpbuf), "%+03d:%02d", t.timezone/60, abs(t.timezone)%60);
-  }
-/* ]WR */
-#else
-  if ((pT = localtime(&n)))
-  { ftime(&t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(t.dstflag!=0), abs(t.timezone)%60);
-  }
-#endif
-#elif defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PLOCALTIME_R)
-  if (localtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-/* ]WR */
-#else
-  if ((pT = localtime(&n)))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-#endif
-  else
-    strcpy(soap->tmpbuf, "1969-12-31T23:59:59Z");
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_dateTime2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2dateTime(struct soap *soap, const char *s, time_t *p)
-{ if (s)
-  { struct tm T;
-    char zone[16];
-    memset((void*)&T, 0, sizeof(T));
-    zone[sizeof(zone)-1] = '\0';
-    sscanf(s, "%d-%d-%dT%d:%d:%d%15s", &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone);
-    if (T.tm_year == 1)
-      T.tm_year = 70;
-    else
-      T.tm_year -= 1900;
-    T.tm_mon--;
-    if (*zone)
-    { if (*zone == '.')
-      { for (s = zone + 1; *s; s++)
-          if (*s < '0' || *s > '9')
-            break;
-      }
-      else
-        s = zone;
-      if (*s != 'Z')
-      { int h = 0, m = 0;
-        sscanf(s, "%d:%d", &h, &m);
-        T.tm_hour -= h;
-        if (h >= 0)
-          T.tm_min -= m;
-        else
-          T.tm_min += m;
-      }
-      *p = soap_timegm(&T);
-    }
-    else
-      *p = mktime(&T); /* no time zone: suppose it is localtime? */
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-time_t *
-SOAP_FMAC2
-soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char * type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":dateTime"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2dateTime(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (time_t*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(time_t), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outliteral(struct soap *soap, const char *tag, char *const*p)
-{ int i;
-  const char *t = NULL;
-  if (tag && *tag != '-')
-  { if ((t = strchr(tag, ':')))
-    { strncpy(soap->tmpbuf, tag, t-tag);
-      soap->tmpbuf[t-tag] = '\0';
-      for (i = 0; soap->local_namespaces[i].id; i++)
-        if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
-          break;
-      t++;
-      sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
-    }
-    else
-    { t = tag;
-      sprintf(soap->tmpbuf, "<%s>", tag);
-    }
-    if (soap_send(soap, soap->tmpbuf))
-      return soap->error;
-  }
-  if (p && *p)
-  { if (soap_send(soap, *p))
-      return soap->error;
-  }
-  if (t)
-  { sprintf(soap->tmpbuf, "</%s>", t);
-    return soap_send(soap, soap->tmpbuf);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char **
-SOAP_FMAC2
-soap_inliteral(struct soap *soap, const char *tag, char **p)
-{ if (soap_element_begin_in(soap, tag, 1))
-    return NULL;
-  if (!p)
-    if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
-      return NULL;
-  if (soap->null)
-    *p = NULL;
-  else if (soap->body)
-    *p = soap_string_in(soap, 0, -1, -1);
-  else
-    *p = NULL;
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p)
-{ int i;
-  const char *t = NULL;
-  wchar_t c;
-  const wchar_t *s;
-  if (tag && *tag != '-')
-  { if (tag && (t = strchr(tag, ':')))
-    { strncpy(soap->tmpbuf, tag, t-tag);
-      soap->tmpbuf[t-tag] = '\0';
-      for (i = 0; soap->local_namespaces[i].id; i++)
-        if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
-          break;
-      t++;
-      sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
-    }
-    else
-    { t = tag;
-      sprintf(soap->tmpbuf, "<%s>", tag);
-    }
-    if (soap_send(soap, soap->tmpbuf))
-      return soap->error;
-  }
-  if (p)
-  { s = *p;
-    while ((c = *s++))
-      if (soap_pututf8(soap, (unsigned char)c))
-        return soap->error;
-  }
-  if (t)
-  { sprintf(soap->tmpbuf, "</%s>", t);
-    return soap_send(soap, soap->tmpbuf);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t **
-SOAP_FMAC2
-soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p)
-{ if (soap_element_begin_in(soap, tag, 1))
-    return NULL;
-  if (!p)
-    if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
-      return NULL;
-  if (soap->null)
-    *p = NULL;
-  else if (soap->body)
-    *p = soap_wstring_in(soap, 0, -1, -1);
-  else
-    *p = NULL;
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char *
-SOAP_FMAC2
-soap_value(struct soap *soap)
-{ size_t i;
-  soap_wchar c = 0;
-  char *s = soap->tmpbuf;
-  if (!soap->body)
-    return SOAP_STR_EOS;
-  for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++)
-  { c = soap_get(soap);
-    if (c == SOAP_TT || (int)c == EOF || soap_blank(c))
-      break;
-    *s++ = (char)c;
-  }
-  if ((int)c == EOF || c == SOAP_TT)
-    soap_unget(soap, c);
-  *s = '\0';
-  return soap->tmpbuf; /* return non-null pointer */
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getline(struct soap *soap, char *s, int len)
-{ int i = len;
-  soap_wchar c = 0;
-  for (;;)
-  { while (--i > 0)
-    { c = soap_getchar(soap);
-      if (c == '\r')
-        break;
-      if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      *s++ = (char)c;
-    }
-    c = soap_getchar(soap);
-    if (c == '\n')
-    { *s = '\0';
-      if (i+1 == len) /* empty line: end of HTTP header */
-        break;
-      c = soap_unget(soap, soap_getchar(soap));
-      if (c != ' ' && c != '\t') /* HTTP line continuation? */
-        break;
-    }
-    else if ((int)c == EOF)
-      return soap->error = SOAP_EOF;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static size_t
-soap_count_attachments(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  register struct soap_multipart *content;
-  register size_t count = soap->count;
-  if (soap->mode & SOAP_ENC_DIME)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n"));
-    for (content = soap->dime.first; content; content = content->next)
-    { count += 12 + ((content->size+3)&(~3));
-      if (content->id)
-        count += ((strlen(content->id)+3)&(~3));
-      if (content->type)
-        count += ((strlen(content->type)+3)&(~3));
-      if (content->options)
-        count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment %lu bytes\n", content->size));
-    }
-  }
-  if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary)
-  { register size_t n = strlen(soap->mime.boundary);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n"));
-    for (content = soap->mime.first; content; content = content->next)
-    { register const char *s;
-      /* count \r\n--boundary\r\n */
-      count += 6 + n;
-      /* count Content-Type: ...\r\n */
-      if (content->type)
-        count += 16 + strlen(content->type);
-      s = soap_str_code(mime_codes, content->encoding);
-      /* count Content-Transfer-Encoding: ...\r\n */
-      if (s)
-        count += 29 + strlen(s);
-      /* count Content-ID: ...\r\n */
-      if (content->id)
-        count += 14 + strlen(content->id);
-      /* count Content-Location: ...\r\n */
-      if (content->location)
-        count += 20 + strlen(content->location);
-      /* count Content-Description: ...\r\n */
-      if (content->description)
-        count += 23 + strlen(content->location);
-      /* count \r\n...content */
-      count += 2 + content->size;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment %lu bytes\n", content->size));
-    }
-    /* count \r\n--boundary--\r\n */
-    count += 8 + n;
-  }
-  return count;
-#else
-  return soap->count;
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static int
-soap_putdimefield(struct soap *soap, const char *s, size_t n)
-{ if (soap_send_raw(soap, s, n))
-    return soap->error;
-  return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_dime_option(struct soap *soap, unsigned short optype, const char *option)
-{ size_t n;
-  char *s = NULL;
-  if (option)
-  { n = strlen(option);
-    s = (char*)soap_malloc(soap, n + 5);
-    if (s)
-    { s[0] = optype >> 8;
-      s[1] = optype & 0xFF;
-      s[2] = n >> 8;
-      s[3] = n & 0xFF;
-      strcpy(s + 4, option);
-    }
-  }
-  return s;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putdimehdr(struct soap *soap)
-{ unsigned char tmp[12];
-  size_t optlen = 0, idlen = 0, typelen = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id?soap->dime.id:""));
-  if (soap->dime.options)
-    optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4;
-  if (soap->dime.id)
-    idlen = strlen(soap->dime.id);
-  if (soap->dime.type)
-    typelen = strlen(soap->dime.type);
-  tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7);
-  tmp[1] = soap->dime.flags & 0xF0;
-  tmp[2] = optlen >> 8;
-  tmp[3] = optlen & 0xFF;
-  tmp[4] = idlen >> 8;
-  tmp[5] = idlen & 0xFF;
-  tmp[6] = typelen >> 8;
-  tmp[7] = typelen & 0xFF;
-  tmp[8] = soap->dime.size >> 24;
-  tmp[9] = (soap->dime.size >> 16) & 0xFF;
-  tmp[10] = (soap->dime.size >> 8) & 0xFF;
-  tmp[11] = soap->dime.size & 0xFF;
-  if (soap_send_raw(soap, (char*)tmp, 12)
-   || soap_putdimefield(soap, soap->dime.options, optlen)
-   || soap_putdimefield(soap, soap->dime.id, idlen)
-   || soap_putdimefield(soap, soap->dime.type, typelen))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putdime(struct soap *soap)
-{ struct soap_multipart *content;
-  if (!(soap->mode & SOAP_ENC_DIME))
-    return SOAP_OK;
-  for (content = soap->dime.first; content; content = content->next)
-  { void *handle;
-    soap->dime.size = content->size;
-    soap->dime.id = content->id;
-    soap->dime.type = content->type;
-    soap->dime.options = content->options;
-    soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA;
-    if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error))
-    { size_t size = content->size;
-      if (!handle)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n"));
-        return soap->error;
-      }
-      if (!content->size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE))
-      { size_t chunksize = sizeof(soap->tmpbuf);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n"));
-        do 
-        { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize);
-          DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size));
-          if (size < chunksize)
-         { soap->dime.flags &= ~SOAP_DIME_CF;
-            if (!content->next)
-              soap->dime.flags |= SOAP_DIME_ME;
-         }
-          else
-            soap->dime.flags |= SOAP_DIME_CF;
-         soap->dime.size = size;
-          if (soap_putdimehdr(soap)
-          || soap_putdimefield(soap, soap->tmpbuf, size))
-            break;
-          if (soap->dime.id)
-         { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA);
-            soap->dime.id = NULL;
-            soap->dime.type = NULL;
-            soap->dime.options = NULL;
-          }  
-        } while (size >= chunksize);
-      }
-      else
-      { if (!content->next)
-          soap->dime.flags |= SOAP_DIME_ME;
-        if (soap_putdimehdr(soap))
-          return soap->error;
-        do
-        { size_t bufsize;
-         if (size < sizeof(soap->tmpbuf))
-            bufsize = size;
-          else
-            bufsize = sizeof(soap->tmpbuf);
-          if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize)))
-          { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)soap->dime.size));
-            soap->error = SOAP_EOF;
-           break;
-          }
-          if (soap_send_raw(soap, soap->tmpbuf, bufsize))
-            break;
-          size -= bufsize;
-        } while (size);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
-        soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3);
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
-      if (soap->fdimereadclose)
-        soap->fdimereadclose(soap, handle);
-    }
-    else
-    { if (!content->next)
-        soap->dime.flags |= SOAP_DIME_ME;
-      if (soap_putdimehdr(soap)
-       || soap_putdimefield(soap, (char*)content->ptr, content->size))
-        return soap->error;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static char *
-soap_getdimefield(struct soap *soap, size_t n)
-{ register soap_wchar c;
-  register int i;
-  register char *s;
-  char *p = NULL;
-  if (n)
-  { p = (char*)soap_malloc(soap, n + 1);
-    if (p)
-    { s = p;
-      for (i = n; i > 0; i--)
-      { if ((int)(c = soap_get1(soap)) == EOF)
-        { soap->error = SOAP_EOF;
-          return NULL;
-        }
-        *s++ = (char)c;
-      }
-      *s = '\0';
-      if ((soap->error = soap_move(soap, -(long)n&3)))
-        return NULL;
-    }
-    else
-      soap->error = SOAP_EOM;
-  }
-  return p;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getdimehdr(struct soap *soap)
-{ register soap_wchar c;
-  register char *s;
-  register int i;
-  unsigned char tmp[12];
-  size_t optlen, idlen, typelen;
-  if (!(soap->mode & SOAP_ENC_DIME))
-    return soap->error = SOAP_DIME_END;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n"));
-  if (soap->dime.buflen || soap->dime.chunksize)
-  { if (soap_move(soap, (long)(soap->dime.size - soap_tell(soap))))
-      return soap->error = SOAP_EOF;
-    soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n"));
-    return SOAP_OK;
-  }
-  s = (char*)tmp;
-  for (i = 12; i > 0; i--)
-  { if ((int)(c = soap_getchar(soap)) == EOF)
-      return soap->error = SOAP_EOF;
-    *s++ = (char)c;
-  }
-  if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION)
-    return soap->error = SOAP_DIME_MISMATCH;
-  soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0);
-  optlen = (tmp[2] << 8) | tmp[3];
-  idlen = (tmp[4] << 8) | tmp[5];
-  typelen = (tmp[6] << 8) | tmp[7];
-  soap->dime.size = (tmp[8] << 24) | (tmp[9] << 16) | (tmp[10] << 8) | tmp[11];
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags));
-  if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error)
-    return soap->error;
-  if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error)
-    return soap->error;
-  if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error)
-    return soap->error;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id=%s, type=%s, options=%s\n", soap->dime.id?soap->dime.id:"", soap->dime.type?soap->dime.type:"", soap->dime.options?soap->dime.options+4:""));
-  if (soap->dime.flags & SOAP_DIME_ME)
-    soap->mode &= ~SOAP_ENC_DIME;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getdime(struct soap *soap)
-{ struct soap_multipart *content;
-  if (soap_getdimehdr(soap))
-    return soap->error;
-  if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error))
-  { const char *id, *type, *options;
-    size_t size, n;
-    if (!soap->dime.ptr)
-      return soap->error;
-    id = soap->dime.id;
-    type = soap->dime.type;
-    options = soap->dime.options;
-    for (;;)
-    { size = soap->dime.size;
-      for (;;)
-      { n = soap->buflen - soap->bufidx;
-        if (size < n)
-          n = size;
-        if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n)))
-          break;
-       size -= n;
-       if (!size)
-       { soap->bufidx += n;
-         break;
-       }
-       if (soap_recv(soap))
-        { soap->error = SOAP_EOF;
-         goto end;
-        }
-      }
-      if (soap_move(soap, -(long)soap->dime.size&3))
-      { soap->error = SOAP_EOF;
-       break;
-      }
-      if (!(soap->dime.flags & SOAP_DIME_CF))
-        break;
-      if (soap_getdimehdr(soap))
-        break;
-    }
-end:
-    if (soap->fdimewriteclose)
-      soap->fdimewriteclose(soap, (void*)soap->dime.ptr);
-    soap->dime.size = 0;
-    soap->dime.id = id;
-    soap->dime.type = type;
-    soap->dime.options = options;
-  }
-  else if (soap->dime.flags & SOAP_DIME_CF)
-  { const char *id, *type, *options;
-    register soap_wchar c;
-    register char *s;
-    register int i;
-    id = soap->dime.id;
-    type = soap->dime.type;
-    options = soap->dime.options;
-    if (soap_new_block(soap))
-      return SOAP_EOM;
-    for (;;)
-    { s = (char*)soap_push_block(soap, soap->dime.size);
-      if (!s)
-        return soap->error = SOAP_EOM;
-      for (i = soap->dime.size; i > 0; i--)
-      { if ((int)(c = soap_get1(soap)) == EOF)
-          return soap->error = SOAP_EOF;
-        *s++ = (char)c;
-      }
-      if (soap_move(soap, -(long)soap->dime.size&3))
-        return soap->error = SOAP_EOF;
-      if (!(soap->dime.flags & SOAP_DIME_CF))
-        break;
-      if (soap_getdimehdr(soap))
-        return soap->error;
-    }
-    soap->dime.size = soap->blist->size++; /* allocate one more for '\0' */
-    if (!(soap->dime.ptr = soap_save_block(soap, NULL, 0)))
-      return soap->error;
-    soap->dime.ptr[soap->dime.size] = '\0'; /* force 0-terminated */
-    soap->dime.id = id;
-    soap->dime.type = type;
-    soap->dime.options = options;
-  }
-  else
-    soap->dime.ptr = soap_getdimefield(soap, soap->dime.size);
-  content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size);
-  if (!content)
-    return soap->error = SOAP_EOM;
-  content->id = soap->dime.id;
-  content->type = soap->dime.type;
-  content->options = soap->dime.options;
-  return soap->error;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getmimehdr(struct soap *soap)
-{ struct soap_multipart *content;
-  do
-  { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
-      return soap->error;
-  }
-  while (!*soap->msgbuf);
-  if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-')
-  { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1;
-    /* remove white space */
-    while (soap_blank(*s))
-      s--;
-    s[1] = '\0';
-    if (soap->mime.boundary)
-    { if (strcmp(soap->msgbuf + 2, soap->mime.boundary))
-        return soap->error = SOAP_MIME_ERROR;
-    }
-    else
-      soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2);
-    if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
-      return soap->error;
-  }
-  if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL))
-    return soap->error = SOAP_EOM;
-  content = soap->mime.last;
-  for (;;)
-  { register char *key = soap->msgbuf;
-    register char *val;
-    if (!*key)
-      break;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "MIME header: %s\n", key));
-    val = strchr(soap->msgbuf, ':');
-    if (val)
-    { *val = '\0';
-      do val++;
-      while (*val && *val <= 32);
-      if (!soap_tag_cmp(key, "Content-ID"))
-        content->id = soap_strdup(soap, val);
-      else if (!soap_tag_cmp(key, "Content-Location"))
-        content->location = soap_strdup(soap, val);
-      else if (!soap_tag_cmp(key, "Content-Type"))
-        content->type = soap_strdup(soap, val);
-      else if (!soap_tag_cmp(key, "Content-Description"))
-        content->description = soap_strdup(soap, val);
-      else if (!soap_tag_cmp(key, "Content-Transfer-Encoding"))
-        content->encoding = (enum soap_mime_encoding)soap_int_code(mime_codes, val, (long)SOAP_MIME_NONE);
-    }
-    if (soap_getline(soap, key, sizeof(soap->msgbuf)))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getmime(struct soap *soap)
-{ register char c;
-  for (;;)
-  { register size_t i, m = 0;
-    register char *s;
-    struct soap_multipart *content = soap->mime.last;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id=%s type=%s\n", content->id?content->id:"", content->type?content->type:""));
-    if (soap_new_block(soap))
-      return soap->error = SOAP_EOM;
-    for (;;)
-    { register char *t = NULL;
-      if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
-        return soap->error = SOAP_EOM;
-      for (i = 0; i < SOAP_BLKLEN; i++)
-      { if (m > 0)
-        { *s++ = *t++;
-         m--;
-       }
-       else
-        { c = soap_get1(soap);
-         if ((int)c == EOF)
-           return soap->error = SOAP_EOF;
-         if (c == '\r')
-         { t = soap->tmpbuf;
-            strcpy(t, "\n--");
-            strncat(t, soap->mime.boundary, sizeof(soap->tmpbuf)-3);
-            t[sizeof(soap->tmpbuf)-1] = '\0';
-           do c = soap_get1(soap);
-           while ((char)c == *t++);
-           if ((int)c == EOF)
-             return soap->error = SOAP_EOF;
-           if (!*--t)
-             goto end;
-           *t = (char)c;
-           m = t - soap->tmpbuf + 1;
-           t = soap->tmpbuf;
-           c = '\r';
-         }
-         *s++ = (char)c;
-        }
-      }
-    }
-end:
-    *s = '\0'; /* force 0-terminated */
-    content->size = soap_size_block(soap, i+1)-1;
-    content->ptr = soap_save_block(soap, NULL, 0);
-    if (c == '-' && (int)soap_get1(soap) == '-')
-      break;
-    while (c != '\r' && (int)c != EOF && soap_blank(c))
-      c = soap_get1(soap);
-    if (c != '\r' || (int)soap_get1(soap) != '\n')
-      return soap->error = SOAP_MIME_ERROR;
-    if (soap_getmimehdr(soap))
-      return soap->error;
-  }
-  do c = soap_get1(soap);
-  while ((int)c != EOF && c != '\r');
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  if (soap_get1(soap) != '\n')
-    return soap->error = SOAP_MIME_ERROR;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putmimehdr(struct soap *soap, struct soap_multipart *content)
-{ const char *s;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type=%s\n", content->type?content->type:""));
-  if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n"))
-    return soap->error;
-  if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n"))
-    return soap->error;
-  s = soap_str_code(mime_codes, content->encoding);
-  if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n"))
-    return soap->error;
-  if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n"))
-    return soap->error;
-  if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n"))
-    return soap->error;
-  if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n"))
-    return soap->error;
-  return soap_send_raw(soap, "\r\n", 2);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putmime(struct soap *soap)
-{ struct soap_multipart *content;
-  if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary)
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n"));
-  for (content = soap->mime.first; content; content = content->next)
-    if (soap_putmimehdr(soap, content)
-     || soap_send_raw(soap, content->ptr, content->size))
-      return soap->error;
-  return soap_send3(soap, "\r\n--", soap->mime.boundary, "--\r\n");
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_dime(struct soap *soap)
-{ soap->omode |= SOAP_ENC_DIME;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_mime(struct soap *soap, const char *boundary, const char *start)
-{ soap->omode |= SOAP_ENC_MIME;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->mime.boundary = soap_strdup(soap, boundary);
-  soap->mime.start = soap_strdup(soap, start);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_dime(struct soap *soap)
-{ soap->omode &= ~SOAP_ENC_DIME;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_mime(struct soap *soap)
-{ soap->omode &= ~SOAP_ENC_MIME;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->mime.boundary = NULL;
-  soap->mime.start = NULL;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static struct soap_multipart*
-soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size)
-{ struct soap_multipart *content;
-  content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart));
-  if (content)
-  { content->next = NULL;
-    content->ptr = ptr;
-    content->size = size;
-    content->id = NULL;
-    content->type = NULL;
-    content->options = NULL;
-    content->encoding = SOAP_MIME_NONE;
-    content->location = NULL;
-    content->description = NULL;
-    if (!*first)
-      *first = content;
-    if (*last)
-      (*last)->next = content;
-    *last = content;
-  }
-  return content;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option)
-{ struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size);
-  if (!content)
-    return SOAP_EOM;
-  content->id = soap_strdup(soap, id);
-  content->type = soap_strdup(soap, type);
-  content->options = soap_dime_option(soap, optype, option);
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description)
-{ struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size);
-  if (!content)
-    return SOAP_EOM;
-  content->id = soap_strdup(soap, id);
-  content->type = soap_strdup(soap, type);
-  content->encoding = encoding;
-  content->location = soap_strdup(soap, location);
-  content->description = soap_strdup(soap, description);
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap_multipart*
-SOAP_FMAC2
-soap_next_multipart(struct soap_multipart *content)
-{ if (content)
-    return content->next;
-  return NULL;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static void
-soap_select_mime_boundary(struct soap *soap)
-{ while (!soap->mime.boundary || soap_valid_mime_boundary(soap))
-  { char *s = soap->mime.boundary;
-    size_t n = 0;
-    if (s)
-      n = strlen(s);
-    if (n < 16)
-    { n = 72;
-      s = soap->mime.boundary = (char*)soap_malloc(soap, n);
-      if (!s)
-        return;
-    }
-    strcpy(s, "<>");
-    s += 2;
-    n -= 4;
-    while (n)
-    { *s++ = soap_base64o[rand()&0x3F];
-      n--;
-    }
-    *s = '\0';
-    strcat(s, "<>");
-  }
-  if (!soap->mime.start)
-    soap->mime.start = "<SOAP-ENV:Envelope>";
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static int
-soap_valid_mime_boundary(struct soap *soap)
-{ register struct soap_multipart *content;
-  register size_t k = strlen(soap->mime.boundary);
-  for (content = soap->mime.first; content; content = content->next)
-  { if (content->ptr && content->size >= k)
-    { register const char *p = (const char*)content->ptr; 
-      register size_t i;
-      for (i = 0; i < content->size - k; i++, p++)
-        if (!strncmp(p, soap->mime.boundary, k))
-          return SOAP_ERR;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-
-#ifdef WITH_COOKIES
-/******************************************************************************/
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_encode_cookie(const char *s, char *t, size_t len)
-{ register int c;
-  register size_t n = len;
-  while ((c = *s++) && --n > 0)
-  { if (c > ' ' && c < 128 && c != ';' && c != ',')
-      *t++ = c;
-    else if (n > 2)
-    { *t++ = '%';
-      *t++ = (c >> 4) + (c > 159 ? '7' : '0');
-      c &= 0xF;
-      *t++ = c + (c > 9 ? '7' : '0');
-      n -= 2;
-    }
-    else
-      break;
-  }
-  *t = '\0';
-  return len - n;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  size_t n;
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!path)
-    path = soap->cookie_path;
-  if (*path == '/')
-    path++;
-  n = strlen(path);
-  for (p = soap->cookies; p; p = p->next)
-    if (!strcmp(p->name, name)
-     && domain
-     && p->domain
-     && !strcmp(p->domain, domain)
-     && !strncmp(p->path, path, n))
-      break;
-  return p;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path)
-{ struct soap_cookie **p, *q;
-  int n;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie: %s=%s domain=%s path=%s\n", name, value?value:"", domain?domain:"", path?path:""));
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!path)
-    path = soap->cookie_path;
-  if (!path)
-  { soap_set_receiver_error(soap, "Cookie path not set", NULL, SOAP_HTTP_ERROR);
-    return NULL;
-  }
-  if (*path == '/')
-    path++;
-  q = soap_cookie(soap, name, domain, path);
-  if (!q)
-  { if ((q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-    { if ((q->name = (char*)SOAP_MALLOC(strlen(name)+1)))
-        strcpy(q->name, name);
-      q->value = NULL;
-      q->domain = NULL;
-      q->path = NULL;
-      q->expire = -1;
-      q->version = 0;
-      q->secure = 0;
-      q->env = 0;
-      q->modified = 0;
-      for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--)
-        if (!strcmp((*p)->name, name) && (*p)->path && strcmp((*p)->path, path) < 0)
-          break;
-      if (n)
-      { q->next = *p;
-        *p = q;
-      }
-      else
-      { SOAP_FREE(q->name);
-        SOAP_FREE(q);
-        q = NULL;
-      }
-    }
-  }
-  else
-    q->modified = 1;
-  if (q)
-  { if (q->value)
-    { SOAP_FREE(q->value);
-      q->value = NULL;
-    }
-    if (q->domain)
-    { SOAP_FREE(q->domain);
-      q->domain = NULL;
-    }
-    if (q->path)
-    { SOAP_FREE(q->path);
-      q->path = NULL;
-    }
-    if (value && *value && (q->value = (char*)SOAP_MALLOC(strlen(value)+1)))
-      strcpy(q->value, value);
-    if (domain && *domain && (q->domain = (char*)SOAP_MALLOC(strlen(domain)+1)))
-      strcpy(q->domain, domain);
-    if (path && *path && (q->path = (char*)SOAP_MALLOC(strlen(path)+1)))
-      strcpy(q->path, path);
-    q->session = 1;
-  }
-  return q;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie **p, *q;
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!domain)
-  { soap_set_receiver_error(soap, "Cookie domain not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
-    return;
-  }
-  if (!path)
-    path = soap->cookie_path;
-  if (!path)
-  { soap_set_receiver_error(soap, "Cookie path not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
-    return;
-  }
-  if (*path == '/')
-    path++;
-  for (p = &soap->cookies, q = *p; q; q = *p)
-    if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path)))
-    { if (q->value)
-        SOAP_FREE(q->value);
-      if (q->domain)
-        SOAP_FREE(q->domain);
-      if (q->path)
-        SOAP_FREE(q->path);
-      *p = q->next;
-      SOAP_FREE(q);
-    }
-    else
-      p = &q->next;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-    return p->value;
-  return NULL;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-    return p->expire;
-  return -1;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->expire = expire;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->session = 1;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->session = 0;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putsetcookies(struct soap *soap)
-{ struct soap_cookie *p;
-  char *s, tmp[4096];
-  const char *t;
-  for (p = soap->cookies; p; p = p->next)
-  { if (p->modified || !p->env)
-    { s = tmp;
-      if (p->name)
-        s += soap_encode_cookie(p->name, s, tmp-s+4064);
-      if (p->value && *p->value)
-      { *s++ = '=';
-        s += soap_encode_cookie(p->value, s, tmp-s+4064);
-      }
-      if (p->domain && (int)strlen(p->domain) < tmp-s+4064)
-        sprintf(s, ";Domain=%s", p->domain);
-      else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064)
-        sprintf(s, ";Domain=%s", soap->cookie_domain);
-      strcat(s, ";Path=/");
-      if (p->path)
-        t = p->path;
-      else
-        t = soap->cookie_path;
-      if (t)
-      { if (*t == '/')
-          t++;
-        if ((int)strlen(t) < tmp-s+4064)
-          strcat(s, t);
-      }
-      s += strlen(s);
-      if (p->version > 0)
-        sprintf(s, ";Version=%u", p->version);
-      if (p->expire >= 0)
-        sprintf(s, ";Max-Age=%ld", p->expire);
-      if (p->secure)
-        strcat(s, ";Secure");
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp));
-      if (soap->fposthdr(soap, "Set-Cookie", tmp))
-        return soap->error;
-    }
-  }
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure)
-{ struct soap_cookie **p, *q;
-  unsigned int version = 0;
-  time_t now = time(NULL);
-  char *s, tmp[4096];
-  p = &soap->cookies;
-  while ((q = *p))
-  { if (q->expire && now > q->expire)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name));
-      SOAP_FREE(q->name);
-      if (q->value)
-        SOAP_FREE(q->value);
-      if (q->domain)
-        SOAP_FREE(q->domain);
-      if (q->path)
-        SOAP_FREE(q->path);
-      *p = q->next;
-      SOAP_FREE(q);
-    }
-    else if ((!q->domain || !strcmp(q->domain, domain))
-          && (!q->path || !strncmp(q->path, path, strlen(q->path)))
-          && (!q->secure || secure))
-    { s = tmp;
-      if (q->version != version)
-      { sprintf(s, "$Version=%u;", q->version);
-        version = q->version;
-      }
-      if (q->name)
-        s += soap_encode_cookie(q->name, s, tmp-s+4080);
-      if (q->value && *q->value)
-      { *s++ = '=';
-        s += soap_encode_cookie(q->value, s, tmp-s+4080);
-      }
-      if (q->path && (int)strlen(q->path) < tmp-s+4080)
-      { sprintf(s, ";$Path=/%s", q->path);
-        s += strlen(s);
-      }
-      if (q->domain && (int)strlen(q->domain) < tmp-s+4080)
-        sprintf(s, ";$Domain=%s", q->domain);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp));
-      if (soap->fposthdr(soap, "Cookie", tmp))
-        return soap->error;
-      p = &q->next;
-    }
-    else
-      p = &q->next;
-  }
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_getcookies(struct soap *soap, const char *val)
-{ struct soap_cookie *p = NULL, *q;
-  const char *s;
-  char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
-  char *domain = NULL;
-  char *path = NULL;
-  unsigned int version = 0;
-  time_t now = time(NULL);
-  if (!val)
-    return;
-  s = val;
-  while (*s)
-  { s = soap_decode_key(tmp, sizeof(tmp), s);
-    if (!soap_tag_cmp(tmp, "$Version"))
-    { if ((s = soap_decode_val(tmp, sizeof(tmp), s)))
-      { if (p)
-          p->version = (int)atol(tmp);
-        else
-          version = (int)atol(tmp);
-      }
-    }
-    else if (!soap_tag_cmp(tmp, "$Path"))
-    { s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(t, tmp);
-      }
-      else
-        t = NULL;
-      if (p)
-      { if (p->path)
-          SOAP_FREE(p->path);
-        p->path = t;
-      }
-      else
-      { if (path)
-          SOAP_FREE(path);
-        path = t;
-      }
-    }
-    else if (!soap_tag_cmp(tmp, "$Domain"))
-    { s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(t, tmp);
-      }
-      else
-        t = NULL;
-      if (p)
-      { if (p->domain)
-          SOAP_FREE(p->domain);
-       p->domain = t;
-      }
-      else
-      { if (domain)
-          SOAP_FREE(domain);
-        domain = t;
-      }
-    }
-    else if (p && !soap_tag_cmp(tmp, "Path"))
-    { if (p->path)
-        SOAP_FREE(p->path);
-      s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((p->path = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(p->path, tmp);
-      }
-      else
-        p->path = NULL;
-    }
-    else if (p && !soap_tag_cmp(tmp, "Domain"))
-    { if (p->domain)
-        SOAP_FREE(p->domain);
-      s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((p->domain = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(p->domain, tmp);
-      }
-      else
-        p->domain = NULL;
-    }
-    else if (p && !soap_tag_cmp(tmp, "Version"))
-    { s = soap_decode_val(tmp, sizeof(tmp), s);
-      p->version = (unsigned int)atol(tmp);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Max-Age"))
-    { s = soap_decode_val(tmp, sizeof(tmp), s);
-      p->expire = now + atol(tmp);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Expires"))
-    { struct tm T;
-      char a[3]; 
-      static const char mns[] = "anebarprayunulugepctovec";
-      s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (strlen(tmp) > 20)
-      { memset((void*)&T, 0, sizeof(T));
-        a[0] = tmp[4];
-        a[1] = tmp[5];
-        a[2] = '\0';
-        T.tm_mday = (int)atol(a);
-        a[0] = tmp[8];
-        a[1] = tmp[9];
-        T.tm_mon = (strstr(mns, a) - mns) / 2;
-        a[0] = tmp[11];
-        a[1] = tmp[12];
-        T.tm_year = 100 + (int)atol(a);
-        a[0] = tmp[13];
-        a[1] = tmp[14];
-        T.tm_hour = (int)atol(a);
-        a[0] = tmp[16];
-        a[1] = tmp[17];
-        T.tm_min = (int)atol(a);
-        a[0] = tmp[19];
-        a[1] = tmp[20];
-        T.tm_sec = (int)atol(a);
-        p->expire = soap_timegm(&T);
-      }
-    }
-    else if (p && !soap_tag_cmp(tmp, "Secure"))
-      p->secure = 1;
-    else
-    { if (p)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
-        if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
-        { q->version = p->version;
-          q->expire = p->expire;
-          q->secure = p->secure;
-          q->env = 1;
-        }
-        if (p->name)
-          SOAP_FREE(p->name);
-        if (p->value)
-          SOAP_FREE(p->value);
-        if (p->domain)
-          SOAP_FREE(p->domain);
-        if (p->path)
-          SOAP_FREE(p->path);
-        SOAP_FREE(p);
-      }
-      if ((p = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-      { p->name = (char*)SOAP_MALLOC(strlen(tmp)+1);
-        strcpy(p->name, tmp);
-        s = soap_decode_val(tmp, sizeof(tmp), s);
-        if (*tmp)
-        { p->value = (char*)SOAP_MALLOC(strlen(tmp)+1);
-          strcpy(p->value, tmp);
-        }
-        else
-          p->value = NULL;
-        p->domain = domain;
-        p->path = path;
-        p->expire = 0;
-        p->secure = 0;
-        p->version = version;
-      }
-    }
-  }
-  if (p)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
-    if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
-    { q->version = p->version;
-      q->expire = p->expire;
-      q->secure = p->secure;
-    }
-    if (p->name)
-      SOAP_FREE(p->name);
-    if (p->value)
-      SOAP_FREE(p->value);
-    if (p->domain)
-      SOAP_FREE(p->domain);
-    if (p->path)
-      SOAP_FREE(p->path);
-    SOAP_FREE(p);
-  }
-  if (domain)
-    SOAP_FREE(domain);
-  if (path)
-    SOAP_FREE(path);
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getenv_cookies(struct soap *soap)
-{ struct soap_cookie *p;
-  const char *s;
-  char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
-  if (!(s = getenv("HTTP_COOKIE")))
-    return SOAP_ERR;
-  do
-  { s = soap_decode_key(key, sizeof(key), s);
-    s = soap_decode_val(val, sizeof(val), s);
-    p = soap_set_cookie(soap, key, val, NULL, NULL);
-    if (p)
-      p->env = 1;
-  } while (*s);
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_copy_cookies(struct soap *soap)
-{ struct soap_cookie *p, **q, *r;
-  q = &r;
-  for (p = soap->cookies; p; p = p->next)
-  { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-      return r;
-    **q = *p;
-    if (p->name)
-    { if (((*q)->name = (char*)SOAP_MALLOC(strlen(p->name)+1)))
-        strcpy((*q)->name, p->name);
-    }
-    if (p->value)
-    { if (((*q)->value = (char*)SOAP_MALLOC(strlen(p->value)+1)))
-        strcpy((*q)->value, p->value);
-    }
-    if (p->domain)
-    { if (((*q)->domain = (char*)SOAP_MALLOC(strlen(p->domain)+1)))
-        strcpy((*q)->domain, p->domain);
-    }
-    if (p->path)
-    { if (((*q)->path = (char*)SOAP_MALLOC(strlen(p->path)+1)))
-        strcpy((*q)->path, p->path);
-    }
-    q = &(*q)->next;
-  }
-  *q = NULL;
-  return r;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_free_cookies(struct soap *soap)
-{ struct soap_cookie *p;
-  for (p = soap->cookies; p; p = soap->cookies)
-  { soap->cookies = p->next;
-    SOAP_FREE(p->name);
-    if (p->value)
-      SOAP_FREE(p->value);
-    if (p->domain)
-      SOAP_FREE(p->domain);
-    if (p->path)
-      SOAP_FREE(p->path);
-    SOAP_FREE(p);
-  }
-}
-
-/******************************************************************************/
-#endif /* WITH_COOKIES */
-
-/******************************************************************************/
-#ifdef WITH_GZIP
-#ifndef PALM_2
-static int
-soap_getgziphdr(struct soap *soap)
-{ int i;
-  soap_wchar c, f = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n"));
-  for (i = 0; i < 9; i++)
-  { if ((int)(c = soap_get1(soap) == EOF))
-      return soap->error = SOAP_EOF;
-    if (i == 2)
-      f = c;
-  }
-  if (f & 0x04) /* FEXTRA */
-  { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--)
-      if ((int)soap_get1(soap) == EOF)
-        return soap->error = SOAP_EOF;
-  }
-  if (f & 0x08) /* FNAME */
-    do
-      c = soap_get1(soap);
-    while (c && (int)c != EOF);
-  if ((int)c != EOF && (f & 0x10)) /* FCOMMENT */
-    do
-      c = soap_get1(soap);
-    while (c && (int)f != EOF);
-  if ((int)c != EOF && (f & 0x01)) /* FHCRC */
-  { if ((int)(c = soap_get1(soap)) != EOF)
-      c = soap_get1(soap);
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_begin_recv(struct soap *soap)
-{ soap_wchar c;
-  soap->error = SOAP_OK;
-  soap_free(soap);
-  soap_set_local_namespaces(soap);
-  soap->version = 0;   /* don't assume we're parsing SOAP content by default */
-  soap_free_iht(soap);
-  if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK)
-    soap->omode |= SOAP_IO_CHUNK;
-  soap->imode &= ~SOAP_IO;
-  soap->mode = soap->imode;
-  if (!soap->keep_alive)
-  { soap->buflen = 0;
-    soap->bufidx = 0;
-  }
-  if (!(soap->mode & SOAP_IO_KEEPALIVE))
-    soap->keep_alive = 0;
-  soap->ahead = 0;
-  soap->peeked = 0;
-  soap->level = 0;
-  soap->part = SOAP_BEGIN;
-  soap->alloced = 0;
-  soap->count = 0;
-  soap->length = 0;
-  soap->cdata = 0;
-  *soap->endpoint = '\0';
-  soap->userid = NULL;
-  soap->passwd = NULL;
-  soap->action = NULL;
-  soap->authrealm = NULL;
-  soap->dime.chunksize = 0;
-  soap->dime.buflen = 0;
-  soap->dime.list = NULL;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-  soap->mime.list = NULL;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->mime.boundary = NULL;
-  soap->mime.start = NULL;
-#ifdef WIN32
-#ifndef UNDER_CE
-#ifndef WITH_FASTCGI
-  if (!soap_valid_socket(soap->socket))
-#ifdef __BORLANDC__
-    setmode((SOAP_SOCKET)soap->recvfd, O_BINARY);
-#else
-    _setmode((SOAP_SOCKET)soap->recvfd, _O_BINARY);
-#endif
-#endif
-#endif
-#endif
-#ifdef WITH_ZLIB
-  soap->mode &= ~SOAP_ENC_ZLIB;
-  soap->zlib_in = SOAP_ZLIB_NONE;
-  soap->zlib_out = SOAP_ZLIB_NONE;
-  soap->d_stream.next_in = Z_NULL;
-  soap->d_stream.avail_in = 0;
-  soap->d_stream.next_out = (Byte*)soap->buf;
-  soap->d_stream.avail_out = SOAP_BUFLEN;
-  soap->z_ratio_in = 1.0;
-  if (soap->fprepareinit)
-    soap->fprepareinit(soap);
-#endif
-  c = soap_getchar(soap);
-#ifdef WITH_GZIP
-  if (c == 0x1F)
-  { if (soap_getgziphdr(soap))
-      return soap->error;
-    if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
-      return soap->error = SOAP_ZLIB_ERROR;
-    soap->zlib_state = SOAP_ZLIB_INFLATE;
-    soap->mode |= SOAP_ENC_ZLIB;
-    soap->zlib_in = SOAP_ZLIB_GZIP;
-    soap->z_crc = crc32(0L, NULL, 0);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
-    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-    /* should not chunk over plain transport, so why bother to check? */
-    /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */
-    /*   soap->z_buflen = soap->bufidx; */
-    /* else */
-    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-    soap->d_stream.avail_in = soap->buflen - soap->bufidx;
-    soap->z_buflen = soap->buflen;
-    soap->buflen = soap->bufidx;
-    c = soap_getchar(soap);
-  }  
-#endif
-  if (c == '-' && soap_get0(soap) == '-')
-    soap->mode |= SOAP_ENC_MIME;
-  else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20)
-    soap->mode |= SOAP_ENC_DIME;
-  else
-  { while (soap_blank(c))
-      c = soap_getchar(soap);
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  soap_unget(soap, c);
-  if (c != '<' && !(soap->mode & (SOAP_ENC_DIME | SOAP_ENC_ZLIB)))
-  { soap->mode &= ~SOAP_IO;
-    if ((soap->error = soap->fparse(soap)))
-    { soap->keep_alive = 0; /* force close later */
-      return soap->error;
-    }
-    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    { soap->chunkbuflen = soap->buflen;
-      soap->buflen = soap->bufidx;
-      soap->chunksize = 0;
-    }
-    else if (soap->fpreparerecv && soap->buflen != soap->bufidx)
-      soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx);
-#ifdef WITH_ZLIB
-    if (soap->zlib_in)
-    { /* fparse should not use soap_unget to push back last char */
-#ifdef WITH_GZIP
-      c = soap_get1(soap);
-      if (c == 0x1F)
-      { if (soap_getgziphdr(soap))
-          return soap->error;
-        if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
-          return soap->error = SOAP_ZLIB_ERROR;
-        soap->zlib_state = SOAP_ZLIB_INFLATE;
-        soap->z_crc = crc32(0L, NULL, 0);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
-      }
-      else
-      { soap_revget1(soap);
-#else
-      {
-#endif
-        if (inflateInit(&soap->d_stream) != Z_OK)
-          return soap->error = SOAP_ZLIB_ERROR;
-        soap->zlib_state = SOAP_ZLIB_INFLATE;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n"));
-      }
-      soap->mode |= SOAP_ENC_ZLIB;
-      memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-      soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-      soap->d_stream.avail_in = soap->buflen - soap->bufidx;
-      soap->z_buflen = soap->buflen;
-      soap->buflen = soap->bufidx;
-    }
-#endif
-  }
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_MIME)
-  { if (soap_getmimehdr(soap))
-      return soap->error;
-    if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime"))
-      soap->mode |= SOAP_ENC_DIME;
-  }
-  if (soap->mode & SOAP_ENC_DIME)
-  { if (soap_getdimehdr(soap))
-      return soap->error;
-    if (soap->dime.flags & SOAP_DIME_CF)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n"));
-      soap->dime.chunksize = soap->dime.size;
-      if (soap->buflen - soap->bufidx >= soap->dime.chunksize)
-      { soap->dime.buflen = soap->buflen;
-        soap->buflen = soap->bufidx + soap->dime.chunksize;
-      }
-      else
-        soap->dime.chunksize -= soap->buflen - soap->bufidx;
-    }
-    soap->count = soap->buflen - soap->bufidx;
-  }
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_parse(struct soap *soap)
-{ char header[SOAP_HDRLEN], *s;
-  unsigned short g = 0, k;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for response...\n"));
-  *soap->endpoint = '\0';
-  soap->length = 0;
-  do
-  { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
-      return soap->error;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf));
-    for (;;)
-    { if (soap_getline(soap, header, SOAP_HDRLEN))
-        return soap->error;
-      if (!*header)
-        break;
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header));
-      s = strchr(header, ':');
-      if (s)
-      { *s = '\0';
-        do s++;
-        while (*s && *s <= 32);
-        if ((soap->error = soap->fparsehdr(soap, header, s)))
-          return soap->error;
-      }
-    }
-    if ((s = strchr(soap->msgbuf, ' ')))
-      k = (unsigned short)soap_strtoul(s, NULL, 10);
-    else
-      k = 0;
-  } while (k == 100);
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing\n"));
-  s = strstr(soap->msgbuf, "HTTP/");
-  if (s && s[7] != '1')
-  { if (soap->keep_alive == 1)
-      soap->keep_alive = 0;
-    if (k == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* k == 0 for HTTP request */
-    { soap->imode |= SOAP_IO_CHUNK;
-      soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE;
-    }
-  }
-  if (soap->keep_alive < 0)
-    soap->keep_alive = 1;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive));
-  if (s && (((g = !strncmp(soap->msgbuf, "GET ", 4))) || !strncmp(soap->msgbuf, "POST ", 5)))
-  { size_t m = strlen(soap->endpoint);
-    size_t n = m + (s - soap->msgbuf) - 5 - (!g);
-    if (n >= sizeof(soap->endpoint))
-      n = sizeof(soap->endpoint) - 1;
-    strncpy(soap->path, soap->msgbuf + 4 + (!g), n - m);
-    soap->path[n - m] = '\0';
-    strcat(soap->endpoint, soap->path);
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint));
-    if (g)
-    { soap->error = soap->fget(soap);
-      if (soap->error == SOAP_OK)
-        soap->error = SOAP_STOP; /* prevents further processing */
-      return soap->error;
-    }
-    return SOAP_OK;
-  }
-  if (k == 0 || (k >= 200 && k <= 299) || k == 400 || k == 500)
-    return SOAP_OK;
-  return soap_set_receiver_error(soap, "HTTP error", soap->msgbuf, k);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_parse_header(struct soap *soap, const char *key, const char *val)
-{ if (!soap_tag_cmp(key, "Host"))
-  { 
-#ifdef WITH_OPENSSL
-    if (soap->imode & SOAP_ENC_SSL)
-      strcpy(soap->endpoint, "https://");
-    else
-#endif
-      strcpy(soap->endpoint, "http://");
-    strncat(soap->endpoint, val, sizeof(soap->endpoint) - 8);
-    soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
-  }
-#ifndef WITH_LEANER
-  else if (!soap_tag_cmp(key, "Content-Type"))
-  { if (soap_get_header_attribute(soap, val, "application/dime"))
-      soap->mode |= SOAP_ENC_DIME;
-    else if (soap_get_header_attribute(soap, val, "multipart/related"))
-    { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary"));
-      soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start"));
-      soap->mode |= SOAP_ENC_MIME;
-    }
-  }
-#endif
-  else if (!soap_tag_cmp(key, "Content-Length"))
-    soap->length = soap_strtoul(val, NULL, 10);
-  else if (!soap_tag_cmp(key, "Content-Encoding"))
-  { if (!soap_tag_cmp(val, "deflate"))
-#ifdef WITH_ZLIB
-      soap->zlib_in = SOAP_ZLIB_DEFLATE;
-#else
-      return SOAP_ZLIB_ERROR;
-#endif
-    else if (!soap_tag_cmp(val, "gzip"))
-#ifdef WITH_GZIP
-      soap->zlib_in = SOAP_ZLIB_GZIP;
-#else
-      return SOAP_ZLIB_ERROR;
-#endif
-  }
-#ifdef WITH_ZLIB
-  else if (!soap_tag_cmp(key, "Accept-Encoding"))
-  {
-#ifdef WITH_GZIP
-    if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip"))
-      soap->zlib_out = SOAP_ZLIB_GZIP;
-    else
-#endif
-    if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate"))
-      soap->zlib_out = SOAP_ZLIB_DEFLATE;
-    else
-      soap->zlib_out = SOAP_ZLIB_NONE;
-  }
-#endif
-  else if (!soap_tag_cmp(key, "Transfer-Encoding"))
-  { soap->mode &= ~SOAP_IO;
-    if (!soap_tag_cmp(val, "chunked"))
-      soap->mode |= SOAP_IO_CHUNK;
-  }
-  else if (!soap_tag_cmp(key, "Connection"))
-  { if (!soap_tag_cmp(val, "keep-alive"))
-      soap->keep_alive = -soap->keep_alive;
-    else if (!soap_tag_cmp(val, "close"))
-      soap->keep_alive = 0;
-  }
-#ifndef WITH_LEAN
-  else if (!soap_tag_cmp(key, "Authorization"))
-  { if (!soap_tag_cmp(val, "Basic *"))
-    { size_t n;
-      char *s;
-      soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n);
-      soap->tmpbuf[n] = '\0';
-      if ((s = strchr(soap->tmpbuf, ':')))
-      { *s = '\0';
-       soap->userid = soap_strdup(soap, soap->tmpbuf);
-       soap->passwd = soap_strdup(soap, s + 1);
-      }
-    }
-  }
-#endif
-  else if (!soap_tag_cmp(key, "SOAPAction"))
-  { if (val[0] && val[1])
-    { soap->action = soap_strdup(soap, val + 1);
-      soap->action[strlen(soap->action) - 1] = '\0';
-    }
-  }
-  else if (!soap_tag_cmp(key, "Location"))
-  { strncpy(soap->endpoint, val, sizeof(soap->endpoint));
-    soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
-  }
-  else if (!soap_tag_cmp(key, "WWW-Authenticate"))
-    soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val+6, "realm"));
-  else if (!soap_tag_cmp(key, "Expect"))
-  { if (!soap_tag_cmp(val, "100-continue"))
-    { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL)))
-        return soap->error;
-      if ((soap->error = soap->fposthdr(soap, NULL, NULL)))
-        return soap->error;
-    }
-  }
-#ifdef WITH_COOKIES
-  else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Set-Cookie"))
-    soap_getcookies(soap, val);
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_get_header_attribute(struct soap *soap, const char *line, const char *key)
-{ register const char *s = line;
-  if (s)
-  { while (*s)
-    { register short flag;
-      s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s);
-      flag = soap_tag_cmp(soap->tmpbuf, key);
-      s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s);
-      if (!flag)
-        return soap->tmpbuf;
-    }
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_decode_key(char *buf, size_t len, const char *val)
-{ return soap_decode(buf, len, val, "=,;");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_decode_val(char *buf, size_t len, const char *val)
-{ if (*val != '=')
-  { *buf = '\0';
-    return val;
-  }
-  return soap_decode(buf, len, val + 1, ",;");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-soap_decode(char *buf, size_t len, const char *val, const char *sep)
-{ const char *s;
-  char *t = buf;
-  for (s = val; *s; s++)
-    if (*s != ' ' && *s != '\t' && !strchr(sep, *s))
-      break;
-  if (*s == '"')
-  { s++;
-    while (*s && *s != '"' && --len)
-      *t++ = *s++;
-  }
-  else
-  { while (soap_notblank(*s) && !strchr(sep, *s) && --len)
-    { if (*s == '%')
-      { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4)
-              + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0');
-        s += 3;
-      }
-      else
-        *t++ = *s++;
-    }
-  }
-  *t = '\0';
-  while (*s && !strchr(sep, *s))
-    s++;
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_begin_out(struct soap *soap)
-{
-#ifndef WITH_LEANER
-  size_t n = 0;
-  if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start)
-  { const char *s;
-    if (soap->mode & SOAP_ENC_DIME)
-      s = "application/dime";
-    else if (soap->version == 2)
-      s = "application/soap+xml; charset=utf-8";
-    else
-      s = "text/xml; charset=utf-8";
-    sprintf(soap->tmpbuf, "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start);
-    n = strlen(soap->tmpbuf);
-    if (soap_send_raw(soap, soap->tmpbuf, n))
-      return soap->error;
-  }
-  if (soap->mode & SOAP_IO_LENGTH)
-    soap->dime.size = soap->count;     /* DIME in MIME correction */
-  if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME))
-  { if (soap_putdimehdr(soap))
-      return soap->error;
-  }
-#endif
-  soap->part = SOAP_IN_ENVELOPE;
-  return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_end_out(struct soap *soap)
-{ if (soap_element_end_out(soap, "SOAP-ENV:Envelope"))
-    return soap->error;
-#ifndef WITH_LEANER
-  if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME))
-  { soap->dime.size = soap->count - soap->dime.size;   /* DIME in MIME correction */
-    sprintf(soap->id, soap->dime_id_format, 0);
-    soap->dime.id = soap->id;
-    if (soap->local_namespaces)
-    { if (soap->local_namespaces[0].out)
-        soap->dime.type = (char*)soap->local_namespaces[0].out;
-      else
-        soap->dime.type = (char*)soap->local_namespaces[0].ns;
-    }
-    soap->dime.options = NULL;
-    soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI;
-    if (!soap->dime.first)
-      soap->dime.flags |= SOAP_DIME_ME;
-    soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + ((strlen(soap->dime.type)+3)&(~3));
-  }
-  if (soap->mode & SOAP_ENC_DIME)
-    return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3);
-#endif
-  soap->part = SOAP_END_ENVELOPE;
-  return SOAP_OK;
-} 
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_begin_in(struct soap *soap)
-{ register struct Namespace *p;
-  soap->part = SOAP_IN_ENVELOPE;
-  if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0))
-    return soap->error = SOAP_VERSIONMISMATCH;
-  p = soap->local_namespaces;
-  if (p)
-  { const char *ns = p[0].out;
-    if (!ns)
-      ns = p[0].ns;
-    if (!strcmp(ns, soap_env1))
-    { soap->version = 1; /* make sure we use SOAP 1.1 */
-      if (p[1].out)
-        SOAP_FREE(p[1].out);
-      if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc1))))
-        strcpy(p[1].out, soap_enc1);
-    }
-    else if (!strcmp(ns, soap_env2))
-    { soap->version = 2; /* make sure we use SOAP 1.2 */
-      if (p[1].out)
-        SOAP_FREE(p[1].out);
-      if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc2))))
-        strcpy(p[1].out, soap_enc2);
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_end_in(struct soap *soap)
-{ if (soap_element_end_in(soap, "SOAP-ENV:Envelope"))
-    return soap->error;
-  soap->part = SOAP_END_ENVELOPE;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_begin_out(struct soap *soap)
-{ soap->part = SOAP_IN_BODY;
-  if (soap->version == 1)
-    soap->encoding = 1;
-  if (soap_element(soap, "SOAP-ENV:Body", 0, NULL))
-    return soap->error;
-  if ((soap->mode & SOAP_XML_SEC) && soap_attribute(soap, "id", "_0"))
-    return soap->error;
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_end_out(struct soap *soap)
-{ if (soap_element_end_out(soap, "SOAP-ENV:Body"))
-    return soap->error;
-  soap->part = SOAP_IN_BODY;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_begin_in(struct soap *soap)
-{ soap->part = SOAP_IN_BODY;
-  return soap_element_begin_in(soap, "SOAP-ENV:Body", 0);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_end_in(struct soap *soap)
-{ if (soap_element_end_in(soap, "SOAP-ENV:Body"))
-    return soap->error;
-  soap->part = SOAP_END_BODY;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_header(struct soap *soap)
-{ if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH)
-    soap->error = SOAP_OK;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_endpoint(struct soap *soap, const char *endpoint)
-{ register const char *s;
-  register size_t i, n;
-  *soap->endpoint = '\0';
-  *soap->host = '\0';
-  *soap->path = '\0';
-  soap->port = 80;
-  if (!endpoint || !*endpoint)
-    return;
-#ifdef WITH_OPENSSL
-  if (!strncmp(endpoint, "https:", 6))
-    soap->port = 443;
-#endif
-  strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1);
-  s = strchr(endpoint, ':');
-  if (s && s[1] == '/' && s[2] == '/')
-    s += 3;
-  else
-    s = endpoint;
-  n = strlen(s);
-  if (n >= sizeof(soap->host))
-    n = sizeof(soap->host) - 1;
-/* WR[ */
-#ifdef WITH_IPV6
-  if ('[' == s[0])
-  {
-    s++;
-    for (i = 0; i < n; i++)
-    { soap->host[i] = s[i];
-      if (']' == s[i])
-      {
-        s++;
-        break; 
-      }
-    }
-  }
-  else
-  {
-    for (i = 0; i < n; i++)
-    { soap->host[i] = s[i];
-      if (s[i] == '/' || s[i] == ':')
-        break; 
-    }
-  }
-#else /* WITH_IPV6 */
-/* ]WR */
-  for (i = 0; i < n; i++)
-  { soap->host[i] = s[i];
-    if (s[i] == '/' || s[i] == ':')
-      break; 
-  }
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-  soap->host[i] = '\0';
-  if (s[i] == ':')
-  { soap->port = (int)atol(s + i + 1);
-    for (i++; i < n; i++)
-      if (s[i] == '/')
-        break;
-  }
-  if (s[i])
-  { strncpy(soap->path, s + i + 1, sizeof(soap->path));
-    soap->path[sizeof(soap->path) - 1] = '\0';
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_connect(struct soap *soap, const char *endpoint, const char *action)
-{ return soap_connect_command(soap, SOAP_POST, endpoint, action);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action)
-{ char host[sizeof(soap->host)];
-  int port;
-  size_t count;
-  soap->error = SOAP_OK;
-  strcpy(host, soap->host); /* save to compare */
-  port = soap->port; /* save to compare */
-  soap_set_endpoint(soap, endpoint);
-  if (action)
-    soap->action = soap_strdup(soap, action);
-  if (soap->fconnect)
-  {
-    if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port)))
-      return soap->error;
-  }
-  else if (*soap->host)
-  { soap->status = http_command;
-    if (!soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port)
-    { soap->keep_alive = 0; /* force close */
-      soap_closesock(soap);
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
-      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
-      if (soap->error)
-        return soap->error;
-      soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0);
-    }
-    else if (!soap->keep_alive || !soap->fpoll || soap->fpoll(soap))
-    { soap->keep_alive = 0; /* force close */
-      soap_closesock(soap);
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
-      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
-      if (soap->error)
-        return soap->error;
-    }
-  }
-  if (soap_begin_send(soap))
-    return soap->error;
-  count = soap_count_attachments(soap);
-  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint)
-  { unsigned int k = soap->mode;
-    soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
-    if ((k & SOAP_IO) != SOAP_IO_FLUSH)
-      soap->mode |= SOAP_IO_BUFFER;
-    if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count)))
-      return soap->error;
-    if ((k & SOAP_IO) == SOAP_IO_CHUNK)
-    { if (soap_flush(soap))
-        return soap->error;
-    }
-    soap->mode = k;
-  }
-  if (http_command != SOAP_POST)
-    return soap_end_send(soap);
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_s2base64(struct soap *soap, const unsigned char *s, char *t, size_t n)
-{ register size_t i;
-  register unsigned long m;
-  register char *p;
-  if (!t)
-    t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1);
-  if (!t)
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  p = t;
-  t[0] = '\0';
-  if (!s)
-    return p;
-  for (; n > 2; n -= 3, s += 3)
-  { m = s[0];
-    m = (m << 8) | s[1];
-    m = (m << 8) | s[2];
-    for (i = 4; i > 0; m >>= 6)
-      t[--i] = soap_base64o[m & 0x3F];
-    t += 4;
-  }
-  t[0] = '\0';
-  if (n > 0)
-  { m = 0;
-    for (i = 0; i < n; i++)
-      m = (m << 8) | *s++;
-    for (; i < 3; i++)
-      m <<= 8;
-    for (i++; i > 0; m >>= 6)
-      t[--i] = soap_base64o[m & 0x3F];
-    for (i = 3; i > n; i--)
-      t[i] = '=';
-    t[4] = '\0';
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_base642s(struct soap *soap, const char *s, char *t, size_t l, size_t *n)
-{ register int i, j, c;
-  register unsigned long m;
-  char *p = t;
-  if (n)
-    *n = 0;
-  for (;;)
-  { for (i = 0; i < SOAP_BLKLEN; i++)
-    { m = 0;
-      j = 0;
-      while (j < 4)
-      { c = *s++;
-        if (c == '=' || !c)
-        { i *= 3;
-          switch (j)
-          { case 2:
-              *t++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *t++ = (char)((m >> 10) & 0xFF);
-              *t++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-           *n += i;
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      }
-      *t++ = (char)((m >> 16) & 0xFF);
-      *t++ = (char)((m >> 8) & 0xFF);
-      *t++ = (char)(m & 0xFF);
-      if (l < 3)
-      { if (n)
-         *n += i;
-        return p;
-      }
-      l -= 3;
-    }
-    if (n)
-      *n += 3 * SOAP_BLKLEN;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_puthttphdr(struct soap *soap, int status, size_t count)
-{ register const char *s;
-  register int err;
-  if (status == SOAP_FILE)
-    s = soap->http_content;
-  else if (status == SOAP_HTML)
-    s = "text/html; charset=utf-8";
-#ifndef WITH_LEANER
-  else if (soap->mode & SOAP_ENC_DIME)
-    s = "application/dime";
-#endif
-  else if (soap->version == 2)
-    s = "application/soap+xml; charset=utf-8";
-  else
-    s = "text/xml; charset=utf-8";
-#ifndef WITH_LEANER
-  if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start && soap->status != SOAP_GET)
-  { sprintf(soap->tmpbuf, "multipart/related; boundary=\"%s\"; type=%s; start=\"%s\"", soap->mime.boundary, s, soap->mime.start);
-    s = soap->tmpbuf;
-  }
-#endif
-  if ((err = soap->fposthdr(soap, "Content-Type", s)))
-    return err;
-#ifdef WITH_ZLIB
-  if (soap->omode & SOAP_ENC_ZLIB)
-  {
-#ifdef WITH_GZIP
-    err = soap->fposthdr(soap, "Content-Encoding", "gzip");
-#else
-    err = soap->fposthdr(soap, "Content-Encoding", "deflate");
-#endif
-    if (err)
-      return err;
-  }
-#endif
-  if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)
-    err = soap->fposthdr(soap, "Transfer-Encoding", "chunked");
-  else if (count > 0)
-  { sprintf(soap->tmpbuf, "%lu", (unsigned long)count);
-    err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf);
-  }
-  if (err)
-    return err;
-  return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_get(struct soap *soap)
-{ return SOAP_GET_METHOD;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count)
-{ register const char *s;
-  register int err;
-  if (soap->status == SOAP_GET)
-  { s = "GET";
-    count = 0;
-  }
-  else
-    s = "POST";
-#ifndef PALM
-  if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)))
-#else
-  if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8))
-#endif
-    return SOAP_OK;
-  if (soap->proxy_host && strncmp(endpoint, "https:", 6))
-    sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version);
-  else
-    sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, path, soap->http_version);
-  if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-    return err;
-  if (port != 80)
-    sprintf(soap->tmpbuf, "%s:%d", host, port);
-  else
-    strcpy(soap->tmpbuf, host); 
-  if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))
-   || (err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.7"))
-   || (err = soap_puthttphdr(soap, SOAP_OK, count)))
-    return err;
-#ifdef WITH_ZLIB
-#ifdef WITH_GZIP
-  if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate")))
-#else
-  if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate")))
-#endif
-    return err;
-#endif
-#ifndef WITH_LEAN
-  if (soap->userid && soap->passwd && strlen(soap->userid) + strlen(soap->passwd) < 761)
-  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd);
-    strcpy(soap->tmpbuf, "Basic ");
-    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-    if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf)))
-      return err;
-  }
-  if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
-  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
-    strcpy(soap->tmpbuf, "Basic ");
-    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-    if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
-      return err;
-  }
-#endif
-#ifdef WITH_COOKIES
-#ifdef WITH_OPENSSL
-  if (soap_putcookies(soap, host, path, soap->ssl != NULL))
-    return soap->error;
-#else
-  if (soap_putcookies(soap, host, path, 0))
-    return soap->error;
-#endif
-#endif
-  if (action && soap->version == 1)
-  { sprintf(soap->tmpbuf, "\"%s\"", action);
-    if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf)))
-      return err;
-  }
-  return soap->fposthdr(soap, NULL, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_send_header(struct soap *soap, const char *s)
-{ register const char *t;
-  do
-  { t = strchr(s, '\n'); /* disallow \n in HTTP headers */
-    if (!t)
-      t = s + strlen(s);
-    if (soap_send_raw(soap, s, t - s))
-      return soap->error;
-    s = t + 1;
-  } while (*t);
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_post_header(struct soap *soap, const char *key, const char *val)
-{ if (key)
-  { if (http_send_header(soap, key))
-      return soap->error;
-    if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val)))
-      return soap->error;
-  }
-  return soap_send_raw(soap, "\r\n", 2);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_response(struct soap *soap, int status, size_t count)
-{ register int err;
-/* WR[ */
-#ifdef WMW_RPM_IO
-  if (soap->rpmreqid)
-      {
-      httpOutputEnable(soap->rpmreqid);
-      }
-#endif  /* WMW_RPM_IO */
-/* ]WR */
-  if (!status || status == SOAP_HTML || status == SOAP_FILE)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "OK 200\n"));
-/* WR[ */
-#ifdef WMW_RPM_IO
-    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
-#else
-/* ]WR */
-    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
-/* WR[ */
-#endif /* WMW_RPM_IO */
-/* ]WR */
-    { sprintf(soap->tmpbuf, "HTTP/%s 200 OK", soap->http_version);
-      if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return err;
-    }
-    else if ((err = soap->fposthdr(soap, "Status", "200 OK")))
-      return err;
-  }
-  else if (status > 200 && status < 600)
-  { sprintf(soap->tmpbuf, "HTTP/%s %d %s", soap->http_version, status, http_error(soap, status));
-    if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-      return err;
-    if (status == 401)
-    { sprintf(soap->tmpbuf, "Basic realm=\"%s\"", soap->authrealm ? soap->authrealm : "gSOAP Web Service");
-      if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf)))
-        return err;
-    }
-    else if ((status >= 301 && status <= 303) || status == 307)
-    { if ((err = soap->fposthdr(soap, "Location", soap->endpoint)))
-        return err;
-    }
-  }
-  else
-  { const char *s = *soap_faultcode(soap);
-    if (soap->version == 2 && !strcmp(s, "SOAP-ENV:Sender"))
-      s = "400 Bad Request";
-    else
-      s = "500 Internal Server Error";
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error %s (status=%d)\n", s, status));
-/* WR[ */
-#ifdef WMW_RPM_IO
-    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
-#else
-/* ]WR */
-    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
-/* WR[ */
-#endif /* WMW_RPM_IO */
-/* ]WR */
-    { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s);
-      if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return err;
-    }
-    else if ((err = soap->fposthdr(soap, "Status", s)))
-      return err;
-  }
-  if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.7"))
-   || (err = soap_puthttphdr(soap, status, count)))
-    return err;
-#ifdef WITH_COOKIES
-  if (soap_putsetcookies(soap))
-    return soap->error;
-#endif
-  return soap->fposthdr(soap, NULL, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_response(struct soap *soap, int status)
-{ register size_t count;
-  if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */))
-   && (status == SOAP_HTML || status == SOAP_FILE))
-  { soap->omode &= ~SOAP_IO;
-    soap->omode |= SOAP_IO_STORE;
-  }
-  soap->status = status;
-  count = soap_count_attachments(soap);
-  if (soap_begin_send(soap))
-    return soap->error;
-  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML))
-  { register int n = soap->mode;
-    soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
-    if ((n & SOAP_IO) != SOAP_IO_FLUSH)
-      soap->mode |= SOAP_IO_BUFFER;
-    if ((soap->error = soap->fresponse(soap, status, count)))
-      return soap->error;
-    if ((n & SOAP_IO) == SOAP_IO_CHUNK)
-    { if (soap_flush(soap))
-        return soap->error;
-    }
-    soap->mode = n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-soap_set_validation_fault(struct soap *soap, const char *s, const char *t)
-{ sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element <%s>", s, t?t:SOAP_STR_EOS, soap->tag);
-  return soap->msgbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_fault(struct soap *soap)
-{ const char **c = soap_faultcode(soap);
-  const char **s = soap_faultstring(soap);
-  if (!*c)
-  { if (soap->version == 2)
-      *c = "SOAP-ENV:Sender";
-    else
-      *c = "SOAP-ENV:Client";
-  }
-  if (*s)
-    return;
-  switch (soap->error)
-  { case SOAP_CLI_FAULT:
-      *s = "Client fault";
-      break;
-    case SOAP_SVR_FAULT:
-      *s = "Server fault";
-      break;
-    case SOAP_TAG_MISMATCH:
-      *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL);
-      break;
-    case SOAP_TAG_END:
-      *s = soap_set_validation_fault(soap, "incorrect end tag", NULL);
-      break;
-    case SOAP_TYPE:
-      *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type);
-      break;
-    case SOAP_SYNTAX_ERROR:
-      *s = "Well-formedness constraint violation";
-      break;
-    case SOAP_NO_TAG:
-      *s = "No XML element tag found";
-      break;
-    case SOAP_MUSTUNDERSTAND:
-      *c = "SOAP-ENV:MustUnderstand";
-      sprintf(soap->msgbuf, "The data in element '%s' must be understood but cannot be handled", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_VERSIONMISMATCH:
-      *c = "SOAP-ENV:VersionMismatch";
-      *s = "SOAP version mismatch or invalid SOAP message";
-      break;
-    case SOAP_DATAENCODINGUNKNOWN:
-      *c = "SOAP-ENV:DataEncodingUnknown";
-      *s = "Unsupported SOAP data encoding";
-      break;
-    case SOAP_NAMESPACE:
-      *s = soap_set_validation_fault(soap, "namespace mismatch", NULL);
-      break;
-    case SOAP_FATAL_ERROR:
-      *s = "Fatal error";
-      break;
-    case SOAP_NO_METHOD:
-      sprintf(soap->msgbuf, "Method '%s' not implemented: method name or namespace not recognized", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_GET_METHOD:
-      *s = "HTTP GET method not implemented";
-      break;
-    case SOAP_EOM:
-      *s = "Out of memory";
-      break;
-    case SOAP_IOB:
-      *s = "Array index out of bounds";
-      break;
-    case SOAP_NULL:
-      *s = soap_set_validation_fault(soap, "nil not allowed", NULL);
-      break;
-    case SOAP_MULTI_ID:
-      *s = soap_set_validation_fault(soap, "multiple definitions of id ", soap->id);
-      break;
-    case SOAP_MISSING_ID:
-      *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id);
-      break;
-    case SOAP_HREF:
-      *s = soap_set_validation_fault(soap, "incompatible object ref ", soap->id);
-      break;
-    case SOAP_FAULT:
-      break;
-    case SOAP_TCP_ERROR:
-      *s = tcp_error(soap);
-      break;
-    case SOAP_HTTP_ERROR:
-      *s = "HTTP error";
-      break;
-    case SOAP_SSL_ERROR:
-      *s = "SSL error";
-      break;
-    case SOAP_PLUGIN_ERROR:
-      *s = "Plugin registry error";
-      break;
-    case SOAP_DIME_MISMATCH:
-      *s = "DIME version/transmission error";
-      break;
-    case SOAP_DIME_END:
-      *s = "End of DIME error";
-      break;
-    case SOAP_DIME_ERROR:
-      *s = "DIME format error";
-      break;
-    case SOAP_MIME_ERROR:
-      *s = "MIME format error";
-      break;
-    case SOAP_ZLIB_ERROR:
-#ifdef WITH_ZLIB
-      sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream.msg?soap->d_stream.msg:"");
-      *s = soap->msgbuf;
-#else
-      *s = "Zlib not installed for required message (de)compression";
-#endif
-      break;
-    case SOAP_REQUIRED:
-      *s = soap_set_validation_fault(soap, "missing required attribute", NULL);
-      break;
-    case SOAP_PROHIBITED:
-      *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL);
-      break;
-    case SOAP_OCCURS:
-      *s = soap_set_validation_fault(soap, "a min/maxOccurs violation was detected", NULL);
-      break;
-    case SOAP_LENGTH:
-      *s = soap_set_validation_fault(soap, "content length violation", NULL);
-      break;
-    case SOAP_EOF:
-      sprintf(soap->msgbuf, "End of file or no input: '%s'", soap_strerror(soap));
-      *s = soap->msgbuf;
-      break;
-    default:
-      if (soap->error > 200 && soap->error < 600)
-      { sprintf(soap->msgbuf, "HTTP Error: '%s'", http_error(soap, soap->error));
-        *s = soap->msgbuf;
-      }
-      else
-        *s = "Unknown error code";
-    }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send_fault(struct soap *soap)
-{ register int status = soap->error;
-  if (status == SOAP_STOP)
-    return status;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error));
-  soap->keep_alive = 0; /* to terminate connection */
-  soap_set_fault(soap);
-  if ((status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) && (!soap->fpoll || soap->fpoll(soap) == SOAP_OK))
-  { soap->error = SOAP_OK;
-    soap_serializeheader(soap);
-    soap_serializefault(soap);
-    soap_begin_count(soap);
-    if (soap->mode & SOAP_IO_LENGTH)
-    { soap_envelope_begin_out(soap);
-      soap_putheader(soap);
-      soap_body_begin_out(soap);
-      soap_putfault(soap);
-      soap_body_end_out(soap);
-      soap_envelope_end_out(soap);
-    }
-    if (soap_response(soap, status)
-     || soap_envelope_begin_out(soap)
-     || soap_putheader(soap)
-     || soap_body_begin_out(soap)
-     || soap_putfault(soap)
-     || soap_body_end_out(soap)
-     || soap_envelope_end_out(soap))
-      return soap_closesock(soap);
-    soap_end_send(soap);
-  }
-  soap->error = status;
-  return soap_closesock(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_fault(struct soap *soap)
-{ register int status = soap->error;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Receiving SOAP Fault\n"));
-  soap->error = SOAP_OK;
-  if (soap_getfault(soap))
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed. Is this a SOAP message at all?\n"));
-    *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client");
-    soap->error = status;
-    soap_set_fault(soap);
-  }
-  else
-  { register const char *s = *soap_faultcode(soap);
-    if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver"))
-      status = SOAP_SVR_FAULT; 
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender"))
-      status = SOAP_CLI_FAULT;
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand"))
-      status = SOAP_MUSTUNDERSTAND;
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch"))
-      status = SOAP_VERSIONMISMATCH;
-    else
-    { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Fault code %s\n", s));
-      status = SOAP_FAULT;
-    }
-    if (soap_body_end_in(soap)
-     || soap_envelope_end_in(soap)
-     || soap_end_recv(soap))
-      return soap_closesock(soap);
-    soap->error = status;
-  }
-  return soap_closesock(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-soap_strerror(struct soap *soap)
-{ int err = soap->errnum;
-  if (!err)
-    err = soap_errno;
-  if (err)
-  {
-#ifndef UNDER_CE
-    return strerror(err);
-#else
-    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)&soap->werrorstr, sizeof(soap->werrorstr), NULL);
-    wcstombs(soap->errorstr, soap->werrorstr, sizeof(soap->errorstr));
-    return soap->errorstr;
-#endif
-  }
-  return "Operation interrupted or timed out";
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_set_error(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail, int soaperror)
-{ *soap_faultcode(soap) = faultcode;
-  *soap_faultstring(soap) = faultstring;
-  if (faultdetail && *faultdetail)
-  { register const char **s = soap_faultdetail(soap);
-    if (s)
-      *s = faultdetail;
-  }
-  return soap->error = soaperror;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
-{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail, soaperror);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
-{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail, soaperror);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail)
-{ char *s = NULL, *t = NULL;
-  if (faultstring)
-    s = soap_strdup(soap, faultstring);
-  if (faultdetail)
-    t = soap_strdup(soap, faultdetail);
-  return soap_set_error(soap, faultcode, s, t, SOAP_FAULT);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
-{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
-{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_print_fault(struct soap *soap, FILE *fd)
-{ if (soap->error)
-  { const char **s;
-    if (!*soap_faultcode(soap))
-      soap_set_fault(soap);
-    fprintf(fd, "SOAP FAULT: %s\n\"%s\"\n", *soap_faultcode(soap), *soap_faultstring(soap));
-    s = soap_faultdetail(soap);
-    if (s && *s)
-      fprintf(fd, "Detail: %s\n", *s);
-  }
-}
-#endif
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_print_fault_location(struct soap *soap, FILE *fd)
-{ 
-#ifndef WITH_LEAN
-  int c;
-  if (soap->error && soap->buflen > 0)
-  { if (soap->bufidx == 0)
-      soap->bufidx = 1;
-    c = soap->buf[soap->bufidx - 1];
-    soap->buf[soap->bufidx - 1] = '\0';
-    if (soap->buflen - soap->bufidx > 1024)
-      soap->buf[soap->bufidx + 1024] = '\0';
-    else
-      soap->buf[soap->buflen - 1] = '\0';
-    fprintf(fd, "%s%c\n** HERE **\n", soap->buf, c);
-    if (soap->bufidx < soap->buflen)
-      fprintf(fd, "%s\n", soap->buf + soap->bufidx);
-  }
-#endif
-}
-#endif
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg)
-{ register struct soap_plugin *p;
-  register int r;
-  if (!(p = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin))))
-    return soap->error = SOAP_EOM;
-  p->id = NULL;
-  p->data = NULL;
-  p->fcopy = NULL;
-  p->fdelete = NULL;
-  r = fcreate(soap, p, arg);
-  if (!r && p->fdelete)
-  { p->next = soap->plugins;
-    soap->plugins = p;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id));
-    return SOAP_OK;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id?p->id:"?", r));
-  SOAP_FREE(p);
-  return r;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void *
-fplugin(struct soap *soap, const char *id)
-{ register struct soap_plugin *p;
-  for (p = soap->plugins; p; p = p->next)
-    if (p->id == id || !strcmp(p->id, id))
-      return p->data;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void *
-SOAP_FMAC2
-soap_lookup_plugin(struct soap *soap, const char *id)
-{ return soap->fplugin(soap, id);
-}
-#endif
-
-/******************************************************************************/
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/org.glite.lb.server/examples/stdsoap2_2.7.0d.c b/org.glite.lb.server/examples/stdsoap2_2.7.0d.c
deleted file mode 100644 (file)
index fab9eee..0000000
+++ /dev/null
@@ -1,11692 +0,0 @@
-/*
-
-stdsoap2.c[pp] 2.7.0d
-
-Runtime environment.
-
-gSOAP XML Web services tools
-Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved.
-
-Contributors:
-
-Wind River Systems, Inc., for the following additions (marked WR[...]):
-  - vxWorks compatible
-  - Support for IPv6.
-
---------------------------------------------------------------------------------
-gSOAP public license.
-
-The contents of this file are subject to the gSOAP Public License Version 1.3
-(the "License"); you may not use this file except in compliance with the
-License. You may obtain a copy of the License at
-http://www.cs.fsu.edu/~engelen/soaplicense.html
-Software distributed under the License is distributed on an "AS IS" basis,
-WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-for the specific language governing rights and limitations under the License.
-
-The Initial Developer of the Original Code is Robert A. van Engelen.
-Copyright (C) 2000-2004, Robert van Engelen, Genivia, Inc., All Rights Reserved.
---------------------------------------------------------------------------------
-GPL license.
-
-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
-
-Author contact information:
-engelen@genivia.com / engelen@acm.org
---------------------------------------------------------------------------------
-
-Installation note:
-
-Win32 build needs winsock.dll (Visual C++ "wsock32.lib")
-To do this in Visual C++ 6.0, go to "Project", "settings", select the "Link"
-tab (the project file needs to be selected in the file view) and add
-"wsock32.lib" to the "Object/library modules" entry
-
-On Mac OS X with gcc (GCC) 3.1 20020420 (prerelease) you MUST compile with
--fstack_check when using -O2 because gcc 3.1 has a bug that smashes the stack
-when locally allocated data exceeds 64K.
-
-*/
-
-#include "stdsoap2.h"
-
-#ifdef __cplusplus
-SOAP_SOURCE_STAMP("@(#) stdsoap2.cpp ver 2.7.0c 2004-09-27 12:00:00 GMT")
-extern "C" {
-#else
-SOAP_SOURCE_STAMP("@(#) stdsoap2.c ver 2.7.0c 2004-09-27 12:00:00 GMT")
-#endif
-
-/* 8bit character representing unknown/nonrepresentable character data (e.g. not supported by current locale) */
-#ifndef SOAP_UNKNOWN_CHAR
-#define SOAP_UNKNOWN_CHAR (127)
-#endif
-
-/*      EOF=-1 */
-#define SOAP_LT (soap_wchar)(-2) /* XML character '<' */
-#define SOAP_TT (soap_wchar)(-3) /* XML character '</' */
-#define SOAP_GT (soap_wchar)(-4) /* XML character '>' */
-#define SOAP_QT (soap_wchar)(-5) /* XML character '"' */
-#define SOAP_AP (soap_wchar)(-6) /* XML character ''' */
-
-#define soap_blank(c)          ((c) >= 0 && (c) <= 32)
-#define soap_notblank(c)       ((c) > 32)
-#define soap_hash_ptr(p)       (((unsigned long)(p) >> 3) & (SOAP_PTRHASH - 1))
-
-static int soap_isxdigit(int);
-static soap_wchar soap_char(struct soap*);
-static soap_wchar soap_getchunkchar(struct soap*);
-static void soap_update_ptrs(struct soap*, char*, char*, long);
-static int soap_has_copies(struct soap*, const char*, const char*);
-static struct soap_ilist *soap_hlookup(struct soap*, const char*);
-static void soap_init_iht(struct soap*);
-static void soap_free_iht(struct soap*);
-static void soap_init_pht(struct soap*);
-static void soap_free_pht(struct soap*);
-static int soap_set_error(struct soap*, const char*, const char*, const char*, int);
-static const char *soap_set_validation_fault(struct soap*, const char*, const char*);
-static int soap_copy_fault(struct soap*, const char*, const char*, const char*);
-static int soap_getattrval(struct soap*, char*, size_t, soap_wchar);
-static void soap_set_local_namespaces(struct soap*);
-static int soap_isnumeric(struct soap*, const char*);
-static void *fplugin(struct soap*, const char*);
-static const char *soap_decode(char*, size_t, const char*, const char*);
-
-#ifndef WITH_LEAN
-static time_t soap_timegm(struct tm*);
-#endif
-
-#ifdef SOAP_DEBUG
-static void soap_init_logs(struct soap*);
-static void soap_close_logfile(struct soap*, int);
-static void soap_set_logfile(struct soap*, int, const char*);
-#endif
-
-#ifdef WITH_FAST
-static int soap_append_lab(struct soap*, const char*, size_t);
-#endif
-
-#ifndef WITH_LEANER
-static struct soap_multipart *soap_new_multipart(struct soap*, struct soap_multipart**, struct soap_multipart**, char*, size_t);
-static int soap_putdimefield(struct soap*, const char*, size_t);
-static char *soap_getdimefield(struct soap*, size_t);
-static void soap_select_mime_boundary(struct soap*);
-static int soap_valid_mime_boundary(struct soap*);
-#endif
-
-#ifdef WITH_GZIP
-static int soap_getgziphdr(struct soap*);
-#endif
-
-#ifdef WITH_OPENSSL
-static int ssl_auth_init(struct soap*);
-static int ssl_verify_callback(int, X509_STORE_CTX*);
-static int ssl_password(char*, int, int, void *);
-static const char *ssl_error(struct soap*, int);
-/* This callback is included for future references. It should not be deleted
-static DH *ssl_tmp_dh(SSL*, int, int);
-*/
-#endif
-
-static const char *soap_strerror(struct soap*);
-static const char *tcp_error(struct soap*);
-static const char *http_error(struct soap*, int);
-static int http_post(struct soap*, const char*, const char*, int, const char*, const char*, size_t);
-static int http_get(struct soap*);
-static int http_send_header(struct soap*, const char*);
-static int http_post_header(struct soap*, const char*, const char*);
-static int http_response(struct soap*, int, size_t);
-static int http_parse(struct soap*);
-static int http_parse_header(struct soap*, const char*, const char*);
-#ifndef MAC_CARBON
-static int tcp_gethost(struct soap*, const char *addr, struct in_addr *inaddr);
-static int tcp_connect(struct soap*, const char *endpoint, const char *host, int port);
-static int tcp_accept(struct soap*, int, struct sockaddr*, int*);
-static int tcp_disconnect(struct soap*);
-static int tcp_closesocket(struct soap*, SOAP_SOCKET);
-static int tcp_shutdownsocket(struct soap*, SOAP_SOCKET, int);
-static int fsend(struct soap*, const char*, size_t);
-static size_t frecv(struct soap*, char*, size_t);
-#endif
-
-/* WR[ */
-#ifdef VXWORKS
-static int vx_nonblocking = TRUE; /* ioctl argument */
-#endif
-/* ]WR */
-
-#if defined(PALM) && !defined(PALM_2)
-unsigned short errno;
-#endif
-
-#ifndef PALM_1
-static const char soap_env1[42] = "http://schemas.xmlsoap.org/soap/envelope/";
-static const char soap_enc1[42] = "http://schemas.xmlsoap.org/soap/encoding/";
-static const char soap_env2[40] = "http://www.w3.org/2003/05/soap-envelope";
-static const char soap_enc2[40] = "http://www.w3.org/2003/05/soap-encoding";
-static const char soap_rpc[35] = "http://www.w3.org/2003/05/soap-rpc";
-#endif
-
-#ifndef PALM_1
-const struct soap_double_nan soap_double_nan = {0xFFFFFFFF, 0xFFFFFFFF};
-static const char soap_base64o[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-static const char soap_base64i[81] = "\76XXX\77\64\65\66\67\70\71\72\73\74\75XXXXXXX\00\01\02\03\04\05\06\07\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31XXXXXX\32\33\34\35\36\37\40\41\42\43\44\45\46\47\50\51\52\53\54\55\56\57\60\61\62\63";
-#endif
-
-static const char soap_padding[3] = "\0\0";
-#define SOAP_STR_PADDING (soap_padding)
-#define SOAP_STR_EOS (soap_padding)
-
-#ifndef WITH_LEAN
-static const struct soap_code_map html_entity_codes[] = /* entities for XHTML parsing */
-{ { 160, "nbsp" },
-  { 161, "iexcl" },
-  { 162, "cent" },
-  { 163, "pound" },
-  { 164, "curren" },
-  { 165, "yen" },
-  { 166, "brvbar" },
-  { 167, "sect" },
-  { 168, "uml" },
-  { 169, "copy" },
-  { 170, "ordf" },
-  { 171, "laquo" },
-  { 172, "not" },
-  { 173, "shy" },
-  { 174, "reg" },
-  { 175, "macr" },
-  { 176, "deg" },
-  { 177, "plusmn" },
-  { 178, "sup2" },
-  { 179, "sup3" },
-  { 180, "acute" },
-  { 181, "micro" },
-  { 182, "para" },
-  { 183, "middot" },
-  { 184, "cedil" },
-  { 185, "sup1" },
-  { 186, "ordm" },
-  { 187, "raquo" },
-  { 188, "frac14" },
-  { 189, "frac12" },
-  { 190, "frac34" },
-  { 191, "iquest" },
-  { 192, "Agrave" },
-  { 193, "Aacute" },
-  { 194, "Acirc" },
-  { 195, "Atilde" },
-  { 196, "Auml" },
-  { 197, "Aring" },
-  { 198, "AElig" },
-  { 199, "Ccedil" },
-  { 200, "Egrave" },
-  { 201, "Eacute" },
-  { 202, "Ecirc" },
-  { 203, "Euml" },
-  { 204, "Igrave" },
-  { 205, "Iacute" },
-  { 206, "Icirc" },
-  { 207, "Iuml" },
-  { 208, "ETH" },
-  { 209, "Ntilde" },
-  { 210, "Ograve" },
-  { 211, "Oacute" },
-  { 212, "Ocirc" },
-  { 213, "Otilde" },
-  { 214, "Ouml" },
-  { 215, "times" },
-  { 216, "Oslash" },
-  { 217, "Ugrave" },
-  { 218, "Uacute" },
-  { 219, "Ucirc" },
-  { 220, "Uuml" },
-  { 221, "Yacute" },
-  { 222, "THORN" },
-  { 223, "szlig" },
-  { 224, "agrave" },
-  { 225, "aacute" },
-  { 226, "acirc" },
-  { 227, "atilde" },
-  { 228, "auml" },
-  { 229, "aring" },
-  { 230, "aelig" },
-  { 231, "ccedil" },
-  { 232, "egrave" },
-  { 233, "eacute" },
-  { 234, "ecirc" },
-  { 235, "euml" },
-  { 236, "igrave" },
-  { 237, "iacute" },
-  { 238, "icirc" },
-  { 239, "iuml" },
-  { 240, "eth" },
-  { 241, "ntilde" },
-  { 242, "ograve" },
-  { 243, "oacute" },
-  { 244, "ocirc" },
-  { 245, "otilde" },
-  { 246, "ouml" },
-  { 247, "divide" },
-  { 248, "oslash" },
-  { 249, "ugrave" },
-  { 250, "uacute" },
-  { 251, "ucirc" },
-  { 252, "uuml" },
-  { 253, "yacute" },
-  { 254, "thorn" },
-  { 255, "yuml" },
-  {   0, NULL }
-};
-#endif
-
-#ifndef WITH_LEAN
-static const struct soap_code_map h_error_codes[] =
-{
-#ifdef HOST_NOT_FOUND   
-  { HOST_NOT_FOUND, "Host not found" },
-#endif
-#ifdef TRY_AGAIN
-  { TRY_AGAIN, "Try Again" },
-#endif
-#ifdef NO_RECOVERY  
-  { NO_RECOVERY, "No Recovery" },
-#endif
-#ifdef NO_DATA
-  { NO_DATA, "No Data" },
-#endif
-#ifdef NO_ADDRESS
-  { NO_ADDRESS, "No Address" },
-#endif
-  { 0, NULL }
-};
-#endif
-
-#ifndef WITH_LEAN
-static const struct soap_code_map h_http_error_codes[] =
-{ { 201, "Created" },
-  { 202, "Accepted" },
-  { 203, "Non-Authoritative Information" },
-  { 204, "No Content" },
-  { 205, "Reset Content" },
-  { 206, "Partial Content" },
-  { 300, "Multiple Choices" },
-  { 301, "Moved Permanently" },
-  { 302, "Found" },
-  { 303, "See Other" },
-  { 304, "Not Modified" },
-  { 305, "Use Proxy" },
-  { 307, "Temporary Redirect" },
-  { 400, "Bad Request" },
-  { 401, "Unauthorized" },
-  { 402, "Payment Required" },
-  { 403, "Forbidden" },
-  { 404, "Not Found" },
-  { 405, "Method Not Allowed" },
-  { 406, "Not Acceptable" },
-  { 407, "Proxy Authentication Required" },
-  { 408, "Request Time-out" },
-  { 409, "Conflict" },
-  { 410, "Gone" },
-  { 411, "Length Required" },
-  { 412, "Precondition Failed" },
-  { 413, "Request Entity Too Large" },
-  { 414, "Request-URI Too Large" },
-  { 415, "Unsupported Media Type" },
-  { 416, "Requested range not satisfiable" },
-  { 417, "Expectation Failed" },
-  { 500, "Internal Server Error" },
-  { 501, "Not Implemented" },
-  { 502, "Bad Gateway" },
-  { 503, "Service Unavailable" },
-  { 504, "Gateway Time-out" },
-  { 505, "HTTP Version not supported" },
-  {   0, NULL }
-};
-#endif
-
-#ifdef WITH_OPENSSL
-static const struct soap_code_map h_ssl_error_codes[] =
-{
-#define _SSL_ERROR(e) { e, #e }
-  _SSL_ERROR(SSL_ERROR_SSL),
-  _SSL_ERROR(SSL_ERROR_ZERO_RETURN),
-  _SSL_ERROR(SSL_ERROR_WANT_READ),
-  _SSL_ERROR(SSL_ERROR_WANT_WRITE),
-  _SSL_ERROR(SSL_ERROR_WANT_CONNECT),
-  _SSL_ERROR(SSL_ERROR_WANT_X509_LOOKUP),
-  _SSL_ERROR(SSL_ERROR_SYSCALL),
-  { 0, NULL }
-};
-#endif
-
-#ifndef WITH_LEANER
-static const struct soap_code_map mime_codes[] =
-{ { SOAP_MIME_7BIT,            "7bit" },
-  { SOAP_MIME_8BIT,            "8bit" },
-  { SOAP_MIME_BINARY,          "binary" },
-  { SOAP_MIME_QUOTED_PRINTABLE, "quoted-printable" },
-  { SOAP_MIME_BASE64,          "base64" },
-  { SOAP_MIME_IETF_TOKEN,      "ietf-token" },
-  { SOAP_MIME_X_TOKEN,         "x-token" },
-  { 0,                         NULL }
-};
-#endif
-
-#ifdef WIN32
-static int tcp_done = 0;
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-fsend(struct soap *soap, const char *s, size_t n)
-{ register int nwritten;
-#if defined(__cplusplus) && !defined(WITH_LEAN)
-  if (soap->os)
-  { soap->os->write(s, n);
-    if (soap->os->good())
-      return SOAP_OK;
-    return SOAP_EOF;
-  }
-#endif
-  while (n)
-  { if (soap_valid_socket(soap->socket))
-    { 
-#ifndef WITH_LEAN
-      if (soap->send_timeout)
-      { struct timeval timeout;
-        fd_set fd;
-        if (soap->send_timeout > 0)
-        { timeout.tv_sec = soap->send_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->send_timeout/1000000;
-          timeout.tv_usec = -soap->send_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        for (;;)
-        { register int r = select((SOAP_SOCKET)(soap->socket + 1), NULL, &fd, &fd, &timeout);
-          if (r > 0)
-            break;
-          if (!r)
-          { soap->errnum = 0;
-            return SOAP_EOF;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            return SOAP_EOF;
-          }
-        }
-      }
-#endif
-#ifdef WITH_OPENSSL
-      if (soap->ssl)
-        nwritten = SSL_write(soap->ssl, s, n);
-      else
-#endif
-#ifndef PALM
-        nwritten = send((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
-#else
-        nwritten = send((SOAP_SOCKET)soap->socket, (void*)s, n, soap->socket_flags);
-#endif
-      if (nwritten <= 0)
-      {
-#ifdef WITH_OPENSSL
-       int err;
-        if (soap->ssl && (err = SSL_get_error(soap->ssl, nwritten)) != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-          return SOAP_EOF;
-#endif
-        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EWOULDBLOCK && soap_socket_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_socket_errno;
-          return SOAP_EOF;
-        }
-        nwritten = 0; /* and call write() again */
-      }
-    }
-    else
-    {
-#ifdef WITH_FASTCGI
-      nwritten = fwrite((void*)s, 1, n, stdout);
-      fflush(stdout);
-#else
-#ifdef UNDER_CE
-      nwritten = fwrite(s, 1, n, soap->sendfd);
-#else
-/* WR[ */
-#ifdef VXWORKS
-#ifdef WMW_RPM_IO
-      if (soap->rpmreqid)
-          {
-          httpBlockPut(soap->rpmreqid, s, n); 
-          nwritten = n;
-          }
-      else
-          {
-          nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
-          }
-#else
-      nwritten = fwrite(s, sizeof(char), n, fdopen(soap->sendfd, "w"));
-#endif /* WMW_RPM_IO */
-#else
-/* ]WR */
-      nwritten = write((SOAP_SOCKET)soap->sendfd, s, n);
-/* WR[ */
-#endif
-/* ]WR */
-#endif
-#endif
-      if (nwritten <= 0)
-      { if (soap_errno != SOAP_EINTR && soap_errno != SOAP_EWOULDBLOCK && soap_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_errno;
-          return SOAP_EOF;
-        }
-        nwritten = 0; /* and call write() again */
-      }
-    }
-    n -= nwritten;
-    s += nwritten;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_flush_raw(struct soap *soap, const char *s, size_t n)
-{ if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-  { register char *t;
-    if (!(t = (char*)soap_push_block(soap, n)))
-      return soap->error = SOAP_EOM;
-    memcpy(t, s, n);
-    if (soap->fpreparesend)
-      return soap->fpreparesend(soap, s, n);
-    return SOAP_OK;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-  { char t[16];
-    sprintf(t, "\r\n%lX\r\n" + (soap->chunksize ? 0 : 2), (unsigned long)n);
-    DBGMSG(SENT, t, strlen(t));
-    if ((soap->error = soap->fsend(soap, t, strlen(t))))
-      return soap->error;
-    soap->chunksize += n;
-  }
-  DBGMSG(SENT, s, n);
-  return soap->error = soap->fsend(soap, s, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_flush(struct soap *soap)
-{ if (soap->bufidx)
-  {
-#ifdef WITH_ZLIB
-    if (soap->mode & SOAP_ENC_ZLIB)
-    { soap->d_stream.next_in = (Byte*)soap->buf;
-      soap->d_stream.avail_in = (unsigned int)soap->bufidx;
-#ifdef WITH_GZIP
-      soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->bufidx);
-#endif
-      do
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating %u bytes\n", soap->d_stream.avail_in));
-        if (deflate(&soap->d_stream, Z_NO_FLUSH) != Z_OK)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-          return soap->error = SOAP_ZLIB_ERROR;
-        }
-        if (!soap->d_stream.avail_out)
-        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN))
-            return soap->error;
-          soap->d_stream.next_out = (Byte*)soap->z_buf;
-          soap->d_stream.avail_out = SOAP_BUFLEN;
-        }
-      } while (soap->d_stream.avail_in);
-    }
-    else
-#endif
-    if (soap_flush_raw(soap, soap->buf, soap->bufidx))
-      return soap->error;
-    soap->bufidx = 0;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send_raw(struct soap *soap, const char *s, size_t n)
-{ if (!n)
-    return SOAP_OK;
-  if (soap->mode & SOAP_IO_LENGTH)
-  { soap->count += n;
-    if (soap->fpreparesend && (soap->mode & SOAP_IO) != SOAP_IO_STORE)
-      return soap->fpreparesend(soap, s, n);
-    return SOAP_OK;
-  }
-  if (soap->mode & SOAP_IO)
-  { register size_t i = SOAP_BUFLEN - soap->bufidx;
-    while (n >= i)
-    { memcpy(soap->buf + soap->bufidx, s, i);
-      soap->bufidx = SOAP_BUFLEN;
-      if (soap_flush(soap))
-        return soap->error;
-      s += i;
-      n -= i;
-      i = SOAP_BUFLEN;
-    }
-    memcpy(soap->buf + soap->bufidx, s, n);
-    soap->bufidx += n;
-    return SOAP_OK;
-  }
-  return soap_flush_raw(soap, s, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send(struct soap *soap, const char *s)
-{ if (s)
-    return soap_send_raw(soap, s, strlen(s));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send2(struct soap *soap, const char *s1, const char *s2)
-{ if (soap_send(soap, s1))
-    return soap->error;
-  return soap_send(soap, s2);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send3(struct soap *soap, const char *s1, const char *s2, const char *s3)
-{ if (soap_send(soap, s1)
-   || soap_send(soap, s2))
-    return soap->error;
-  return soap_send(soap, s3);
-}
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static size_t
-frecv(struct soap *soap, char *s, size_t n)
-{ register int r;
-  soap->errnum = 0;
-#if defined(__cplusplus) && !defined(WITH_LEAN)
-  if (soap->is)
-  { if (soap->is->good())
-      return soap->is->read(s, n).gcount();
-    return 0;
-  }
-#endif
-  if (soap_valid_socket(soap->socket))
-  { for (;;)
-    { 
-#ifndef WITH_LEAN
-      struct timeval timeout;
-      fd_set fd;
-      if (soap->recv_timeout)
-      { if (soap->recv_timeout > 0)
-        { timeout.tv_sec = soap->recv_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->recv_timeout/1000000;
-          timeout.tv_usec = -soap->recv_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        for (;;)
-        { r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-          if (r > 0)
-            break;
-          if (r == 0)
-            return 0;
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            return 0;
-          }
-        }
-      }
-#endif
-#ifdef WITH_OPENSSL
-      if (soap->ssl)
-      { int err;
-       r = SSL_read(soap->ssl, s, n);
-        if ((err = SSL_get_error(soap->ssl, r)) == SSL_ERROR_NONE)
-          return (size_t)r;
-       if (err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-          return 0;
-      }
-      else
-#endif
-      { r = recv((SOAP_SOCKET)soap->socket, s, n, soap->socket_flags);
-        if (r >= 0)
-          return (size_t)r;
-        if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
-        { soap->errnum = soap_socket_errno;
-          return 0;
-        }
-      }
-#ifndef WITH_LEAN
-      { struct timeval timeout;
-        fd_set fd;
-        timeout.tv_sec = 0;
-        timeout.tv_usec = 10000;
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->socket, &fd);
-        r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-        if (r < 0 && soap_socket_errno != SOAP_EINTR)
-        { soap->errnum = soap_socket_errno;
-          return 0;
-        }
-      }
-#endif
-    }
-  }
-#ifdef WITH_FASTCGI
-  return fread(s, 1, n, stdin);
-#else
-#ifdef UNDER_CE
-  return fread(s, 1, n, soap->recvfd);
-#else
-/* WR[ */
-#ifdef WMW_RPM_IO
-  if (soap->rpmreqid)
-    r = httpBlockRead(soap->rpmreqid, s, n);
-  else
-    r = read(soap->recvfd, s, n);
-  if (r >= 0)
-    return r;
-  return 0;
-#else
-/* ]WR */
-  r = read((SOAP_SOCKET)soap->recvfd, s, n);
-  if (r >= 0)
-    return (size_t)r;
-  soap->errnum = soap_errno;
-  return 0;
-/* WR[ */
-#endif
-/* ]WR */
-#endif
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static soap_wchar
-soap_getchunkchar(struct soap *soap)
-{ if (soap->bufidx < soap->buflen)
-    return soap->buf[soap->bufidx++];
-  soap->bufidx = 0;
-  soap->buflen = soap->chunkbuflen = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)soap->buflen));
-  DBGMSG(RECV, soap->buf, soap->buflen);
-  if (soap->buflen)
-    return soap->buf[soap->bufidx++];
-  return EOF;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_isxdigit(int c)
-{ switch (c)
-  { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
-    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
-    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
-      return 1;
-  }
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_raw(struct soap *soap)
-{ register size_t ret;
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { if (soap->d_stream.next_out == Z_NULL)
-      return EOF;
-    if (soap->d_stream.avail_in || !soap->d_stream.avail_out)
-    { register int r;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflating\n"));
-      soap->d_stream.next_out = (Byte*)soap->buf;
-      soap->d_stream.avail_out = SOAP_BUFLEN;
-      r = inflate(&soap->d_stream, Z_NO_FLUSH);
-      if (r == Z_OK || r == Z_STREAM_END)
-      { soap->bufidx = 0;
-        soap->buflen = SOAP_BUFLEN - soap->d_stream.avail_out;
-        if (soap->zlib_in == SOAP_ZLIB_GZIP)
-          soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
-        if (r == Z_STREAM_END)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-          soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
-          soap->d_stream.next_out = Z_NULL;
-        }
-        if (soap->buflen)
-        { soap->count += soap->buflen;
-          return SOAP_OK;
-        }
-      }
-      else if (r != Z_BUF_ERROR)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate error: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-        soap->d_stream.next_out = Z_NULL;
-        return EOF;
-      }
-    }
-zlib_again:
-    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK && !soap->chunksize)
-    { memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
-      soap->buflen = soap->z_buflen;
-    }
-  }
-#endif
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) /* read HTTP chunked transfer */
-  { 
-chunk_again:
-    if (soap->chunksize)
-    { soap->buflen = ret = soap->frecv(soap, soap->buf, soap->chunksize > SOAP_BUFLEN ? SOAP_BUFLEN : soap->chunksize);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk: read %u bytes\n", (unsigned int)ret));
-      DBGMSG(RECV, soap->buf, ret);
-      soap->bufidx = 0;
-      soap->chunksize -= ret;
-    }
-    else
-    { register soap_wchar c;
-      char *t, tmp[8];
-      t = tmp;
-      if (!soap->chunkbuflen)
-      { soap->chunkbuflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
-        DBGMSG(RECV, soap->buf, ret);
-        soap->bufidx = 0;
-        if (!ret)
-          return EOF;
-      }
-      else
-        soap->bufidx = soap->buflen;
-      soap->buflen = soap->chunkbuflen;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Getting chunk size (%u %u)\n", (unsigned int)soap->bufidx, (unsigned int)soap->buflen));
-      while (!soap_isxdigit((int)(c = soap_getchunkchar(soap))))
-        if ((int)c == EOF)
-         return EOF;
-      do
-        *t++ = (char)c;
-      while (soap_isxdigit((int)(c = soap_getchunkchar(soap))) && t - tmp < 7);
-      while ((int)c != EOF && c != '\n')
-        c = soap_getchunkchar(soap);
-      if ((int)c == EOF)
-        return EOF;
-      *t = '\0';
-      soap->chunksize = soap_strtoul(tmp, &t, 16);
-      if (!soap->chunksize)
-      { soap->chunkbuflen = 0;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of chunked message\n"));
-       while ((int)c != EOF && c != '\n')
-          c = soap_getchunkchar(soap);
-        return EOF;
-      }
-      soap->buflen = soap->bufidx + soap->chunksize;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving buf len to %u (%u %s)\n", (unsigned int)soap->buflen, (unsigned int)soap->bufidx, tmp));
-      if (soap->buflen > soap->chunkbuflen)
-      { soap->buflen = soap->chunkbuflen;
-        soap->chunksize -= soap->buflen - soap->bufidx;
-        soap->chunkbuflen = 0;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Passed end of buffer for chunked HTTP (%lu bytes left)\n", (unsigned long)(soap->buflen - soap->bufidx)));
-      }
-      else if (soap->chunkbuflen)
-        soap->chunksize = 0;
-      ret = soap->buflen - soap->bufidx;
-      if (!ret)
-        goto chunk_again;
-    }
-  }
-  else
-  { soap->bufidx = 0;
-    soap->buflen = ret = soap->frecv(soap, soap->buf, SOAP_BUFLEN);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Read %u bytes\n", (unsigned int)ret));
-    DBGMSG(RECV, soap->buf, ret);
-  }
-  if (soap->fpreparerecv && (soap->error = soap->fpreparerecv(soap, soap->buf, ret)))
-    return soap->error;
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { register int r;
-    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-    soap->d_stream.avail_in = (unsigned int)ret;
-    soap->d_stream.next_out = (Byte*)soap->buf;
-    soap->d_stream.avail_out = SOAP_BUFLEN;
-    r = inflate(&soap->d_stream, Z_NO_FLUSH);
-    if (r == Z_OK || r == Z_STREAM_END)
-    { soap->bufidx = 0;
-      soap->z_buflen = soap->buflen;
-      soap->buflen = ret = SOAP_BUFLEN - soap->d_stream.avail_out;
-      if (soap->zlib_in == SOAP_ZLIB_GZIP)
-        soap->z_crc = crc32(soap->z_crc, (Byte*)soap->buf, (unsigned int)soap->buflen);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %u bytes\n", (unsigned int)ret));
-      if (!ret)
-        goto zlib_again;
-      if (r == Z_STREAM_END)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-        soap->z_ratio_in = (float)soap->d_stream.total_in / (float)soap->d_stream.total_out;
-        soap->d_stream.next_out = Z_NULL;
-      }
-    }
-    else
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to inflate: (%d) %s\n", r, soap->d_stream.msg?soap->d_stream.msg:""));
-      soap->d_stream.next_out = Z_NULL;
-      return EOF;
-    }
-  }
-#endif
-  soap->count += ret;
-  return !ret;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_DIME)
-  { if (soap->dime.buflen)
-    { char *s;
-      int i;
-      unsigned char tmp[12];
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME hdr for chunked DIME is in buffer\n"));
-      soap->count += soap->dime.buflen - soap->buflen;
-      soap->buflen = soap->dime.buflen;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Skip padding (%ld bytes)\n", -(long)soap->dime.size&3));
-      for (i = -(long)soap->dime.size&3; i > 0; i--)
-      { soap->bufidx++;
-        if (soap->bufidx >= soap->buflen)
-          if (soap_recv_raw(soap))
-            return EOF;
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME hdr for next chunk\n"));
-      s = (char*)tmp;
-      for (i = 12; i > 0; i--)
-      { *s++ = soap->buf[soap->bufidx++];
-        if (soap->bufidx >= soap->buflen)
-          if (soap_recv_raw(soap))
-            return EOF;
-      }
-      soap->dime.flags = tmp[0] & 0x7;
-      soap->dime.size = ((size_t)tmp[8] << 24) | ((size_t)tmp[9] << 16) | ((size_t)tmp[10] << 8) | ((size_t)tmp[11]);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME chunk (%u bytes)\n", (unsigned int)soap->dime.size));
-      if (soap->dime.flags & SOAP_DIME_CF)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "More chunking\n"));
-        soap->dime.chunksize = soap->dime.size;
-        if (soap->buflen - soap->bufidx >= soap->dime.size)
-        { soap->dime.buflen = soap->buflen;
-          soap->buflen = soap->bufidx + soap->dime.chunksize;
-        }
-        else
-          soap->dime.chunksize -= soap->buflen - soap->bufidx;
-      }
-      else
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Last chunk\n"));
-        soap->dime.buflen = 0;
-        soap->dime.chunksize = 0;
-      }
-      soap->count = soap->buflen - soap->bufidx;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%u bytes remaining\n", (unsigned int)soap->count));
-      return SOAP_OK;
-    }
-    if (soap->dime.chunksize)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get next DIME hdr for chunked DIME (%u bytes chunk)\n", (unsigned int)soap->dime.chunksize));
-      if (soap_recv_raw(soap))
-        return EOF;
-      if (soap->buflen - soap->bufidx >= soap->dime.chunksize)
-      { soap->dime.buflen = soap->buflen;
-        soap->count -= soap->buflen - soap->bufidx - soap->dime.chunksize;
-        soap->buflen = soap->bufidx + soap->dime.chunksize;
-      }
-      else
-        soap->dime.chunksize -= soap->buflen - soap->bufidx;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "%lu bytes remaining, count=%u\n", (unsigned long)(soap->buflen-soap->bufidx), (unsigned int)soap->count));
-      return SOAP_OK;
-    }
-  }
-#endif
-  return soap_recv_raw(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_getchar(struct soap *soap)
-{ register soap_wchar c;
-  if (soap->ahead)
-  { c = soap->ahead;
-    soap->ahead = 0;
-    return c;
-  }
-  return soap_get1(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const struct soap_code_map*
-SOAP_FMAC2
-soap_code(const struct soap_code_map *map, const char *str)
-{ while (map->string)
-  { if (!strcmp(str, map->string)) /* case sensitive */
-      return map;
-    map++;
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_int_code(const struct soap_code_map *map, const char *str, long other)
-{ while (map->string)
-  { if (!soap_tag_cmp(str, map->string)) /* case insensitive */
-      return map->code;
-    map++;
-  }
-  return other;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_str_code(const struct soap_code_map *map, long code)
-{ while (map->code != code && map->string)
-    map++;
-  return map->string;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static soap_wchar
-soap_char(struct soap *soap)
-{ char tmp[8];
-  register int i;
-  register soap_wchar c;
-  register char *s = tmp;
-  for (i = 0; i < 7; i++)
-  { c = soap_get1(soap);
-    if (c == ';' || (int)c == EOF)
-      break;
-    *s++ = (char)c;
-  }
-  *s = '\0';
-  if (*tmp == '#')
-  { if (tmp[1] == 'x' || tmp[1] == 'X')
-      return soap_strtol(tmp + 2, NULL, 16);
-    return atol(tmp + 1);
-  }
-  if (!strcmp(tmp, "lt"))
-    return '<';
-  if (!strcmp(tmp, "gt"))
-    return '>';
-  if (!strcmp(tmp, "amp"))
-    return '&';
-  if (!strcmp(tmp, "quot"))
-    return '"';
-  if (!strcmp(tmp, "apos"))
-    return '\'';
-#ifndef WITH_LEAN
-  return (soap_wchar)soap_int_code(html_entity_codes, tmp, SOAP_UNKNOWN_CHAR);
-#else
-  return SOAP_UNKNOWN_CHAR; /* use this to represent unknown code */
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_get(struct soap *soap)
-{ register soap_wchar c;
-  c = soap->ahead;
-  if (c)
-    soap->ahead = 0;
-  else
-    c = soap_get1(soap);
-  for (;;)
-  { if (soap->cdata)
-    { if (c == ']')
-      { c = soap_get1(soap);
-        if (c == ']')
-        { soap->cdata = 0;
-          soap_get1(soap); /* skip > */
-          c = soap_get1(soap);
-        }
-       else
-        { soap_revget1(soap);
-          return ']';
-        }
-      }
-      else
-        return c;
-    }
-    switch (c)
-    { case '<':
-        do c = soap_get1(soap);
-        while (soap_blank(c));
-        if (c == '!' || c == '?' || c == '%')
-        { if (c == '!')
-          { c = soap_get1(soap);
-            if (c == '[')
-            { do c = soap_get1(soap);
-              while ((int)c != EOF && c != '[');
-              if ((int)c == EOF)
-                break;
-              soap->cdata = 1;
-              c = soap_get1(soap);
-             continue;
-            }
-            if (c == '-' && (c = soap_get1(soap)) == '-')
-            { do
-              { c = soap_get1(soap);
-                if (c == '-' && (c = soap_get1(soap)) == '-')
-                  break;
-              } while ((int)c != EOF);
-            }
-          }
-          while ((int)c != EOF && c != '>')
-            c = soap_get1(soap);
-         if ((int)c == EOF)
-           break;
-          c = soap_get1(soap);
-          continue;
-        }
-        if (c == '/')
-          return SOAP_TT;
-        soap_revget1(soap);
-        return SOAP_LT;
-      case '>':
-        return SOAP_GT;
-      case '"':
-        return SOAP_QT;
-      case '\'':
-        return SOAP_AP;
-      case '&':
-        return soap_char(soap) | 0x80000000;
-    }
-    break;
-  }
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_advance(struct soap *soap)
-{ register soap_wchar c;
-  while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
-    ;
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_skip(struct soap *soap)
-{ register soap_wchar c;
-  do c = soap_get(soap);
-  while (soap_blank(c));
-  return c;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_move(struct soap *soap, long n)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Moving %ld bytes forward\n", (long)n));
-  for (; n > 0; n--)
-    if ((int)soap_getchar(soap) == EOF)
-      return SOAP_EOF;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_tell(struct soap *soap)
-{ return soap->count - soap->buflen + soap->bufidx - (soap->ahead != 0);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pututf8(struct soap *soap, register unsigned long c)
-{ char tmp[16];
-  if (c > 0 && c < 0x80)
-  { *tmp = (char)c;
-    return soap_send_raw(soap, tmp, 1);
-  }
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { register char *t = tmp;
-    if (c < 0x0800)
-      *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-    else
-    { if (c < 0x010000)
-        *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-      else
-      { if (c < 0x200000)
-          *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-        else
-        { if (c < 0x04000000)
-            *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-          else
-          { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-            *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-          }
-          *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-        }     
-        *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-      }
-      *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-    }
-    *t++ = (char)(0x80 | (c & 0x3F));
-    *t = '\0';
-  }
-  else
-#endif
-    sprintf(tmp, "&#%lu;", c);
-  return soap_send(soap, tmp);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-soap_wchar
-SOAP_FMAC2
-soap_getutf8(struct soap *soap)
-{ register soap_wchar c, c1, c2, c3, c4;
-  c = soap_get(soap);
-  if (c < 0x80 || (soap->mode & SOAP_ENC_LATIN))
-    return c;
-  c1 = soap_get(soap);
-  if (c1 < 0x80)
-  { soap_unget(soap, c1);
-    return c;
-  }
-  c1 &= 0x3F;
-  if (c < 0xE0)
-    return ((soap_wchar)(c & 0x1F) << 6) | c1;
-  c2 = (soap_wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xF0)
-    return ((soap_wchar)(c & 0x0F) << 12) | (c1 << 6) | c2;
-  c3 = (soap_wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xF8)
-    return ((soap_wchar)(c & 0x07) << 18) | (c1 << 12) | (c2 << 6) | c3;
-  c4 = (soap_wchar)soap_get1(soap) & 0x3F;
-  if (c < 0xFC)
-    return ((soap_wchar)(c & 0x03) << 24) | (c1 << 18) | (c2 << 12) | (c3 << 6) | c4;
-  return ((soap_wchar)(c & 0x01) << 30) | (c1 << 24) | (c2 << 18) | (c3 << 12) | (c4 << 6) | (soap_wchar)(soap_get1(soap) & 0x3F);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_puthex(struct soap *soap, const unsigned char *s, int n)
-{ /* TODO: serialize to DOM (as an option) using new soap_s2hex() */
-  char d[2];
-  register int i;
-  for (i = 0; i < n; i++)
-  { register int m = *s++;
-    d[0] = (char)((m >> 4) + (m > 159 ? '7' : '0'));
-    m &= 0x0F;
-    d[1] = (char)(m + (m > 9 ? '7' : '0'));
-    if (soap_send_raw(soap, d, 2))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-unsigned char*
-SOAP_FMAC2
-soap_gethex(struct soap *soap, int *n)
-{
-#ifdef WITH_FAST
-  soap->labidx = 0;
-  for (;;)
-  { register char *s;
-    register int i, k;
-    if (soap_append_lab(soap, NULL, 0))
-      return NULL;
-    s = soap->labbuf + soap->labidx;
-    k = soap->lablen - soap->labidx;
-    soap->labidx = soap->lablen;
-    for (i = 0; i < k; i++)
-    { register char d1, d2;
-      register soap_wchar c;
-      c = soap_get(soap);
-      if (soap_isxdigit(c))
-      { d1 = (char)c;
-        c = soap_get(soap); 
-       if (soap_isxdigit(c))
-          d2 = (char)c;
-        else 
-        { soap->error = SOAP_TYPE;
-          return NULL;
-        }
-      }
-      else
-      { unsigned char *p;
-        soap_unget(soap, c);
-        if (n)
-          *n = (int)(soap->lablen - k + i);
-        p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i);
-       if (p)
-         memcpy(p, soap->labbuf, soap->lablen - k + i);
-        return p;
-      }
-      *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
-    }
-  }
-#else
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { register int i;
-    register char *s = (char*)soap_push_block(soap, SOAP_BLKLEN);
-    if (!s)
-    { soap_end_block(soap);
-      return NULL;
-    }
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { register char d1, d2;
-      register soap_wchar c = soap_get(soap);
-      if (soap_isxdigit(c))
-      { d1 = (char)c;
-        c = soap_get(soap); 
-       if (soap_isxdigit(c))
-          d2 = (char)c;
-        else 
-        { soap_end_block(soap);
-         soap->error = SOAP_TYPE;
-          return NULL;
-        }
-      }
-      else
-      { unsigned char *p;
-        soap_unget(soap, c);
-        if (n)
-          *n = soap_size_block(soap, i);
-        p = (unsigned char*)soap_save_block(soap, NULL, 0);
-        return p;
-      }
-      *s++ = ((d1 >= 'A' ? (d1 & 0x7) + 9 : d1 - '0') << 4) + (d2 >= 'A' ? (d2 & 0x7) + 9 : d2 - '0');
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putbase64(struct soap *soap, const unsigned char *s, int n)
-{ register int i;
-  register unsigned long m;
-  char d[4];
-  if (!s)
-    return SOAP_OK;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { if (!(soap->dom->data = soap_s2base64(soap, s, soap->dom->data, n)))
-      return soap->error;
-    return SOAP_OK;
-  }
-#endif
-  for (; n > 2; n -= 3, s += 3)
-  { m = s[0];
-    m = (m << 8) | s[1];
-    m = (m << 8) | s[2];
-    for (i = 4; i > 0; m >>= 6)
-      d[--i] = soap_base64o[m & 0x3F];
-    if (soap_send_raw(soap, d, 4))
-      return soap->error;
-  }
-  if (n > 0)
-  { m = 0;
-    for (i = 0; i < n; i++)
-      m = (m << 8) | *s++;
-    for (; i < 3; i++)
-      m <<= 8;
-    for (i++; i > 0; m >>= 6)
-      d[--i] = soap_base64o[m & 0x3F];
-    for (i = 3; i > n; i--)
-      d[i] = '=';
-    if (soap_send_raw(soap, d, 4))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-unsigned char*
-SOAP_FMAC2
-soap_getbase64(struct soap *soap, int *n, int malloc_flag)
-{ 
-#ifdef WITH_FAST
-  soap->labidx = 0;
-  for (;;)
-  { register int i, k;
-    register char *s;
-    if (soap_append_lab(soap, NULL, 2))
-      return NULL;
-    s = soap->labbuf + soap->labidx;
-    k = 3 * ((soap->lablen - soap->labidx) / 3);
-    soap->labidx = 3 * (soap->lablen / 3);
-    if (!s)
-      return NULL;
-    for (i = 0; i < k; i += 3)
-    { register unsigned long m = 0;
-      register int j = 0;
-      do
-      { register soap_wchar c = soap_get(soap);
-        if (c == '=' || c < 0)
-        { unsigned char *p;
-          switch (j)
-          { case 2:
-              *s++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *s++ = (char)((m >> 10) & 0xFF);
-              *s++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-            *n = (int)(soap->lablen - k + i);
-          p = (unsigned char*)soap_malloc(soap, soap->lablen - k + i);
-         if (p)
-           memcpy(p, soap->labbuf, soap->lablen - k + i);
-          if (c >= 0)
-          { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
-              ;
-         }
-          soap_unget(soap, c);
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      } while (j < 4);
-      *s++ = (char)((m >> 16) & 0xFF);
-      *s++ = (char)((m >> 8) & 0xFF);
-      *s++ = (char)(m & 0xFF);
-    }
-  }
-#else
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { register int i;
-    register char *s = (char*)soap_push_block(soap, 3 * SOAP_BLKLEN); /* must be multiple of 3 */
-    if (!s)
-    { soap_end_block(soap);
-      return NULL;
-    }
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { register unsigned long m = 0;
-      register int j = 0;
-      do
-      { register soap_wchar c = soap_get(soap);
-        if (c == '=' || c < 0)
-        { unsigned char *p;
-          i *= 3;
-          switch (j)
-          { case 2:
-              *s++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *s++ = (char)((m >> 10) & 0xFF);
-              *s++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-           *n = (int)soap_size_block(soap, i);
-          p = (unsigned char*)soap_save_block(soap, NULL, 0);
-          if (c >= 0)
-          { while ((int)((c = soap_get(soap)) != EOF) && c != SOAP_LT && c != SOAP_TT)
-              ;
-         }
-          soap_unget(soap, c);
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      } while (j < 4);
-      *s++ = (char)((m >> 16) & 0xFF);
-      *s++ = (char)((m >> 8) & 0xFF);
-      *s++ = (char)(m & 0xFF);
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_strdup(struct soap *soap, const char *s)
-{ char *t = NULL;
-  if (s && (t = (char*)soap_malloc(soap, strlen(s) + 1)))
-    strcpy(t, s);
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_new_block(struct soap *soap)
-{ struct soap_blist *p;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "New block sequence (prev=%p)\n", soap->blist));
-  if (!(p = (struct soap_blist*)SOAP_MALLOC(sizeof(struct soap_blist))))
-    return SOAP_EOM;   
-  p->next = soap->blist; 
-  p->ptr = NULL;
-  p->size = 0;
-  soap->blist = p;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_push_block(struct soap *soap, size_t n)
-{ char *p;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push block of %u bytes (%u bytes total)\n", (unsigned int)n, (unsigned int)soap->blist->size + (unsigned int)n));
-  if (!(p = (char*)SOAP_MALLOC(n + sizeof(char*) + sizeof(size_t))))
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  *(char**)p = soap->blist->ptr;
-  *(size_t*)(p + sizeof(char*)) = n;
-  soap->blist->ptr = p;
-  soap->blist->size += n;
-  return p + sizeof(char*) + sizeof(size_t);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_pop_block(struct soap *soap)
-{ char *p;
-  if (!soap->blist->ptr)
-    return;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pop block\n"));
-  p = soap->blist->ptr;
-  soap->blist->size -= *(size_t*)(p + sizeof(char*));
-  soap->blist->ptr = *(char**)p;
-  SOAP_FREE(p);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_update_ptrs(struct soap *soap, char *start, char *end, long offset)
-{ int i;
-  register struct soap_ilist *ip;
-  register struct soap_flist *fp;
-  register void *p, **q;
-  for (i = 0; i < SOAP_IDHASH; i++)
-    for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->ptr && (char*)ip->ptr >= start && (char*)ip->ptr < end)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update id='%s' %p -> %p\n", ip->id, ip->ptr, (char*)ip->ptr + offset));
-        ip->ptr = (char*)ip->ptr + offset;
-      }
-      for (q = &ip->link; q; q = (void**)p)
-      { p = *q;
-        if (p && (char*)p >= start && (char*)p < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Link update id='%s' %p\n", ip->id, p));
-          *q = (char*)p + offset;
-        }
-      }
-      for (q = &ip->copy; q; q = (void**)p)
-      { p = *q;
-        if (p && (char*)p >= start && (char*)p < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy chain update id='%s' %p\n", ip->id, p));
-          *q = (char*)p + offset;
-        }
-      }
-      for (fp = ip->flist; fp; fp = fp->next)
-      { if ((char*)fp->ptr >= start && (char*)fp->ptr < end)
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy list update id='%s' %p\n", ip->id, fp));
-          fp->ptr = (char*)fp->ptr + offset;
-        }
-      }
-    }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-soap_has_copies(struct soap *soap, register const char *start, register const char *end)
-{ register int i;
-  register struct soap_ilist *ip;
-  register struct soap_flist *fp;
-  register const char *p;
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = ip->next)
-    { for (p = (const char*)ip->copy; p; p = *(const char**)p)
-        if (p >= start && p < end)
-          return SOAP_ERR;
-      for (fp = ip->flist; fp; fp = fp->next)
-        if ((const char*)fp->ptr >= start && (const char*)fp->ptr < end)
-         return SOAP_ERR;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_resolve(struct soap *soap)
-{ register int i;
-  register struct soap_ilist *ip;
-  register struct soap_flist *fp;
-  short flag;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->ptr)
-      { register void *p, **q, *r;
-        q = (void**)ip->link;
-        ip->link = NULL;
-        r = ip->ptr;
-        DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing link chain to resolve id='%s'\n", ip->id));
-        while (q)
-        { p = *q;
-          *q = r;
-          DBGLOG(TEST,SOAP_MESSAGE(fdebug, "... link %p -> %p\n", q, r));
-          q = (void**)p;
-        }
-      }
-      else if (*ip->id == '#')
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Missing data for id='%s'\n", ip->id));
-        strcpy(soap->id, ip->id + 1);
-        return soap->error = SOAP_MISSING_ID;
-      }
-    }
-  }
-  do
-  { flag = 0;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution phase\n"));
-    for (i = 0; i < SOAP_IDHASH; i++)
-    { for (ip = soap->iht[i]; ip; ip = ip->next)
-      { if (ip->ptr && !soap_has_copies(soap, (const char*)ip->ptr, (const char*)ip->ptr + ip->size))
-        { if (ip->copy)
-          { register void *p, **q = (void**)ip->copy;
-            DBGLOG(TEST, if (q) SOAP_MESSAGE(fdebug, "Traversing copy chain to resolve id='%s'\n", ip->id));
-            ip->copy = NULL;
-            do
-            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... copy %p -> %p (%u bytes)\n", ip->ptr, q, (unsigned int)ip->size));
-             p = *q;
-              memcpy(q, ip->ptr, ip->size);
-              q = (void**)p;
-            } while (q);
-           flag = 1;
-         }
-          for (fp = ip->flist; fp; fp = ip->flist)
-          { register unsigned int k = fp->level;
-           register void *p = ip->ptr;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving forwarded data type=%d location=%p level=%u,%u id='%s'\n", ip->type, p, ip->level, fp->level, ip->id));
-           while (ip->level < k)
-            { register void **q = (void**)soap_malloc(soap, sizeof(void*));  
-             if (!q)
-               return soap->error;
-             *q = p;
-              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level, new location=%p holds=%p...\n", q, *q));
-              p = (void*)q;
-              k--;
-            }
-           if (fp->fcopy)
-             fp->fcopy(soap, ip->type, fp->type, fp->ptr, p, ip->size);
-           else
-             soap_fcopy(soap, ip->type, fp->type, fp->ptr, p, ip->size);
-           ip->flist = fp->next;
-           SOAP_FREE(fp);
-           flag = 1;
-         }
-        }
-      }
-    }
-  } while (flag);
-#ifdef SOAP_DEBUG
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = ip->next)
-    { if (ip->copy || ip->flist)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution error: forwarded data for id='%s' could not be propagated, please report this problem to the developers\n", ip->id));
-      }
-    }
-  }
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolution done\n"));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_size_block(struct soap *soap, size_t n)
-{ if (soap->blist->ptr)
-  { soap->blist->size -= *(size_t*)(soap->blist->ptr + sizeof(char*)) - n;
-    *(size_t*)(soap->blist->ptr + sizeof(char*)) = n;
-  }
-  return soap->blist->size;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_first_block(struct soap *soap)
-{ char *p, *q, *r;
-  p = soap->blist->ptr;
-  if (!p)
-    return NULL;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "First block\n"));
-  r = NULL;
-  do
-  { q = *(char**)p;
-    *(char**)p = r;
-    r = p;
-    p = q;
-  } while (p);
-  soap->blist->ptr = r;
-  return r + sizeof(char*) + sizeof(size_t);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_next_block(struct soap *soap)
-{ char *p;
-  p = soap->blist->ptr;
-  if (p)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Next block\n"));
-    soap->blist->ptr = *(char**)p;
-    SOAP_FREE(p);
-    if (soap->blist->ptr)
-      return soap->blist->ptr + sizeof(char*) + sizeof(size_t);
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_block_size(struct soap *soap)
-{ return *(size_t*)(soap->blist->ptr + sizeof(char*));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_end_block(struct soap *soap)
-{ struct soap_blist *bp;
-  char *p, *q;
-  bp = soap->blist;
-  if (bp)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of block sequence, free all remaining blocks\n"));
-    for (p = bp->ptr; p; p = q)
-    { q = *(char**)p;
-      SOAP_FREE(p);
-    }
-    soap->blist = bp->next;
-    SOAP_FREE(bp);
-  }
-  DBGLOG(TEST, if (soap->blist) SOAP_MESSAGE(fdebug, "Restore previous block sequence\n"));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_save_block(struct soap *soap, char *p, int flag)
-{ register size_t n;
-  register char *q, *s;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Save all blocks in contiguous memory space of %u bytes (%p->%p)\n", (unsigned int)soap->blist->size, soap->blist->ptr, p));
-  if (soap->blist->size)
-  { if (!p)
-      p = (char*)soap_malloc(soap, soap->blist->size);
-    if (p)
-    { for (s = p, q = soap_first_block(soap); q; q = soap_next_block(soap))
-      { n = soap_block_size(soap);
-        if (flag)
-         soap_update_ptrs(soap, q, q + n, (long)s - (long)q); /* pointers s and q may or may not be related */
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copy %u bytes from %p to %p\n", (unsigned int)n, q, s));
-        memcpy(s, q, n);
-        s += n;
-      }
-    }
-    else
-      soap->error = SOAP_EOM;
-  }
-  soap_end_block(soap);
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsize(struct soap *soap, const char *type, int size)
-{ return soap_putsizes(soap, type, &size, 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsizes(struct soap *soap, const char *type, const int *size, int dim)
-{ return soap_putsizesoffsets(soap, type, size, NULL, dim);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putsizesoffsets(struct soap *soap, const char *type, const int *size, const int *offset, int dim)
-{ int i;
-  if (!type)
-    return NULL;
-  if (soap->version == 2)
-  { sprintf(soap->type, "%s[%d", type, size[0]);
-    for (i = 1; i < dim; i++)
-      sprintf(soap->type + strlen(soap->type), " %d", size[i]);
-  }
-  else
-  { if (offset)
-    { sprintf(soap->type, "%s[%d", type, size[0] + offset[0]);
-      for (i = 1; i < dim; i++)
-        sprintf(soap->type + strlen(soap->type), ",%d", size[i] + offset[i]);
-    }
-    else
-    { sprintf(soap->type, "%s[%d", type, size[0]);
-      for (i = 1; i < dim; i++)
-        sprintf(soap->type + strlen(soap->type), ",%d", size[i]);
-    }
-    strcat(soap->type, "]");
-  }
-  return soap->type;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putoffset(struct soap *soap, int offset)
-{ return soap_putoffsets(soap, &offset, 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_putoffsets(struct soap *soap, const int *offset, int dim)
-{ register int i;
-  sprintf(soap->arrayOffset, "[%d", offset[0]);
-  for (i = 1; i < dim; i++)
-    sprintf(soap->arrayOffset + strlen(soap->arrayOffset), ",%d", offset[i]);
-  strcat(soap->arrayOffset, "]");
-  return soap->arrayOffset;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_size(const int *size, int dim)
-{ register int i, n = size[0];
-  for (i = 1; i < dim; i++)
-    n *= size[i];
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getoffsets(const char *attr, const int *size, int *offset, int dim)
-{ register int i, j = 0;
-  if (offset)
-    for (i = 0; i < dim && attr && *attr; i++)
-    { attr++;
-      j *= size[i];
-      j += offset[i] = (int)atol(attr);
-      attr = strchr(attr, ',');
-    }
-  else
-    for (i = 0; i < dim && attr && *attr; i++)
-    { attr++;
-      j *= size[i];
-      j += (int)atol(attr);
-      attr = strchr(attr, ',');
-    }
-  return j;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getsize(const char *attr1, const char *attr2, int *j)
-{ register int n, k;
-  char *s;
-  *j = 0;
-  if (!*attr1)
-    return -1;
-  n = 1;
-  do
-  { attr1++;
-    k = (int)soap_strtol(attr1, &s, 10);
-    n *= k;
-    if (k < 0 || n > SOAP_MAXARRAYSIZE || s == attr1)
-      return -1;
-    attr1 = strchr(s, ',');
-    if (!attr1)
-      attr1 = strchr(s, ' ');
-    if (attr2 && *attr2)
-    { attr2++;
-      *j *= k;
-      k = (int)soap_strtol(attr2, &s, 10);
-      *j += k;
-      if (k < 0)
-        return -1;
-      attr2 = s;
-    }
-  } while (attr1 && *attr1 != ']');
-  return n - *j;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getsizes(const char *attr, int *size, int dim)
-{ register int i, k, n;
-  if (!*attr)
-    return -1;
-  i = strlen(attr);
-  n = 1;
-  do
-  { for (i = i-1; i >= 0; i--)
-      if (attr[i] == '[' || attr[i] == ',' || attr[i] == ' ')
-        break;
-    k = (int)atol(attr + i + 1);
-    n *= size[--dim] = k;
-    if (k < 0 || n > SOAP_MAXARRAYSIZE)
-      return -1;
-  } while (i >= 0 && attr[i] != '[');
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getposition(const char *attr, int *pos)
-{ register int i, n;
-  if (!*attr)
-    return -1;
-  n = 0;
-  i = 1;
-  do
-  { pos[n++] = (int)atol(attr + i);
-    while (attr[i] && attr[i] != ',' && attr[i] != ']')
-      i++;
-    if (attr[i] == ',')
-      i++;
-  } while (n < SOAP_MAXDIMS && attr[i] && attr[i] != ']');
-  return n;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_push_namespace(struct soap *soap, const char *id, const char *ns)
-{ register struct soap_nlist *np;
-  register struct Namespace *p;
-  np = (struct soap_nlist*)SOAP_MALLOC(sizeof(struct soap_nlist) + strlen(id));
-  if (!np)
-    return soap->error = SOAP_EOM;
-  np->next = soap->nlist;
-  soap->nlist = np;
-  strcpy(np->id, id);
-  np->level = soap->level;
-  np->index = -1;
-  np->ns = NULL;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push namespace binding (level=%u) '%s' '%s'\n", soap->level, id, ns));
-  p = soap->local_namespaces;
-  if (p)
-  { register short i = 0;
-    for (; p->id; p++, i++)
-    { if (p->ns && !strcmp(ns, p->ns))
-      { if (p->out)
-        { SOAP_FREE(p->out);
-          p->out = NULL;
-        }
-        break;
-      }
-      if (p->out)
-      { if (!SOAP_STRCMP(ns, p->out))
-          break;
-      }
-      else if (p->in)
-      { if (!soap_tag_cmp(ns, p->in))
-        { if ((p->out = (char*)SOAP_MALLOC(strlen(ns) + 1)))
-            strcpy(p->out, ns);
-          break;
-        }
-      }
-    }
-    if (p && p->id)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push OK ('%s' matches '%s' in namespace table)\n", id, p->id));
-      np->index = i;
-    }
-  }
-  if (!p || !p->id)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Push NOT OK: no match found for '%s' in namespace mapping table (added to stack anyway)\n", ns));
-    np->ns = (char*)SOAP_MALLOC(strlen(ns) + 1);
-    if (!np->ns)
-      return soap->error = SOAP_EOM;
-    strcpy(np->ns, ns);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_pop_namespace(struct soap *soap)
-{ register struct soap_nlist *np;
-  while (soap->nlist && soap->nlist->level >= soap->level)
-  { np = soap->nlist->next;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Popped namespace binding (level=%u) '%s'\n", soap->level, soap->nlist->id));
-    if (soap->nlist->ns)
-      SOAP_FREE(soap->nlist->ns);
-    SOAP_FREE(soap->nlist);
-    soap->nlist = np;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_namespace(struct soap *soap, const char *id1, const char *id2, int n1, int n2) 
-{ register struct soap_nlist *np = soap->nlist;
-  while (np && (strncmp(np->id, id1, n1) || np->id[n1]))
-    np = np->next;
-  if (np)
-  { if (np->index < 0 || (np->index >= 0 && soap->local_namespaces[np->index].id && (strncmp(soap->local_namespaces[np->index].id, id2, n2) || soap->local_namespaces[np->index].id[n2])))
-      return SOAP_NAMESPACE;
-    return SOAP_OK;
-  }
-  if (n1 == 3 && n1 == n2 && !strcmp(id1, "xml") && !strcmp(id1, id2))
-    return SOAP_OK;
-  return SOAP_SYNTAX_ERROR; 
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_tag_cmp(const char *s, const char *t)
-{ for (;;)
-  { register int c1 = *s;
-    register int c2 = *t;
-    if (!c1 || c1 == '"')
-      break;
-    if (c2 != '-')
-    { if (c1 != c2)
-      { if (c1 >= 'A' && c1 <= 'Z')
-          c1 += 'a' - 'A';
-        if (c2 >= 'A' && c2 <= 'Z')
-          c2 += 'a' - 'A';
-      }
-      if (c1 != c2)
-      { if (c2 != '*')
-          return 1;
-       c2 = *++t;
-        if (!c2)
-         return 0;
-        if (c2 >= 'A' && c2 <= 'Z')
-          c2 += 'a' - 'A';
-        for (;;)
-        { c1 = *s;
-         if (!c1 || c1 == '"')
-           break;
-         if (c1 >= 'A' && c1 <= 'Z')
-            c1 += 'a' - 'A';
-          if (c1 == c2)
-            if (!soap_tag_cmp(s + 1, t + 1))
-              return 0;
-         s++;
-        }
-        break;
-      }
-    }
-    s++;
-    t++;
-  }
-  if (*t == '*' && !t[1])
-    return 0;
-  return *t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_tag(struct soap *soap, const char *tag1, const char *tag2)
-{ register const char *s, *t;
-  if (!tag1 || !tag2 || !*tag2)
-    return SOAP_OK;
-  s = strchr(tag1, ':');
-  t = strchr(tag2, ':');
-  if (t)
-  { if (s)
-    { if (t[1] && SOAP_STRCMP(s + 1, t + 1))
-        return SOAP_TAG_MISMATCH;
-      if (t != tag2 && soap_match_namespace(soap, tag1, tag2, s - tag1, t - tag2))
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
-        return SOAP_TAG_MISMATCH;
-      }
-    } 
-    else if (SOAP_STRCMP(tag1, t + 1))
-      return SOAP_TAG_MISMATCH;
-    else if (t != tag2 && soap_match_namespace(soap, tag1, tag2, 0, t - tag2))
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags '%s' and '%s' match but namespaces differ\n", tag1, tag2));
-      return SOAP_TAG_MISMATCH;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags and (default) namespaces match: '%s' '%s'\n", tag1, tag2));
-    return SOAP_OK;
-  }
-  if (s)
-  { if (SOAP_STRCMP(s + 1, tag2))
-      return SOAP_TAG_MISMATCH;
-  }
-  else if (SOAP_STRCMP(tag1, tag2))
-    return SOAP_TAG_MISMATCH;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Tags match: '%s' '%s'\n", tag1, tag2));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_match_array(struct soap *soap, const char *type)
-{ if (*soap->arrayType)
-    if (soap_match_tag(soap, soap->arrayType, type)
-     && soap_match_tag(soap, soap->arrayType, "xsd:anyType")
-     && soap_match_tag(soap, soap->arrayType, "xsd:ur-type")
-    )
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array type mismatch: '%s' '%s'\n", soap->arrayType, type));
-      return SOAP_TAG_MISMATCH;
-    }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-
-#ifdef WITH_OPENSSL
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_server_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *dhfile, const char *randfile, const char *sid)
-{ int err;
-  soap->keyfile = keyfile;
-  soap->password = password;
-  soap->cafile = cafile;
-  soap->capath = capath;
-  if (dhfile)
-  { soap->dhfile = dhfile;
-    soap->rsa = 0;
-  }
-  else
-  { soap->dhfile = NULL;
-    soap->rsa = 1;
-  }
-  soap->randfile = randfile;
-  soap->require_client_auth = (flags & SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION);
-  if (!(err = soap->fsslauth(soap)))
-    if (sid)
-      SSL_CTX_set_session_id_context(soap->ctx, (unsigned char*)sid, strlen(sid));
-  return err; 
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_client_context(struct soap *soap, unsigned short flags, const char *keyfile, const char *password, const char *cafile, const char *capath, const char *randfile)
-{ soap->keyfile = keyfile;
-  soap->password = password;
-  soap->cafile = cafile;
-  soap->capath = capath;
-  soap->dhfile = NULL;
-  soap->rsa = 0;
-  soap->randfile = randfile;
-  soap->require_server_auth = (flags & SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION);
-  return soap->fsslauth(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static void
-ssl_init()
-{ static int done = 0;
-  if (!done)
-  { done = 1;
-    SSL_library_init();
-#ifndef WITH_LEAN
-    SSL_load_error_strings();
-#endif
-    if (!RAND_load_file("/dev/urandom", 1024))
-    { int r;
-#ifdef HAVE_RAND_R
-      unsigned int s = (unsigned int)time(NULL);
-#endif
-      char buf[SOAP_BUFLEN];
-      RAND_seed(buf, sizeof(buf));
-      while (!RAND_status())
-      {
-#ifdef HAVE_RAND_R
-        r = rand_r(&s);
-#else
-        r = rand();
-#endif
-        RAND_seed(&r, sizeof(int));
-      }
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char *
-ssl_error(struct soap *soap, int ret)
-{ int err = SSL_get_error(soap->ssl, ret);
-  const char *msg = soap_str_code(h_ssl_error_codes, err);
-  if (msg)
-    strcpy(soap->msgbuf, msg);
-  else
-    return ERR_error_string(err, soap->msgbuf);
-  if (ERR_peek_error())
-  { unsigned long r;
-    strcat(soap->msgbuf, "\n");
-    while ((r = ERR_get_error()))
-      ERR_error_string_n(r, soap->msgbuf + strlen(soap->msgbuf), sizeof(soap->msgbuf) - strlen(soap->msgbuf));
-  } 
-  else
-  { switch (ret)
-    { case 0:
-        strcpy(soap->msgbuf, "EOF was observed that violates the protocol. The client probably provided invalid authentication information.");
-        break;
-      case -1:
-        sprintf(soap->msgbuf, "Error observed by underlying BIO: %s", strerror(errno));  
-        break;
-    }
-  }
-  return soap->msgbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_password(char *buf, int num, int rwflag, void *userdata)
-{ if (num < (int)strlen((char*)userdata) + 1)
-    return 0;
-  return strlen(strcpy(buf, (char*)userdata));
-}
-#endif
-
-/******************************************************************************/
-/* This callback is included for future references. It should not be deleted
-#ifndef PALM_2
-static DH *
-ssl_tmp_dh(SSL *ssl, int is_export, int keylength)
-{ static DH *dh512 = NULL;
-  static DH *dh1024 = NULL;
-  DH *dh;
-  switch (keylength)
-  { case 512:
-      if (!dh512)
-      { BIO *bio = BIO_new_file("dh512.pem", "r");
-        if (bio)
-        { dh512 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-          BIO_free(bio);
-          return dh512;
-        }
-      }
-      else
-        return dh512;
-    default:
-      if (!dh1024)
-      { BIO *bio = BIO_new_file("dh1024.pem", "r");
-        if (bio)
-        { dh1024 = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-          BIO_free(bio);
-        }
-      }
-      dh = dh1024;
-  }
-  return dh;
-}
-#endif
-*/
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_auth_init(struct soap *soap)
-{ ssl_init();
-  if (!soap->ctx)
-    if (!(soap->ctx = SSL_CTX_new(SSLv23_method())))
-      return soap_set_receiver_error(soap, "SSL error", "Can't setup context", SOAP_SSL_ERROR);
-  if (soap->randfile)
-  { if (!RAND_load_file(soap->randfile, -1))
-      return soap_set_receiver_error(soap, "SSL error", "Can't load randomness", SOAP_SSL_ERROR);
-  }
-  if (soap->cafile || soap->capath)
-    if (!SSL_CTX_load_verify_locations(soap->ctx, soap->cafile, soap->capath))
-      return soap_set_receiver_error(soap, "SSL error", "Can't read CA file and/or directory", SOAP_SSL_ERROR);
-  if (!SSL_CTX_set_default_verify_paths(soap->ctx))
-    return soap_set_receiver_error(soap, "SSL error", "Can't read default CA file and/or directory", SOAP_SSL_ERROR);
-  if (soap->keyfile)
-  { if (!SSL_CTX_use_certificate_chain_file(soap->ctx, soap->keyfile))
-      return soap_set_receiver_error(soap, "SSL error", "Can't read certificate key file", SOAP_SSL_ERROR);
-    if (soap->password)
-    { SSL_CTX_set_default_passwd_cb_userdata(soap->ctx, (void*)soap->password);
-      SSL_CTX_set_default_passwd_cb(soap->ctx, ssl_password);
-      if (!SSL_CTX_use_PrivateKey_file(soap->ctx, soap->keyfile, SSL_FILETYPE_PEM))
-        return soap_set_receiver_error(soap, "SSL error", "Can't read key file", SOAP_SSL_ERROR);
-    }
-  }
-  if (soap->rsa)
-  { RSA *rsa = RSA_generate_key(512, RSA_F4, NULL, NULL);
-    if (!SSL_CTX_set_tmp_rsa(soap->ctx, rsa))
-    { if (rsa)
-        RSA_free(rsa);
-      return soap_set_receiver_error(soap, "SSL error", "Can't set RSA key", SOAP_SSL_ERROR);
-    }
-    RSA_free(rsa);
-  }
-  else if (soap->dhfile)
-  { DH *dh = 0;
-    BIO *bio;
-    bio = BIO_new_file(soap->dhfile, "r");
-    if (!bio)
-      return soap_set_receiver_error(soap, "SSL error", "Can't read DH file", SOAP_SSL_ERROR);
-    dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
-    BIO_free(bio);
-    if (SSL_CTX_set_tmp_dh(soap->ctx, dh) < 0)
-    { if (dh)
-        DH_free(dh);
-      return soap_set_receiver_error(soap, "SSL error", "Can't set DH parameters", SOAP_SSL_ERROR);
-    }
-    DH_free(dh);
-  }
-  SSL_CTX_set_options(soap->ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2);
-  SSL_CTX_set_verify(soap->ctx, soap->require_client_auth ? (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) : soap->require_server_auth ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, soap->fsslverify);
-#if (OPENSSL_VERSION_NUMBER < 0x00905100L)
-  SSL_CTX_set_verify_depth(soap->ctx, 1); 
-#else
-  SSL_CTX_set_verify_depth(soap->ctx, 9); 
-#endif  
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-ssl_verify_callback(int ok, X509_STORE_CTX *store)
-{
-#ifdef SOAP_DEBUG
-  if (!ok) 
-  { char data[256];
-    X509 *cert = X509_STORE_CTX_get_current_cert(store);
-    fprintf(stderr, "SSL Verify error with certificate at depth %d: %s\n", X509_STORE_CTX_get_error_depth(store), X509_verify_cert_error_string(X509_STORE_CTX_get_error(store)));
-    X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data));
-    fprintf(stderr, "certificate issuer %s\n", data);
-    X509_NAME_oneline(X509_get_subject_name(cert), data, sizeof(data));
-    fprintf(stderr, "certificate subject %s\n", data);
-  }
-#endif
-  /* return 1 to always continue, but unsafe progress will be terminated by SSL */
-  return ok;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_ssl_accept(struct soap *soap)
-{ int i, r;
-  if (!soap_valid_socket(soap->socket))
-    return soap_set_receiver_error(soap, "SSL error", "No socket in soap_ssl_accept()", SOAP_SSL_ERROR);
-  if (!soap->ssl)
-  { soap->ssl = SSL_new(soap->ctx);
-    if (!soap->ssl)
-      return soap_set_receiver_error(soap, "SSL error", "SSL_new() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
-  }
-  else
-    SSL_clear(soap->ssl);
-  soap->imode |= SOAP_ENC_SSL;
-  soap->omode |= SOAP_ENC_SSL;
-#ifdef WIN32
-  { u_long nonblocking = 1;
-    ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &nonblocking);
-  }
-#else
-  fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)|O_NONBLOCK);
-#endif
-  soap->bio = BIO_new_socket((SOAP_SOCKET)soap->socket, BIO_NOCLOSE);
-  SSL_set_bio(soap->ssl, soap->bio, soap->bio);
-  i = 100; /* 100 * 0.1 ms retries */
-  while ((r = SSL_accept(soap->ssl)) <= 0)
-  { int err = SSL_get_error(soap->ssl, r);
-    if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
-    { struct timeval timeout;
-      fd_set fd;
-      if (i-- <= 0)
-        break;
-      timeout.tv_sec = 0;
-      timeout.tv_usec = 100000;
-      FD_ZERO(&fd);
-      FD_SET((SOAP_SOCKET)soap->socket, &fd);
-      r = select((SOAP_SOCKET)(soap->socket + 1), &fd, NULL, &fd, &timeout);
-      if (r < 0 && soap_socket_errno != SOAP_EINTR)
-      { soap->errnum = soap_socket_errno;
-        return SOAP_EOF;
-      }
-    }
-    else
-    { soap->errnum = err;
-      break;
-    }
-  }
-#ifdef WIN32
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
-  }
-#else
-  fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
-#endif
-  if (r <= 0)
-  { soap_set_receiver_error(soap, ssl_error(soap, r), "SSL_accept() failed in soap_ssl_accept()", SOAP_SSL_ERROR);
-    soap_closesock(soap);
-    return SOAP_SSL_ERROR;
-  }
-  if (soap->require_client_auth)
-  { X509 *peer;
-    int err;
-    if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK)
-    { soap_closesock(soap);
-      return soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in soap_ssl_accept()", SOAP_SSL_ERROR);
-    }
-    peer = SSL_get_peer_certificate(soap->ssl);
-    if (!peer)
-    { soap_closesock(soap);
-      return soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in soap_ssl_accept()", SOAP_SSL_ERROR);
-    }
-    X509_free(peer);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#endif /* WITH_OPENSSL */
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-tcp_init(struct soap *soap)
-{ soap->errmode = 1;
-#ifdef WIN32
-  if (tcp_done)
-    return 0;
-  else
-  { WSADATA w;
-    if (WSAStartup(MAKEWORD(1, 1), &w))
-      return -1;
-    tcp_done = 1;
-  }
-#endif
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_done(struct soap *soap)
-{ 
-#ifdef SOAP_DEBUG
-  int i;
-#endif
-  soap_free(soap);
-  while (soap->clist)
-  { struct soap_clist *p = soap->clist->next;
-    SOAP_FREE(soap->clist);
-    soap->clist = p;
-  }
-  soap->keep_alive = 0; /* to force close the socket */
-  soap_closesock(soap);
-#ifdef WITH_COOKIES
-  soap_free_cookies(soap);
-#endif
-  while (soap->plugins)
-  { register struct soap_plugin *p = soap->plugins->next;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Removing plugin '%s'\n", soap->plugins->id));
-    if (soap->plugins->fcopy || !soap->copy)
-      soap->plugins->fdelete(soap, soap->plugins);
-    SOAP_FREE(soap->plugins);
-    soap->plugins = p;
-  }
-  soap->fplugin = fplugin;
-  soap->fpost = http_post;
-  soap->fget = http_get;
-  soap->fposthdr = http_post_header;
-  soap->fresponse = http_response;
-  soap->fparse = http_parse;
-  soap->fparsehdr = http_parse_header;
-#ifndef MAC_CARBON
-#ifndef WITH_IPV6
-  soap->fresolve = tcp_gethost;
-#else
-  soap->fresolve = NULL;
-#endif
-  soap->faccept = tcp_accept;
-  soap->fopen = tcp_connect;
-  soap->fclose = tcp_disconnect;
-  soap->fclosesocket = tcp_closesocket;
-  soap->fshutdownsocket = tcp_shutdownsocket;
-  soap->fsend = fsend;
-  soap->frecv = frecv;
-  soap->fpoll = soap_poll;
-#else
-  soap->fpoll = NULL;
-#endif
-  soap->fprepareinit = NULL;
-  soap->fpreparesend = NULL;
-  soap->fpreparerecv = NULL;
-  soap->fignore = NULL;
-  soap->fserveloop = NULL;
-#ifdef WITH_OPENSSL
-  if (soap->session)
-  { SSL_SESSION_free(soap->session);
-    soap->session = NULL;
-  }
-#endif
-  if (!soap->copy)
-  { if (soap_valid_socket(soap->master))
-    { soap->fclosesocket(soap, (SOAP_SOCKET)soap->master);
-      soap->master = SOAP_INVALID_SOCKET;
-    }
-#ifdef WITH_OPENSSL
-    if (soap->ctx)
-    { SSL_CTX_free(soap->ctx);
-      soap->ctx = NULL;
-    }
-#endif
-  }
-#ifdef SOAP_DEBUG
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-  { soap_close_logfile(soap, i);
-    if (soap->logfile[i])
-    { SOAP_FREE((void*)soap->logfile[i]);
-      soap->logfile[i] = NULL;
-    }
-  }
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_cleanup(struct soap *soap)
-{ soap_done(soap);
-#ifdef WIN32
-  if (!tcp_done)
-    return;
-  tcp_done = 0;
-  WSACleanup();
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-tcp_error(struct soap *soap)
-{ register const char *msg = NULL;
-  switch (soap->errmode)
-  { case 0:
-      msg = soap_strerror(soap);
-      break;
-    case 1:
-      msg = "WSAStartup failed";
-      break;
-    case 2:
-    {
-#ifndef WITH_LEAN
-      msg = soap_str_code(h_error_codes, soap->errnum);
-      if (!msg)
-#endif
-      { sprintf(soap->msgbuf, "TCP error %d", soap->errnum);
-        msg = soap->msgbuf;
-      }
-    }
-  }
-  return msg;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-http_error(struct soap *soap, int status)
-{ register const char *msg = NULL;
-#ifndef WITH_LEAN
-  msg = soap_str_code(h_http_error_codes, status);
-  if (!msg)
-#endif
-  { sprintf(soap->msgbuf, "HTTP error %d", status);
-    msg = soap->msgbuf;
-  }
-  return msg;
-}
-#endif
-
-/******************************************************************************/
-/* WR[ */
-#ifndef WITH_IPV6
-/* ]WR */
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_gethost(struct soap *soap, const char *addr, struct in_addr *inaddr)
-{ unsigned long iadd;
-  struct hostent hostent, *host = &hostent;
-/* WR[ */
-#ifdef VXWORKS
-  int hostint;
-  char *addrcopy = (char*)malloc(strlen(addr) + 1); /*copy of addr. */
-  /* inet_addr(), and hostGetByName() expect "char *"; addr is a "const char *". */
-  strncpy(addrcopy, addr, strlen(addr)+1);
-  iadd = inet_addr(addrcopy);
-#else
-/* ]WR */
-#if defined(_AIXVERSION_431) || defined(TRU64)
-  struct hostent_data ht_data;
-#endif
-  iadd = inet_addr(addr);
-/* WR[ */
-#endif
-/* ]WR */
-  if ((int)iadd != -1)
-  { memcpy(inaddr, &iadd, sizeof(iadd));
-/* WR[ */
-#ifdef VXWORKS
-    free(addrcopy);
-#endif
-/* ]WR */
-    return SOAP_OK;
-  }
-#if defined(__GLIBC__)
-  if (gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &host, &soap->errnum) < 0)
-    host = NULL;
-#elif defined(_AIXVERSION_431) || defined(TRU64)
-  memset((void*)&ht_data, 0, sizeof(ht_data));
-  if (gethostbyname_r(addr, &hostent, &ht_data) < 0)
-  { host = NULL;
-    soap->errnum = h_errno;
-  }
-#elif defined(HAVE_GETHOSTBYNAME_R)
-  host = gethostbyname_r(addr, &hostent, soap->buf, SOAP_BUFLEN, &soap->errnum);
-/* WR[ */
-#elif defined(VXWORKS)
-  /* If the DNS resolver library resolvLib has been configured in the vxWorks
-   * image, a query for the host IP address is sent to the DNS server, if the
-   * name was not found in the local host table. */
-  hostint = hostGetByName(addrcopy);
-  if (hostint == ERROR)
-  { host = NULL;
-    soap->errnum = soap_errno; 
-  }
-  free(addrcopy);  /*free() is placed after the error checking to assure that
-                   * errno captured is that from hostGetByName() */
-/* ]WR */
-#else
-  if (!(host = gethostbyname(addr)))
-    soap->errnum = h_errno;
-#endif
-  if (!host)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Host name not found\n"));
-    return SOAP_ERR;
-  }
-/* WR[ */
-#ifdef VXWORKS
-  inaddr->s_addr = hostint;
-#else
-/* ]WR */
-  memcpy(inaddr, host->h_addr, host->h_length);
-/* WR[ */
-#endif
-/* ]WR */
-  return SOAP_OK;
-}
-#endif
-#endif
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_connect(struct soap *soap, const char *endpoint, const char *host, int port)
-{ struct sockaddr_in sockaddr;
-/* WR[ */
-#ifdef WITH_IPV6
-  struct addrinfo *addrinfo;
-  struct addrinfo hints;
-  struct addrinfo resaddr;
-  struct sockaddr_storage addrstorage;
-  int err;
-#endif /* WITH_IPV6 */
-/* ]WR */
-  register int fd;
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  if (soap_valid_socket(soap->socket))
-    soap->fclosesocket(soap, (SOAP_SOCKET)soap->socket);
-  soap->socket = SOAP_INVALID_SOCKET;
-  if (tcp_init(soap))
-  { soap_set_sender_error(soap, tcp_error(soap), "TCP initialization failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  soap->errmode = 0;
-/* WR[ */
-#ifdef WITH_IPV6
-  memset((void*)&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
-  hints.ai_socktype = SOCK_STREAM;
-  soap->errmode = 2;
-  if (soap->proxy_host)
-    err = getaddrinfo(soap->proxy_host, soap_int2s(soap, soap->proxy_port), &hints, &addrinfo);
-  else
-    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
-  if (addrinfo)
-  { resaddr = *addrinfo;
-    addrstorage = *((struct sockaddr_storage*)addrinfo->ai_addr);
-    resaddr.ai_addr = (struct sockaddr*)&addrstorage;
-    freeaddrinfo(addrinfo);
-  }
-  if (err)
-  { soap_set_sender_error(soap, gai_strerror(err), 
-    "TCP getaddrinfo on proxy host failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  fd = (int)socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol); /* modified to use fd */
-  soap->errmode = 0;
-#else /* WITH_IPV6 */
-/* ]WR */
-  fd = (int)socket(AF_INET, SOCK_STREAM, 0);
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-  if (fd < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP socket failed in tcp_connect()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#ifdef SOCKET_CLOSE_ON_EXEC
-#ifdef WIN32
-#ifndef UNDER_CE
-  SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0);
-#endif
-#else
-  fcntl (fd, F_SETFD, 1);
-#endif
-#endif
-#ifndef WITH_LEAN
-  if (soap->connect_flags & SO_LINGER)
-  { struct linger linger;
-    memset((void*)&linger, 0, sizeof(linger));
-    linger.l_onoff = 1;
-    linger.l_linger = 0;
-    if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
-    { soap->errnum = soap_socket_errno;
-      soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in tcp_connect()", SOAP_TCP_ERROR);
-      soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-      return -1;
-    }
-  }
-  if ((soap->connect_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, soap->connect_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (soap->keep_alive && setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-#ifdef TCP_NODELAY
-  if (setsockopt((SOAP_SOCKET)fd, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_sender_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in tcp_connect()", SOAP_TCP_ERROR);
-    soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-    return -1;
-  }
-#endif
-#endif
-/* WR[ */
-#ifndef WITH_IPV6
-/* ]WR */
-  memset((void*)&sockaddr, 0, sizeof(sockaddr));
-  sockaddr.sin_family = AF_INET;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Open socket %d to host='%s'\n", fd, host));
-  soap->errmode = 2;
-  if (soap->proxy_host)
-  { if (soap->fresolve(soap, soap->proxy_host, &sockaddr.sin_addr))
-    { soap_set_sender_error(soap, tcp_error(soap), "TCP get proxy host by name failed in tcp_connect()", SOAP_TCP_ERROR);
-      soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-      return -1;
-    }
-    sockaddr.sin_port = htons((short)soap->proxy_port);
-  }
-  else
-  { if (soap->fresolve(soap, host, &sockaddr.sin_addr))
-    { soap_set_sender_error(soap, tcp_error(soap), "TCP get host by name failed in tcp_connect()", SOAP_TCP_ERROR);
-      soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-      return -1;
-    }
-    sockaddr.sin_port = htons((short)port);
-  }
-  soap->errmode = 0;
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  if (soap->connect_timeout)
-#if defined(WIN32)
-  { u_long nonblocking = 1;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  { vx_nonblocking = TRUE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
-#endif
-  else
-#if defined(WIN32)
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  { vx_nonblocking = FALSE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-  for (;;)
-  { 
-/* WR[ */
-#ifdef WITH_IPV6
-    if (connect((SOAP_SOCKET)fd, resaddr.ai_addr, resaddr.ai_addrlen)) /* modified to use fd */
-#else /* WITH_IPV6 */
-    if (connect((SOAP_SOCKET)fd, (struct sockaddr*)&sockaddr, sizeof(sockaddr)))
-#endif /* WITH_IPV6 */
-/* ]WR */
-    { 
-#ifndef WITH_LEAN
-      if (soap->connect_timeout && (soap_socket_errno == SOAP_EINPROGRESS || soap_socket_errno == SOAP_EWOULDBLOCK))
-      { struct timeval timeout;
-#if defined(SOCKLEN_T)
-        SOCKLEN_T n = sizeof(struct sockaddr_in);
-#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
-        socklen_t n = sizeof(struct sockaddr_in);
-#elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
-        int n = sizeof(struct sockaddr_in);
-#else
-        size_t n = sizeof(struct sockaddr_in);
-#endif
-        fd_set fds;
-        if (soap->connect_timeout > 0)
-        { timeout.tv_sec = soap->connect_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->connect_timeout/1000000;
-          timeout.tv_usec = -soap->connect_timeout%1000000;
-        }
-        FD_ZERO(&fds);
-        FD_SET((SOAP_SOCKET)fd, &fds);
-        for (;;)
-        { int r = select((SOAP_SOCKET)(fd + 1), NULL, &fds, NULL, &timeout);
-          if (r > 0)
-           break;
-          if (!r)
-          { soap->errnum = 0;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
-            soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-            soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-            return -1;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-            soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-            soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-            return -1;
-          }
-        }
-       n = sizeof(soap->errnum);
-        if (!getsockopt((SOAP_SOCKET)fd, SOL_SOCKET, SO_ERROR, (char*)&soap->errnum, &n) && !soap->errnum)
-          break;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-        soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-        soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-        return -1;
-      }
-      else
-#endif
-      if (soap_socket_errno != SOAP_EINTR)
-      { soap->errnum = soap_socket_errno;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not connect to host\n"));
-        soap_set_sender_error(soap, tcp_error(soap), "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-        soap->fclosesocket(soap, (SOAP_SOCKET)fd);
-        return -1;
-      }
-    }  
-    else
-      break;
-  }
-#ifndef WITH_LEAN
-  if (soap->connect_timeout)
-#if defined(WIN32)
-  { u_long blocking = 0;
-    ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-  }
-/* WR[ */
-#elif defined(VXWORKS)
-  { vx_nonblocking = FALSE;
-    ioctl((SOAP_SOCKET)fd, FIONBIO, (int)(&vx_nonblocking)); /* modified to use fd */
-  }
-/* ]WR */
-#else
-    fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-  soap->socket = fd;
-#ifdef WITH_OPENSSL
-  soap->imode &= ~SOAP_ENC_SSL;
-  soap->omode &= ~SOAP_ENC_SSL;
-  if (!strncmp(endpoint, "https:", 6))
-  { int r;
-    if (soap->proxy_host)
-    { unsigned int k = soap->omode; /* make sure we only parse HTTP */
-      size_t n = soap->count; /* save the content length */
-      soap->omode &= ~0xFF; /* mask IO and ENC */
-      soap->omode |= SOAP_IO_BUFFER;
-      soap_begin_send(soap);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connecting to proxy server\n"));
-      sprintf(soap->tmpbuf, "CONNECT %s:%d HTTP/%s", host, port, soap->http_version);
-      if ((soap->error = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return -1;
-#ifndef WITH_LEAN
-      if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
-      { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
-        strcpy(soap->tmpbuf, "Basic ");
-        soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-        if ((soap->error = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
-          return soap->error;
-      }
-#endif
-      if ((soap->error = soap->fposthdr(soap, NULL, NULL))
-       || soap_flush(soap))
-        return -1;
-      soap->omode = k;
-      k = soap->imode;
-      soap->imode &= ~0xFF; /* mask IO and ENC */
-      if (soap_begin_recv(soap))
-        return -1;
-      soap->imode = k;
-      soap->count = n;
-      soap_begin_send(soap);
-    }
-    if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
-    { soap_set_sender_error(soap, "SSL error", "SSL authentication failed in tcp_connect(): check password, key file, and ca file.", SOAP_SSL_ERROR);
-      return -1;
-    }
-    soap->ssl = SSL_new(soap->ctx);
-    if (!soap->ssl)
-    { soap->error = SOAP_SSL_ERROR;
-      return -1;
-    }
-    if (soap->session)
-    { if (!strcmp(soap->session_host, host) && soap->session_port == port)
-        SSL_set_session(soap->ssl, soap->session);
-      SSL_SESSION_free(soap->session);
-      soap->session = NULL;
-    }
-    soap->imode |= SOAP_ENC_SSL;
-    soap->omode |= SOAP_ENC_SSL;
-    soap->bio = BIO_new_socket((SOAP_SOCKET)fd, BIO_NOCLOSE);
-    SSL_set_bio(soap->ssl, soap->bio, soap->bio);
-#ifndef WITH_LEAN
-    if (soap->connect_timeout)
-#ifdef WIN32
-    { u_long nonblocking = 1;
-      ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &nonblocking);
-    }
-#else
-      fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)|O_NONBLOCK);
-#endif
-#endif
-    for (;;)
-    { if ((r = SSL_connect(soap->ssl)) <= 0)
-      { int err = SSL_get_error(soap->ssl, r);
-        if (err != SSL_ERROR_NONE && err != SSL_ERROR_WANT_READ && err != SSL_ERROR_WANT_WRITE)
-        { soap_set_sender_error(soap, ssl_error(soap, r), "SSL connect failed in tcp_connect()", SOAP_SSL_ERROR);
-          return -1;
-        }
-        if (soap->connect_timeout)
-        { struct timeval timeout;
-          fd_set fds;
-          if (soap->connect_timeout > 0)
-          { timeout.tv_sec = soap->connect_timeout;
-            timeout.tv_usec = 0;
-          }
-          else
-          { timeout.tv_sec = -soap->connect_timeout/1000000;
-            timeout.tv_usec = -soap->connect_timeout%1000000;
-          }
-          FD_ZERO(&fds);
-          FD_SET((SOAP_SOCKET)(soap->socket), &fds);
-          for (;;)
-          { int r = select((SOAP_SOCKET)(soap->socket + 1), &fds, NULL, &fds, &timeout);
-            if (r > 0)
-             break;
-            if (!r)
-            { soap->errnum = 0;
-              DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Connect timeout\n"));
-              soap_set_sender_error(soap, "Timeout", "TCP connect failed in tcp_connect()", SOAP_TCP_ERROR);
-              return -1;
-            }
-          }
-         continue;
-        }
-      }
-      break;
-    }
-#ifndef WITH_LEAN
-    if (soap->connect_timeout)
-#ifdef WIN32
-    { u_long blocking = 0;
-      ioctlsocket((SOAP_SOCKET)fd, FIONBIO, &blocking);
-    }
-#else
-      fcntl((SOAP_SOCKET)fd, F_SETFL, fcntl((SOAP_SOCKET)fd, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-    if (soap->require_server_auth)
-    { X509 *peer;
-      int err;
-      if ((err = SSL_get_verify_result(soap->ssl)) != X509_V_OK)
-      { soap_set_sender_error(soap, X509_verify_cert_error_string(err), "SSL certificate presented by peer cannot be verified in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-      peer = SSL_get_peer_certificate(soap->ssl);
-      if (!peer)
-      { soap_set_sender_error(soap, "SSL error", "No SSL certificate was presented by the peer in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-      X509_NAME_get_text_by_NID(X509_get_subject_name(peer), NID_commonName, soap->msgbuf, sizeof(soap->msgbuf));
-      X509_free(peer);
-      if (soap_tag_cmp(soap->msgbuf, host))
-      { soap_set_sender_error(soap, "SSL error", "SSL certificate host name mismatch in tcp_connect()", SOAP_SSL_ERROR);
-        return -1;
-      }
-    }
-  }
-#endif
-  return fd;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_bind(struct soap *soap, const char *host, int port, int backlog)
-{ struct sockaddr_in sockaddr;
-/* WR[ */
-#ifdef WITH_IPV6
-  struct addrinfo *addrinfo;
-  struct addrinfo hints;
-  struct addrinfo resaddr;
-  struct sockaddr_storage addrstorage;
-  int err;
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  if (soap_valid_socket(soap->master))
-  { soap->fclosesocket(soap, (SOAP_SOCKET)soap->master);
-    soap->master = SOAP_INVALID_SOCKET;
-  }
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->errmode = 1;
-  if (tcp_init(soap))
-  { soap_set_receiver_error(soap, tcp_error(soap), "TCP init failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-/* WR[ */
-#ifdef WITH_IPV6
-  memset((void*)&hints, 0, sizeof(hints));
-  hints.ai_family = PF_UNSPEC;
-  hints.ai_socktype = SOCK_STREAM;
-  hints.ai_flags = AI_PASSIVE;
-  soap->errmode = 2;
-  if (host)
-    err = getaddrinfo(host, soap_int2s(soap, port), &hints, &addrinfo);
-  else
-    err = getaddrinfo(NULL, soap_int2s(soap, port), &hints, &addrinfo);
-  if (NULL != addrinfo)
-  {
-    resaddr = *addrinfo;
-    addrstorage = *((struct sockaddr_storage *) addrinfo->ai_addr);
-    resaddr.ai_addr = (struct sockaddr *) &addrstorage;
-    freeaddrinfo(addrinfo);
-  }
-  if (err)
-  { soap_set_receiver_error(soap, gai_strerror(err), "TCP getaddrinfo failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  soap->errmode = 0;
-  if ((soap->master = socket(resaddr.ai_family, resaddr.ai_socktype, resaddr.ai_protocol)) < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#else /* WITH_IPV6 */
-/* ]WR */
-  soap->errmode = 0;
-  if ((soap->master = (int)socket(AF_INET, SOCK_STREAM, 0)) < 0)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP socket failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifdef SOCKET_CLOSE_ON_EXEC
-#ifdef WIN32
-#ifndef UNDER_CE
-  SetHandleInformation((HANDLE)soap->master, HANDLE_FLAG_INHERIT, 0);
-#endif
-#else
-  fcntl (soap->master, F_SETFD, 1);
-#endif
-#endif
-#ifndef WITH_LEAN
-  if (soap->bind_flags && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, soap->bind_flags, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-  if (setsockopt((SOAP_SOCKET)soap->master, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#ifdef TCP_NODELAY
-  if (setsockopt((SOAP_SOCKET)soap->master, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }
-#endif
-#endif
-/* WR[ */
-#ifdef WITH_IPV6
-  soap->errmode = 0;
-  if (bind(soap->master, resaddr.ai_addr, resaddr.ai_addrlen) || listen(soap->master, backlog))
-  { 
-    soap->errnum = soap_socket_errno;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
-    soap_closesock(soap);
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }  
-#else /* WITH_IPV6 */
-/* ]WR */
-  memset((void*)&sockaddr, 0, sizeof(sockaddr));
-  sockaddr.sin_family = AF_INET;
-  soap->errmode = 2;
-  if (host)
-  { if (soap->fresolve(soap, host, &sockaddr.sin_addr))
-    { soap_set_receiver_error(soap, tcp_error(soap), "TCP get host by name failed in soap_bind()", SOAP_TCP_ERROR);
-      return -1;
-    }
-  }
-  else
-    sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
-  sockaddr.sin_port = htons((short)port);
-  soap->errmode = 0;
-  if (bind((SOAP_SOCKET)soap->master, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) || listen((SOAP_SOCKET)soap->master, backlog))
-  { soap->errnum = soap_socket_errno;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not bind to host\n"));
-    soap_closesock(soap);
-    soap_set_receiver_error(soap, tcp_error(soap), "TCP bind failed in soap_bind()", SOAP_TCP_ERROR);
-    return -1;
-  }  
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-#ifdef WITH_OPENSSL
-  if (!soap->ctx && (soap->error = soap->fsslauth(soap)))
-    return -1;
-#endif
-  return soap->master;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_poll(struct soap *soap)
-{ 
-#ifndef WITH_LEAN
-  struct timeval timeout;
-  fd_set sfd,rfd;
-  int r;
-  timeout.tv_sec = 0;
-  timeout.tv_usec = 0;
-  FD_ZERO(&rfd);
-  FD_ZERO(&sfd);
-  if (soap->socket >= 0)
-  { FD_SET(soap->socket, &rfd);
-    FD_SET(soap->socket, &sfd);
-    r = select(soap->socket + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  else if (soap->master >= 0)
-  { FD_SET(soap->master, &rfd);
-    r = select(soap->master + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  else
-  { FD_SET(soap->sendfd, &sfd);
-    FD_SET(soap->recvfd, &rfd);
-    r = select((soap->sendfd > soap->recvfd ? soap->sendfd : soap->recvfd) + 1, &rfd, &sfd, NULL, &timeout);
-  }
-  if (r > 0)
-  {
-#ifdef WITH_OPENSSL
-    if (soap->ssl)
-    { if ((soap->socket >= 0) && FD_ISSET(soap->socket, &rfd))
-      { char buf = '\0';
-       if (SSL_peek(soap->ssl, &buf, 1) <= 0)
-         return SOAP_EOF;
-      }
-    }
-#endif   
-    return SOAP_OK;
-  }
-  if (r < 0 && (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) && soap_socket_errno != SOAP_EINTR)
-  { soap->errnum = soap_socket_errno;
-    soap_set_receiver_error(soap, tcp_error(soap), "select failed in soap_poll()", SOAP_TCP_ERROR);
-    return soap->error = SOAP_TCP_ERROR;
-  }
-  else
-    soap->errnum = soap_errno;
-  return SOAP_EOF;
-#else
-  return SOAP_OK;
-#endif
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_accept(struct soap *soap, int s, struct sockaddr *a, int *n)
-{ int fd;
-#if defined(SOCKLEN_T)
-  fd = (int)accept((SOAP_SOCKET)s, a, (SOCKLEN_T*)n);
-#elif defined(__socklen_t_defined) || defined(_SOCKLEN_T) || defined(CYGWIN)
-  fd = (int)accept((SOAP_SOCKET)s, a, (socklen_t*)n);
-#elif defined(WIN32) || defined(__APPLE__) || defined(HP_UX) || defined(SUN_OS) || defined(OPENSERVER) || defined(TRU64) || defined(VXWORKS)
-  fd = (int)accept((SOAP_SOCKET)s, a, n);
-#else
-  fd = (int)accept((SOAP_SOCKET)s, a, (size_t*)n);
-#endif
-#ifdef SOCKET_CLOSE_ON_EXEC
-#ifdef WIN32
-#ifndef UNDER_CE
-  SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0);
-#endif
-#else
-  fcntl(fd, F_SETFD, FD_CLOEXEC);
-#endif
-#endif
-  return fd;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_accept(struct soap *soap)
-{ 
-/* WR[ */
-#ifdef WITH_IPV6
-  struct sockaddr_storage sockaddr;
-#else /* WITH_IPV6 */
-/* ]WR */
-  struct sockaddr_in sockaddr;
-/* WR[ */
-#endif
-/* ]WR */
-  int n = (int)sizeof(sockaddr);
-#ifndef WITH_LEAN
-  int len = SOAP_BUFLEN;
-  int set = 1;
-#endif
-  soap->error = SOAP_OK;
-  memset((void*)&sockaddr, 0, sizeof(sockaddr));
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->errmode = 0;
-  if (soap_valid_socket(soap->master))
-  { for (;;)
-    { 
-#ifndef WITH_LEAN
-      if (soap->accept_timeout)
-      { struct timeval timeout;
-        fd_set fd;
-        if (soap->accept_timeout > 0)
-        { timeout.tv_sec = soap->accept_timeout;
-          timeout.tv_usec = 0;
-        }
-        else
-        { timeout.tv_sec = -soap->accept_timeout/1000000;
-          timeout.tv_usec = -soap->accept_timeout%1000000;
-        }
-        FD_ZERO(&fd);
-        FD_SET((SOAP_SOCKET)soap->master, &fd);
-        for (;;)
-        { int r = select((SOAP_SOCKET)(soap->master + 1), &fd, &fd, NULL, &timeout);
-          if (r > 0)
-            break;
-          if (!r)
-          { soap->errnum = 0;
-            soap_set_receiver_error(soap, "Timeout", "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-          }
-          if (soap_socket_errno != SOAP_EINTR)
-          { soap->errnum = soap_socket_errno;
-            soap_closesock(soap);
-            soap_set_sender_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-          }
-        }
-#if defined(WIN32)
-       { u_long nonblocking = 1;
-          ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &nonblocking);
-        }
-#elif defined(VXWORKS)
-        { vx_nonblocking = TRUE;
-          ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-        }
-#else
-        fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)|O_NONBLOCK);
-#endif
-      }
-      else
-#if defined(WIN32)
-      { u_long blocking = 0;
-        ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
-      }
-/* WR[ */
-#elif defined(VXWORKS)
-      { vx_nonblocking = FALSE;
-        ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-      }
-/* ]WR */
-#else
-        fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
-#endif
-#endif
-      if ((soap->socket = soap->faccept(soap, soap->master, (struct sockaddr*)&sockaddr, &n)) >= 0)
-      {
-/* WR[ */
-#ifdef WITH_IPV6
-/* Use soap->host to store the numeric form of the remote host */
-        getnameinfo((struct sockaddr*)&sockaddr, n, soap->host, sizeof(soap->host), NULL, 0, NI_NUMERICHOST | NI_NUMERICSERV); 
-        DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket %d from %s\n", soap->socket, soap->host));
-        soap->ip = 0; /* info stored in soap->host */
-        soap->port = 0; /* info stored in soap->host */
-#else /* WITH_IPV6 */
-/* ]WR */
-        soap->ip = ntohl(sockaddr.sin_addr.s_addr);
-        soap->port = (int)ntohs(sockaddr.sin_port); /* does not return port number on some systems */
-        DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Accept socket %d at port %d from IP %d.%d.%d.%d\n", soap->socket, soap->port, (int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF, (int)(soap->ip>>8)&0xFF, (int)soap->ip&0xFF));
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-        soap->keep_alive = ((soap->imode & SOAP_IO_KEEPALIVE) != 0);
-#ifndef WITH_LEAN
-       if (soap->accept_flags & SO_LINGER)
-        { struct linger linger;
-          memset((void*)&linger, 0, sizeof(linger));
-          linger.l_onoff = 1;
-          linger.l_linger = 0;
-         if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(struct linger)))
-          { soap->errnum = soap_socket_errno;
-           soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_LINGER failed in soap_accept()", SOAP_TCP_ERROR);
-            return -1;
-         }
-        }
-        if ((soap->accept_flags & ~SO_LINGER) && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, soap->accept_flags & ~SO_LINGER, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (soap->keep_alive && setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_KEEPALIVE failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_SNDBUF, (char*)&len, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_SNDBUF failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-        if (setsockopt((SOAP_SOCKET)soap->socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt SO_RCVBUF failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-#ifdef TCP_NODELAY
-        if (setsockopt((SOAP_SOCKET)soap->socket, IPPROTO_TCP, TCP_NODELAY, (char*)&set, sizeof(int)))
-        { soap->errnum = soap_socket_errno;
-          soap_set_receiver_error(soap, tcp_error(soap), "TCP setsockopt TCP_NODELAY failed in soap_accept()", SOAP_TCP_ERROR);
-          return -1;
-        }
-#endif
-#endif
-        if (soap->accept_timeout)
-        {
-#if defined(WIN32)
-          u_long blocking = 0;
-          ioctlsocket((SOAP_SOCKET)soap->master, FIONBIO, &blocking);
-          ioctlsocket((SOAP_SOCKET)soap->socket, FIONBIO, &blocking);
-/* WR[ */
-#elif defined(VXWORKS)
-          vx_nonblocking = FALSE;
-          ioctl((SOAP_SOCKET)soap->master, FIONBIO, (int)(&vx_nonblocking));
-          ioctl((SOAP_SOCKET)soap->socket, FIONBIO, (int)(&vx_nonblocking));
-/* ]WR */
-#elif defined(PALM)
-          fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL,0)&~O_NONBLOCK);
-          fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL,0)&~O_NONBLOCK);
-#elif defined(SYMBIAN)
-          long blocking = 0;
-          ioctl((SOAP_SOCKET)soap->master, 0/*FIONBIO*/, &blocking);
-#else
-          fcntl((SOAP_SOCKET)soap->master, F_SETFL, fcntl((SOAP_SOCKET)soap->master, F_GETFL)&~O_NONBLOCK);
-          fcntl((SOAP_SOCKET)soap->socket, F_SETFL, fcntl((SOAP_SOCKET)soap->socket, F_GETFL)&~O_NONBLOCK);
-#endif
-       }
-        return soap->socket;
-      }
-      if (soap_socket_errno != SOAP_EINTR && soap_socket_errno != SOAP_EAGAIN)
-      { soap->errnum = soap_socket_errno;
-        soap_set_receiver_error(soap, tcp_error(soap), "TCP accept failed in soap_accept()", SOAP_TCP_ERROR);
-        return -1;
-      }
-    }
-  }
-  else
-  { soap_set_receiver_error(soap, tcp_error(soap), "TCP no master socket in soap_accept()", SOAP_TCP_ERROR);
-    return -1;
-  }
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_disconnect(struct soap *soap)
-{
-#ifdef WITH_OPENSSL
-  if (soap->ssl)
-  { int r, s = 0;
-    if (soap->session)
-      SSL_SESSION_free(soap->session);
-    if (*soap->host)
-    { soap->session = SSL_get1_session(soap->ssl);
-      if (soap->session)
-      { strcpy(soap->session_host, soap->host);
-        soap->session_port = soap->port;
-      }
-    }
-    r = SSL_shutdown(soap->ssl);
-    if (r != 1)
-    { s = ERR_get_error();
-      if (s)
-      { if (soap_valid_socket(soap->socket))
-        { soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1);
-          soap->socket = SOAP_INVALID_SOCKET;
-        }
-        r = SSL_shutdown(soap->ssl);
-      }
-    }
-    DBGLOG(TEST, if (s) SOAP_MESSAGE(fdebug, "Shutdown failed: %d\n", SSL_get_error(soap->ssl, r)));
-    SSL_free(soap->ssl);
-    soap->ssl = NULL;
-    if (s)
-      return SOAP_SSL_ERROR;
-    ERR_remove_state(0);
-  }
-#endif
-  if (soap_valid_socket(soap->socket))
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Closing socket %d\n", soap->socket));
-    soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 2);
-    soap->fclosesocket(soap, (SOAP_SOCKET)soap->socket);
-    soap->socket = SOAP_INVALID_SOCKET;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_closesocket(struct soap *soap, SOAP_SOCKET fd)
-{ return closesocket(fd);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef MAC_CARBON
-#ifndef PALM_1
-static int
-tcp_shutdownsocket(struct soap *soap, SOAP_SOCKET fd, int how)
-{ return shutdown(fd, how);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_closesock(struct soap *soap)
-{ register int status = soap->error;
-#ifndef MAC_CARBON
-  if (status == SOAP_EOF || status == SOAP_TCP_ERROR || status == SOAP_SSL_ERROR || !soap->keep_alive)
-  { if ((soap->error = soap->fclose(soap)))
-      return soap->error;
-    soap->socket = SOAP_INVALID_SOCKET;
-  }
-#endif
-#ifdef WITH_ZLIB
-  if (soap->zlib_state == SOAP_ZLIB_DEFLATE)
-    deflateEnd(&soap->d_stream);
-  else if (soap->zlib_state == SOAP_ZLIB_INFLATE)
-    inflateEnd(&soap->d_stream);
-  soap->zlib_state = SOAP_ZLIB_NONE;
-#endif
-  return soap->error = status;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_hash(register const char *s)
-{ register size_t h = 0;
-  while (*s)
-    h = 65599*h + *s++;
-  return h % SOAP_IDHASH;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_init_pht(struct soap *soap)
-{ register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing pointer hashtable\n"));
-  for (i = 0; i < (int)SOAP_PTRHASH; i++)
-    soap->pht[i] = NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new()
-{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
-  if (soap)
-    soap_init(soap);
-  return soap;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new1(int mode)
-{ return soap_new2(mode, mode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_new2(int imode, int omode)
-{ struct soap *soap = (struct soap*)SOAP_MALLOC(sizeof(struct soap));
-  if (soap)
-    soap_init2(soap, imode, omode);
-  return soap;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_free_pht(struct soap *soap)
-{ register struct soap_plist *pp, *next;
-  register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free pointer hashtable\n"));
-  for (i = 0; i < (int)SOAP_PTRHASH; i++)
-  { for (pp = soap->pht[i]; pp; pp = next)
-    { next = pp->next;
-      SOAP_FREE(pp);
-    }
-    soap->pht[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embed(struct soap *soap, const void *p, const struct soap_array *a, int n, const char *tag, int type)
-{ register int i;
-  struct soap_plist *pp;
-  if (soap->version != 1)
-    soap->encoding = 1;
-  if (a)
-    i = soap_array_pointer_lookup(soap, p, a, n, type, &pp);
-  else
-    i = soap_pointer_lookup(soap, p, type, &pp);
-  if (i)
-  { if (soap_is_embedded(soap, pp)
-     || soap_is_single(soap, pp))
-      return 0;
-    soap_set_embedded(soap, pp);
-  }
-  return i;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pointer_lookup(struct soap *soap, const void *p, int type, struct soap_plist **ppp)
-{ register struct soap_plist *pp;
-  *ppp = NULL;
-  if (p)
-    for (pp = soap->pht[soap_hash_ptr(p)]; pp; pp = pp->next)
-      if (pp->ptr == p && pp->type == type)
-      { *ppp = pp;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d id=%d\n", p, type, pp->id));
-        return pp->id;
-      }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup location=%p type=%d: not found\n", p, type));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_pointer_enter(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
-{ register int h;
-  register struct soap_plist *pp = *ppp = (struct soap_plist*)SOAP_MALLOC(sizeof(struct soap_plist));
-  if (!pp)
-    return 0;
-  if (a)
-    h = soap_hash_ptr(a->__ptr);
-  else
-    h = soap_hash_ptr(p);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Pointer enter location=%p array=%p size=%d dim=%d type=%d id=%lu\n", p, a?a->__ptr:NULL, a?a->__size:0, n, type, soap->idnum+1));
-  pp->next = soap->pht[h];
-  pp->type = type;
-  pp->mark1 = 0;
-  pp->mark2 = 0;
-  pp->ptr = p;
-  pp->array = a;
-  soap->pht[h] = pp;
-  pp->id = ++soap->idnum;
-  return pp->id;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_pointer_lookup(struct soap *soap, const void *p, const struct soap_array *a, int n, int type, struct soap_plist **ppp)
-{ register struct soap_plist *pp;
-  *ppp = NULL;
-  if (!p || !a->__ptr)
-    return 0;
-  for (pp = soap->pht[soap_hash_ptr(a->__ptr)]; pp; pp = pp->next)
-  { if (pp->type == type && pp->array && pp->array->__ptr == a->__ptr)
-    { register int i;
-      for (i = 0; i < n; i++)
-        if (((const int*)&pp->array->__size)[i] != ((const int*)&a->__size)[i])
-         break;
-      if (i == n)
-      { *ppp = pp;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d id=%d\n", a->__ptr, type, pp->id));
-        return pp->id;
-      }
-    }
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array lookup location=%p type=%d: not found\n", a->__ptr, type));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_begin_count(struct soap *soap)
-{ soap_clr_attr(soap);
-  soap_set_local_namespaces(soap);
-#ifndef WITH_LEANER
-  if ((soap->mode & SOAP_ENC_DIME) || (soap->omode & SOAP_ENC_DIME))
-    soap->mode = soap->omode | SOAP_IO_LENGTH | SOAP_ENC_DIME;
-  else
-#endif
-  { soap->mode = soap->omode;
-    if ((soap->mode & SOAP_IO) == SOAP_IO_STORE
-     || (((soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_ENC_XML)) && !soap->fpreparesend))
-      soap->mode &= ~SOAP_IO_LENGTH;
-    else
-      soap->mode |= SOAP_IO_LENGTH;
-  }
-  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
-  { if (!(soap->mode & SOAP_ENC_DIME))
-      soap->mode &= ~SOAP_IO_LENGTH;
-    if (soap->mode & SOAP_ENC_XML)
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH))
-    soap->mode |= SOAP_XML_TREE;
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_MIME)
-    soap_select_mime_boundary(soap);
-  soap->dime.list = soap->dime.last;   /* keep track of last DIME attachment */
-#endif
-  soap->count = 0;
-  soap->ns = 0;
-  soap->null = 0;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  soap->encoding = 0;
-  soap->part = SOAP_BEGIN;
-  soap->idnum = 0;
-  soap->dime.count = 0; /* count # of attachments */
-  soap->dime.size = 0; /* accumulate total size of attachments */
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin count phase (socket=%d mode=%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
-  if (soap->fprepareinit && (soap->mode & SOAP_IO) != SOAP_IO_STORE)
-    soap->fprepareinit(soap);   
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_begin_send(struct soap *soap)
-{ soap->error = SOAP_OK;
-  soap_clr_attr(soap);
-  soap_set_local_namespaces(soap);
-  soap->mode = (soap->omode & ~SOAP_IO_LENGTH) | (soap->mode & SOAP_ENC_DIME);
-  if ((soap->mode & SOAP_ENC_ZLIB) && (soap->mode & SOAP_IO) == SOAP_IO_FLUSH)
-  { if (soap->mode & SOAP_ENC_XML)
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_FLUSH && soap_valid_socket(soap->socket))
-  { if (soap->count || (soap->mode & SOAP_ENC_XML))
-      soap->mode |= SOAP_IO_BUFFER;
-    else
-      soap->mode |= SOAP_IO_STORE;
-  }
-  if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    soap_new_block(soap);
-  if (!(soap->mode & SOAP_IO_KEEPALIVE))
-    soap->keep_alive = 0;
-  if (!soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH))
-    soap->mode |= SOAP_XML_TREE;
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_MIME)
-    soap_select_mime_boundary(soap);
-#endif
-#ifdef WIN32
-#ifndef UNDER_CE
-#ifndef WITH_FASTCGI
-  if (!soap_valid_socket(soap->socket)) /* Set win32 stdout or soap->sendfd to BINARY, e.g. to support DIME */
-#ifdef __BORLANDC__
-    setmode((SOAP_SOCKET)soap->sendfd, O_BINARY);
-#else
-    _setmode((SOAP_SOCKET)soap->sendfd, _O_BINARY);
-#endif
-#endif
-#endif
-#endif
-  if (soap->mode & SOAP_IO)
-  { soap->bufidx = 0;
-    soap->buflen = 0;
-  }
-  soap->chunksize = 0;
-  soap->ns = 0;
-  soap->null = 0;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  soap->encoding = 0;
-  soap->part = SOAP_BEGIN;
-  soap->idnum = 0;
-  soap->level = 0;
-#ifdef WITH_ZLIB
-  soap->z_ratio_out = 1.0;
-  if ((soap->mode & SOAP_ENC_ZLIB) && soap->zlib_state != SOAP_ZLIB_DEFLATE)
-  {
-#ifdef WITH_GZIP
-    memcpy(soap->z_buf, "\37\213\10\0\0\0\0\0\0\377", 10);
-    soap->d_stream.next_out = (Byte*)soap->z_buf + 10;
-    soap->d_stream.avail_out = SOAP_BUFLEN - 10;
-    soap->z_crc = crc32(0L, NULL, 0);
-    if (deflateInit2(&soap->d_stream, soap->z_level, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK)
-#else
-    soap->d_stream.next_out = (Byte*)soap->z_buf;
-    soap->d_stream.avail_out = SOAP_BUFLEN;
-    if (deflateInit(&soap->d_stream, soap->z_level) != Z_OK)
-#endif
-      return soap->error = SOAP_ZLIB_ERROR;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflate initialized\n"));
-    soap->zlib_state = SOAP_ZLIB_DEFLATE;
-  }
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin send phase (socket=%d mode=%x count=%lu)\n", soap->socket, soap->mode, (unsigned long)soap->count));
-  if (soap->fprepareinit && (soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    soap->fprepareinit(soap);   
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_embedded(struct soap *soap, const void *p, int t)
-{ struct soap_plist *pp;
-  if (soap_pointer_lookup(soap, p, t, &pp))
-  { pp->mark1 = 1;
-    pp->mark2 = 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded %p type=%d mark set to 1\n", p, t));
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_reference(struct soap *soap, const void *p, int t)
-{ struct soap_plist *pp;
-  if (!p || (soap->mode & SOAP_XML_TREE))
-    return 1;
-  if (soap_pointer_lookup(soap, p, t, &pp))
-  { if (pp->mark1 == 0)
-    { pp->mark1 = 2;
-      pp->mark2 = 2;
-    }
-  }
-  else if (soap_pointer_enter(soap, p, NULL, 0, t, &pp))
-  { pp->mark1 = 0;
-    pp->mark2 = 0;
-  }
-  else
-    return 1;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reference %p type=%d (%d %d)\n", p, t, (int)pp->mark1, (int)pp->mark2));
-  return pp->mark1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_reference(struct soap *soap, const void *p, const struct soap_array *a, int n, int t)
-{ register int i;
-  struct soap_plist *pp;
-  if (!p)
-    return 1;
-  i = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
-  if (i)
-  { if (pp->mark1 == 0)
-    { pp->mark1 = 2;
-      pp->mark2 = 2;
-    }
-  }
-  else if (!soap_pointer_enter(soap, p, a, n, t, &pp))
-    return 1;
-  else
-  { pp->mark1 = 0;
-    pp->mark2 = 0;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Array reference %p ptr=%p dim=%d type=%d (%d %d)\n", p, a->__ptr, n, t, (int)pp->mark1, (int)pp->mark2));
-  return pp->mark1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_embedded_id(struct soap *soap, int id, const void *p, int t)
-{ struct soap_plist *pp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id %p type=%d id=%d\n", p, t, id));
-  if (soap->mode & SOAP_XML_TREE)
-    return id;
-  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER)
-  { if (id < 0)
-    { id = soap_pointer_lookup(soap, p, t, &pp);
-      if (id)
-      { if (soap->mode & SOAP_IO_LENGTH)
-          pp->mark1 = 2;
-        else
-          pp->mark2 = 2;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id multiref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2));
-      }
-      return -1;
-    }
-    return id;
-  }
-  if (id < 0)
-    id = soap_pointer_lookup(soap, p, t, &pp);
-  else if (id && !soap_pointer_lookup(soap, p, t, &pp))
-    return 0;
-  if (id && pp)
-  { if (soap->mode & SOAP_IO_LENGTH)
-      pp->mark1 = 1;
-    else
-      pp->mark2 = 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Embedded_id embedded ref id=%d %p type=%d = (%d %d)\n", id, p, t, (int)pp->mark1, (int)pp->mark2));
-  }
-  return id;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_embedded(struct soap *soap, struct soap_plist *pp)
-{ if (!pp)
-    return 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Is embedded? %d %d\n", (int)pp->mark1, (int)pp->mark2));
-  if (soap->version == 1 && soap->encodingStyle && !(soap->mode & SOAP_XML_GRAPH) && soap->part != SOAP_IN_HEADER)
-  { if (soap->mode & SOAP_IO_LENGTH)
-      return pp->mark1 != 0;
-    return pp->mark2 != 0;
-  }
-  if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 1;
-  return pp->mark2 == 1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_is_single(struct soap *soap, struct soap_plist *pp)
-{ if (soap->part == SOAP_IN_HEADER)
-    return 1;
-  if (!pp)
-    return 0;
-  if (soap->mode & SOAP_IO_LENGTH)
-    return pp->mark1 == 0;
-  return pp->mark2 == 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_embedded(struct soap *soap, struct soap_plist *pp)
-{ if (!pp)
-    return;
-  if (soap->mode & SOAP_IO_LENGTH)
-    pp->mark1 = 1;
-  else
-    pp->mark2 = 1;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_dime(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, const char *aid, const char *atype, const char *aoptions, int n, const char *type, int t) 
-{ struct soap_plist *pp;
-  if (!p || !a->__ptr || (!aid && !atype))
-    return soap_element_id(soap, tag, id, p, a, n, type, t);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Attachment tag='%s' id='%s' (%d) type='%s'\n", tag, aid?aid:"", id, atype?atype:""));
-  if (id < 0)
-    id = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
-  if (!aid)
-  { sprintf(soap->tmpbuf, soap->dime_id_format, id);
-    aid = soap_strdup(soap, soap->tmpbuf);
-  }
-  if (soap_element_href(soap, tag, 0, "href", aid))
-    return soap->error;
-  if (soap->mode & SOAP_IO_LENGTH)
-  { if (pp->mark1 != 3)
-    { struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, (char*)a->__ptr, a->__size);
-      if (!content)
-        return soap->error = SOAP_EOM;
-      content->id = aid;
-      content->type = atype;
-      content->options = aoptions;
-      pp->mark1 = 3;
-    }
-  }
-  else
-    pp->mark2 = 3;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_init_iht(struct soap *soap)
-{ register int i;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing ID hashtable\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-    soap->iht[i] = NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_free_iht(struct soap *soap)
-{ register int i;
-  register struct soap_ilist *ip, *p;
-  register struct soap_flist *fp, *fq;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free ID hashtable\n"));
-  for (i = 0; i < SOAP_IDHASH; i++)
-  { for (ip = soap->iht[i]; ip; ip = p)
-    { for (fp = ip->flist; fp; fp = fq)
-      { fq = fp->next;
-        SOAP_FREE(fp);
-      }
-      p = ip->next;
-      SOAP_FREE(ip);
-    }
-    soap->iht[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static struct soap_ilist *
-soap_hlookup(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  for (ip = soap->iht[soap_hash(id)]; ip; ip = ip->next)
-    if (!strcmp(ip->id, id))
-      return ip;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_ilist *
-SOAP_FMAC2
-soap_lookup(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  ip = soap_hlookup(soap, id);
-#ifndef WITH_LEANER
-  if (!ip && *id != '#' && !strchr(id, ':')) /* try content id "cid:" with DIME attachments */
-  { char cid[SOAP_TAGLEN];
-    strcpy(cid, "cid:");
-    strncat(cid + 4, id, sizeof(cid) - 5);
-    cid[sizeof(cid) - 1] = '\0';
-    ip = soap_hlookup(soap, cid);
-  }
-#endif
-  return ip;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_ilist *
-SOAP_FMAC2
-soap_enter(struct soap *soap, const char *id)
-{ register size_t h;
-  register struct soap_ilist *ip;
-  ip = (struct soap_ilist*)SOAP_MALLOC(sizeof(struct soap_ilist) + strlen(id));
-  if (ip)
-  { h = soap_hash(id);
-    strcpy(ip->id, id);
-    ip->next = soap->iht[h];
-    soap->iht[h] = ip;
-    return ip;
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_malloc(struct soap *soap, size_t n)
-{ register char *p;
-  if (!n)
-    return NULL;
-  if (!soap)
-    return SOAP_MALLOC(n);
-  n += (-(long)n) & 7;
-  if (!(p = (char*)SOAP_MALLOC(n + sizeof(void*) + sizeof(size_t))))
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  /* keep chain of alloced cells for later destruction */
-  soap->alloced = 1;
-  *(void**)(p + n) = soap->alist;
-  *(size_t*)(p + n + sizeof(void*)) = n;
-  soap->alist = p + n;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Malloc %u bytes at location %p\n", (unsigned int)n, p));
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_dealloc(struct soap *soap, void *p)
-{ if (!soap)
-    return;
-  if (p)
-  { register char **q;
-    for (q = (char**)&soap->alist; *q; q = *(char***)q)
-    { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
-      { *q = **(char***)q;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Freed data at %p\n", p));
-        SOAP_FREE(p);
-        return;
-      }
-    }
-    soap_delete(soap, p);
-  }
-  else
-  { register char *q;
-    while (soap->alist)
-    { q = (char*)soap->alist;
-      soap->alist = *(void**)q;
-      q -= *(size_t*)(q + sizeof(void*));
-      SOAP_FREE(q);
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Dealloc all data done\n"));
-  }
-  /* we must assume these were deallocated: */
-  soap->action = NULL;
-  soap->fault = NULL;
-  soap->header = NULL;
-  soap->authrealm = NULL;
-#ifndef WITH_LEANER
-  soap_clr_mime(soap);
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_delete(struct soap *soap, void *p)
-{ register struct soap_clist **cp = &soap->clist;
-  if (p)
-  { while (*cp)
-    { if (p == (*cp)->ptr)
-      { register struct soap_clist *q = *cp;
-        *cp = q->next;
-        q->fdelete(q);
-        SOAP_FREE(q);
-        return;
-      }
-      cp = &(*cp)->next;
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not dealloc data %p: address not in list\n", p));
-  }
-  else
-  { while (*cp)
-    { register struct soap_clist *q = *cp;
-      *cp = q->next;
-      if (q->ptr == (void*)soap->fault)
-        soap->fault = NULL; /* this was deallocated */
-      else if (q->ptr == (void*)soap->header)
-        soap->header = NULL; /* this was deallocated */
-      q->fdelete(q);
-      SOAP_FREE(q);
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-struct soap_clist *
-SOAP_FMAC2
-soap_link(struct soap *soap, void *p, int t, int n, void (*fdelete)(struct soap_clist*))
-{ register struct soap_clist *cp;
-  if ((cp = (struct soap_clist*)SOAP_MALLOC(sizeof(struct soap_clist))))
-  { cp->next = soap->clist;
-    cp->type = t;
-    cp->size = n; 
-    cp->ptr = p;
-    cp->fdelete = fdelete;
-    soap->clist = cp;
-  }
-  return cp;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_unlink(struct soap *soap, const void *p)
-{ register char **q;
-  register struct soap_clist **cp;
-  if (!soap || !p)
-    return;
-  for (q = (char**)&soap->alist; *q; q = *(char***)q)
-  { if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
-    { *q = **(char***)q;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked data %p\n", p));
-      return;
-    }
-  }
-  for (cp = &soap->clist; *cp; cp = &(*cp)->next)
-  { if (p == (*cp)->ptr)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unlinked class instance %p\n", p));
-      q = (char**)*cp;
-      *cp = (*cp)->next;
-      SOAP_FREE(q);
-      return;
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_lookup_type(struct soap *soap, const char *id)
-{ register struct soap_ilist *ip;
-  if (id && *id)
-  { ip = soap_lookup(soap, id);
-    if (ip)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Lookup id='%s' type=%d\n", id, ip->type));
-      return ip->type;
-    }
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "lookup type id='%s' NOT FOUND! Need to get it from xsi:type\n", id));
-  return 0;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_lookup(struct soap *soap, const char *id, void **p, int t, size_t n, unsigned int k)
-{ struct soap_ilist *ip;
-  void **q;
-  if (!id || !*id)
-    return p;
-  soap->alloced = 0;
-  if (!p)
-    p = (void**)soap_malloc(soap, sizeof(void*));
-  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
-  if (!ip)
-  { ip = soap_enter(soap, id); /* new hash table entry for string id */
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding first href='%s' type=%d %p (%u bytes)\n", id, t, p, (unsigned int)n));
-    ip->type = t;
-    ip->size = n; 
-    ip->link = p;
-    ip->copy = NULL;
-    ip->flist = NULL;
-    ip->ptr = NULL;
-    ip->level = k;
-    *p = NULL;
-  }
-  else if (ip->ptr)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolved href='%s' type=%d location=%p (%u bytes)\n", id, t, ip->ptr, (unsigned int)n));
-    if (ip->type != t)
-    { strcpy(soap->id, id);
-      soap->error = SOAP_HREF;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility: id type=%d href type=%d\n", ip->type, t));
-      return NULL;
-    }
-    while (ip->level < k)
-    { q = (void**)soap_malloc(soap, sizeof(void*));  
-      if (!q)
-        return NULL;
-      *p = (void*)q;
-      p = q;
-      k--;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    *p = ip->ptr;
-  }
-  else if (ip->level > k)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Resolving level %u pointers to href='%s'\n", ip->level, id));
-    while (ip->level > k)
-    { void *s, **r = &ip->link;
-      q = (void**)ip->link;
-      while (q)
-      { *r = (void*)soap_malloc(soap, sizeof(void*));
-        s = *q;
-        *q = *r;
-        r = (void**)*r;
-        q = (void**)s;
-      }
-      *r = NULL;
-      ip->size = n; 
-      ip->copy = NULL;
-      ip->level = ip->level - 1;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    q = (void**)ip->link;
-    ip->link = p;
-    *p = (void*)q;
-  }
-  else
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarded href='%s' type=%d location=%p (%u bytes)\n", id, t, p, (unsigned int)n));
-    while (ip->level < k)
-    { q = (void**)soap_malloc(soap, sizeof(void*));  
-      *p = q;
-      p = q;
-      k--;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Descending one level...\n"));
-    }
-    q = (void**)ip->link;
-    ip->link = p;
-    *p = (void*)q;
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_forward(struct soap *soap, const char *href, void *p, int st, int tt, size_t n, unsigned int k, void (*fcopy)(struct soap*, int, int, void*, const void*, size_t))
-{ struct soap_ilist *ip;
-  if (!p || !href || !*href)
-    return p;
-  ip = soap_lookup(soap, href); /* lookup pointer to hash table entry for string id */
-  if (!ip)
-  { ip = soap_enter(soap, href); /* new hash table entry for string id */
-    ip->type = st;
-    ip->size = n;
-    ip->link = NULL;
-    ip->copy = NULL;
-    ip->ptr = NULL;
-    ip->level = 0;
-    ip->flist = NULL;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry href='%s' type=%d size=%lu level=%d location=%p\n", href, st, (unsigned long)n, k, p));
-  }
-  else if (ip->type != st || (ip->level == k && ip->size != n))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", href, ip->type, (unsigned long)ip->size, k, st, (unsigned long)n));
-    strcpy(soap->id, href);
-    soap->error = SOAP_HREF;
-    return NULL;
-  }
-  if (fcopy || n < sizeof(void*) || *href != '#')
-  { register struct soap_flist *fp = (struct soap_flist*)SOAP_MALLOC(sizeof(struct soap_flist));
-    if (!fp)
-    { soap->error = SOAP_EOM;
-      return NULL;
-    }
-    fp->next = ip->flist;
-    fp->type = tt;
-    fp->ptr = p;
-    fp->level = k;
-    if (fcopy)
-      fp->fcopy = fcopy;
-    else
-      fp->fcopy = soap_fcopy;
-    ip->flist = fp;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding type=%d (target type=%d) size=%lu location=%p level=%u href='%s'\n", st, tt, (unsigned long)n, p, k, href));
-  }
-  else
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Forwarding copying address %p for type=%d href='%s'\n", p, st, href));
-    *(void**)p = ip->copy;
-    ip->copy = p;
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void*
-SOAP_FMAC2
-soap_id_enter(struct soap *soap, const char *id, void *p, int t, size_t n, unsigned int k, const char *type, const char *arrayType, void *(*finstantiate)(struct soap*, int, const char*, const char*, size_t*))
-{ struct soap_ilist *ip;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Enter id='%s' type=%d loc=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k));
-  soap->alloced = 0;
-  if (!p)
-  { if (finstantiate)
-      p = finstantiate(soap, t, type, arrayType, &n);
-    else
-      p = soap_malloc(soap, n);
-    if (p)
-      soap->alloced = 1;
-  }
-  if (!id || !*id)
-    return p;
-  ip = soap_lookup(soap, id); /* lookup pointer to hash table entry for string id */
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Lookup entry id='%s for location=%p'\n", id, p));
-  if (!ip)
-  { ip = soap_enter(soap, id); /* new hash table entry for string id */
-    ip->type = t;
-    ip->link = NULL;
-    ip->copy = NULL;
-    ip->flist = NULL;
-    ip->size = n;
-    ip->ptr = p;
-    ip->level = k;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "New entry id='%s' type=%d size=%lu level=%u location=%p\n", id, t, (unsigned long)n, k, p));
-  }
-  else if ((ip->type != t || (ip->level == k && ip->size != n)) && (ip->copy || ip->flist))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Type incompatibility id='%s' expect type=%d size=%lu level=%u got type=%d size=%lu\n", id, ip->type, (unsigned long)ip->size, k, t, (unsigned long)n));
-    strcpy(soap->id, id);
-    soap->error = SOAP_HREF;
-    return NULL;
-  }
-  else if (ip->ptr)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Multiply defined id='%s'\n", id));
-    strcpy(soap->id, id);
-    soap->error = SOAP_MULTI_ID;
-    return NULL;
-  }
-  else 
-  { ip->size = n;
-    ip->ptr = p;
-    ip->level = k;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Update entry id='%s' type=%d location=%p size=%lu level=%u\n", id, t, p, (unsigned long)n, k));
-  }
-  return ip->ptr;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_fcopy(struct soap *soap, int st, int tt, void *p, const void *q, size_t n)
-{ DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Copying data type=%d (target type=%d) %p -> %p (%lu bytes)\n", st, tt, q, p, (unsigned long)n));
-  memcpy(p, q, n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_end_send(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  if (soap->dime.list)
-  { /* SOAP body referenced attachments must appear first */
-    soap->dime.last->next = soap->dime.first;
-    soap->dime.first = soap->dime.list->next;
-    soap->dime.list->next = NULL;
-    soap->dime.last = soap->dime.list;
-  }
-  if (soap_putdime(soap) || soap_putmime(soap))
-    return soap->error;
-  soap->mime.list = NULL;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->dime.list = NULL;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End send\n"));
-  if (soap->mode & SOAP_IO) /* need to flush the remaining data in buffer */
-  { if (soap_flush(soap))
-#ifdef WITH_ZLIB
-    { if (soap->mode & SOAP_ENC_ZLIB && soap->zlib_state == SOAP_ZLIB_DEFLATE)
-      { soap->zlib_state = SOAP_ZLIB_NONE;
-        deflateEnd(&soap->d_stream);
-      }
-      return soap->error;
-    }
-#else
-      return soap->error;
-#endif
-#ifdef WITH_ZLIB
-    if (soap->mode & SOAP_ENC_ZLIB)
-    { int r;
-      soap->d_stream.avail_in = 0;
-      do
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflating remainder\n"));
-        r = deflate(&soap->d_stream, Z_FINISH);
-        if (soap->d_stream.avail_out != SOAP_BUFLEN)
-        { if (soap_flush_raw(soap, soap->z_buf, SOAP_BUFLEN - soap->d_stream.avail_out))
-          { soap->zlib_state = SOAP_ZLIB_NONE;
-            deflateEnd(&soap->d_stream);
-            return soap->error;
-         }
-          soap->d_stream.next_out = (Byte*)soap->z_buf;
-          soap->d_stream.avail_out = SOAP_BUFLEN;
-        }
-      } while (r == Z_OK);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Deflated %lu->%lu bytes\n", soap->d_stream.total_in, soap->d_stream.total_out));
-      soap->z_ratio_out = (float)soap->d_stream.total_out / (float)soap->d_stream.total_in;
-      soap->mode &= ~SOAP_ENC_ZLIB;
-      soap->zlib_state = SOAP_ZLIB_NONE;
-      if (deflateEnd(&soap->d_stream) != Z_OK || r != Z_STREAM_END)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Unable to end deflate: %s\n", soap->d_stream.msg?soap->d_stream.msg:""));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-#ifdef WITH_GZIP
-      soap->z_buf[0] = soap->z_crc & 0xFF;
-      soap->z_buf[1] = (soap->z_crc >> 8) & 0xFF;
-      soap->z_buf[2] = (soap->z_crc >> 16) & 0xFF;
-      soap->z_buf[3] = (soap->z_crc >> 24) & 0xFF;
-      soap->z_buf[4] = soap->d_stream.total_in & 0xFF;
-      soap->z_buf[5] = (soap->d_stream.total_in >> 8) & 0xFF;
-      soap->z_buf[6] = (soap->d_stream.total_in >> 16) & 0xFF;
-      soap->z_buf[7] = (soap->d_stream.total_in >> 24) & 0xFF;
-      if (soap_flush_raw(soap, soap->z_buf, 8))
-        return soap->error;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip crc32=%lu\n", (unsigned long)soap->z_crc));
-#endif
-    }
-#endif
-    if ((soap->mode & SOAP_IO) == SOAP_IO_STORE)
-    { char *p;
-      if (!(soap->mode & SOAP_ENC_XML))
-      { soap->mode--;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending buffered message of length %u\n", (unsigned int)soap->blist->size));
-        if (soap->status >= SOAP_POST)
-          soap->error = soap->fpost(soap, soap->endpoint, soap->host, soap->port, soap->path, soap->action, soap->blist->size);
-        else if (soap->status != SOAP_STOP)
-          soap->error = soap->fresponse(soap, soap->status, soap->blist->size);
-        if (soap->error || soap_flush(soap))
-          return soap->error;
-        soap->mode++;
-      }
-      for (p = soap_first_block(soap); p; p = soap_next_block(soap))
-      { DBGMSG(SENT, p, soap_block_size(soap));
-        if ((soap->error = soap->fsend(soap, p, soap_block_size(soap))))
-        { soap_end_block(soap);
-          return soap->error;
-        }
-      }
-      soap_end_block(soap);
-    }
-    else if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    { DBGMSG(SENT, "\r\n0\r\n\r\n", 7);
-      if ((soap->error = soap->fsend(soap, "\r\n0\r\n\r\n", 7)))
-        return soap->error;
-    }
-  }
-#ifdef WITH_OPENSSL
-  if (!soap->ssl && soap_valid_socket(soap->socket) && !soap->keep_alive)
-    soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
-#else
-  if (soap_valid_socket(soap->socket) && !soap->keep_alive)
-    soap->fshutdownsocket(soap, (SOAP_SOCKET)soap->socket, 1); /* Send TCP FIN */
-#endif
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End of send message ok\n"));
-  soap->part = SOAP_END;
-  soap->count = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_end_recv(struct soap *soap)
-{ soap->part = SOAP_END;
-#ifndef WITH_LEANER
-  if ((soap->mode & SOAP_ENC_MIME) && soap_getmime(soap))
-    return soap->error;
-  soap->mime.list = soap->mime.first;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->dime.list = soap->dime.first;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-#endif
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "End of receive message ok\n"));
-#ifdef WITH_ZLIB
-  if (soap->mode & SOAP_ENC_ZLIB)
-  { soap->mode &= ~SOAP_ENC_ZLIB;
-    memcpy(soap->buf, soap->z_buf, SOAP_BUFLEN);
-    soap->bufidx = (char*)soap->d_stream.next_in - soap->z_buf;
-    soap->buflen = soap->z_buflen;
-    soap->zlib_state = SOAP_ZLIB_NONE;
-    if (inflateEnd(&soap->d_stream) != Z_OK)
-      return soap->error = SOAP_ZLIB_ERROR;
-#ifdef WITH_GZIP
-    if (soap->zlib_in == SOAP_ZLIB_GZIP)
-    { soap_wchar c;
-      short i;
-      for (i = 0; i < 8; i++)
-      { if ((int)(c = soap_getchar(soap)) == EOF)
-          return soap->error = SOAP_EOF;
-        soap->z_buf[i] = (char)c;
-      }
-      if (soap->z_crc != ((uLong)(unsigned char)soap->z_buf[0] | ((uLong)(unsigned char)soap->z_buf[1] << 8) | ((uLong)(unsigned char)soap->z_buf[2] << 16) | ((uLong)(unsigned char)soap->z_buf[3] << 24)))
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: crc check failed, message corrupted? (crc32=%lu)\n", (unsigned long)soap->z_crc));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-      if (soap->d_stream.total_out != ((uLong)(unsigned char)soap->z_buf[4] | ((uLong)(unsigned char)soap->z_buf[5] << 8) | ((uLong)(unsigned char)soap->z_buf[6] << 16) | ((uLong)(unsigned char)soap->z_buf[7] << 24)))
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Gzip error: incorrect message length\n"));
-        return soap->error = SOAP_ZLIB_ERROR;
-      }
-    }
-#endif
-  }
-#endif
-  if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    while ((int)soap_getchar(soap) != EOF) /* advance to last chunk */
-      ;
-  if (soap->fdisconnect && (soap->error = soap->fdisconnect(soap)))
-    return soap->error;
-  return soap_resolve(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_free(struct soap *soap)
-{ register struct soap_nlist *np;
-  register struct soap_attribute *tp;
-  register struct Namespace *ns;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free namespace stack\n"));
-  while (soap->nlist)
-  { np = soap->nlist->next;
-    if (soap->nlist->ns)
-      SOAP_FREE(soap->nlist->ns);
-    SOAP_FREE(soap->nlist);
-    soap->nlist = np;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free any remaining temp blocks\n"));
-  while (soap->blist)
-    soap_end_block(soap);
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attributes\n"));
-  while (soap->attributes)
-  { tp = soap->attributes->next;
-    if (soap->attributes->value)
-      SOAP_FREE(soap->attributes->value);
-    SOAP_FREE(soap->attributes);
-    soap->attributes = tp;
-  }
-#ifdef WITH_FAST
-  if (soap->labbuf)
-    SOAP_FREE(soap->labbuf);
-  soap->labbuf = NULL;
-  soap->lablen = 0;
-  soap->labidx = 0;
-#endif
-  soap_free_pht(soap);
-  soap_free_iht(soap);
-  ns = soap->local_namespaces;
-  if (ns)
-  { for (; ns->id; ns++)
-    { if (ns->out)
-      { SOAP_FREE(ns->out);
-       if (soap->encodingStyle == ns->out)
-          soap->encodingStyle = SOAP_STR_EOS;
-        ns->out = NULL;
-      }
-      if (soap->encodingStyle == ns->ns)
-        soap->encodingStyle = SOAP_STR_EOS;
-    }
-    SOAP_FREE(soap->local_namespaces);
-    soap->local_namespaces = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-static void
-soap_init_logs(struct soap *soap)
-{ int i;
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-  { soap->logfile[i] = NULL;
-    soap->fdebug[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#if !defined(WITH_LEAN) || defined(SOAP_DEBUG)
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_open_logfile(struct soap *soap, int i)
-{ if (soap->logfile[i])
-    soap->fdebug[i] = fopen(soap->logfile[i], i < 2 ? "ab" : "a");
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-static void
-soap_close_logfile(struct soap *soap, int i)
-{ if (soap->fdebug[i])
-  { fclose(soap->fdebug[i]);
-    soap->fdebug[i] = NULL;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_close_logfiles(struct soap *soap)
-{ int i;
-  for (i = 0; i < SOAP_MAXLOGS; i++)
-    soap_close_logfile(soap, i);
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-static void
-soap_set_logfile(struct soap *soap, int i, const char *logfile)
-{ char *s = NULL;
-  soap_close_logfile(soap, i);
-  if (soap->logfile[i])
-    SOAP_FREE((void*)soap->logfile[i]);
-  if (logfile)
-    if ((s = (char*)SOAP_MALLOC(strlen(logfile) + 1)))
-      strcpy(s, logfile);
-  soap->logfile[i] = s;
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_recv_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_RECV, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_sent_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_SENT, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifdef SOAP_DEBUG
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_test_logfile(struct soap *soap, const char *logfile)
-{ soap_set_logfile(soap, SOAP_INDEX_TEST, logfile);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_copy(struct soap *soap)
-{ return soap_copy_context((struct soap*)SOAP_MALLOC(sizeof(struct soap)), soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap*
-SOAP_FMAC2
-soap_copy_context(struct soap *copy, struct soap *soap)
-{ if (copy)
-  { register struct soap_plugin *p;
-    memcpy(copy, soap, sizeof(struct soap));
-    copy->copy = 1;
-    copy->user = NULL;
-    copy->userid = NULL;
-    copy->passwd = NULL;
-    copy->nlist = NULL;
-    copy->blist = NULL;
-    copy->clist = NULL;
-    copy->alist = NULL;
-    copy->attributes = NULL;
-    copy->local_namespaces = NULL;
-    soap_set_local_namespaces(copy);
-    soap_init_iht(copy);
-    soap_init_pht(copy);
-    copy->header = NULL;
-    copy->fault = NULL;
-    copy->action = NULL;
-    *copy->host = '\0';
-#ifndef WITH_LEAN
-#ifdef WITH_COOKIES
-    copy->cookies = soap_copy_cookies(soap);
-#else
-    copy->cookies = NULL;
-#endif
-#endif
-#ifdef SOAP_DEBUG
-    soap_init_logs(copy);
-    soap_set_recv_logfile(copy, "RECV.log");
-    soap_set_sent_logfile(copy, "SENT.log");
-    soap_set_test_logfile(copy, "TEST.log");
-#endif
-    copy->plugins = NULL;
-    for (p = soap->plugins; p; p = p->next)
-    { register struct soap_plugin *q = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin));
-      if (!q)
-        return NULL;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Copying plugin '%s'\n", p->id));
-      *q = *p;
-      if (p->fcopy && (soap->error = p->fcopy(soap, q, p)))
-      { SOAP_FREE(q);
-        return NULL;
-      }
-      q->next = copy->plugins;
-      copy->plugins = q;
-    }
-  }
-  else
-    soap->error = SOAP_EOM;
-  return copy;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init(struct soap *soap)
-{ soap->version = 0;
-  soap_imode(soap, SOAP_IO_DEFAULT);
-  soap_omode(soap, SOAP_IO_DEFAULT);
-  soap->copy = 0;
-  soap->plugins = NULL;
-  soap->user = NULL;
-  soap->userid = NULL;
-  soap->passwd = NULL;
-  soap->fpost = http_post;
-  soap->fget = http_get;
-  soap->fposthdr = http_post_header;
-  soap->fresponse = http_response;
-  soap->fparse = http_parse;
-  soap->fparsehdr = http_parse_header;
-  soap->fconnect = NULL;
-  soap->fdisconnect = NULL;
-#ifndef MAC_CARBON
-#ifndef WITH_IPV6
-  soap->fresolve = tcp_gethost;
-#else
-  soap->fresolve = NULL;
-#endif
-  soap->faccept = tcp_accept;
-  soap->fopen = tcp_connect;
-  soap->fclose = tcp_disconnect;
-  soap->fclosesocket = tcp_closesocket;
-  soap->fshutdownsocket = tcp_shutdownsocket;
-  soap->fsend = fsend;
-  soap->frecv = frecv;
-  soap->fpoll = soap_poll;
-#else
-  soap->fpoll = NULL;
-#endif
-  soap->fprepareinit = NULL;
-  soap->fpreparesend = NULL;
-  soap->fpreparerecv = NULL;
-  soap->fignore = NULL;
-  soap->fserveloop = NULL;
-  soap->fplugin = fplugin;
-  soap->fdimereadopen = NULL;
-  soap->fdimewriteopen = NULL;
-  soap->fdimereadclose = NULL;
-  soap->fdimewriteclose = NULL;
-  soap->fdimeread = NULL;
-  soap->fdimewrite = NULL;
-  soap->float_format = "%.8g"; /* .8 preserves single FP precision as much as possible, but might not be very efficient */
-  soap->double_format = "%.17lg"; /* .17 preserves double FP precision as much as possible, but might not be very efficient */
-  soap->dime_id_format = "cid:id%d"; /* default DIME id format */
-  soap->http_version = "1.1";
-  soap->actor = NULL;
-  soap->max_keep_alive = SOAP_MAXKEEPALIVE;
-  soap->keep_alive = 0;
-  soap->recv_timeout = 0;
-  soap->send_timeout = 0;
-  soap->connect_timeout = 0;
-  soap->accept_timeout = 0;
-  soap->socket_flags = 0;
-  soap->connect_flags = 0;
-  soap->bind_flags = 0;
-  soap->accept_flags = 0;
-  soap->ip = 0;
-  soap->labbuf = NULL;
-  soap->lablen = 0;
-  soap->labidx = 0;
-  soap->encodingStyle = SOAP_STR_EOS;
-#ifndef WITH_NONAMESPACES
-  soap->namespaces = namespaces;
-#else
-  soap->namespaces = NULL;
-#endif
-  soap->local_namespaces = NULL;
-  soap->nlist = NULL;
-  soap->blist = NULL;
-  soap->clist = NULL;
-  soap->alist = NULL;
-  soap->attributes = NULL;
-  soap->header = NULL;
-  soap->fault = NULL;
-  soap->master = SOAP_INVALID_SOCKET;
-  soap->socket = SOAP_INVALID_SOCKET;
-  soap->os = NULL;
-  soap->is = NULL;
-  soap->dom = NULL;
-  soap->dime.list = NULL;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-  soap->mime.list = NULL;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->mime.boundary = NULL;
-  soap->mime.start = NULL;
-#ifndef UNDER_CE
-  soap->recvfd = 0;
-  soap->sendfd = 1;
-#else
-  soap->recvfd = stdin;
-  soap->sendfd = stdout;
-#endif 
-  soap->host[0] = '\0';
-  soap->port = 0;
-  soap->action = NULL;
-  soap->proxy_host = NULL;
-  soap->proxy_port = 8080;
-  soap->proxy_userid = NULL;
-  soap->proxy_passwd = NULL;
-  soap->authrealm = NULL;
-  soap->prolog = NULL;
-#ifdef WITH_OPENSSL
-  soap->fsslauth = ssl_auth_init;
-  soap->fsslverify = ssl_verify_callback;
-  soap->bio = NULL;
-  soap->ssl = NULL;
-  soap->ctx = NULL;
-  soap->require_server_auth = 0;
-  soap->require_client_auth = 0;
-  soap->rsa = 0;
-  soap->keyfile = NULL;
-  soap->password = NULL;
-  soap->dhfile = NULL;
-  soap->cafile = NULL;
-  soap->capath = NULL;
-  soap->randfile = NULL;
-  soap->session = NULL;
-#endif
-#ifdef WITH_ZLIB
-  soap->zlib_state = SOAP_ZLIB_NONE;
-  soap->zlib_in = SOAP_ZLIB_NONE;
-  soap->zlib_out = SOAP_ZLIB_NONE;
-  soap->d_stream.zalloc = NULL;
-  soap->d_stream.zfree = NULL;
-  soap->d_stream.opaque = NULL;
-  soap->z_level = 6;
-#endif
-#ifndef WITH_LEAN
-  soap->cookies = NULL;
-  soap->cookie_domain = NULL;
-  soap->cookie_path = NULL;
-  soap->cookie_max = 32;
-#endif
-#ifdef SOAP_DEBUG
-  soap_init_logs(soap);
-  soap_set_recv_logfile(soap, "RECV.log");
-  soap_set_sent_logfile(soap, "SENT.log");
-  soap_set_test_logfile(soap, NULL);
-#endif
-/* WR[ */
-#ifdef WMW_RPM_IO
-  soap->rpmreqid = NULL;
-#endif /* WMW_RPM_IO */
-/* ]WR */
-#ifdef PALM
-  palmNetLibOpen();
-#endif
-  soap_init_iht(soap);
-  soap_init_pht(soap);
-  soap_begin(soap);
-#ifdef SOAP_DEBUG
-  soap_set_test_logfile(soap, "TEST.log");
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init1(struct soap *soap, int mode)
-{ soap_init2(soap, mode, mode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_init2(struct soap *soap, int imode, int omode)
-{ soap_init(soap);
-  soap_imode(soap, imode);
-  soap_omode(soap, omode);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_begin(struct soap *soap)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Initializing\n"));
-  if (!soap->keep_alive)
-  { soap->buflen = 0;
-    soap->bufidx = 0;
-  }
-  soap->keep_alive = (((soap->imode | soap->omode) & SOAP_IO_KEEPALIVE) != 0);
-  soap->null = 0;
-  soap->position = 0;
-  soap->encoding = 0;
-  soap->mustUnderstand = 0;
-  soap->mode = 0;
-  soap->ns = 0;
-  soap->part = SOAP_BEGIN;
-  soap->alloced = 0;
-  soap->count = 0;
-  soap->length = 0;
-  soap->cdata = 0;
-  soap->error = SOAP_OK;
-  soap->peeked = 0;
-  soap->ahead = 0;
-  soap->idnum = 0;
-  soap->level = 0;
-  soap->endpoint[0] = '\0';
-  soap->dime.chunksize = 0;
-  soap->dime.buflen = 0;
-  soap_free(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_end(struct soap *soap)
-{ register struct soap_clist *cp;
-  soap_free(soap);
-  soap_dealloc(soap, NULL);
-  while (soap->clist)
-  { cp = soap->clist->next;
-    SOAP_FREE(soap->clist);
-    soap->clist = cp;
-  }
-  soap_closesock(soap);
-#ifdef SOAP_DEBUG
-  soap_close_logfiles(soap);
-#endif
-#ifdef PALM
-  palmNetLibClose();
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_namespaces(struct soap *soap, struct Namespace *p)
-{ struct Namespace *ns = soap->local_namespaces;
-  struct soap_nlist *np, *nq, *nr;
-  unsigned int level = soap->level;
-  soap->namespaces = p;
-  soap->local_namespaces = NULL;
-  soap_set_local_namespaces(soap);
-  /* reverse the list */
-  np = soap->nlist;
-  soap->nlist = NULL;
-  if (np)
-  { nq = np->next;
-    np->next = NULL;
-    while (nq)
-    { nr = nq->next;
-      nq->next = np;
-      np = nq;
-      nq = nr;
-    }
-  }
-  while (np)
-  { soap->level = np->level; /* preserve element nesting level */
-    if (np->ns)
-    { if (soap_push_namespace(soap, np->id, np->ns))
-        return soap->error;
-    }
-    else if (np->index >= 0 && ns)
-    { if (ns[np->index].out)
-      { if (soap_push_namespace(soap, np->id, ns[np->index].out))
-          return soap->error;
-      }
-      else if (soap_push_namespace(soap, np->id, ns[np->index].ns))
-        return soap->error;
-    }
-    if (np->ns)
-      SOAP_FREE(np->ns);
-    nq = np;
-    np = np->next;
-    SOAP_FREE(nq);
-  }
-  if (ns)
-  { int i;
-    for (i = 0; ns[i].id; i++)
-    { if (ns[i].out)
-      { SOAP_FREE(ns[i].out);
-        ns[i].out = NULL;
-      }
-    }
-    SOAP_FREE(ns);
-  }
-  soap->level = level; /* restore level */
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void
-soap_set_local_namespaces(struct soap *soap)
-{ if (soap->namespaces && !soap->local_namespaces)
-  { register const struct Namespace *ns1;
-    register struct Namespace *ns2;
-    register size_t n = 1;
-    for (ns1 = soap->namespaces; ns1->id; ns1++)
-      n++;
-    if (n > 3)
-    { n *= sizeof(struct Namespace);
-      ns2 = (struct Namespace*)SOAP_MALLOC(n);
-      if (ns2)
-      { memcpy(ns2, soap->namespaces, n);
-        ns2[0].id = "SOAP-ENV";
-        ns2[1].id = "SOAP-ENC";
-        ns2[2].id = "xsi";
-        if (ns2[0].ns)
-        { if (!strcmp(ns2[0].ns, soap_env1))
-            soap->version = 1;
-          else
-            soap->version = 2;
-        }
-        soap->local_namespaces = ns2;
-      }
-    }
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element(struct soap *soap, const char *tag, int id, const char *type)
-{ struct Namespace *ns = soap->local_namespaces;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' id='%d' type='%s'\n", tag, id, type?type:""));
-/**/
-#ifdef WITH_DOM
-  if (soap->mode & SOAP_XML_DOM)
-  { register struct soap_dom_element *p, *e = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
-    e->next = NULL;
-    e->prnt = soap->dom;
-    e->nstr = NULL;
-    e->name = soap_strdup(soap, tag); /* check EOM? */
-    e->data = NULL;
-    e->type = 0;
-    e->node = NULL;
-    e->elts = NULL;
-    e->atts = NULL;
-    if (soap->dom)
-    { p = soap->dom->elts;
-      if (p)
-      { while (p->next)
-          p = p->next;
-        p->next = e;
-      }
-      else
-        soap->dom->elts = e;
-    }
-    soap->dom = e;
-  }
-  else
-#endif
-{
-  soap->level++;
-  if (!soap->ns && !(soap->mode & SOAP_XML_CANONICAL))
-    if (soap_send(soap, soap->prolog ? soap->prolog : "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"))
-      return soap->error;
-  if (soap_send_raw(soap, "<", 1)
-   || soap_send(soap, tag))
-    return soap->error;
-}
-/**/
-  if (!soap->ns)
-  { for (ns = soap->local_namespaces; ns && ns->id; ns++)
-    { if (*ns->id && (ns->out || ns->ns))
-      { sprintf(soap->tmpbuf, "xmlns:%s", ns->id);
-        if (soap_attribute(soap, soap->tmpbuf, ns->out ? ns->out : ns->ns))
-          return soap->error;
-      }
-    }   
-    soap->ns = 1;
-  }
-  if (id > 0)
-  { sprintf(soap->tmpbuf, "_%d", id);
-    if (soap_attribute(soap, "id", soap->tmpbuf))
-      return soap->error;
-  }
-  if (type && *type)
-  { if (soap_attribute(soap, "xsi:type", type))
-      return soap->error;
-  }
-  if (soap->null && soap->position > 0)
-  { int i;
-    sprintf(soap->tmpbuf, "[%d", soap->positions[0]);
-    for (i = 1; i < soap->position; i++)
-      sprintf(soap->tmpbuf + strlen(soap->tmpbuf), ",%d", soap->positions[i]);
-    strcat(soap->tmpbuf, "]");
-    if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf))
-      return soap->error;
-  }
-  if (soap->mustUnderstand)
-  { if (soap->actor && *soap->actor)
-    { if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor))
-        return soap->error;
-    }
-    if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1"))
-      return soap->error;
-    soap->mustUnderstand = 0;
-  }
-  if (soap->encoding)
-  { if (soap->encodingStyle && soap->local_namespaces)
-    { if (!*soap->encodingStyle)
-      { if (soap->local_namespaces[1].out)
-          soap->encodingStyle = soap->local_namespaces[1].out;
-        else
-          soap->encodingStyle = soap->local_namespaces[1].ns;
-      }
-      if (soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle))
-        return soap->error;
-    }
-    soap->encoding = 0;
-  }
-  soap->null = 0;
-  soap->position = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_begin_out(struct soap *soap, const char *tag, int id, const char *type)
-{ if (*tag == '-')
-    return SOAP_OK;
-  if (soap_element(soap, tag, id, type))
-    return soap->error;
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRRCHR
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_strrchr(const char *s, int t)
-{ register char *r = NULL;
-  while (*s)
-    if (*s++ == t)
-      r = (char*)s - 1;
-  return r;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRTOL
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_strtol(const char *s, char **t, int b)
-{ register long n = 0;
-  register int c;
-  while (*s > 0 && *s <= 32)
-    s++;
-  if (b == 10)
-  { short neg = 0;
-    if (*s == '-')
-    { s++;
-      neg = 1;
-    }
-    else if (*s == '+')
-      s++;
-    while ((c = *s) && c >= '0' && c <= '9')
-    { if (n > 214748364)
-        break;
-      n *= 10;
-      n += c - '0';
-      s++;
-    }
-    if (neg)
-      n = -n;
-  }
-  else /* b == 16 and value is always positive */
-  { while ((c = *s))
-    { if (c >= '0' && c <= '9')
-        c -= '0';
-      else if (c >= 'A' && c <= 'F')
-        c -= 'A' - 10;
-      else if (c >= 'a' && c <= 'f')
-        c -= 'a' - 10;
-      if (n > 0x07FFFFFF)
-        break;
-      n <<= 4;
-      n += c;
-      s++;
-    }
-  }
-  if (t)
-    *t = (char*)s;
-  return n;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-#ifndef HAVE_STRTOUL
-SOAP_FMAC1
-unsigned long
-SOAP_FMAC2
-soap_strtoul(const char *s, char **t, int b)
-{ unsigned long n = 0;
-  register int c;
-  while (*s > 0 && *s <= 32)
-    s++;
-  if (b == 10)
-  { if (*s == '+')
-      s++;
-    while ((c = *s) && c >= '0' && c <= '9')
-    { if (n > 429496729)
-        break;
-      n *= 10;
-      n += c - '0';
-      s++;
-    }
-  }
-  else /* b == 16 */
-  { while ((c = *s))
-    { if (c >= '0' && c <= '9')
-        c -= '0';
-      else if (c >= 'A' && c <= 'F')
-        c -= 'A' - 10;
-      else if (c >= 'a' && c <= 'f')
-        c -= 'a' - 10;
-      if (n > 0x0FFFFFFF)
-        break;
-      n <<= 4;
-      n += c;
-      s++;
-    }
-  }
-  if (t)
-    *t = (char*)s;
-  return n;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_array_begin_out(struct soap *soap, const char *tag, int id, const char *type, const char *offset)
-{ if (soap_element(soap, tag, id, "SOAP-ENC:Array"))
-    return soap->error;
-  if (soap->version == 2)
-  { const char *s;
-    s = soap_strrchr(type, '[');
-    if ((size_t)(s - type) < sizeof(soap->tmpbuf))
-    { strncpy(soap->tmpbuf, type, s - type);
-      soap->tmpbuf[s - type] = '\0';
-      if (type && *type && (soap_attribute(soap, "SOAP-ENC:itemType", soap->tmpbuf)))
-        return soap->error;
-      if (s && (soap_attribute(soap, "SOAP-ENC:arraySize", s + 1)))
-        return soap->error;
-    }
-  }
-  else
-  { if (offset && (soap_attribute(soap, "SOAP-ENC:offset", offset)))
-      return soap->error;
-    if (type && *type && (soap_attribute(soap, "SOAP-ENC:arrayType", type)))
-      return soap->error;
-  }
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_start_end_out(struct soap *soap, const char *tag)
-{ register struct soap_attribute *tp;
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { for (tp = soap->attributes; tp; tp = tp->next)
-    { if (tp->visible)
-      { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
-       a->next = soap->dom->atts;
-        a->nstr = NULL;
-        a->name = soap_strdup(soap, tp->name); /* check EOM */
-        a->data = soap_strdup(soap, tp->value); /* check EOM */
-        a->wide = NULL;
-       soap->dom->atts = a;
-        tp->visible = 0;
-      }
-    }
-    return SOAP_OK;
-  }
-#endif
-/**/
-  for (tp = soap->attributes; tp; tp = tp->next)
-  { if (tp->visible)
-    { if (soap_send2(soap, " ", tp->name))
-        return soap->error;
-      if (tp->visible == 2 && tp->value)
-        if (soap_send_raw(soap, "=\"", 2)
-        || soap_string_out(soap, tp->value, 1)
-        || soap_send_raw(soap, "\"", 1))
-          return soap->error;
-      tp->visible = 0;
-    }
-  }
-  if (tag)
-  { soap->level--;
-#ifndef WITH_LEAN
-    if (soap->mode & SOAP_XML_CANONICAL)
-    { if (soap_send_raw(soap, ">", 1)
-       || soap_element_end_out(soap, tag))
-        return soap->error;
-      return SOAP_OK;
-    }
-#endif
-    return soap_send_raw(soap, "/>", 2);
-  }
-  return soap_send_raw(soap, ">", 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_end_out(struct soap *soap, const char *tag)
-{ if (*tag == '-')
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element ending tag='%s'\n", tag));
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { if (soap->dom->prnt)
-      soap->dom = soap->dom->prnt;
-    return SOAP_OK;
-  }
-#endif
-/**/
-  soap->level--;
-  if (soap_send_raw(soap, "</", 2)
-   || soap_send(soap, tag))
-    return soap->error;
-  return soap_send_raw(soap, ">", 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_ref(struct soap *soap, const char *tag, int id, int href)
-{ register int n = 0;
-  if (soap->version == 2)
-    n = 1;
-  sprintf(soap->href, "#_%d", href);
-  return soap_element_href(soap, tag, id, "href" + n, soap->href + n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_href(struct soap *soap, const char *tag, int id, const char *ref, const char *val)
-{ DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element '%s' reference %s='%s'\n", tag, ref, val));
-  if (soap_element(soap, tag, id, NULL)
-   || soap_attribute(soap, ref, val)
-   || soap_element_start_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_null(struct soap *soap, const char *tag, int id, const char *type)
-{ struct soap_attribute *tp;
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (tp->visible)
-      break;
-  if (tp || (soap->version == 2 && soap->position > 0) || id > 0 || (soap->mode & SOAP_XML_NIL))
-  { if (soap_element(soap, tag, id, type))
-      return soap->error;
-    if (soap->part != SOAP_IN_HEADER && soap->encodingStyle)
-      if (soap_attribute(soap, "xsi:nil", "true"))
-        return soap->error;
-    return soap_element_start_end_out(soap, tag);
-  }
-  soap->null = 1;
-  soap->position = 0;
-  soap->mustUnderstand = 0;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_id(struct soap *soap, const char *tag, int id, const void *p, const struct soap_array *a, int n, const char *type, int t) 
-{ struct soap_plist *pp;
-  if (!p || (a && !a->__ptr))
-  { soap_element_null(soap, tag, id, type);
-    return -1;
-  }
-  if (soap->mode & SOAP_XML_TREE)
-    return 0;
-  if (id < 0)
-  { if (a)
-      id = soap_array_pointer_lookup(soap, p, a, n, t, &pp);
-    else
-      id = soap_pointer_lookup(soap, p, t, &pp);
-    if (id)
-    { if (soap_is_embedded(soap, pp))
-      { soap_element_ref(soap, tag, 0, id);
-        return -1;
-      }
-      if (soap_is_single(soap, pp))
-        return 0;
-      soap_set_embedded(soap, pp);
-    }
-  }
-  return id;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_result(struct soap *soap, const char *tag)
-{ if (soap->version == 2 && soap->encodingStyle)
-    if (soap_element(soap, "SOAP-RPC:result", 0, NULL)
-     || soap_attribute(soap, "xmlns:SOAP-RPC", soap_rpc)
-     || soap_element_start_end_out(soap, NULL)
-     || soap_string_out(soap, tag, 0)
-     || soap_element_end_out(soap, "SOAP-RPC:result"))
-      return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_attribute(struct soap *soap, const char *name, const char *value)
-{ 
-/**/
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { register struct soap_dom_attribute *a = (struct soap_dom_attribute*)soap_malloc(soap, sizeof(struct soap_dom_attribute));
-    a->next = soap->dom->atts;
-    a->nstr = NULL;
-    a->name = soap_strdup(soap, name); /* check EOM */
-    a->data = soap_strdup(soap, value); /* check EOM */
-    a->wide = NULL;
-    soap->dom->atts = a;
-    return SOAP_OK;
-  }
-#endif
-/**/
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { if (soap_set_attr(soap, name, value))
-      return soap->error;
-  }
-  else
-#endif
-  { if (soap_send2(soap, " ", name))
-      return soap->error;
-    if (value)
-      if (soap_send_raw(soap, "=\"", 2)
-       || soap_string_out(soap, value, 1)
-       || soap_send_raw(soap, "\"", 1))
-        return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_begin_in(struct soap *soap, const char *tag, int nillable)
-{ if (!soap_peek_element(soap))
-  { if (soap->other)
-      return soap->error = SOAP_TAG_MISMATCH;
-    if (tag && *tag == '-')
-      return SOAP_OK;
-    if (!(soap->error = soap_match_tag(soap, soap->tag, tag)))
-    { soap->peeked = 0;
-      if (soap->body)
-        soap->level++;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Begin element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:"" ));
-      if (!nillable && soap->null && (soap->mode & SOAP_XML_STRICT))
-        return soap->error = SOAP_NULL;
-    }
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_element_end_in(struct soap *soap, const char *tag)  
-{ register soap_wchar c;
-  register char *s;
-  register const char *t;
-  if (tag && *tag == '-')
-    return SOAP_OK;
-  soap->level--;
-  soap_pop_namespace(soap);
-  if (soap->peeked)
-  { if (*soap->tag == '\0')
-    { soap->peeked = 0;
-      if (soap->error == SOAP_NO_TAG || soap->error == SOAP_TAG_END)
-        soap->error = SOAP_OK;
-    }
-    else
-      return soap->error = SOAP_TAG_END;
-  }
-  else
-  { while (((c = soap_get(soap)) != SOAP_TT))
-    { if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      if (c == SOAP_LT)
-        return soap->error = SOAP_TAG_END;
-    }
-  }
-  s = soap->tag;
-  do c = soap_get(soap);
-  while (soap_blank(c));
-  do
-  { *s++ = (char)c;
-    c = soap_get(soap);
-  } while (soap_notblank(c));
-  *s = '\0';
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  while (soap_blank(c))
-    c = soap_get(soap);
-  if (c != SOAP_GT)
-    return soap->error = SOAP_SYNTAX_ERROR;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element found (level=%u) '%s'='%s'\n", soap->level, soap->tag, tag?tag:""));
-  if (!tag)
-    return SOAP_OK;
-  if ((s = strchr(soap->tag, ':')))
-    s++;
-  else
-    s = soap->tag;
-  if ((t = strchr(tag, ':')))
-    t++;
-  else
-    t = tag;
-  if (!SOAP_STRCMP(s, t))
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "End element tag name does not match\n"));
-  return soap->error = SOAP_SYNTAX_ERROR;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char *
-SOAP_FMAC2
-soap_attr_value(struct soap *soap, const char *name, int flag)
-{ register struct soap_attribute *tp;
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (!soap_match_tag(soap, tp->name, name))
-      break;
-  if (tp && tp->visible == 2)
-  { if (flag == 2 && (soap->mode & SOAP_XML_STRICT))
-      soap->error = SOAP_PROHIBITED;
-    else
-      return tp->value;
-  }
-  else if (flag == 1 && (soap->mode & SOAP_XML_STRICT))
-    soap->error = SOAP_REQUIRED;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_attr(struct soap *soap, const char *name, const char *value)
-{ register struct soap_attribute *tp;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set attribute %s='%s'\n", name, value?value:""));
-  for (tp = soap->attributes; tp; tp = tp->next)
-    if (!strcmp(tp->name, name))
-      break;
-  if (!tp)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute %s\n", name));
-    if (!(tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(name))))
-      return soap->error = SOAP_EOM;
-    tp->ns = NULL;
-#ifndef WITH_LEAN
-    if (soap->mode & SOAP_XML_CANONICAL)
-    { struct soap_attribute **tpp = &soap->attributes;
-      const char *s = strchr(name, ':');
-      if (!strncmp(name, "xmlns", 5))
-      { for (; *tpp; tpp = &(*tpp)->next)
-          if (strncmp((*tpp)->name, "xmlns", 5) || strcmp((*tpp)->name + 5, name + 5) > 0)
-            break;
-      }
-      else if (!s)
-      { for (; *tpp; tpp = &(*tpp)->next)
-          if (strncmp((*tpp)->name, "xmlns", 5) && ((*tpp)->ns || strcmp((*tpp)->name, name) > 0))
-            break;
-      }
-      else
-      { int k;
-        for (; *tpp; tpp = &(*tpp)->next)
-       { if (!strncmp((*tpp)->name, "xmlns:", 6) && !strncmp((*tpp)->name + 6, name, s - name) && !(*tpp)->name[6 + s - name])
-         { if (!tp->ns)
-            { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Canonicalization: prefix %s=%p(%s)\n", name, (*tpp)->ns, (*tpp)->ns));
-             tp->ns = (*tpp)->ns;
-           }
-         }
-          else if (strncmp((*tpp)->name, "xmlns", 5) && (*tpp)->ns && tp->ns && ((k = strcmp((*tpp)->ns, tp->ns)) > 0 || (!k && strcmp((*tpp)->name, name) > 0)))
-            break;
-        }
-      }
-      tp->next = *tpp;
-      *tpp = tp;
-    }
-    else
-#endif
-    { tp->next = soap->attributes;
-      soap->attributes = tp;
-    }
-    strcpy(tp->name, name);
-    tp->value = NULL;
-  }
-  else if (value && tp->value && tp->size <= strlen(value))
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Free attribute value of %s (free %p)\n", name, tp->value));
-    SOAP_FREE(tp->value);
-    tp->value = NULL;
-    tp->ns = NULL;
-  }
-  if (value)
-  { if (!tp->value)
-    { tp->size = strlen(value) + 1;
-      if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
-        return soap->error = SOAP_EOM;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Allocate attribute value of %s (%p)\n", tp->name, tp->value));
-    }
-    strcpy(tp->value, value);
-    if (!strncmp(tp->name, "xmlns:", 6))
-      tp->ns = tp->value;
-    tp->visible = 2;
-  }
-  else
-    tp->visible = 1;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_attr(struct soap *soap)
-{ register struct soap_attribute *tp;
-#ifndef WITH_LEAN
-  if (soap->mode & SOAP_XML_CANONICAL)
-  { while (soap->attributes)
-    { tp = soap->attributes->next;
-      SOAP_FREE(soap->attributes->value);
-      SOAP_FREE(soap->attributes);
-      soap->attributes = tp;
-    }
-  }
-  else
-#endif
-  { for (tp = soap->attributes; tp; tp = tp->next)
-      tp->visible = 0;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int
-soap_getattrval(struct soap *soap, char *s, size_t n, soap_wchar d)
-{ size_t i;
-  soap_wchar c;
-  for (i = 0; i < n; i++)
-  { c = soap_getutf8(soap);
-    switch (c)
-    {
-    case SOAP_TT:
-      *s++ = '<';
-      soap_unget(soap, '/');
-      break;
-    case SOAP_LT:
-      *s++ = '<';
-      break;
-    case SOAP_GT:
-      if (d == ' ')
-      { soap_unget(soap, c);
-        *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '>';
-      break;
-    case SOAP_QT:
-      if (c == d)
-      { *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '"';
-      break;
-    case SOAP_AP:
-      if (c == d)
-      { *s = '\0';
-        return SOAP_OK;
-      }
-      *s++ = '\'';
-      break;
-    case '\t':
-    case '\n':
-    case '\r':
-    case ' ':
-    case '/':
-      if (d == ' ')
-      { soap_unget(soap, c);
-        *s = '\0';
-        return SOAP_OK;
-      }
-    default:
-      if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      *s++ = (char)c;
-    }
-  }
-  return soap->error = SOAP_EOM;
-}
-#endif
-
-/******************************************************************************/
-#ifdef WITH_FAST
-#ifndef PALM_2
-static int 
-soap_append_lab(struct soap *soap, const char *s, size_t n)
-{ if (soap->labidx + n >= soap->lablen)
-  { register char *t = soap->labbuf;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Enlarging look-aside buffer to append data, old size=%lu", (unsigned long)soap->lablen));
-    if (soap->lablen == 0)
-      soap->lablen = SOAP_LABLEN;
-    while (soap->labidx + n >= soap->lablen)
-      soap->lablen <<= 1;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, ", new size=%lu\n", (unsigned long)soap->lablen));
-    soap->labbuf = (char*)SOAP_MALLOC(soap->lablen);
-    if (!soap->labbuf)
-    { if (t)
-        free(t);
-      return soap->error = SOAP_EOM;
-    }
-    if (t && soap->labidx)
-    { memcpy(soap->labbuf, t, soap->labidx);
-      free(t);
-    }
-  }
-  if (s)
-  { memcpy(soap->labbuf + soap->labidx, s, n);
-    soap->labidx += n;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_peek_element(struct soap *soap)
-{ register struct soap_attribute *tp;
-  const char *t;
-  register char *s;
-  register soap_wchar c;
-  register int i;
-  if (soap->error == SOAP_NO_TAG || soap->error == SOAP_TAG_END || soap->error == SOAP_TAG_MISMATCH)
-    soap->error = SOAP_OK;     /* retry */
-  if (soap->peeked)
-  { if (*soap->tag == '\0')
-      return soap->error = SOAP_NO_TAG;
-    return SOAP_OK;
-  }
-  soap->peeked = 1;
-  for (;;)
-  { while (((c = soap_getutf8(soap)) != SOAP_LT) && c != SOAP_TT)
-    { if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-    }
-    if (c == SOAP_TT)
-    { *soap->tag = '\0';
-      return soap->error = SOAP_NO_TAG; /* ending tag found */
-    }
-    s = soap->tag;
-    do c = soap_get(soap);
-    while (soap_blank(c));
-    i = sizeof(soap->tag);
-    while (c != '/' && soap_notblank(c))
-    { if (--i > 0)
-        *s++ = (char)c;
-      c = soap_get(soap);
-    }
-    while (soap_blank(c))
-      c = soap_get(soap);
-    *s = '\0';
-    if (*soap->tag != '?')
-      break;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML PI <%s?>\n", soap->tag));
-    while ((int)c != EOF && c != SOAP_GT && c != '?')
-    { s = soap->tmpbuf;
-      i = sizeof(soap->tmpbuf) - 2;
-      while (c != '=' && c != SOAP_GT && c != '?' && soap_notblank(c))
-      { if (--i > 0)
-          *s++ = (char)c;
-        c = soap_get(soap);
-      }
-      while (soap_blank(c))
-        c = soap_get(soap);
-      if (c == '=')
-      { *s++ = '=';
-       do c = soap_get(soap);
-        while (soap_blank(c));
-        if (c != SOAP_QT && c != SOAP_AP)
-        { soap_unget(soap, c);
-          c = ' '; /* blank delimiter */
-        }
-        if (soap_getattrval(soap, s, i, c) == SOAP_EOM)
-         while (soap_getattrval(soap, soap->tmpbuf, sizeof(soap->tmpbuf), c) == SOAP_EOM)
-           ;
-        else if (!strcmp(soap->tag, "?xml") && (!soap_tag_cmp(soap->tmpbuf, "encoding=iso-8859-1") || !soap_tag_cmp(soap->tmpbuf, "encoding=latin1")))
-        { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "XML latin1 encoding\n"));
-          soap->mode |= SOAP_ENC_LATIN;
-        }
-      }
-      do c = soap_get(soap);
-      while (soap_blank(c));
-    }
-  }
-  soap->id[0] = '\0';
-  soap->href[0] = '\0';
-  soap->type[0] = '\0';
-  soap->arrayType[0] = '\0';
-  soap->arraySize[0] = '\0';
-  soap->arrayOffset[0] = '\0';
-  soap->other = 0;
-  soap->root = -1;
-  soap->position = 0;
-  soap->null = 0;
-  soap->mustUnderstand = 0;
-  soap_clr_attr(soap);
-  while ((int)c != EOF && c != SOAP_GT && c != '/')
-  { s = soap->tmpbuf;
-    i = sizeof(soap->tmpbuf);
-    while (c != '=' && c != '/' && soap_notblank(c))
-    { if (--i > 0)
-        *s++ = (char)c;
-      c = soap_get(soap);
-    }
-    *s = '\0';
-    if (i == sizeof(soap->tmpbuf))
-      return soap->error = SOAP_SYNTAX_ERROR;
-    if (!strncmp(soap->tmpbuf, "xmlns:", 6))
-    { soap->tmpbuf[5] = '\0';
-      t = soap->tmpbuf + 6;
-    }
-    else if (!strcmp(soap->tmpbuf, "xmlns"))
-      t = SOAP_STR_EOS;
-    else
-      t = NULL;
-    for (tp = soap->attributes; tp; tp = tp->next)
-      if (!SOAP_STRCMP(tp->name, soap->tmpbuf))
-        break;
-    if (!tp)
-    { tp = (struct soap_attribute*)SOAP_MALLOC(sizeof(struct soap_attribute) + strlen(soap->tmpbuf));
-      if (!tp)
-        return soap->error = SOAP_EOM;
-      strcpy(tp->name, soap->tmpbuf);
-      tp->value = NULL;
-      tp->size = 0;
-      tp->next = soap->attributes;
-      soap->attributes = tp;
-    }
-    while (soap_blank(c))
-      c = soap_get(soap);
-    if (c == '=')
-    { do c = soap_get(soap);
-      while (soap_blank(c));
-      if (c != SOAP_QT && c != SOAP_AP)
-      { soap_unget(soap, c);
-        c = ' '; /* blank delimiter */
-      }
-      if (soap_getattrval(soap, tp->value, tp->size, c))
-      {
-#ifdef WITH_FAST
-        if (soap->error != SOAP_EOM)
-          return soap->error;
-        soap->error = SOAP_OK;
-       soap->labidx = 0;
-       if (soap_append_lab(soap, tp->value, tp->size))
-         return soap->error;
-       SOAP_FREE(tp->value);
-       for (;;)
-       { if (soap_getattrval(soap, soap->labbuf + soap->labidx, soap->lablen - soap->labidx, c))
-         { if (soap->error != SOAP_EOM)
-             return soap->error;
-            soap->error = SOAP_OK;
-           soap->labidx = soap->lablen;
-           if (soap_append_lab(soap, NULL, 0))
-             return soap->error;
-         }
-         else
-           break;
-       }
-        tp->size = soap->lablen;
-       if (!(tp->value = (char*)SOAP_MALLOC(tp->size)))
-         return soap->error = SOAP_EOM;
-        memcpy(tp->value, soap->labbuf, soap->lablen);
-#else
-       size_t n;
-        if (soap->error != SOAP_EOM)
-          return soap->error;
-        soap->error = SOAP_OK;
-        if (soap_new_block(soap))
-          return soap->error;
-        for (;;)
-        { if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
-            return soap->error;
-          if (soap_getattrval(soap, s, SOAP_BLKLEN, c))
-          { if (soap->error != SOAP_EOM)
-              return soap->error;
-            soap->error = SOAP_OK;
-          }
-          else
-            break;
-        }
-       n = tp->size + soap->blist->size;
-        if (!(s = (char*)SOAP_MALLOC(n)))
-          return soap->error = SOAP_EOM;
-        if (tp->value)
-        { memcpy(s, tp->value, tp->size);
-          SOAP_FREE(tp->value);
-        }
-        soap_save_block(soap, s + tp->size, 0);
-        tp->value = s;
-        tp->size = n;
-#endif
-      }
-      do c = soap_get(soap);
-      while (soap_blank(c));
-      tp->visible = 2; /* seen this attribute w/ value */
-    }
-    else
-      tp->visible = 1; /* seen this attribute w/o value */
-    if (t && tp->value)
-    { if (soap_push_namespace(soap, t, tp->value))
-        return soap->error;
-      tp->visible = 0;
-    }
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  for (tp = soap->attributes; tp; tp = tp->next)
-  { if (tp->visible && tp->value)
-    { if (!strcmp(tp->name, "id"))
-      { *soap->id = '#';
-        strncpy(soap->id + 1, tp->value, sizeof(soap->id) - 2);
-        soap->id[sizeof(soap->id)-1] = '\0';
-      }
-      else if (!strcmp(tp->name, "href"))
-      { strncpy(soap->href, tp->value, sizeof(soap->href) - 1);
-        soap->href[sizeof(soap->href)-1] = '\0';
-      }
-      else if ((soap->version == 2 || (soap->mode & SOAP_XML_GRAPH)) && !strcmp(tp->name, "ref"))
-      { *soap->href = '#';
-        strncpy(soap->href + 1, tp->value, sizeof(soap->href) - 2);
-        soap->href[sizeof(soap->href)-1] = '\0';
-      }
-      else if (!soap_match_tag(soap, tp->name, "xsi:type"))
-      { strncpy(soap->type, tp->value, sizeof(soap->type) - 1);
-        soap->type[sizeof(soap->type)-1] = '\0';
-      }
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arrayType"))
-      { s = soap_strrchr(tp->value, '[');
-        if (s && (size_t)(s - tp->value) < sizeof(soap->arrayType))
-        { strncpy(soap->arrayType, tp->value, s - tp->value);
-          soap->arrayType[s - tp->value] = '\0';
-          strncpy(soap->arraySize, s, sizeof(soap->arraySize) - 1);
-        }
-        else
-          strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
-        soap->arraySize[sizeof(soap->arrayType)-1] = '\0';
-        soap->arrayType[sizeof(soap->arrayType)-1] = '\0';
-      }
-      else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:itemType"))
-        strncpy(soap->arrayType, tp->value, sizeof(soap->arrayType) - 1);
-      else if (soap->version == 2 && !soap_match_tag(soap, tp->name, "SOAP-ENC:arraySize"))
-        strncpy(soap->arraySize, tp->value, sizeof(soap->arraySize) - 1);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:offset"))
-        strncpy(soap->arrayOffset, tp->value, sizeof(soap->arrayOffset));
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:position"))
-        soap->position = soap_getposition(tp->value, soap->positions);
-      else if (soap->version == 1 && !soap_match_tag(soap, tp->name, "SOAP-ENC:root"))
-        soap->root = ((!strcmp(tp->value, "1") || !strcmp(tp->value, "true")));
-      else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:actor")
-            || !soap_match_tag(soap, tp->name, "SOAP-ENV:role"))
-      { if ((!soap->actor || strcmp(soap->actor, tp->value))
-         && strcmp(tp->value, "http://schemas.xmlsoap.org/soap/actor/next")
-         && strcmp(tp->value, "http://www.w3.org/2003/05/soap-envelope/role/next"))
-          soap->other = 1;
-      }
-      else if (!soap_match_tag(soap, tp->name, "SOAP-ENV:mustUnderstand")
-            && (!strcmp(tp->value, "1") || !strcmp(tp->value, "true")))
-        soap->mustUnderstand = 1;
-      else if ((!soap_match_tag(soap, tp->name, "xsi:null")
-             || !soap_match_tag(soap, tp->name, "xsi:nil"))
-            && (!strcmp(tp->value, "1")
-             || !strcmp(tp->value, "true")))
-        soap->null = 1;
-    }
-  }
-  if (!(soap->body = (c != '/')))
-    do c = soap_get(soap);
-    while (soap_blank(c));
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_retry(struct soap *soap)
-{ soap->peeked = 1;
-  soap->error = SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_revert(struct soap *soap)
-{ if (!soap->peeked)
-  { soap->peeked = 1;
-    if (soap->body)
-      soap->level--;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Reverting last element (level=%u)\n", soap->level));
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_string_out(struct soap *soap, const char *s, int flag)
-{ register const char *t;
-  register soap_wchar c;
-  register soap_wchar mask = 0x80000000;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->data = soap_strdup(soap, s); /* check EOM */
-    return SOAP_OK;
-  }
-#endif
-  if (soap->mode & SOAP_C_UTFSTRING)
-    mask = 0;
-  t = s;
-  while ((c = *t++))
-  { switch (c)
-    { 
-    case 9:
-      if (flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#x9;", 5))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case 10:
-      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xA;", 5))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case 13:
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&#xD;", 5))
-        return soap->error;
-      s = t;
-      break;
-    case '&':
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&amp;", 5))
-        return soap->error;
-      s = t;
-      break;
-    case '<':
-      if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&lt;", 4))
-        return soap->error;
-      s = t;
-      break;
-    case '>':
-      if (!flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&gt;", 4))
-         return soap->error;
-        s = t;
-      }
-      break;
-    case '"':
-      if (flag)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&quot;", 6))
-         return soap->error;
-        s = t;
-      }
-      break;
-    default:
-#ifdef HAVE_MBTOWC
-      if (soap->mode & SOAP_C_MBSTRING)
-      { wchar_t wc;
-        register int m = mbtowc(&wc, t - 1, MB_CUR_MAX);
-        if (m > 0 && wc != c)
-        { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, wc))
-            return soap->error;
-         s = t + m - 1;
-         continue;
-        }
-      }
-#endif
-      if (c & mask)
-      { if (soap_send_raw(soap, s, t - s - 1) || soap_pututf8(soap, (unsigned char)c))
-          return soap->error;
-        s = t;
-      }
-    }
-  }
-  return soap_send_raw(soap, s, t - s - 1);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_string_in(struct soap *soap, int flag, long minlen, long maxlen)
-{ register char *s;
-  char *t = NULL;
-  register size_t i;
-  register long l = 0;
-  register int n = 0;
-  register int m = 0;
-  register soap_wchar c;
-#ifdef HAVE_WCTOMB
-  char buf[MB_LEN_MAX > 8 ? MB_LEN_MAX : 8];
-#else
-  char buf[8];
-#endif
-#ifdef WITH_CDATA
-  if (!flag)
-  { register int state = 0;
-#ifdef WITH_FAST
-    soap->labidx = 0;                  /* use look-aside buffer */
-#else
-    if (soap_new_block(soap))
-      return NULL;
-#endif
-    for (;;)
-    { 
-#ifdef WITH_FAST
-      register size_t k;
-      if (soap_append_lab(soap, NULL, 0))      /* allocate more space in look-aside buffer if necessary */
-        return NULL;
-      s = soap->labbuf + soap->labidx; /* space to populate */
-      k = soap->lablen - soap->labidx; /* number of bytes available */
-      soap->labidx = soap->lablen;     /* claim this space */
-#else
-      register size_t k = SOAP_BLKLEN;
-      if (!(s = (char*)soap_push_block(soap, k)))
-        return NULL;
-#endif
-      for (i = 0; i < k; i++)
-      { if (m > 0)
-        { *s++ = *t++; /* copy multibyte characters */
-         m--;
-          continue;
-        }
-        c = soap_getchar(soap);
-       if ((int)c == EOF)
-          goto end;
-        if (c >= 0x80 && !(soap->mode & SOAP_ENC_LATIN))
-        { soap_unget(soap, c);
-         c = soap_getutf8(soap);
-         if (soap->mode & SOAP_C_UTFSTRING)
-          { if ((c & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP)
-            { c &= 0x7FFFFFFF;
-              t = buf;
-              if (c < 0x0800)
-                *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-              else
-              { if (c < 0x010000)
-                  *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-                else
-                { if (c < 0x200000)
-                    *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-                  else
-                  { if (c < 0x04000000)
-                      *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-                    else
-                    { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-                      *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-                    }
-                    *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-                  }     
-                  *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-                }
-                *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-              }
-              *t++ = (char)(0x80 | (c & 0x3F));
-             m = (int)(t - buf) - 1;
-              t = buf;
-              *s++ = *t++;
-              continue;
-           }
-          }
-        }
-       switch (state)
-        { case 1:
-            if (c == ']')
-             state = 4;
-           *s++ = c;
-           continue;
-         case 2:
-           if (c == '-')
-              state = 6;
-           *s++ = c;
-           continue;
-         case 3:
-           if (c == '?')
-             state = 8;
-           *s++ = c;
-           continue;
-          /* CDATA */
-         case 4:
-           if (c == ']')
-              state = 5;
-           else
-             state = 1;
-           *s++ = c;
-           continue;
-         case 5:
-           if (c == '>')
-             state = 0;
-           else
-             state = 1;
-           *s++ = c;
-           continue;
-          /* comment */
-          case 6:
-            if (c == '-')
-             state = 7;
-           else
-             state = 2;
-           *s++ = c;
-           continue;
-          case 7:
-            if (c == '>')
-             state = 0;
-           else
-             state = 2;
-           *s++ = c;
-           continue;
-          /* PI */
-         case 8:
-            if (c == '>')
-             state = 0;
-           else
-             state = 3;
-           *s++ = c;
-           continue;
-        }
-        switch (c)
-        {
-        case '/':
-          if (n > 0)
-          { c = soap_getchar(soap);
-            if (c == '>')
-              n--;
-            soap_unget(soap, c);
-          }
-          *s++ = '/';
-          break;
-        case '<':
-         c = soap_getchar(soap);
-         if (c == '/')
-         { if (n == 0)
-           { c = SOAP_TT;
-             goto end;
-           }
-           n--;
-         }
-         else if (c == '!')
-         { c = soap_getchar(soap);
-           if (c == '[')
-            { do c = soap_getchar(soap);
-              while ((int)c != EOF && c != '[');
-              if ((int)c == EOF)
-                 goto end;
-             t = (char*)"![CDATA[";
-             m = 8;
-             state = 1;
-           }
-            else if (c == '-')
-           { if ((c = soap_getchar(soap)) == '-')
-               state = 2;
-             t = (char*)"!-";
-             m = 2;
-             soap_unget(soap, c);
-           }
-           else
-           { t = (char*)"!";
-             m = 1;
-             soap_unget(soap, c);
-           }
-           *s++ = '<';
-           break;
-         }
-         else if (c == '?')
-           state = 3;
-         else
-           n++;
-          soap_unget(soap, c);
-          *s++ = '<';
-          break;
-        case '>':
-          *s++ = '>';
-          break;
-        case '"':
-          *s++ = '"';
-          break;
-        default:
-#ifdef HAVE_WCTOMB
-          if (soap->mode & SOAP_C_MBSTRING)
-          { m = wctomb(buf, c & 0x7FFFFFFF);
-            if (m >= 1)
-            { t = buf;
-              *s++ = *t++;
-              m--;
-            }
-            else
-              *s++ = SOAP_UNKNOWN_CHAR;
-          }
-          else
-#endif
-            *s++ = (char)(c & 0xFF);
-        }
-       l++;
-        if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen)
-        { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
-          soap->error = SOAP_LENGTH;
-          return NULL;
-        }
-      }
-    }
-  }
-#endif
-#ifdef WITH_FAST
-  soap->labidx = 0;                    /* use look-aside buffer */
-#else
-  if (soap_new_block(soap))
-    return NULL;
-#endif
-  for (;;)
-  { 
-#ifdef WITH_FAST
-    register size_t k;
-    if (soap_append_lab(soap, NULL, 0))        /* allocate more space in look-aside buffer if necessary */
-      return NULL;
-    s = soap->labbuf + soap->labidx;   /* space to populate */
-    k = soap->lablen - soap->labidx;   /* number of bytes available */
-    soap->labidx = soap->lablen;       /* claim this space */
-#else
-    register size_t k = SOAP_BLKLEN;
-    if (!(s = (char*)soap_push_block(soap, k)))
-      return NULL;
-#endif
-    for (i = 0; i < k; i++)
-    { if (m > 0)
-      { *s++ = *t++;   /* copy multibyte characters */
-        m--;
-        continue;
-      }
-      if (soap->mode & SOAP_C_UTFSTRING)
-      { if (((c = soap_get(soap)) & 0x80000000) && c >= -0x7FFFFF80 && c < SOAP_AP)
-        { c &= 0x7FFFFFFF;
-          t = buf;
-          if (c < 0x0800)
-            *t++ = (char)(0xC0 | ((c >> 6) & 0x1F));
-          else
-          { if (c < 0x010000)
-              *t++ = (char)(0xE0 | ((c >> 12) & 0x0F));
-            else
-            { if (c < 0x200000)
-                *t++ = (char)(0xF0 | ((c >> 18) & 0x07));
-              else
-              { if (c < 0x04000000)
-                  *t++ = (char)(0xF8 | ((c >> 24) & 0x03));
-                else
-                { *t++ = (char)(0xFC | ((c >> 30) & 0x01));
-                  *t++ = (char)(0x80 | ((c >> 24) & 0x3F));
-                }
-                *t++ = (char)(0x80 | ((c >> 18) & 0x3F));
-              }     
-              *t++ = (char)(0x80 | ((c >> 12) & 0x3F));
-            }
-            *t++ = (char)(0x80 | ((c >> 6) & 0x3F));
-          }
-          *t++ = (char)(0x80 | (c & 0x3F));
-         m = (int)(t - buf) - 1;
-          t = buf;
-          *s++ = *t++;
-          continue;
-        }
-      }
-      else
-        c = soap_getutf8(soap);
-      switch (c)
-      {
-      case SOAP_TT:
-        if (n == 0)
-          goto end;
-        n--;
-        *s++ = '<';
-        t = (char*)"/";
-       m = 1;
-        break;
-      case SOAP_LT:
-        n++;
-        *s++ = '<';
-        break;
-      case SOAP_GT:
-        *s++ = '>';
-        break;
-      case SOAP_QT:
-        *s++ = '"';
-        break;
-      case SOAP_AP:
-        *s++ = '\'';
-        break;
-      case '/':
-        if (n > 0)
-        { c = soap_get(soap);
-          if (c == SOAP_GT)
-            n--;
-          soap_unget(soap, c);
-        }
-        *s++ = '/';
-        break;
-      case '<' | 0x80000000:
-        if (flag)
-          *s++ = '<';
-        else
-        { *s++ = '&';
-          t = (char*)"lt;";
-         m = 3;
-        }
-        break;
-      case '>' | 0x80000000:
-        if (flag)
-          *s++ = '>';
-        else
-        { *s++ = '&';
-          t = (char*)"gt;";
-         m = 3;
-        }
-        break;
-      case '"' | 0x80000000:
-        if (flag)
-          *s++ = '"';
-        else
-        { *s++ = '&';
-          t = (char*)"quot;";
-         m = 5;
-        }
-        break;
-      case '\'' | 0x80000000:
-        if (flag)
-          *s++ = '\'';
-        else
-        { *s++ = '&';
-          t = (char*)"apos;";
-         m = 5;
-        }
-        break;
-      default:
-        if ((int)c == EOF)
-          goto end;
-#ifdef HAVE_WCTOMB
-        if (soap->mode & SOAP_C_MBSTRING)
-        { m = wctomb(buf, c & 0x7FFFFFFF);
-          if (m >= 1)
-          { t = buf;
-            *s++ = *t++;
-            m--;
-          }
-          else
-            *s++ = SOAP_UNKNOWN_CHAR;
-        }
-        else
-#endif
-          *s++ = (char)(c & 0xFF);
-      }
-      l++;
-      if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen)
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
-        soap->error = SOAP_LENGTH;
-        return NULL;
-      }
-    }
-  }
-end:
-  soap_unget(soap, c);
-  *s = '\0';
-#ifdef WITH_FAST
-  t = soap_strdup(soap, soap->labbuf);
-#else
-  soap_size_block(soap, i+1);
-  t = soap_save_block(soap, NULL, 0);
-#endif
-  if ((soap->mode & SOAP_XML_STRICT) && l < minlen)
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen));
-    soap->error = SOAP_LENGTH;
-    return NULL;
-  }
-  if (flag == 2)
-    if (soap_s2QName(soap, t, &t))
-      return NULL;
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_wstring_out(struct soap *soap, const wchar_t *s, int flag)
-{ const char *t;
-  char tmp;
-  register soap_wchar c;
-#ifdef WITH_DOM
-  if ((soap->mode & SOAP_XML_DOM) && soap->dom)
-  { soap->dom->wide = NULL; /* soap_malloc() ??? */
-    return SOAP_OK;
-  }
-#endif
-  while ((c = *s++))
-  { switch (c)
-    { 
-    case 9:
-      if (flag)
-        t = "&#x9;";
-      else
-        t = "\t";
-      break;
-    case 10:
-      if (flag || !(soap->mode & SOAP_XML_CANONICAL))
-        t = "&#xA;";
-      else
-        t = "\n";
-      break;
-    case 13:
-      t = "&#xD;";
-      break;
-    case '&':
-      t = "&amp;";
-      break;
-    case '<':
-      t = "&lt;";
-      break;
-    case '>':
-      if (flag)
-        t = ">";
-      else
-       t = "&gt;";
-      break;
-    case '"':
-      if (flag)
-        t = "&quot;";
-      else
-        t = "\"";
-      break;
-    default:
-      if (c > 0 && c < 0x80)
-      { tmp = (char)c;
-        if (soap_send_raw(soap, &tmp, 1))
-          return soap->error;
-      }
-      else if (soap_pututf8(soap, (unsigned long)c))
-        return soap->error;
-      continue;
-    }
-    if (soap_send(soap, t))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t *
-SOAP_FMAC2
-soap_wstring_in(struct soap *soap, int flag, long minlen, long maxlen)
-{ wchar_t *s;
-  register int i, n = 0;
-  register long l = 0;
-  register soap_wchar c;
-  const char *t = NULL;
-  if (soap_new_block(soap))
-    return NULL;
-  for (;;)
-  { if (!(s = (wchar_t*)soap_push_block(soap, sizeof(wchar_t)*SOAP_BLKLEN)))
-      return NULL;
-    for (i = 0; i < SOAP_BLKLEN; i++)
-    { if (t)
-      { *s++ = (wchar_t)*t++;
-        if (!*t)
-          t = NULL;
-        continue;
-      }
-      c = soap_getutf8(soap);
-      switch (c)
-      {
-      case SOAP_TT:
-        if (n == 0)
-          goto end;
-        n--;
-        *s++ = '<';
-        soap_unget(soap, '/');
-        break;
-      case SOAP_LT:
-        n++;
-        *s++ = '<';
-        break;
-      case SOAP_GT:
-        *s++ = '>';
-        break;
-      case SOAP_QT:
-        *s++ = '"';
-        break;
-      case SOAP_AP:
-        *s++ = '\'';
-        break;
-      case '/':
-        if (n > 0)
-        { c = soap_getutf8(soap);
-          if (c == SOAP_GT)
-            n--;
-          soap_unget(soap, c);
-        }
-        *s++ = '/';
-        break;
-      case '<':
-        if (flag)
-          *s++ = (soap_wchar)'<';
-        else
-        { *s++ = (soap_wchar)'&';
-          t = "lt;";
-        }
-        break;
-      case '>':
-        if (flag)
-          *s++ = (soap_wchar)'>';
-        else
-        { *s++ = (soap_wchar)'&';
-          t = "gt;";
-        }
-        break;
-      case '"':
-        if (flag)
-          *s++ = (soap_wchar)'"';
-        else
-        { *s++ = (soap_wchar)'&';
-          t = "quot;";
-        }
-        break;
-      default:
-        if ((int)c == EOF)
-          goto end;
-        *s++ = (wchar_t)c & 0x7FFFFFFF;
-      }
-      l++;
-      if ((soap->mode & SOAP_XML_STRICT) && maxlen >= 0 && l > maxlen)
-      { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too long: maxlen=%ld\n", maxlen));
-        soap->error = SOAP_LENGTH;
-        return NULL;
-      }
-    }
-  }
-end:
-  soap_unget(soap, c);
-  *s = '\0';
-  soap_size_block(soap, sizeof(wchar_t) * (i + 1));
-  if ((soap->mode & SOAP_XML_STRICT) && l < minlen)
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "String too short: %ld chars, minlen=%ld\n", l, minlen));
-    soap->error = SOAP_LENGTH;
-    return NULL;
-  }
-  return (wchar_t*)soap_save_block(soap, NULL, 0);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_int2s(struct soap *soap, int n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outint(struct soap *soap, const char *tag, int id, const int *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2int(struct soap *soap, const char *s, int *p)
-{ if (s)
-  { char *r;
-    *p = (int)soap_strtol(s, &r, 10);
-    if (*r)
-      soap->error = SOAP_TYPE;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int *
-SOAP_FMAC2
-soap_inint(struct soap *soap, const char *tag, int *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (int*)soap_id_enter(soap, soap->id, p, t, sizeof(int), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2int(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (int*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(int), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_long2s(struct soap *soap, long n)
-{ sprintf(soap->tmpbuf, "%ld", n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outlong(struct soap *soap, const char *tag, int id, const long *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2long(struct soap *soap, const char *s, long *p)
-{ if (s)
-  { char *r;
-    *p = soap_strtol(s, &r, 10);
-    if (*r)
-      soap->error = SOAP_TYPE;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-long *
-SOAP_FMAC2
-soap_inlong(struct soap *soap, const char *tag, long *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (long*)soap_id_enter(soap, soap->id, p, t, sizeof(long), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2long(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (long*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(long), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_LONG642s(struct soap *soap, LONG64 n)
-{ sprintf(soap->tmpbuf, SOAP_LONG_FORMAT, n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outLONG64(struct soap *soap, const char *tag, int id, const LONG64 *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_LONG642s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2LONG64(struct soap *soap, const char *s, LONG64 *p)
-{ if (s && sscanf(s, SOAP_LONG_FORMAT, p) != 1)
-    soap->error = SOAP_TYPE;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-LONG64 *
-SOAP_FMAC2
-soap_inLONG64(struct soap *soap, const char *tag, LONG64 *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":integer")
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":negativeInteger")
-   && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":long")
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (LONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(LONG64), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2LONG64(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (LONG64*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(LONG64), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_byte2s(struct soap *soap, char n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outbyte(struct soap *soap, const char *tag, int id, const char *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2byte(struct soap *soap, const char *s, char *p)
-{ if (s)
-  { long n;
-    char *r;
-    n = soap_strtol(s, &r, 10);
-    if (*r || n < -128 || n > 127)
-      soap->error = SOAP_TYPE;
-    *p = (char)n;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_inbyte(struct soap *soap, const char *tag, char *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (char*)soap_id_enter(soap, soap->id, p, t, sizeof(char), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2byte(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (char*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(char), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_short2s(struct soap *soap, short n)
-{ return soap_long2s(soap, (long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outshort(struct soap *soap, const char *tag, int id, const short *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_long2s(soap, (long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2short(struct soap *soap, const char *s, short *p)
-{ if (s)
-  { long n;
-    char *r;
-    n = soap_strtol(s, &r, 10);
-    if (*r || n < -32768 || n > 32767)
-      soap->error = SOAP_TYPE;
-    *p = (short)n;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-short *
-SOAP_FMAC2
-soap_inshort(struct soap *soap, const char *tag, short *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (short*)soap_id_enter(soap, soap->id, p, t, sizeof(short), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2short(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (short*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(short), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_float2s(struct soap *soap, float n)
-{ const char *s;
-  if (soap_isnan((double)n))
-    s = "NaN";
-  else if (soap_ispinff(n))
-    s = "INF";
-  else if (soap_isninff(n))
-    s = "-INF";
-  else
-  { sprintf(soap->tmpbuf, soap->float_format, n);
-    s = soap->tmpbuf;
-  }
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outfloat(struct soap *soap, const char *tag, int id, const float *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_float2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2float(struct soap *soap, const char *s, float *p)
-{ if (s)
-  { if (!soap_tag_cmp(s, "INF"))
-      *p = FLT_PINFTY;
-    else if (!soap_tag_cmp(s, "+INF"))
-      *p = FLT_PINFTY;
-    else if (!soap_tag_cmp(s, "-INF"))
-      *p = FLT_NINFTY;
-    else if (!soap_tag_cmp(s, "NaN"))
-      *p = FLT_NAN;
-    else
-    {
-#ifdef HAVE_STRTOD
-      char *r;
-      *p = (float)strtod(s, &r);
-      if (*r)
-#endif
-#ifdef HAVE_SSCANF
-        if (sscanf(s, soap->float_format, p) != 1)
-          soap->error = SOAP_TYPE;
-#else
-        soap->error = SOAP_TYPE;
-#endif
-    }
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static int soap_isnumeric(struct soap *soap, const char *type)
-{ if (soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":float")
-   && soap_match_tag(soap, soap->type, ":double")
-   && soap_match_tag(soap, soap->type, ":decimal")
-   && soap_match_tag(soap, soap->type, ":integer")
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":negativeInteger")
-   && soap_match_tag(soap, soap->type, ":nonPositiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":long")
-   && soap_match_tag(soap, soap->type, ":int")
-   && soap_match_tag(soap, soap->type, ":short")
-   && soap_match_tag(soap, soap->type, ":byte")
-   && soap_match_tag(soap, soap->type, ":unsignedLong")
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return SOAP_ERR;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-float *
-SOAP_FMAC2
-soap_infloat(struct soap *soap, const char *tag, float *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type != '\0' && soap_isnumeric(soap, type))
-    return NULL;
-#endif
-  p = (float*)soap_id_enter(soap, soap->id, p, t, sizeof(float), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2float(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (float*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(float), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_double2s(struct soap *soap, double n)
-{ const char *s;
-  if (soap_isnan(n))
-    s = "NaN";
-  else if (soap_ispinfd(n))
-    s = "INF";
-  else if (soap_isninfd(n))
-    s = "-INF";
-  else
-  { sprintf(soap->tmpbuf, soap->double_format, n);
-    s = soap->tmpbuf;
-  }
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outdouble(struct soap *soap, const char *tag, int id, const double *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_double2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2double(struct soap *soap, const char *s, double *p)
-{ if (s)
-  { if (!soap_tag_cmp(s, "INF"))
-      *p = DBL_PINFTY;
-    else if (!soap_tag_cmp(s, "+INF"))
-      *p = DBL_PINFTY;
-    else if (!soap_tag_cmp(s, "-INF"))
-      *p = DBL_NINFTY;
-    else if (!soap_tag_cmp(s, "NaN"))
-      *p = DBL_NAN;
-    else
-    {
-#ifdef HAVE_STRTOD
-      char *r;
-      *p = strtod(s, &r);
-      if (*r)
-#endif
-#ifdef HAVE_SSCANF
-        if (sscanf(s, soap->double_format, p) != 1)
-          soap->error = SOAP_TYPE;
-#else
-        soap->error = SOAP_TYPE;
-#endif
-    }
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-double *
-SOAP_FMAC2
-soap_indouble(struct soap *soap, const char *tag, double *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type != '\0' && soap_isnumeric(soap, type))
-    return NULL;
-#endif
-  p = (double*)soap_id_enter(soap, soap->id, p, t, sizeof(double), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2double(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (double*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(double), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedByte2s(struct soap *soap, unsigned char n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedByte(struct soap *soap, const char *tag, int id, const unsigned char *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedByte(struct soap *soap, const char *s, unsigned char *p)
-{ if (s)
-  { unsigned long n;
-    char *r;
-    n = soap_strtoul(s, &r, 10);
-    if (*r || n > 255)
-      soap->error = SOAP_TYPE;
-    *p = (unsigned char)n;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned char *
-SOAP_FMAC2
-soap_inunsignedByte(struct soap *soap, const char *tag, unsigned char *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (unsigned char*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned char), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2unsignedByte(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (unsigned char*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned char), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedShort2s(struct soap *soap, unsigned short n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedShort(struct soap *soap, const char *tag, int id, const unsigned short *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedShort(struct soap *soap, const char *s, unsigned short *p)
-{ if (s)
-  { unsigned long n;
-    char *r;
-    n = soap_strtoul(s, &r, 10);
-    if (*r || n > 65535)
-      soap->error = SOAP_TYPE;
-    *p = (unsigned short)n;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-unsigned short *
-SOAP_FMAC2
-soap_inunsignedShort(struct soap *soap, const char *tag, unsigned short *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (unsigned short*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned short), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2unsignedShort(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (unsigned short*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned short), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedInt2s(struct soap *soap, unsigned int n)
-{ return soap_unsignedLong2s(soap, (unsigned long)n);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedInt(struct soap *soap, const char *tag, int id, const unsigned int *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, (unsigned long)*p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedInt(struct soap *soap, const char *s, unsigned int *p)
-{ if (s)
-  { char *r;
-    *p = (unsigned int)soap_strtoul(s, &r, 10);
-    if (*r)
-      soap->error = SOAP_TYPE;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned int *
-SOAP_FMAC2
-soap_inunsignedInt(struct soap *soap, const char *tag, unsigned int *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (unsigned int*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned int), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2unsignedInt(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (unsigned int*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned int), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_unsignedLong2s(struct soap *soap, unsigned long n)
-{ sprintf(soap->tmpbuf, "%lu", n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outunsignedLong(struct soap *soap, const char *tag, int id, const unsigned long *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_unsignedLong2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2unsignedLong(struct soap *soap, const char *s, unsigned long *p)
-{ if (s)
-  { char *r;
-    *p = soap_strtoul(s, &r, 10);
-    if (*r)
-      soap->error = SOAP_TYPE;
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-unsigned long *
-SOAP_FMAC2
-soap_inunsignedLong(struct soap *soap, const char *tag, unsigned long *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-#ifndef WITH_LEAN
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-#endif
-  p = (unsigned long*)soap_id_enter(soap, soap->id, p, t, sizeof(unsigned long), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2unsignedLong(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (unsigned long*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(unsigned long), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_ULONG642s(struct soap *soap, ULONG64 n)
-{ sprintf(soap->tmpbuf, SOAP_ULONG_FORMAT, n);
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outULONG64(struct soap *soap, const char *tag, int id, const ULONG64 *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_ULONG642s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2ULONG64(struct soap *soap, const char *s, ULONG64 *p)
-{ if (s && sscanf(s, SOAP_ULONG_FORMAT, p) != 1)
-    soap->error = SOAP_TYPE;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-ULONG64 *
-SOAP_FMAC2
-soap_inULONG64(struct soap *soap, const char *tag, ULONG64 *p, const char *type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":positiveInteger")
-   && soap_match_tag(soap, soap->type, ":nonNegativeInteger")
-   && soap_match_tag(soap, soap->type, ":unsignedLong")
-   && soap_match_tag(soap, soap->type, ":unsignedInt")
-   && soap_match_tag(soap, soap->type, ":unsignedShort")
-   && soap_match_tag(soap, soap->type, ":unsignedByte"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (ULONG64*)soap_id_enter(soap, soap->id, p, t, sizeof(ULONG64), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2ULONG64(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (ULONG64*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(ULONG64), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2string(struct soap *soap, const char *s, char **t)
-{ *t = NULL;
-  if (s && !(*t = soap_strdup(soap, s)))
-    soap->error = SOAP_EOM;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2QName(struct soap *soap, const char *s, char **t)
-{ if (s)
-  { struct soap_nlist *np;
-    const char *p;
-    if (!strncmp(s, "xml:", 4))
-    { *t = soap_strdup(soap, s);
-      return SOAP_OK;
-    }
-    np = soap->nlist;
-    p = strchr(s, ':');
-    if (p)
-    { register int n = p - s;
-      while (np && (strncmp(np->id, s, n) || np->id[n]))
-        np = np->next;
-      p++;
-    }
-    else
-    { while (np && *np->id)
-        np = np->next;
-      p = s;
-    }
-    if (np)
-    { if (np->index >= 0 && soap->local_namespaces)
-      { register const char *q = soap->local_namespaces[np->index].id;
-        if (q)
-        { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(q) + 2)))
-            sprintf(*t, "%s:%s", q, p);
-          return SOAP_OK;
-        }
-      }
-      if (np->ns)
-      { if ((*t = (char*)soap_malloc(soap, strlen(p) + strlen(np->ns) + 4)))
-          sprintf(*t, "\"%s\":%s", np->ns, p);
-        return SOAP_OK;
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined (index=%d, URI=%s)\n", s, np->index, np->ns?np->ns:""));
-      return soap->error = SOAP_NAMESPACE; 
-    }
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Namespace prefix of '%s' not defined, assuming empty namespace\n", s));
-    if ((*t = (char*)soap_malloc(soap, strlen(p) + 4)))
-      sprintf(*t, "\"\":%s", p);
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_QName2s(struct soap *soap, const char *s)
-{ struct Namespace *p;
-  char *t;
-  int n;
-  if (!s || *s != '"')
-    return s;
-  s++;
-  if ((p = soap->local_namespaces))
-  { for (; p->id; p++)
-    { if (p->ns)
-        if (!soap_tag_cmp(s, p->ns))
-          break;
-      if (p->in)
-        if (!soap_tag_cmp(s, p->in))
-          break;
-    }
-    if (p && p->id)
-    { s = strchr(s, '"');
-      if (s)
-      { t = (char*)soap_malloc(soap, strlen(p->id) + strlen(s));
-        strcpy(t, p->id);
-       strcat(t, s + 1);
-        return t;
-      }
-    }
-  }
-  t = (char*)strchr(s, '"');
-  if (t)
-    n = t - s;
-  else
-    n = 0;
-  t = soap_strdup(soap, s);
-  t[n] = '\0';
-  sprintf(soap->tmpbuf, "xmlns:_%lu", soap->idnum++);
-  soap_set_attr(soap, soap->tmpbuf, t);
-  s = strchr(s, '"');
-  if (s)
-  { t = (char*)soap_malloc(soap, strlen(soap->tmpbuf) + strlen(s) - 6);
-    strcpy(t, soap->tmpbuf + 6);
-    strcat(t, s + 1);
-  }
-  return t;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outstring(struct soap *soap, const char *tag, int id, char *const*p, const char *type, int n) 
-{ id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n);
-  if (id < 0
-   || soap_element_begin_out(soap, tag, id, type)
-   || soap_string_out(soap, *p, 0)
-   || soap_element_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char **
-SOAP_FMAC2
-soap_instring(struct soap *soap, const char *tag, char **p, const char *type, int t, int flag, long minlen, long maxlen)
-{ if (soap_element_begin_in(soap, tag, 1))
-    return NULL;
-  if (!p)
-    if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
-      return NULL;
-  if (soap->body)
-  { *p = soap_string_in(soap, flag, minlen, maxlen);
-    if (!*p || !(char*)soap_id_enter(soap, soap->id, *p, t, sizeof(char*), 0, NULL, NULL, NULL))
-      return NULL;
-  }
-  else
-    *p = NULL;
-  p = (char**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(char**), 0);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outwstring(struct soap *soap, const char *tag, int id, wchar_t *const*p, const char *type, int n) 
-{ id = soap_element_id(soap, tag, id, *p, NULL, 0, type, n);
-  if (id < 0
-   || soap_element_begin_out(soap, tag, id, type)
-   || soap_wstring_out(soap, *p, 0)
-   || soap_element_end_out(soap, tag))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t **
-SOAP_FMAC2
-soap_inwstring(struct soap *soap, const char *tag, wchar_t **p, const char *type, int t, long minlen, long maxlen)
-{ if (soap_element_begin_in(soap, tag, 1))
-    return NULL;
-  if (!p)
-    if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
-      return NULL;
-  if (soap->body)
-  { *p = soap_wstring_in(soap, 1, minlen, maxlen);
-    if (!*p || !(wchar_t*)soap_id_enter(soap, soap->id, *p, t, sizeof(wchar_t*), 0, NULL, NULL, NULL))
-      return NULL;
-  }
-  else
-    *p = NULL;
-  p = (wchar_t**)soap_id_lookup(soap, soap->href, (void**)p, t, sizeof(wchar_t**), 0);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static time_t
-soap_timegm(struct tm *T)
-{
-#if defined(HAVE_TIMEGM)
-  return timegm(T);
-#elif defined(HAVE_GETTIMEOFDAY)
-  struct timezone t;
-  struct timeval tv;
-  memset((void*)&t, 0, sizeof(t));
-  gettimeofday(&tv, &t);
-  T->tm_min -= t.tz_minuteswest - (t.tz_dsttime != 0)*60;
-  T->tm_isdst = 0;
-  return mktime(T);
-/* WR[ */
-  /* The following define was added for VxWorks*/
-#elif defined(HAVE_MKTIME)
-  /* FOR VXWORKS:
-  vxWorks does not seem to have any variable representation of time zones, but
-  timezone information can be set in INSTALL_DIR/target/h/private/timeP.h header
-  file, by setting the ZONEBUFFER define.  The ZONEBUFFER define follows this 
-  format:
-    name_of_zone:<(unused)>:time_in_minutes_from_UTC:daylight_start:daylight_end 
-  To calculate local time, the value of time_in_minutes_from_UTC is subtracted
-  from UTC; time_in_minutes_from_UTC must be positive. Daylight information is 
-  expressed as mmddhh (month-day-hour), for example: 
-    UTC::0:040102:100102
-  */
-  return mktime(T);
-/* ]WR */
-#elif defined(HAVE_FTIME)
-  struct timeb t;
-  memset((void*)&t, 0, sizeof(t));
-  t.timezone = 0;
-  t.dstflag = -1;
-  ftime(&t);
-  T->tm_min -= t.timezone - (t.dstflag != 0)*60;
-  T->tm_isdst = 0;
-  return mktime(T);
-#else
-#warning "time_t (de)serialization is not MT safe on this platform"
-  time_t t;
-  char *tz = getenv("TZ");
-  putenv("TZ=UTC");
-  tzset();
-  t = mktime(T);
-  if (tz)
-  { char tmp[16];
-    strcpy(tmp, "TZ=");
-    strncat(tmp, tz, 12);
-    tmp[15] = '\0';
-    putenv(tmp);
-  }
-  else
-    putenv("TZ=");
-  tzset();
-  return t;
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_dateTime2s(struct soap *soap, time_t n)
-{ struct tm T;
-  struct tm *pT = &T;
-#if defined(HAVE_GMTIME_R)
-  if (gmtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PGMTIME_R)
-  if (gmtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-#elif defined(HAVE_PGMTIME)
-  if (gmtime(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-/* ]WR */
-#elif defined(HAVE_GMTIME)
-  if ((pT = gmtime(&n)))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%SZ", pT);
-#elif defined(HAVE_GETTIMEOFDAY)
-  struct timezone tz;
-  memset((void*)&tz, 0, sizeof(tz));
-#if defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { struct timeval tv;
-    gettimeofday(&tv, &tz);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(tz.tz_dsttime!=0), abs(tz.tz_minuteswest)%60);
-  }
-#else
-  if ((pT = localtime(&n)))
-  { struct timeval tv;
-    gettimeofday(&tv, &tz);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -tz.tz_minuteswest/60+(tz.tz_dsttime!=0), abs(tz.tz_minuteswest)%60);
-  }
-#endif
-#elif defined(HAVE_FTIME)
-  struct timeb t;
-  memset((void*)&t, 0, sizeof(t));
-#if defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { ftime(&t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(t.dstflag!=0), abs(t.timezone)%60);
-  }
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PLOCALTIME_R)
-  if (localtime_r(&n, pT))
-  { strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf+strlen(soap->tmpbuf), "%+03d:%02d", t.timezone/60, abs(t.timezone)%60);
-  }
-/* ]WR */
-#else
-  if ((pT = localtime(&n)))
-  { ftime(&t);
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-    sprintf(soap->tmpbuf + strlen(soap->tmpbuf), "%+03d:%02d", -t.timezone/60+(t.dstflag!=0), abs(t.timezone)%60);
-  }
-#endif
-#elif defined(HAVE_LOCALTIME_R)
-  if (localtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-/* WR[ */
-  /* The following defines were added for VxWorks*/
-#elif defined(HAVE_PLOCALTIME_R)
-  if (localtime_r(&n, pT))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-/* ]WR */
-#else
-  if ((pT = localtime(&n)))
-    strftime(soap->tmpbuf, sizeof(soap->tmpbuf), "%Y-%m-%dT%H:%M:%S", pT);
-#endif
-  else
-    strcpy(soap->tmpbuf, "1969-12-31T23:59:59Z");
-  return soap->tmpbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outdateTime(struct soap *soap, const char *tag, int id, const time_t *p, const char *type, int n)
-{ if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
-   || soap_string_out(soap, soap_dateTime2s(soap, *p), 0))
-    return soap->error;
-  return soap_element_end_out(soap, tag);
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_s2dateTime(struct soap *soap, const char *s, time_t *p)
-{ if (s)
-  { struct tm T;
-    char zone[16];
-    memset((void*)&T, 0, sizeof(T));
-    zone[sizeof(zone)-1] = '\0';
-    sscanf(s, "%d-%d-%dT%d:%d:%d%15s", &T.tm_year, &T.tm_mon, &T.tm_mday, &T.tm_hour, &T.tm_min, &T.tm_sec, zone);
-    if (T.tm_year == 1)
-      T.tm_year = 70;
-    else
-      T.tm_year -= 1900;
-    T.tm_mon--;
-    if (*zone)
-    { if (*zone == '.')
-      { for (s = zone + 1; *s; s++)
-          if (*s < '0' || *s > '9')
-            break;
-      }
-      else
-        s = zone;
-      if (*s != 'Z')
-      { int h = 0, m = 0;
-        sscanf(s, "%d:%d", &h, &m);
-        T.tm_hour -= h;
-        if (h >= 0)
-          T.tm_min -= m;
-        else
-          T.tm_min += m;
-      }
-      *p = soap_timegm(&T);
-    }
-    else
-      *p = mktime(&T); /* no time zone: suppose it is localtime? */
-  }
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-time_t *
-SOAP_FMAC2
-soap_indateTime(struct soap *soap, const char *tag, time_t *p, const char * type, int t)
-{ if (soap_element_begin_in(soap, tag, 0))
-    return NULL;
-  if (*soap->type
-   && soap_match_tag(soap, soap->type, type)
-   && soap_match_tag(soap, soap->type, ":dateTime"))
-  { soap->error = SOAP_TYPE;
-    soap_revert(soap);
-    return NULL;
-  }
-  p = (time_t*)soap_id_enter(soap, soap->id, p, t, sizeof(time_t), 0, NULL, NULL, NULL);
-  if (p)
-  { if (soap_s2dateTime(soap, soap_value(soap), p))
-      return NULL;
-  }
-  p = (time_t*)soap_id_forward(soap, soap->href, p, t, 0, sizeof(time_t), 0, NULL);
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outliteral(struct soap *soap, const char *tag, char *const*p)
-{ int i;
-  const char *t = NULL;
-  if (tag && *tag != '-')
-  { if ((t = strchr(tag, ':')))
-    { strncpy(soap->tmpbuf, tag, t-tag);
-      soap->tmpbuf[t-tag] = '\0';
-      for (i = 0; soap->local_namespaces[i].id; i++)
-        if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
-          break;
-      t++;
-      sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
-    }
-    else
-    { t = tag;
-      sprintf(soap->tmpbuf, "<%s>", tag);
-    }
-    if (soap_send(soap, soap->tmpbuf))
-      return soap->error;
-  }
-  if (p && *p)
-  { if (soap_send(soap, *p))
-      return soap->error;
-  }
-  if (t)
-  { sprintf(soap->tmpbuf, "</%s>", t);
-    return soap_send(soap, soap->tmpbuf);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-char **
-SOAP_FMAC2
-soap_inliteral(struct soap *soap, const char *tag, char **p)
-{ if (soap_element_begin_in(soap, tag, 1))
-    return NULL;
-  if (!p)
-    if (!(p = (char**)soap_malloc(soap, sizeof(char*))))
-      return NULL;
-  if (soap->null)
-    *p = NULL;
-  else if (soap->body)
-    *p = soap_string_in(soap, 0, -1, -1);
-  else
-    *p = NULL;
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_outwliteral(struct soap *soap, const char *tag, wchar_t *const*p)
-{ int i;
-  const char *t = NULL;
-  wchar_t c;
-  const wchar_t *s;
-  if (tag && *tag != '-')
-  { if (tag && (t = strchr(tag, ':')))
-    { strncpy(soap->tmpbuf, tag, t-tag);
-      soap->tmpbuf[t-tag] = '\0';
-      for (i = 0; soap->local_namespaces[i].id; i++)
-        if (!strcmp(soap->tmpbuf, soap->local_namespaces[i].id))
-          break;
-      t++;
-      sprintf(soap->tmpbuf, "<%s xmlns=\"%s\">", t, soap->local_namespaces[i].ns ? soap->local_namespaces[i].ns : SOAP_STR_EOS);
-    }
-    else
-    { t = tag;
-      sprintf(soap->tmpbuf, "<%s>", tag);
-    }
-    if (soap_send(soap, soap->tmpbuf))
-      return soap->error;
-  }
-  if (p)
-  { s = *p;
-    while ((c = *s++))
-      if (soap_pututf8(soap, (unsigned char)c))
-        return soap->error;
-  }
-  if (t)
-  { sprintf(soap->tmpbuf, "</%s>", t);
-    return soap_send(soap, soap->tmpbuf);
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-wchar_t **
-SOAP_FMAC2
-soap_inwliteral(struct soap *soap, const char *tag, wchar_t **p)
-{ if (soap_element_begin_in(soap, tag, 1))
-    return NULL;
-  if (!p)
-    if (!(p = (wchar_t**)soap_malloc(soap, sizeof(wchar_t*))))
-      return NULL;
-  if (soap->null)
-    *p = NULL;
-  else if (soap->body)
-    *p = soap_wstring_in(soap, 0, -1, -1);
-  else
-    *p = NULL;
-  if (soap->body && soap_element_end_in(soap, tag))
-    return NULL;
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-const char *
-SOAP_FMAC2
-soap_value(struct soap *soap)
-{ size_t i;
-  soap_wchar c = 0;
-  char *s = soap->tmpbuf;
-  if (!soap->body)
-    return SOAP_STR_EOS;
-  for (i = 0; i < sizeof(soap->tmpbuf) - 1; i++)
-  { c = soap_get(soap);
-    if (c == SOAP_TT || (int)c == EOF || soap_blank(c))
-      break;
-    *s++ = (char)c;
-  }
-  if ((int)c == EOF || c == SOAP_TT)
-    soap_unget(soap, c);
-  *s = '\0';
-  return soap->tmpbuf; /* return non-null pointer */
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getline(struct soap *soap, char *s, int len)
-{ int i = len;
-  soap_wchar c = 0;
-  for (;;)
-  { while (--i > 0)
-    { c = soap_getchar(soap);
-      if (c == '\r')
-        break;
-      if ((int)c == EOF)
-        return soap->error = SOAP_EOF;
-      *s++ = (char)c;
-    }
-    c = soap_getchar(soap);
-    if (c == '\n')
-    { *s = '\0';
-      if (i+1 == len) /* empty line: end of HTTP header */
-        break;
-      c = soap_unget(soap, soap_getchar(soap));
-      if (c != ' ' && c != '\t') /* HTTP line continuation? */
-        break;
-    }
-    else if ((int)c == EOF)
-      return soap->error = SOAP_EOF;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static size_t
-soap_count_attachments(struct soap *soap)
-{ 
-#ifndef WITH_LEANER
-  register struct soap_multipart *content;
-  register size_t count = soap->count;
-  if (soap->mode & SOAP_ENC_DIME)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of DIME attachments\n"));
-    for (content = soap->dime.first; content; content = content->next)
-    { count += 12 + ((content->size+3)&(~3));
-      if (content->id)
-        count += ((strlen(content->id)+3)&(~3));
-      if (content->type)
-        count += ((strlen(content->type)+3)&(~3));
-      if (content->options)
-        count += ((((unsigned char)content->options[2] << 8) | ((unsigned char)content->options[3]))+7)&(~3);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of DIME attachment %lu bytes\n", (unsigned long)content->size));
-    }
-  }
-  if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary)
-  { register size_t n = strlen(soap->mime.boundary);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Calculating the size of MIME attachments\n"));
-    for (content = soap->mime.first; content; content = content->next)
-    { register const char *s;
-      /* count \r\n--boundary\r\n */
-      count += 6 + n;
-      /* count Content-Type: ...\r\n */
-      if (content->type)
-        count += 16 + strlen(content->type);
-      s = soap_str_code(mime_codes, content->encoding);
-      /* count Content-Transfer-Encoding: ...\r\n */
-      if (s)
-        count += 29 + strlen(s);
-      /* count Content-ID: ...\r\n */
-      if (content->id)
-        count += 14 + strlen(content->id);
-      /* count Content-Location: ...\r\n */
-      if (content->location)
-        count += 20 + strlen(content->location);
-      /* count Content-Description: ...\r\n */
-      if (content->description)
-        count += 23 + strlen(content->location);
-      /* count \r\n...content */
-      count += 2 + content->size;
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Size of MIME attachment %lu bytes\n", (unsigned long)content->size));
-    }
-    /* count \r\n--boundary--\r\n */
-    count += 8 + n;
-  }
-  return count;
-#else
-  return soap->count;
-#endif
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static int
-soap_putdimefield(struct soap *soap, const char *s, size_t n)
-{ if (soap_send_raw(soap, s, n))
-    return soap->error;
-  return soap_send_raw(soap, SOAP_STR_PADDING, -(long)n&3);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_dime_option(struct soap *soap, unsigned short optype, const char *option)
-{ size_t n;
-  char *s = NULL;
-  if (option)
-  { n = strlen(option);
-    s = (char*)soap_malloc(soap, n + 5);
-    if (s)
-    { s[0] = optype >> 8;
-      s[1] = optype & 0xFF;
-      s[2] = n >> 8;
-      s[3] = n & 0xFF;
-      strcpy(s + 4, option);
-    }
-  }
-  return s;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putdimehdr(struct soap *soap)
-{ unsigned char tmp[12];
-  size_t optlen = 0, idlen = 0, typelen = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Put DIME header id='%s'\n", soap->dime.id?soap->dime.id:""));
-  if (soap->dime.options)
-    optlen = (((unsigned char)soap->dime.options[2] << 8) | ((unsigned char)soap->dime.options[3])) + 4;
-  if (soap->dime.id)
-    idlen = strlen(soap->dime.id);
-  if (soap->dime.type)
-    typelen = strlen(soap->dime.type);
-  tmp[0] = SOAP_DIME_VERSION | (soap->dime.flags & 0x7);
-  tmp[1] = soap->dime.flags & 0xF0;
-  tmp[2] = optlen >> 8;
-  tmp[3] = optlen & 0xFF;
-  tmp[4] = idlen >> 8;
-  tmp[5] = idlen & 0xFF;
-  tmp[6] = typelen >> 8;
-  tmp[7] = typelen & 0xFF;
-  tmp[8] = soap->dime.size >> 24;
-  tmp[9] = (soap->dime.size >> 16) & 0xFF;
-  tmp[10] = (soap->dime.size >> 8) & 0xFF;
-  tmp[11] = soap->dime.size & 0xFF;
-  if (soap_send_raw(soap, (char*)tmp, 12)
-   || soap_putdimefield(soap, soap->dime.options, optlen)
-   || soap_putdimefield(soap, soap->dime.id, idlen)
-   || soap_putdimefield(soap, soap->dime.type, typelen))
-    return soap->error;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putdime(struct soap *soap)
-{ struct soap_multipart *content;
-  if (!(soap->mode & SOAP_ENC_DIME))
-    return SOAP_OK;
-  for (content = soap->dime.first; content; content = content->next)
-  { void *handle;
-    soap->dime.size = content->size;
-    soap->dime.id = content->id;
-    soap->dime.type = content->type;
-    soap->dime.options = content->options;
-    soap->dime.flags = SOAP_DIME_VERSION | SOAP_DIME_MEDIA;
-    if (soap->fdimereadopen && ((handle = soap->fdimereadopen(soap, (void*)content->ptr, content->id, content->type, content->options)) || soap->error))
-    { size_t size = content->size;
-      if (!handle)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadopen failed\n"));
-        return soap->error;
-      }
-      if (!content->size && ((soap->mode & SOAP_ENC_XML) || (soap->mode & SOAP_IO) == SOAP_IO_CHUNK || (soap->mode & SOAP_IO) == SOAP_IO_STORE))
-      { size_t chunksize = sizeof(soap->tmpbuf);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked streaming DIME\n"));
-        do 
-        { size = soap->fdimeread(soap, handle, soap->tmpbuf, chunksize);
-          DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread returned %lu bytes\n", (unsigned long)size));
-          if (size < chunksize)
-         { soap->dime.flags &= ~SOAP_DIME_CF;
-            if (!content->next)
-              soap->dime.flags |= SOAP_DIME_ME;
-         }
-          else
-            soap->dime.flags |= SOAP_DIME_CF;
-         soap->dime.size = size;
-          if (soap_putdimehdr(soap)
-          || soap_putdimefield(soap, soap->tmpbuf, size))
-            break;
-          if (soap->dime.id)
-         { soap->dime.flags &= ~(SOAP_DIME_MB | SOAP_DIME_MEDIA);
-            soap->dime.id = NULL;
-            soap->dime.type = NULL;
-            soap->dime.options = NULL;
-          }  
-        } while (size >= chunksize);
-      }
-      else
-      { if (!content->next)
-          soap->dime.flags |= SOAP_DIME_ME;
-        if (soap_putdimehdr(soap))
-          return soap->error;
-        do
-        { size_t bufsize;
-         if (size < sizeof(soap->tmpbuf))
-            bufsize = size;
-          else
-            bufsize = sizeof(soap->tmpbuf);
-          if (!(bufsize = soap->fdimeread(soap, handle, soap->tmpbuf, bufsize)))
-          { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimeread failed: insufficient data (%lu bytes remaining from %lu bytes)\n", (unsigned long)size, (unsigned long)soap->dime.size));
-            soap->error = SOAP_EOF;
-           break;
-          }
-          if (soap_send_raw(soap, soap->tmpbuf, bufsize))
-            break;
-          size -= bufsize;
-        } while (size);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
-        soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3);
-      }
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "fdimereadclose\n"));
-      if (soap->fdimereadclose)
-        soap->fdimereadclose(soap, handle);
-    }
-    else
-    { if (!content->next)
-        soap->dime.flags |= SOAP_DIME_ME;
-      if (soap_putdimehdr(soap)
-       || soap_putdimefield(soap, (char*)content->ptr, content->size))
-        return soap->error;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static char *
-soap_getdimefield(struct soap *soap, size_t n)
-{ register soap_wchar c;
-  register int i;
-  register char *s;
-  char *p = NULL;
-  if (n)
-  { p = (char*)soap_malloc(soap, n + 1);
-    if (p)
-    { s = p;
-      for (i = n; i > 0; i--)
-      { if ((int)(c = soap_get1(soap)) == EOF)
-        { soap->error = SOAP_EOF;
-          return NULL;
-        }
-        *s++ = (char)c;
-      }
-      *s = '\0';
-      if ((soap->error = soap_move(soap, -(long)n&3)))
-        return NULL;
-    }
-    else
-      soap->error = SOAP_EOM;
-  }
-  return p;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getdimehdr(struct soap *soap)
-{ register soap_wchar c;
-  register char *s;
-  register int i;
-  unsigned char tmp[12];
-  size_t optlen, idlen, typelen;
-  if (!(soap->mode & SOAP_ENC_DIME))
-    return soap->error = SOAP_DIME_END;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get DIME header\n"));
-  if (soap->dime.buflen || soap->dime.chunksize)
-  { if (soap_move(soap, (long)(soap->dime.size - soap_tell(soap))))
-      return soap->error = SOAP_EOF;
-    soap_unget(soap, soap_getchar(soap)); /* skip padding and get hdr */
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "... From chunked\n"));
-    return SOAP_OK;
-  }
-  s = (char*)tmp;
-  for (i = 12; i > 0; i--)
-  { if ((int)(c = soap_getchar(soap)) == EOF)
-      return soap->error = SOAP_EOF;
-    *s++ = (char)c;
-  }
-  if ((tmp[0] & 0xF8) != SOAP_DIME_VERSION)
-    return soap->error = SOAP_DIME_MISMATCH;
-  soap->dime.flags = (tmp[0] & 0x7) | (tmp[1] & 0xF0);
-  optlen = (tmp[2] << 8) | tmp[3];
-  idlen = (tmp[4] << 8) | tmp[5];
-  typelen = (tmp[6] << 8) | tmp[7];
-  soap->dime.size = (tmp[8] << 24) | (tmp[9] << 16) | (tmp[10] << 8) | tmp[11];
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME size=%lu flags=0x%X\n", (unsigned long)soap->dime.size, soap->dime.flags));
-  if (!(soap->dime.options = soap_getdimefield(soap, optlen)) && soap->error)
-    return soap->error;
-  if (!(soap->dime.id = soap_getdimefield(soap, idlen)) && soap->error)
-    return soap->error;
-  if (!(soap->dime.type = soap_getdimefield(soap, typelen)) && soap->error)
-    return soap->error;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "DIME id=%s, type=%s, options=%s\n", soap->dime.id?soap->dime.id:"", soap->dime.type?soap->dime.type:"", soap->dime.options?soap->dime.options+4:""));
-  if (soap->dime.flags & SOAP_DIME_ME)
-    soap->mode &= ~SOAP_ENC_DIME;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getdime(struct soap *soap)
-{ struct soap_multipart *content;
-  if (soap_getdimehdr(soap))
-    return soap->error;
-  if (soap->fdimewriteopen && ((soap->dime.ptr = (char*)soap->fdimewriteopen(soap, soap->dime.id, soap->dime.type, soap->dime.options)) || soap->error))
-  { const char *id, *type, *options;
-    size_t size, n;
-    if (!soap->dime.ptr)
-      return soap->error;
-    id = soap->dime.id;
-    type = soap->dime.type;
-    options = soap->dime.options;
-    for (;;)
-    { size = soap->dime.size;
-      for (;;)
-      { n = soap->buflen - soap->bufidx;
-        if (size < n)
-          n = size;
-        if ((soap->error = soap->fdimewrite(soap, (void*)soap->dime.ptr, soap->buf + soap->bufidx, n)))
-          break;
-       size -= n;
-       if (!size)
-       { soap->bufidx += n;
-         break;
-       }
-       if (soap_recv(soap))
-        { soap->error = SOAP_EOF;
-         goto end;
-        }
-      }
-      if (soap_move(soap, -(long)soap->dime.size&3))
-      { soap->error = SOAP_EOF;
-       break;
-      }
-      if (!(soap->dime.flags & SOAP_DIME_CF))
-        break;
-      if (soap_getdimehdr(soap))
-        break;
-    }
-end:
-    if (soap->fdimewriteclose)
-      soap->fdimewriteclose(soap, (void*)soap->dime.ptr);
-    soap->dime.size = 0;
-    soap->dime.id = id;
-    soap->dime.type = type;
-    soap->dime.options = options;
-  }
-  else if (soap->dime.flags & SOAP_DIME_CF)
-  { const char *id, *type, *options;
-    register soap_wchar c;
-    register char *s;
-    register int i;
-    id = soap->dime.id;
-    type = soap->dime.type;
-    options = soap->dime.options;
-    if (soap_new_block(soap))
-      return SOAP_EOM;
-    for (;;)
-    { s = (char*)soap_push_block(soap, soap->dime.size);
-      if (!s)
-        return soap->error = SOAP_EOM;
-      for (i = soap->dime.size; i > 0; i--)
-      { if ((int)(c = soap_get1(soap)) == EOF)
-          return soap->error = SOAP_EOF;
-        *s++ = (char)c;
-      }
-      if (soap_move(soap, -(long)soap->dime.size&3))
-        return soap->error = SOAP_EOF;
-      if (!(soap->dime.flags & SOAP_DIME_CF))
-        break;
-      if (soap_getdimehdr(soap))
-        return soap->error;
-    }
-    soap->dime.size = soap->blist->size++; /* allocate one more for '\0' */
-    if (!(soap->dime.ptr = soap_save_block(soap, NULL, 0)))
-      return soap->error;
-    soap->dime.ptr[soap->dime.size] = '\0'; /* force 0-terminated */
-    soap->dime.id = id;
-    soap->dime.type = type;
-    soap->dime.options = options;
-  }
-  else
-    soap->dime.ptr = soap_getdimefield(soap, soap->dime.size);
-  content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, soap->dime.ptr, soap->dime.size);
-  if (!content)
-    return soap->error = SOAP_EOM;
-  content->id = soap->dime.id;
-  content->type = soap->dime.type;
-  content->options = soap->dime.options;
-  return soap->error;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getmimehdr(struct soap *soap)
-{ struct soap_multipart *content;
-  do
-  { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
-      return soap->error;
-  }
-  while (!*soap->msgbuf);
-  if (soap->msgbuf[0] == '-' && soap->msgbuf[1] == '-')
-  { char *s = soap->msgbuf + strlen(soap->msgbuf) - 1;
-    /* remove white space */
-    while (soap_blank(*s))
-      s--;
-    s[1] = '\0';
-    if (soap->mime.boundary)
-    { if (strcmp(soap->msgbuf + 2, soap->mime.boundary))
-        return soap->error = SOAP_MIME_ERROR;
-    }
-    else
-      soap->mime.boundary = soap_strdup(soap, soap->msgbuf + 2);
-    if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
-      return soap->error;
-  }
-  if (soap_set_mime_attachment(soap, NULL, 0, SOAP_MIME_NONE, NULL, NULL, NULL, NULL))
-    return soap->error = SOAP_EOM;
-  content = soap->mime.last;
-  for (;;)
-  { register char *key = soap->msgbuf;
-    register char *val;
-    if (!*key)
-      break;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "MIME header: %s\n", key));
-    val = strchr(soap->msgbuf, ':');
-    if (val)
-    { *val = '\0';
-      do val++;
-      while (*val && *val <= 32);
-      if (!soap_tag_cmp(key, "Content-ID"))
-        content->id = soap_strdup(soap, val);
-      else if (!soap_tag_cmp(key, "Content-Location"))
-        content->location = soap_strdup(soap, val);
-      else if (!soap_tag_cmp(key, "Content-Type"))
-        content->type = soap_strdup(soap, val);
-      else if (!soap_tag_cmp(key, "Content-Description"))
-        content->description = soap_strdup(soap, val);
-      else if (!soap_tag_cmp(key, "Content-Transfer-Encoding"))
-        content->encoding = (enum soap_mime_encoding)soap_int_code(mime_codes, val, (long)SOAP_MIME_NONE);
-    }
-    if (soap_getline(soap, key, sizeof(soap->msgbuf)))
-      return soap->error;
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getmime(struct soap *soap)
-{ register soap_wchar c;
-  if (!soap->mime.last)
-    return SOAP_OK;
-  for (;;)
-  { register size_t i, m = 0;
-    register char *s;
-    struct soap_multipart *content = soap->mime.last;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Parsing MIME content id=%s type=%s\n", content->id?content->id:"", content->type?content->type:""));
-    if (soap_new_block(soap))
-      return soap->error = SOAP_EOM;
-    for (;;)
-    { register char *t = NULL;
-      if (!(s = (char*)soap_push_block(soap, SOAP_BLKLEN)))
-        return soap->error = SOAP_EOM;
-      for (i = 0; i < SOAP_BLKLEN; i++)
-      { if (m > 0)
-        { *s++ = *t++;
-         m--;
-       }
-       else
-        { c = soap_get1(soap);
-         if ((int)c == EOF)
-           return soap->error = SOAP_EOF;
-         if (c == '\r')
-         { t = soap->tmpbuf;
-            strcpy(t, "\n--");
-            strncat(t, soap->mime.boundary, sizeof(soap->tmpbuf)-3);
-            t[sizeof(soap->tmpbuf)-1] = '\0';
-           do c = soap_getchar(soap);
-           while (c == *t++);
-           if ((int)c == EOF)
-             return soap->error = SOAP_EOF;
-           if (!*--t)
-             goto end;
-           *t = (char)c;
-           m = t - soap->tmpbuf + 1;
-           t = soap->tmpbuf;
-           c = '\r';
-         }
-         *s++ = (char)c;
-        }
-      }
-    }
-end:
-    *s = '\0'; /* force 0-terminated */
-    content->size = soap_size_block(soap, i+1)-1;
-    content->ptr = soap_save_block(soap, NULL, 0);
-    if (c == '-' && soap_getchar(soap) == '-')
-      break;
-    while (c != '\r' && (int)c != EOF && soap_blank(c))
-      c = soap_getchar(soap);
-    if (c != '\r' || soap_getchar(soap) != '\n')
-      return soap->error = SOAP_MIME_ERROR;
-    if (soap_getmimehdr(soap))
-      return soap->error;
-  }
-  do c = soap_getchar(soap);
-  while ((int)c != EOF && c != '\r');
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  if (soap_getchar(soap) != '\n')
-    return soap->error = SOAP_MIME_ERROR;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putmimehdr(struct soap *soap, struct soap_multipart *content)
-{ const char *s;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "MIME attachment type=%s\n", content->type?content->type:""));
-  if (soap_send3(soap, "\r\n--", soap->mime.boundary, "\r\n"))
-    return soap->error;
-  if (content->type && soap_send3(soap, "Content-Type: ", content->type, "\r\n"))
-    return soap->error;
-  s = soap_str_code(mime_codes, content->encoding);
-  if (s && soap_send3(soap, "Content-Transfer-Encoding: ", s, "\r\n"))
-    return soap->error;
-  if (content->id && soap_send3(soap, "Content-ID: ", content->id, "\r\n"))
-    return soap->error;
-  if (content->location && soap_send3(soap, "Content-Location: ", content->location, "\r\n"))
-    return soap->error;
-  if (content->description && soap_send3(soap, "Content-Description: ", content->description, "\r\n"))
-    return soap->error;
-  return soap_send_raw(soap, "\r\n", 2);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putmime(struct soap *soap)
-{ struct soap_multipart *content;
-  if (!(soap->mode & SOAP_ENC_MIME) || !soap->mime.boundary)
-    return SOAP_OK;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Sending MIME attachments\n"));
-  for (content = soap->mime.first; content; content = content->next)
-    if (soap_putmimehdr(soap, content)
-     || soap_send_raw(soap, content->ptr, content->size))
-      return soap->error;
-  return soap_send3(soap, "\r\n--", soap->mime.boundary, "--\r\n");
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_dime(struct soap *soap)
-{ soap->omode |= SOAP_ENC_DIME;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_mime(struct soap *soap, const char *boundary, const char *start)
-{ soap->omode |= SOAP_ENC_MIME;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->mime.boundary = soap_strdup(soap, boundary);
-  soap->mime.start = soap_strdup(soap, start);
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_dime(struct soap *soap)
-{ soap->omode &= ~SOAP_ENC_DIME;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_mime(struct soap *soap)
-{ soap->omode &= ~SOAP_ENC_MIME;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->mime.boundary = NULL;
-  soap->mime.start = NULL;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static struct soap_multipart*
-soap_new_multipart(struct soap *soap, struct soap_multipart **first, struct soap_multipart **last, char *ptr, size_t size)
-{ struct soap_multipart *content;
-  content = (struct soap_multipart*)soap_malloc(soap, sizeof(struct soap_multipart));
-  if (content)
-  { content->next = NULL;
-    content->ptr = ptr;
-    content->size = size;
-    content->id = NULL;
-    content->type = NULL;
-    content->options = NULL;
-    content->encoding = SOAP_MIME_NONE;
-    content->location = NULL;
-    content->description = NULL;
-    if (!*first)
-      *first = content;
-    if (*last)
-      (*last)->next = content;
-    *last = content;
-  }
-  return content;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_dime_attachment(struct soap *soap, char *ptr, size_t size, const char *type, const char *id, unsigned short optype, const char *option)
-{ struct soap_multipart *content = soap_new_multipart(soap, &soap->dime.first, &soap->dime.last, ptr, size);
-  if (!content)
-    return SOAP_EOM;
-  content->id = soap_strdup(soap, id);
-  content->type = soap_strdup(soap, type);
-  content->options = soap_dime_option(soap, optype, option);
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_mime_attachment(struct soap *soap, char *ptr, size_t size, enum soap_mime_encoding encoding, const char *type, const char *id, const char *location, const char *description)
-{ struct soap_multipart *content = soap_new_multipart(soap, &soap->mime.first, &soap->mime.last, ptr, size);
-  if (!content)
-    return SOAP_EOM;
-  content->id = soap_strdup(soap, id);
-  content->type = soap_strdup(soap, type);
-  content->encoding = encoding;
-  content->location = soap_strdup(soap, location);
-  content->description = soap_strdup(soap, description);
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-SOAP_FMAC1
-struct soap_multipart*
-SOAP_FMAC2
-soap_next_multipart(struct soap_multipart *content)
-{ if (content)
-    return content->next;
-  return NULL;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static void
-soap_select_mime_boundary(struct soap *soap)
-{ while (!soap->mime.boundary || soap_valid_mime_boundary(soap))
-  { register char *s = soap->mime.boundary;
-    register size_t n = 0;
-    if (s)
-      n = strlen(s);
-    if (n < 16)
-    { n = 72;
-      s = soap->mime.boundary = (char*)soap_malloc(soap, n);
-      if (!s)
-        return;
-    }
-    strcpy(s, "<>");
-    s += 2;
-    n -= 4;
-    while (n)
-    { *s++ = soap_base64o[rand()&0x3F];
-      n--;
-    }
-    *s = '\0';
-    strcat(s, "<>");
-  }
-  if (!soap->mime.start)
-    soap->mime.start = "<SOAP-ENV:Envelope>";
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEANER
-#ifndef PALM_1
-static int
-soap_valid_mime_boundary(struct soap *soap)
-{ register struct soap_multipart *content;
-  register size_t k = strlen(soap->mime.boundary);
-  for (content = soap->mime.first; content; content = content->next)
-  { if (content->ptr && content->size >= k)
-    { register const char *p = (const char*)content->ptr; 
-      register size_t i;
-      for (i = 0; i < content->size - k; i++, p++)
-        if (!strncmp(p, soap->mime.boundary, k))
-          return SOAP_ERR;
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-
-#ifdef WITH_COOKIES
-/******************************************************************************/
-SOAP_FMAC1
-size_t
-SOAP_FMAC2
-soap_encode_cookie(const char *s, char *t, size_t len)
-{ register int c;
-  register size_t n = len;
-  while ((c = *s++) && --n > 0)
-  { if (c > ' ' && c < 128 && c != ';' && c != ',')
-      *t++ = c;
-    else if (n > 2)
-    { *t++ = '%';
-      *t++ = (c >> 4) + (c > 159 ? '7' : '0');
-      c &= 0xF;
-      *t++ = c + (c > 9 ? '7' : '0');
-      n -= 2;
-    }
-    else
-      break;
-  }
-  *t = '\0';
-  return len - n;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  size_t n;
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!path)
-    path = soap->cookie_path;
-  if (*path == '/')
-    path++;
-  n = strlen(path);
-  for (p = soap->cookies; p; p = p->next)
-    if (!strcmp(p->name, name)
-     && domain
-     && p->domain
-     && !strcmp(p->domain, domain)
-     && !strncmp(p->path, path, n))
-      break;
-  return p;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_set_cookie(struct soap *soap, const char *name, const char *value, const char *domain, const char *path)
-{ struct soap_cookie **p, *q;
-  int n;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set cookie: %s=%s domain=%s path=%s\n", name, value?value:"", domain?domain:"", path?path:""));
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!path)
-    path = soap->cookie_path;
-  if (!path)
-  { soap_set_receiver_error(soap, "Cookie path not set", NULL, SOAP_HTTP_ERROR);
-    return NULL;
-  }
-  if (*path == '/')
-    path++;
-  q = soap_cookie(soap, name, domain, path);
-  if (!q)
-  { if ((q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-    { if ((q->name = (char*)SOAP_MALLOC(strlen(name)+1)))
-        strcpy(q->name, name);
-      q->value = NULL;
-      q->domain = NULL;
-      q->path = NULL;
-      q->expire = -1;
-      q->version = 0;
-      q->secure = 0;
-      q->env = 0;
-      q->modified = 0;
-      for (p = &soap->cookies, n = soap->cookie_max; *p && n; p = &(*p)->next, n--)
-        if (!strcmp((*p)->name, name) && (*p)->path && strcmp((*p)->path, path) < 0)
-          break;
-      if (n)
-      { q->next = *p;
-        *p = q;
-      }
-      else
-      { SOAP_FREE(q->name);
-        SOAP_FREE(q);
-        q = NULL;
-      }
-    }
-  }
-  else
-    q->modified = 1;
-  if (q)
-  { if (q->value)
-    { SOAP_FREE(q->value);
-      q->value = NULL;
-    }
-    if (q->domain)
-    { SOAP_FREE(q->domain);
-      q->domain = NULL;
-    }
-    if (q->path)
-    { SOAP_FREE(q->path);
-      q->path = NULL;
-    }
-    if (value && *value && (q->value = (char*)SOAP_MALLOC(strlen(value)+1)))
-      strcpy(q->value, value);
-    if (domain && *domain && (q->domain = (char*)SOAP_MALLOC(strlen(domain)+1)))
-      strcpy(q->domain, domain);
-    if (path && *path && (q->path = (char*)SOAP_MALLOC(strlen(path)+1)))
-      strcpy(q->path, path);
-    q->session = 1;
-  }
-  return q;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_clr_cookie(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie **p, *q;
-  if (!domain)
-    domain = soap->cookie_domain;
-  if (!domain)
-  { soap_set_receiver_error(soap, "Cookie domain not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
-    return;
-  }
-  if (!path)
-    path = soap->cookie_path;
-  if (!path)
-  { soap_set_receiver_error(soap, "Cookie path not set", SOAP_STR_EOS, SOAP_HTTP_ERROR);
-    return;
-  }
-  if (*path == '/')
-    path++;
-  for (p = &soap->cookies, q = *p; q; q = *p)
-    if (!strcmp(q->name, name) && !strcmp(q->domain, domain) && !strncmp(q->path, path, strlen(q->path)))
-    { if (q->value)
-        SOAP_FREE(q->value);
-      if (q->domain)
-        SOAP_FREE(q->domain);
-      if (q->path)
-        SOAP_FREE(q->path);
-      *p = q->next;
-      SOAP_FREE(q);
-    }
-    else
-      p = &q->next;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-char *
-SOAP_FMAC2
-soap_cookie_value(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-    return p->value;
-  return NULL;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-long
-SOAP_FMAC2
-soap_cookie_expire(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-    return p->expire;
-  return -1;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_cookie_expire(struct soap *soap, const char *name, long expire, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->expire = expire;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->session = 1;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_clr_cookie_session(struct soap *soap, const char *name, const char *domain, const char *path)
-{ struct soap_cookie *p;
-  if ((p = soap_cookie(soap, name, domain, path)))
-  { p->session = 0;
-    p->modified = 1;
-    return SOAP_OK;
-  }
-  return SOAP_ERR;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putsetcookies(struct soap *soap)
-{ struct soap_cookie *p;
-  char *s, tmp[4096];
-  const char *t;
-  for (p = soap->cookies; p; p = p->next)
-  { if (p->modified || !p->env)
-    { s = tmp;
-      if (p->name)
-        s += soap_encode_cookie(p->name, s, tmp-s+4064);
-      if (p->value && *p->value)
-      { *s++ = '=';
-        s += soap_encode_cookie(p->value, s, tmp-s+4064);
-      }
-      if (p->domain && (int)strlen(p->domain) < tmp-s+4064)
-        sprintf(s, ";Domain=%s", p->domain);
-      else if (soap->cookie_domain && (int)strlen(soap->cookie_domain) < tmp-s+4064)
-        sprintf(s, ";Domain=%s", soap->cookie_domain);
-      strcat(s, ";Path=/");
-      if (p->path)
-        t = p->path;
-      else
-        t = soap->cookie_path;
-      if (t)
-      { if (*t == '/')
-          t++;
-        if ((int)strlen(t) < tmp-s+4064)
-          strcat(s, t);
-      }
-      s += strlen(s);
-      if (p->version > 0)
-        sprintf(s, ";Version=%u", p->version);
-      if (p->expire >= 0)
-        sprintf(s, ";Max-Age=%ld", p->expire);
-      if (p->secure)
-        strcat(s, ";Secure");
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Set-Cookie: %s\n", tmp));
-      if (soap->fposthdr(soap, "Set-Cookie", tmp))
-        return soap->error;
-    }
-  }
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_putcookies(struct soap *soap, const char *domain, const char *path, int secure)
-{ struct soap_cookie **p, *q;
-  unsigned int version = 0;
-  time_t now = time(NULL);
-  char *s, tmp[4096];
-  p = &soap->cookies;
-  while ((q = *p))
-  { if (q->expire && now > q->expire)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie %s expired\n", q->name));
-      SOAP_FREE(q->name);
-      if (q->value)
-        SOAP_FREE(q->value);
-      if (q->domain)
-        SOAP_FREE(q->domain);
-      if (q->path)
-        SOAP_FREE(q->path);
-      *p = q->next;
-      SOAP_FREE(q);
-    }
-    else if ((!q->domain || !strcmp(q->domain, domain))
-          && (!q->path || !strncmp(q->path, path, strlen(q->path)))
-          && (!q->secure || secure))
-    { s = tmp;
-      if (q->version != version)
-      { sprintf(s, "$Version=%u;", q->version);
-        version = q->version;
-      }
-      if (q->name)
-        s += soap_encode_cookie(q->name, s, tmp-s+4080);
-      if (q->value && *q->value)
-      { *s++ = '=';
-        s += soap_encode_cookie(q->value, s, tmp-s+4080);
-      }
-      if (q->path && (int)strlen(q->path) < tmp-s+4080)
-      { sprintf(s, ";$Path=/%s", q->path);
-        s += strlen(s);
-      }
-      if (q->domain && (int)strlen(q->domain) < tmp-s+4080)
-        sprintf(s, ";$Domain=%s", q->domain);
-      DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Cookie: %s\n", tmp));
-      if (soap->fposthdr(soap, "Cookie", tmp))
-        return soap->error;
-      p = &q->next;
-    }
-    else
-      p = &q->next;
-  }
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_getcookies(struct soap *soap, const char *val)
-{ struct soap_cookie *p = NULL, *q;
-  const char *s;
-  char *t, tmp[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
-  char *domain = NULL;
-  char *path = NULL;
-  unsigned int version = 0;
-  time_t now = time(NULL);
-  if (!val)
-    return;
-  s = val;
-  while (*s)
-  { s = soap_decode_key(tmp, sizeof(tmp), s);
-    if (!soap_tag_cmp(tmp, "$Version"))
-    { if ((s = soap_decode_val(tmp, sizeof(tmp), s)))
-      { if (p)
-          p->version = (int)atol(tmp);
-        else
-          version = (int)atol(tmp);
-      }
-    }
-    else if (!soap_tag_cmp(tmp, "$Path"))
-    { s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(t, tmp);
-      }
-      else
-        t = NULL;
-      if (p)
-      { if (p->path)
-          SOAP_FREE(p->path);
-        p->path = t;
-      }
-      else
-      { if (path)
-          SOAP_FREE(path);
-        path = t;
-      }
-    }
-    else if (!soap_tag_cmp(tmp, "$Domain"))
-    { s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((t = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(t, tmp);
-      }
-      else
-        t = NULL;
-      if (p)
-      { if (p->domain)
-          SOAP_FREE(p->domain);
-       p->domain = t;
-      }
-      else
-      { if (domain)
-          SOAP_FREE(domain);
-        domain = t;
-      }
-    }
-    else if (p && !soap_tag_cmp(tmp, "Path"))
-    { if (p->path)
-        SOAP_FREE(p->path);
-      s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((p->path = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(p->path, tmp);
-      }
-      else
-        p->path = NULL;
-    }
-    else if (p && !soap_tag_cmp(tmp, "Domain"))
-    { if (p->domain)
-        SOAP_FREE(p->domain);
-      s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (*tmp)
-      { if ((p->domain = (char*)SOAP_MALLOC(strlen(tmp)+1)))
-          strcpy(p->domain, tmp);
-      }
-      else
-        p->domain = NULL;
-    }
-    else if (p && !soap_tag_cmp(tmp, "Version"))
-    { s = soap_decode_val(tmp, sizeof(tmp), s);
-      p->version = (unsigned int)atol(tmp);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Max-Age"))
-    { s = soap_decode_val(tmp, sizeof(tmp), s);
-      p->expire = now + atol(tmp);
-    }
-    else if (p && !soap_tag_cmp(tmp, "Expires"))
-    { struct tm T;
-      char a[3]; 
-      static const char mns[] = "anebarprayunulugepctovec";
-      s = soap_decode_val(tmp, sizeof(tmp), s);
-      if (strlen(tmp) > 20)
-      { memset((void*)&T, 0, sizeof(T));
-        a[0] = tmp[4];
-        a[1] = tmp[5];
-        a[2] = '\0';
-        T.tm_mday = (int)atol(a);
-        a[0] = tmp[8];
-        a[1] = tmp[9];
-        T.tm_mon = (strstr(mns, a) - mns) / 2;
-        a[0] = tmp[11];
-        a[1] = tmp[12];
-        T.tm_year = 100 + (int)atol(a);
-        a[0] = tmp[13];
-        a[1] = tmp[14];
-        T.tm_hour = (int)atol(a);
-        a[0] = tmp[16];
-        a[1] = tmp[17];
-        T.tm_min = (int)atol(a);
-        a[0] = tmp[19];
-        a[1] = tmp[20];
-        T.tm_sec = (int)atol(a);
-        p->expire = soap_timegm(&T);
-      }
-    }
-    else if (p && !soap_tag_cmp(tmp, "Secure"))
-      p->secure = 1;
-    else
-    { if (p)
-      { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got environment cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
-        if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
-        { q->version = p->version;
-          q->expire = p->expire;
-          q->secure = p->secure;
-          q->env = 1;
-        }
-        if (p->name)
-          SOAP_FREE(p->name);
-        if (p->value)
-          SOAP_FREE(p->value);
-        if (p->domain)
-          SOAP_FREE(p->domain);
-        if (p->path)
-          SOAP_FREE(p->path);
-        SOAP_FREE(p);
-      }
-      if ((p = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-      { p->name = (char*)SOAP_MALLOC(strlen(tmp)+1);
-        strcpy(p->name, tmp);
-        s = soap_decode_val(tmp, sizeof(tmp), s);
-        if (*tmp)
-        { p->value = (char*)SOAP_MALLOC(strlen(tmp)+1);
-          strcpy(p->value, tmp);
-        }
-        else
-          p->value = NULL;
-        p->domain = domain;
-        p->path = path;
-        p->expire = 0;
-        p->secure = 0;
-        p->version = version;
-      }
-    }
-  }
-  if (p)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Got cookie %s=%s domain=%s path=%s expire=%ld secure=%d\n", p->name, p->value?p->value:"", p->domain?p->domain:"", p->path?p->path:"", p->expire, p->secure));
-    if ((q = soap_set_cookie(soap, p->name, p->value, p->domain, p->path)))
-    { q->version = p->version;
-      q->expire = p->expire;
-      q->secure = p->secure;
-    }
-    if (p->name)
-      SOAP_FREE(p->name);
-    if (p->value)
-      SOAP_FREE(p->value);
-    if (p->domain)
-      SOAP_FREE(p->domain);
-    if (p->path)
-      SOAP_FREE(p->path);
-    SOAP_FREE(p);
-  }
-  if (domain)
-    SOAP_FREE(domain);
-  if (path)
-    SOAP_FREE(path);
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_getenv_cookies(struct soap *soap)
-{ struct soap_cookie *p;
-  const char *s;
-  char key[4096], val[4096]; /* cookie size is up to 4096 bytes [RFC2109] */
-  if (!(s = getenv("HTTP_COOKIE")))
-    return SOAP_ERR;
-  do
-  { s = soap_decode_key(key, sizeof(key), s);
-    s = soap_decode_val(val, sizeof(val), s);
-    p = soap_set_cookie(soap, key, val, NULL, NULL);
-    if (p)
-      p->env = 1;
-  } while (*s);
-  return SOAP_OK;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-struct soap_cookie*
-SOAP_FMAC2
-soap_copy_cookies(struct soap *soap)
-{ struct soap_cookie *p, **q, *r;
-  q = &r;
-  for (p = soap->cookies; p; p = p->next)
-  { if (!(*q = (struct soap_cookie*)SOAP_MALLOC(sizeof(struct soap_cookie))))
-      return r;
-    **q = *p;
-    if (p->name)
-    { if (((*q)->name = (char*)SOAP_MALLOC(strlen(p->name)+1)))
-        strcpy((*q)->name, p->name);
-    }
-    if (p->value)
-    { if (((*q)->value = (char*)SOAP_MALLOC(strlen(p->value)+1)))
-        strcpy((*q)->value, p->value);
-    }
-    if (p->domain)
-    { if (((*q)->domain = (char*)SOAP_MALLOC(strlen(p->domain)+1)))
-        strcpy((*q)->domain, p->domain);
-    }
-    if (p->path)
-    { if (((*q)->path = (char*)SOAP_MALLOC(strlen(p->path)+1)))
-        strcpy((*q)->path, p->path);
-    }
-    q = &(*q)->next;
-  }
-  *q = NULL;
-  return r;
-}
-
-/******************************************************************************/
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_free_cookies(struct soap *soap)
-{ struct soap_cookie *p;
-  for (p = soap->cookies; p; p = soap->cookies)
-  { soap->cookies = p->next;
-    SOAP_FREE(p->name);
-    if (p->value)
-      SOAP_FREE(p->value);
-    if (p->domain)
-      SOAP_FREE(p->domain);
-    if (p->path)
-      SOAP_FREE(p->path);
-    SOAP_FREE(p);
-  }
-}
-
-/******************************************************************************/
-#endif /* WITH_COOKIES */
-
-/******************************************************************************/
-#ifdef WITH_GZIP
-#ifndef PALM_1
-static int
-soap_getgziphdr(struct soap *soap)
-{ int i;
-  soap_wchar c, f = 0;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Get gzip header\n"));
-  for (i = 0; i < 9; i++)
-  { if ((int)(c = soap_get1(soap) == EOF))
-      return soap->error = SOAP_EOF;
-    if (i == 2)
-      f = c;
-  }
-  if (f & 0x04) /* FEXTRA */
-  { for (i = soap_get1(soap) | (soap_get1(soap) << 8); i; i--)
-      if ((int)soap_get1(soap) == EOF)
-        return soap->error = SOAP_EOF;
-  }
-  if (f & 0x08) /* FNAME */
-    do
-      c = soap_get1(soap);
-    while (c && (int)c != EOF);
-  if ((int)c != EOF && (f & 0x10)) /* FCOMMENT */
-    do
-      c = soap_get1(soap);
-    while (c && (int)f != EOF);
-  if ((int)c != EOF && (f & 0x01)) /* FHCRC */
-  { if ((int)(c = soap_get1(soap)) != EOF)
-      c = soap_get1(soap);
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  return SOAP_OK;
-}
-#endif
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_begin_recv(struct soap *soap)
-{ soap_wchar c;
-  soap->error = SOAP_OK;
-  soap_free(soap);
-  soap_set_local_namespaces(soap);
-  soap->version = 0;   /* don't assume we're parsing SOAP content by default */
-  soap_free_iht(soap);
-  if ((soap->imode & SOAP_IO) == SOAP_IO_CHUNK)
-    soap->omode |= SOAP_IO_CHUNK;
-  soap->imode &= ~SOAP_IO;
-  soap->mode = soap->imode;
-  if (!soap->keep_alive)
-  { soap->buflen = 0;
-    soap->bufidx = 0;
-  }
-  if (!(soap->mode & SOAP_IO_KEEPALIVE))
-    soap->keep_alive = 0;
-  soap->ahead = 0;
-  soap->peeked = 0;
-  soap->level = 0;
-  soap->part = SOAP_BEGIN;
-  soap->alloced = 0;
-  soap->count = 0;
-  soap->length = 0;
-  soap->cdata = 0;
-  *soap->endpoint = '\0';
-  soap->userid = NULL;
-  soap->passwd = NULL;
-  soap->action = NULL;
-  soap->authrealm = NULL;
-  soap->dime.chunksize = 0;
-  soap->dime.buflen = 0;
-  soap->dime.list = NULL;
-  soap->dime.first = NULL;
-  soap->dime.last = NULL;
-  soap->mime.list = NULL;
-  soap->mime.first = NULL;
-  soap->mime.last = NULL;
-  soap->mime.boundary = NULL;
-  soap->mime.start = NULL;
-#ifdef WIN32
-#ifndef UNDER_CE
-#ifndef WITH_FASTCGI
-  if (!soap_valid_socket(soap->socket))
-#ifdef __BORLANDC__
-    setmode((SOAP_SOCKET)soap->recvfd, O_BINARY);
-#else
-    _setmode((SOAP_SOCKET)soap->recvfd, _O_BINARY);
-#endif
-#endif
-#endif
-#endif
-#ifdef WITH_ZLIB
-  soap->mode &= ~SOAP_ENC_ZLIB;
-  soap->zlib_in = SOAP_ZLIB_NONE;
-  soap->zlib_out = SOAP_ZLIB_NONE;
-  soap->d_stream.next_in = Z_NULL;
-  soap->d_stream.avail_in = 0;
-  soap->d_stream.next_out = (Byte*)soap->buf;
-  soap->d_stream.avail_out = SOAP_BUFLEN;
-  soap->z_ratio_in = 1.0;
-  if (soap->fprepareinit)
-    soap->fprepareinit(soap);
-#endif
-  c = soap_getchar(soap);
-#ifdef WITH_GZIP
-  if (c == 0x1F)
-  { if (soap_getgziphdr(soap))
-      return soap->error;
-    if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
-      return soap->error = SOAP_ZLIB_ERROR;
-    soap->zlib_state = SOAP_ZLIB_INFLATE;
-    soap->mode |= SOAP_ENC_ZLIB;
-    soap->zlib_in = SOAP_ZLIB_GZIP;
-    soap->z_crc = crc32(0L, NULL, 0);
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
-    memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-    /* should not chunk over plain transport, so why bother to check? */
-    /* if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK) */
-    /*   soap->z_buflen = soap->bufidx; */
-    /* else */
-    soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-    soap->d_stream.avail_in = soap->buflen - soap->bufidx;
-    soap->z_buflen = soap->buflen;
-    soap->buflen = soap->bufidx;
-    c = soap_getchar(soap);
-  }  
-#endif
-  if (c == '-' && soap_get0(soap) == '-')
-    soap->mode |= SOAP_ENC_MIME;
-  else if ((c & 0xFFFC) == (SOAP_DIME_VERSION | SOAP_DIME_MB) && (soap_get0(soap) & 0xFFF0) == 0x20)
-    soap->mode |= SOAP_ENC_DIME;
-  else
-  { while (soap_blank(c))
-      c = soap_getchar(soap);
-  }
-  if ((int)c == EOF)
-    return soap->error = SOAP_EOF;
-  soap_unget(soap, c);
-  if (c != '<' && !(soap->mode & (SOAP_ENC_DIME | SOAP_ENC_ZLIB)))
-  { soap->mode &= ~SOAP_IO;
-    if ((soap->error = soap->fparse(soap)))
-    { soap->keep_alive = 0; /* force close later */
-      return soap->error;
-    }
-    if ((soap->mode & SOAP_IO) == SOAP_IO_CHUNK)
-    { soap->chunkbuflen = soap->buflen;
-      soap->buflen = soap->bufidx;
-      soap->chunksize = 0;
-    }
-    else if (soap->fpreparerecv && soap->buflen != soap->bufidx)
-      soap->fpreparerecv(soap, soap->buf + soap->bufidx, soap->buflen - soap->bufidx);
-#ifdef WITH_ZLIB
-    if (soap->zlib_in)
-    { /* fparse should not use soap_unget to push back last char */
-#ifdef WITH_GZIP
-      c = soap_get1(soap);
-      if (c == 0x1F)
-      { if (soap_getgziphdr(soap))
-          return soap->error;
-        if (inflateInit2(&soap->d_stream, -MAX_WBITS) != Z_OK)
-          return soap->error = SOAP_ZLIB_ERROR;
-        soap->zlib_state = SOAP_ZLIB_INFLATE;
-        soap->z_crc = crc32(0L, NULL, 0);
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "gzip initialized\n"));
-      }
-      else
-      { soap_revget1(soap);
-#else
-      {
-#endif
-        if (inflateInit(&soap->d_stream) != Z_OK)
-          return soap->error = SOAP_ZLIB_ERROR;
-        soap->zlib_state = SOAP_ZLIB_INFLATE;
-        DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Inflate initialized\n"));
-      }
-      soap->mode |= SOAP_ENC_ZLIB;
-      memcpy(soap->z_buf, soap->buf, SOAP_BUFLEN);
-      soap->d_stream.next_in = (Byte*)(soap->z_buf + soap->bufidx);
-      soap->d_stream.avail_in = soap->buflen - soap->bufidx;
-      soap->z_buflen = soap->buflen;
-      soap->buflen = soap->bufidx;
-    }
-#endif
-  }
-#ifndef WITH_LEANER
-  if (soap->mode & SOAP_ENC_MIME)
-  { if (soap_getmimehdr(soap))
-      return soap->error;
-    if (soap_get_header_attribute(soap, soap->mime.first->type, "application/dime"))
-      soap->mode |= SOAP_ENC_DIME;
-  }
-  if (soap->mode & SOAP_ENC_DIME)
-  { if (soap_getdimehdr(soap))
-      return soap->error;
-    if (soap->dime.flags & SOAP_DIME_CF)
-    { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Chunked DIME SOAP message\n"));
-      soap->dime.chunksize = soap->dime.size;
-      if (soap->buflen - soap->bufidx >= soap->dime.chunksize)
-      { soap->dime.buflen = soap->buflen;
-        soap->buflen = soap->bufidx + soap->dime.chunksize;
-      }
-      else
-        soap->dime.chunksize -= soap->buflen - soap->bufidx;
-    }
-    soap->count = soap->buflen - soap->bufidx;
-  }
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_parse(struct soap *soap)
-{ char header[SOAP_HDRLEN], *s;
-  unsigned short g = 0, k;
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Waiting for response...\n"));
-  *soap->endpoint = '\0';
-  soap->length = 0;
-  do
-  { if (soap_getline(soap, soap->msgbuf, sizeof(soap->msgbuf)))
-      return soap->error;
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP status: %s\n", soap->msgbuf));
-    for (;;)
-    { if (soap_getline(soap, header, SOAP_HDRLEN))
-        return soap->error;
-      if (!*header)
-        break;
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "HTTP header: %s\n", header));
-      s = strchr(header, ':');
-      if (s)
-      { *s = '\0';
-        do s++;
-        while (*s && *s <= 32);
-        if ((soap->error = soap->fparsehdr(soap, header, s)))
-          return soap->error;
-      }
-    }
-    if ((s = strchr(soap->msgbuf, ' ')))
-      k = (unsigned short)soap_strtoul(s, NULL, 10);
-    else
-      k = 0;
-  } while (k == 100);
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Finished HTTP header parsing\n"));
-  s = strstr(soap->msgbuf, "HTTP/");
-  if (s && s[7] != '1')
-  { if (soap->keep_alive == 1)
-      soap->keep_alive = 0;
-    if (k == 0 && (soap->omode & SOAP_IO) == SOAP_IO_CHUNK) /* k == 0 for HTTP request */
-    { soap->imode |= SOAP_IO_CHUNK;
-      soap->omode = (soap->omode & ~SOAP_IO) | SOAP_IO_STORE;
-    }
-  }
-  if (soap->keep_alive < 0)
-    soap->keep_alive = 1;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Keep alive connection = %d\n", soap->keep_alive));
-  if (s && (((g = !strncmp(soap->msgbuf, "GET ", 4))) || !strncmp(soap->msgbuf, "POST ", 5)))
-  { size_t m = strlen(soap->endpoint);
-    size_t n = m + (s - soap->msgbuf) - 5 - (!g);
-    if (n >= sizeof(soap->endpoint))
-      n = sizeof(soap->endpoint) - 1;
-    strncpy(soap->path, soap->msgbuf + 4 + (!g), n - m);
-    soap->path[n - m] = '\0';
-    strcat(soap->endpoint, soap->path);
-    DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Target endpoint='%s'\n", soap->endpoint));
-    if (g)
-    { soap->error = soap->fget(soap);
-      if (soap->error == SOAP_OK)
-        soap->error = SOAP_STOP; /* prevents further processing */
-      return soap->error;
-    }
-    return SOAP_OK;
-  }
-  if (k == 0 || (k >= 200 && k <= 299) || k == 400 || k == 500)
-    return SOAP_OK;
-  return soap_set_receiver_error(soap, "HTTP error", soap->msgbuf, k);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_parse_header(struct soap *soap, const char *key, const char *val)
-{ if (!soap_tag_cmp(key, "Host"))
-  { 
-#ifdef WITH_OPENSSL
-    if (soap->imode & SOAP_ENC_SSL)
-      strcpy(soap->endpoint, "https://");
-    else
-#endif
-      strcpy(soap->endpoint, "http://");
-    strncat(soap->endpoint, val, sizeof(soap->endpoint) - 8);
-    soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
-  }
-#ifndef WITH_LEANER
-  else if (!soap_tag_cmp(key, "Content-Type"))
-  { if (soap_get_header_attribute(soap, val, "application/dime"))
-      soap->mode |= SOAP_ENC_DIME;
-    else if (soap_get_header_attribute(soap, val, "multipart/related"))
-    { soap->mime.boundary = soap_strdup(soap, soap_get_header_attribute(soap, val, "boundary"));
-      soap->mime.start = soap_strdup(soap, soap_get_header_attribute(soap, val, "start"));
-      soap->mode |= SOAP_ENC_MIME;
-    }
-  }
-#endif
-  else if (!soap_tag_cmp(key, "Content-Length"))
-    soap->length = soap_strtoul(val, NULL, 10);
-  else if (!soap_tag_cmp(key, "Content-Encoding"))
-  { if (!soap_tag_cmp(val, "deflate"))
-#ifdef WITH_ZLIB
-      soap->zlib_in = SOAP_ZLIB_DEFLATE;
-#else
-      return SOAP_ZLIB_ERROR;
-#endif
-    else if (!soap_tag_cmp(val, "gzip"))
-#ifdef WITH_GZIP
-      soap->zlib_in = SOAP_ZLIB_GZIP;
-#else
-      return SOAP_ZLIB_ERROR;
-#endif
-  }
-#ifdef WITH_ZLIB
-  else if (!soap_tag_cmp(key, "Accept-Encoding"))
-  {
-#ifdef WITH_GZIP
-    if (strchr(val, '*') || soap_get_header_attribute(soap, val, "gzip"))
-      soap->zlib_out = SOAP_ZLIB_GZIP;
-    else
-#endif
-    if (strchr(val, '*') || soap_get_header_attribute(soap, val, "deflate"))
-      soap->zlib_out = SOAP_ZLIB_DEFLATE;
-    else
-      soap->zlib_out = SOAP_ZLIB_NONE;
-  }
-#endif
-  else if (!soap_tag_cmp(key, "Transfer-Encoding"))
-  { soap->mode &= ~SOAP_IO;
-    if (!soap_tag_cmp(val, "chunked"))
-      soap->mode |= SOAP_IO_CHUNK;
-  }
-  else if (!soap_tag_cmp(key, "Connection"))
-  { if (!soap_tag_cmp(val, "keep-alive"))
-      soap->keep_alive = -soap->keep_alive;
-    else if (!soap_tag_cmp(val, "close"))
-      soap->keep_alive = 0;
-  }
-#ifndef WITH_LEAN
-  else if (!soap_tag_cmp(key, "Authorization"))
-  { if (!soap_tag_cmp(val, "Basic *"))
-    { size_t n;
-      char *s;
-      soap_base642s(soap, val + 6, soap->tmpbuf, sizeof(soap->tmpbuf) - 1, &n);
-      soap->tmpbuf[n] = '\0';
-      if ((s = strchr(soap->tmpbuf, ':')))
-      { *s = '\0';
-       soap->userid = soap_strdup(soap, soap->tmpbuf);
-       soap->passwd = soap_strdup(soap, s + 1);
-      }
-    }
-  }
-  else if (!soap_tag_cmp(key, "WWW-Authenticate"))
-    soap->authrealm = soap_strdup(soap, soap_get_header_attribute(soap, val+6, "realm"));
-  else if (!soap_tag_cmp(key, "Expect"))
-  { if (!soap_tag_cmp(val, "100-continue"))
-    { if ((soap->error = soap->fposthdr(soap, "HTTP/1.1 100 Continue", NULL))
-       || (soap->error = soap->fposthdr(soap, NULL, NULL)))
-        return soap->error;
-    }
-  }
-#endif
-  else if (!soap_tag_cmp(key, "SOAPAction"))
-  { if (val[0] && val[1])
-    { soap->action = soap_strdup(soap, val + 1);
-      soap->action[strlen(soap->action) - 1] = '\0';
-    }
-  }
-  else if (!soap_tag_cmp(key, "Location"))
-  { strncpy(soap->endpoint, val, sizeof(soap->endpoint));
-    soap->endpoint[sizeof(soap->endpoint) - 1] = '\0';
-  }
-#ifdef WITH_COOKIES
-  else if (!soap_tag_cmp(key, "Cookie") || !soap_tag_cmp(key, "Set-Cookie"))
-    soap_getcookies(soap, val);
-#endif
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_get_header_attribute(struct soap *soap, const char *line, const char *key)
-{ register const char *s = line;
-  if (s)
-  { while (*s)
-    { register short flag;
-      s = soap_decode_key(soap->tmpbuf, sizeof(soap->tmpbuf), s);
-      flag = soap_tag_cmp(soap->tmpbuf, key);
-      s = soap_decode_val(soap->tmpbuf, sizeof(soap->tmpbuf), s);
-      if (!flag)
-        return soap->tmpbuf;
-    }
-  }
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_decode_key(char *buf, size_t len, const char *val)
-{ return soap_decode(buf, len, val, "=,;");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_decode_val(char *buf, size_t len, const char *val)
-{ if (*val != '=')
-  { *buf = '\0';
-    return val;
-  }
-  return soap_decode(buf, len, val + 1, ",;");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-soap_decode(char *buf, size_t len, const char *val, const char *sep)
-{ const char *s;
-  char *t = buf;
-  for (s = val; *s; s++)
-    if (*s != ' ' && *s != '\t' && !strchr(sep, *s))
-      break;
-  if (*s == '"')
-  { s++;
-    while (*s && *s != '"' && --len)
-      *t++ = *s++;
-  }
-  else
-  { while (soap_notblank(*s) && !strchr(sep, *s) && --len)
-    { if (*s == '%')
-      { *t++ = ((s[1] >= 'A' ? (s[1] & 0x7) + 9 : s[1] - '0') << 4)
-              + (s[2] >= 'A' ? (s[2] & 0x7) + 9 : s[2] - '0');
-        s += 3;
-      }
-      else
-        *t++ = *s++;
-    }
-  }
-  *t = '\0';
-  while (*s && !strchr(sep, *s))
-    s++;
-  return s;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_begin_out(struct soap *soap)
-{
-#ifndef WITH_LEANER
-  size_t n = 0;
-  if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start)
-  { const char *s;
-    if (soap->mode & SOAP_ENC_DIME)
-      s = "application/dime";
-    else if (soap->version == 2)
-      s = "application/soap+xml; charset=utf-8";
-    else
-      s = "text/xml; charset=utf-8";
-    sprintf(soap->tmpbuf, "--%s\r\nContent-Type: %s\r\nContent-Transfer-Encoding: binary\r\nContent-ID: %s\r\n\r\n", soap->mime.boundary, s, soap->mime.start);
-    n = strlen(soap->tmpbuf);
-    if (soap_send_raw(soap, soap->tmpbuf, n))
-      return soap->error;
-  }
-  if (soap->mode & SOAP_IO_LENGTH)
-    soap->dime.size = soap->count;     /* DIME in MIME correction */
-  if (!(soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME))
-  { if (soap_putdimehdr(soap))
-      return soap->error;
-  }
-#endif
-  soap->part = SOAP_IN_ENVELOPE;
-  return soap_element_begin_out(soap, "SOAP-ENV:Envelope", 0, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_end_out(struct soap *soap)
-{ if (soap_element_end_out(soap, "SOAP-ENV:Envelope"))
-    return soap->error;
-#ifndef WITH_LEANER
-  if ((soap->mode & SOAP_IO_LENGTH) && (soap->mode & SOAP_ENC_DIME))
-  { soap->dime.size = soap->count - soap->dime.size;   /* DIME in MIME correction */
-    sprintf(soap->id, soap->dime_id_format, 0);
-    soap->dime.id = soap->id;
-    if (soap->local_namespaces)
-    { if (soap->local_namespaces[0].out)
-        soap->dime.type = (char*)soap->local_namespaces[0].out;
-      else
-        soap->dime.type = (char*)soap->local_namespaces[0].ns;
-    }
-    soap->dime.options = NULL;
-    soap->dime.flags = SOAP_DIME_MB | SOAP_DIME_ABSURI;
-    if (!soap->dime.first)
-      soap->dime.flags |= SOAP_DIME_ME;
-    soap->count += 12 + ((strlen(soap->dime.id)+3)&(~3)) + ((strlen(soap->dime.type)+3)&(~3));
-  }
-  if (soap->mode & SOAP_ENC_DIME)
-    return soap_send_raw(soap, SOAP_STR_PADDING, -(long)soap->dime.size&3);
-#endif
-  soap->part = SOAP_END_ENVELOPE;
-  return SOAP_OK;
-} 
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_begin_in(struct soap *soap)
-{ register struct Namespace *p;
-  soap->part = SOAP_IN_ENVELOPE;
-  if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0))
-    return soap->error = SOAP_VERSIONMISMATCH;
-  p = soap->local_namespaces;
-  if (p)
-  { const char *ns = p[0].out;
-    if (!ns)
-      ns = p[0].ns;
-    if (!strcmp(ns, soap_env1))
-    { soap->version = 1; /* make sure we use SOAP 1.1 */
-      if (p[1].out)
-        SOAP_FREE(p[1].out);
-      if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc1))))
-        strcpy(p[1].out, soap_enc1);
-    }
-    else if (!strcmp(ns, soap_env2))
-    { soap->version = 2; /* make sure we use SOAP 1.2 */
-      if (p[1].out)
-        SOAP_FREE(p[1].out);
-      if ((p[1].out = (char*)SOAP_MALLOC(sizeof(soap_enc2))))
-        strcpy(p[1].out, soap_enc2);
-    }
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_envelope_end_in(struct soap *soap)
-{ if (soap_element_end_in(soap, "SOAP-ENV:Envelope"))
-    return soap->error;
-  soap->part = SOAP_END_ENVELOPE;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_begin_out(struct soap *soap)
-{ soap->part = SOAP_IN_BODY;
-  if (soap->version == 1)
-    soap->encoding = 1;
-  if (soap_element(soap, "SOAP-ENV:Body", 0, NULL))
-    return soap->error;
-  if ((soap->mode & SOAP_XML_SEC) && soap_attribute(soap, "id", "_0"))
-    return soap->error;
-  return soap_element_start_end_out(soap, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_end_out(struct soap *soap)
-{ if (soap_element_end_out(soap, "SOAP-ENV:Body"))
-    return soap->error;
-  soap->part = SOAP_IN_BODY;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_begin_in(struct soap *soap)
-{ soap->part = SOAP_IN_BODY;
-  return soap_element_begin_in(soap, "SOAP-ENV:Body", 0);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_body_end_in(struct soap *soap)
-{ if (soap_element_end_in(soap, "SOAP-ENV:Body"))
-    return soap->error;
-  soap->part = SOAP_END_BODY;
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_header(struct soap *soap)
-{ if (soap_getheader(soap) && soap->error == SOAP_TAG_MISMATCH)
-    soap->error = SOAP_OK;
-  return soap->error;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_endpoint(struct soap *soap, const char *endpoint)
-{ register const char *s;
-  register size_t i, n;
-  *soap->endpoint = '\0';
-  *soap->host = '\0';
-  *soap->path = '\0';
-  soap->port = 80;
-  if (!endpoint || !*endpoint)
-    return;
-#ifdef WITH_OPENSSL
-  if (!strncmp(endpoint, "https:", 6))
-    soap->port = 443;
-#endif
-  strncpy(soap->endpoint, endpoint, sizeof(soap->endpoint) - 1);
-  s = strchr(endpoint, ':');
-  if (s && s[1] == '/' && s[2] == '/')
-    s += 3;
-  else
-    s = endpoint;
-  n = strlen(s);
-  if (n >= sizeof(soap->host))
-    n = sizeof(soap->host) - 1;
-/* WR[ */
-#ifdef WITH_IPV6
-  if ('[' == s[0])
-  { s++;
-    for (i = 0; i < n; i++)
-    { soap->host[i] = s[i];
-      if (']' == s[i])
-      {
-        s++;
-        break; 
-      }
-    }
-  }
-  else
-  { for (i = 0; i < n; i++)
-    { soap->host[i] = s[i];
-      if (s[i] == '/' || s[i] == ':')
-        break; 
-    }
-  }
-#else /* WITH_IPV6 */
-/* ]WR */
-  for (i = 0; i < n; i++)
-  { soap->host[i] = s[i];
-    if (s[i] == '/' || s[i] == ':')
-      break; 
-  }
-/* WR[ */
-#endif /* WITH_IPV6 */
-/* ]WR */
-  soap->host[i] = '\0';
-  if (s[i] == ':')
-  { soap->port = (int)atol(s + i + 1);
-    for (i++; i < n; i++)
-      if (s[i] == '/')
-        break;
-  }
-  if (s[i])
-  { strncpy(soap->path, s + i + 1, sizeof(soap->path));
-    soap->path[sizeof(soap->path) - 1] = '\0';
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_connect(struct soap *soap, const char *endpoint, const char *action)
-{ return soap_connect_command(soap, SOAP_POST, endpoint, action);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_connect_command(struct soap *soap, int http_command, const char *endpoint, const char *action)
-{ char host[sizeof(soap->host)];
-  int port;
-  size_t count;
-  soap->error = SOAP_OK;
-  strcpy(host, soap->host); /* save to compare */
-  port = soap->port; /* save to compare */
-  soap_set_endpoint(soap, endpoint);
-  if (action)
-    soap->action = soap_strdup(soap, action);
-  if (soap->fconnect)
-  {
-    if ((soap->error = soap->fconnect(soap, endpoint, soap->host, soap->port)))
-      return soap->error;
-  }
-  else if (*soap->host)
-  { soap->status = http_command;
-    if (!soap_valid_socket(soap->socket) || strcmp(soap->host, host) || soap->port != port)
-    { soap->keep_alive = 0; /* force close */
-      soap_closesock(soap);
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Connect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
-      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
-      if (soap->error)
-        return soap->error;
-      soap->keep_alive = ((soap->omode & SOAP_IO_KEEPALIVE) != 0);
-    }
-    else if (!soap->keep_alive || !soap->fpoll || soap->fpoll(soap))
-    { soap->keep_alive = 0; /* force close */
-      soap_closesock(soap);
-      DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Reconnect to host='%s' path='%s' port=%d\n", soap->host, soap->path, soap->port));
-      soap->socket = soap->fopen(soap, endpoint, soap->host, soap->port);
-      if (soap->error)
-        return soap->error;
-    }
-  }
-  if (soap_begin_send(soap))
-    return soap->error;
-  count = soap_count_attachments(soap);
-  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML) && endpoint)
-  { unsigned int k = soap->mode;
-    soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
-    if ((k & SOAP_IO) != SOAP_IO_FLUSH)
-      soap->mode |= SOAP_IO_BUFFER;
-    if ((soap->error = soap->fpost(soap, endpoint, soap->host, soap->port, soap->path, action, count)))
-      return soap->error;
-    if ((k & SOAP_IO) == SOAP_IO_CHUNK)
-    { if (soap_flush(soap))
-        return soap->error;
-    }
-    soap->mode = k;
-  }
-  if (http_command != SOAP_POST)
-    return soap_end_send(soap);
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-char*
-SOAP_FMAC2
-soap_s2base64(struct soap *soap, const unsigned char *s, char *t, size_t n)
-{ register size_t i;
-  register unsigned long m;
-  register char *p;
-  if (!t)
-    t = (char*)soap_malloc(soap, (n + 2) / 3 * 4 + 1);
-  if (!t)
-  { soap->error = SOAP_EOM;
-    return NULL;
-  }
-  p = t;
-  t[0] = '\0';
-  if (!s)
-    return p;
-  for (; n > 2; n -= 3, s += 3)
-  { m = s[0];
-    m = (m << 8) | s[1];
-    m = (m << 8) | s[2];
-    for (i = 4; i > 0; m >>= 6)
-      t[--i] = soap_base64o[m & 0x3F];
-    t += 4;
-  }
-  t[0] = '\0';
-  if (n > 0)
-  { m = 0;
-    for (i = 0; i < n; i++)
-      m = (m << 8) | *s++;
-    for (; i < 3; i++)
-      m <<= 8;
-    for (i++; i > 0; m >>= 6)
-      t[--i] = soap_base64o[m & 0x3F];
-    for (i = 3; i > n; i--)
-      t[i] = '=';
-    t[4] = '\0';
-  }
-  return p;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-SOAP_FMAC1
-const char*
-SOAP_FMAC2
-soap_base642s(struct soap *soap, const char *s, char *t, size_t l, size_t *n)
-{ register int i, j, c;
-  register unsigned long m;
-  char *p = t;
-  if (n)
-    *n = 0;
-  for (;;)
-  { for (i = 0; i < SOAP_BLKLEN; i++)
-    { m = 0;
-      j = 0;
-      while (j < 4)
-      { c = *s++;
-        if (c == '=' || !c)
-        { i *= 3;
-          switch (j)
-          { case 2:
-              *t++ = (char)((m >> 4) & 0xFF);
-              i++;
-              break;
-            case 3:
-              *t++ = (char)((m >> 10) & 0xFF);
-              *t++ = (char)((m >> 2) & 0xFF);
-              i += 2;
-          }
-          if (n)
-           *n += i;
-          return p;
-        }
-        c -= '+';
-        if (c >= 0 && c <= 79)
-        { m = (m << 6) + soap_base64i[c];
-          j++;
-        }
-      }
-      *t++ = (char)((m >> 16) & 0xFF);
-      *t++ = (char)((m >> 8) & 0xFF);
-      *t++ = (char)(m & 0xFF);
-      if (l < 3)
-      { if (n)
-         *n += i;
-        return p;
-      }
-      l -= 3;
-    }
-    if (n)
-      *n += 3 * SOAP_BLKLEN;
-  }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_puthttphdr(struct soap *soap, int status, size_t count)
-{ register const char *s;
-  register int err;
-  if (status == SOAP_FILE)
-    s = soap->http_content;
-  else if (status == SOAP_HTML)
-    s = "text/html; charset=utf-8";
-#ifndef WITH_LEANER
-  else if (soap->mode & SOAP_ENC_DIME)
-    s = "application/dime";
-#endif
-  else if (soap->version == 2)
-    s = "application/soap+xml; charset=utf-8";
-  else
-    s = "text/xml; charset=utf-8";
-#ifndef WITH_LEANER
-  if ((soap->mode & SOAP_ENC_MIME) && soap->mime.boundary && soap->mime.start && soap->status != SOAP_GET)
-  { sprintf(soap->tmpbuf, "multipart/related; boundary=\"%s\"; type=%s; start=\"%s\"", soap->mime.boundary, s, soap->mime.start);
-    s = soap->tmpbuf;
-  }
-#endif
-  if ((err = soap->fposthdr(soap, "Content-Type", s)))
-    return err;
-#ifdef WITH_ZLIB
-  if (soap->omode & SOAP_ENC_ZLIB)
-  {
-#ifdef WITH_GZIP
-    err = soap->fposthdr(soap, "Content-Encoding", "gzip");
-#else
-    err = soap->fposthdr(soap, "Content-Encoding", "deflate");
-#endif
-    if (err)
-      return err;
-  }
-#endif
-  if ((soap->omode & SOAP_IO) == SOAP_IO_CHUNK)
-    err = soap->fposthdr(soap, "Transfer-Encoding", "chunked");
-  else if (count > 0)
-  { sprintf(soap->tmpbuf, "%lu", (unsigned long)count);
-    err = soap->fposthdr(soap, "Content-Length", soap->tmpbuf);
-  }
-  if (err)
-    return err;
-  return soap->fposthdr(soap, "Connection", soap->keep_alive ? "keep-alive" : "close");
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_get(struct soap *soap)
-{ return SOAP_GET_METHOD;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count)
-{ register const char *s;
-  register int err;
-  if (soap->status == SOAP_GET)
-  { s = "GET";
-    count = 0;
-  }
-  else
-    s = "POST";
-#ifdef PALM
-  if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)) && strncmp(endpoint, "_beam:", 6) && strncmp(endpoint, "_local:", 7) && strncmp(endpoint, "_btobex:", 8))
-#else
-  if (!endpoint || (strncmp(endpoint, "http:", 5) && strncmp(endpoint, "https:", 6) && strncmp(endpoint, "httpg:", 6)))
-#endif
-    return SOAP_OK;
-  if (soap->proxy_host && strncmp(endpoint, "https:", 6))
-    sprintf(soap->tmpbuf, "%s %s HTTP/%s", s, endpoint, soap->http_version);
-  else
-    sprintf(soap->tmpbuf, "%s /%s HTTP/%s", s, path, soap->http_version);
-  if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-    return err;
-  if (port != 80)
-    sprintf(soap->tmpbuf, "%s:%d", host, port);
-  else
-    strcpy(soap->tmpbuf, host); 
-  if ((err = soap->fposthdr(soap, "Host", soap->tmpbuf))
-   || (err = soap->fposthdr(soap, "User-Agent", "gSOAP/2.7"))
-   || (err = soap_puthttphdr(soap, SOAP_OK, count)))
-    return err;
-#ifdef WITH_ZLIB
-#ifdef WITH_GZIP
-  if ((err = soap->fposthdr(soap, "Accept-Encoding", "gzip, deflate")))
-#else
-  if ((err = soap->fposthdr(soap, "Accept-Encoding", "deflate")))
-#endif
-    return err;
-#endif
-#ifndef WITH_LEAN
-  if (soap->userid && soap->passwd && strlen(soap->userid) + strlen(soap->passwd) < 761)
-  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->userid, soap->passwd);
-    strcpy(soap->tmpbuf, "Basic ");
-    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-    if ((err = soap->fposthdr(soap, "Authorization", soap->tmpbuf)))
-      return err;
-  }
-  if (soap->proxy_userid && soap->proxy_passwd && strlen(soap->proxy_userid) + strlen(soap->proxy_passwd) < 761)
-  { sprintf(soap->tmpbuf + 262, "%s:%s", soap->proxy_userid, soap->proxy_passwd);
-    strcpy(soap->tmpbuf, "Basic ");
-    soap_s2base64(soap, (const unsigned char*)(soap->tmpbuf + 262), soap->tmpbuf + 6, strlen(soap->tmpbuf + 262));
-    if ((err = soap->fposthdr(soap, "Proxy-Authorization", soap->tmpbuf)))
-      return err;
-  }
-#endif
-#ifdef WITH_COOKIES
-#ifdef WITH_OPENSSL
-  if (soap_putcookies(soap, host, path, soap->ssl != NULL))
-    return soap->error;
-#else
-  if (soap_putcookies(soap, host, path, 0))
-    return soap->error;
-#endif
-#endif
-  if (action && soap->version == 1)
-  { sprintf(soap->tmpbuf, "\"%s\"", action);
-    if ((err = soap->fposthdr(soap, "SOAPAction", soap->tmpbuf)))
-      return err;
-  }
-  return soap->fposthdr(soap, NULL, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_send_header(struct soap *soap, const char *s)
-{ register const char *t;
-  do
-  { t = strchr(s, '\n'); /* disallow \n in HTTP headers */
-    if (!t)
-      t = s + strlen(s);
-    if (soap_send_raw(soap, s, t - s))
-      return soap->error;
-    s = t + 1;
-  } while (*t);
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_post_header(struct soap *soap, const char *key, const char *val)
-{ if (key)
-  { if (http_send_header(soap, key))
-      return soap->error;
-    if (val && (soap_send_raw(soap, ": ", 2) || http_send_header(soap, val)))
-      return soap->error;
-  }
-  return soap_send_raw(soap, "\r\n", 2);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static int
-http_response(struct soap *soap, int status, size_t count)
-{ register int err;
-/* WR[ */
-#ifdef WMW_RPM_IO
-  if (soap->rpmreqid)
-    httpOutputEnable(soap->rpmreqid);
-#endif  /* WMW_RPM_IO */
-/* ]WR */
-  if (!status || status == SOAP_HTML || status == SOAP_FILE)
-  { DBGLOG(TEST, SOAP_MESSAGE(fdebug, "OK 200\n"));
-/* WR[ */
-#ifdef WMW_RPM_IO
-    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
-#else
-/* ]WR */
-    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
-/* WR[ */
-#endif /* WMW_RPM_IO */
-/* ]WR */
-    { sprintf(soap->tmpbuf, "HTTP/%s 200 OK", soap->http_version);
-      if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return err;
-    }
-    else if ((err = soap->fposthdr(soap, "Status", "200 OK")))
-      return err;
-  }
-  else if (status > 200 && status < 600)
-  { sprintf(soap->tmpbuf, "HTTP/%s %d %s", soap->http_version, status, http_error(soap, status));
-    if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-      return err;
-    if (status == 401)
-    { sprintf(soap->tmpbuf, "Basic realm=\"%s\"", soap->authrealm ? soap->authrealm : "gSOAP Web Service");
-      if ((err = soap->fposthdr(soap, "WWW-Authenticate", soap->tmpbuf)))
-        return err;
-    }
-    else if ((status >= 301 && status <= 303) || status == 307)
-    { if ((err = soap->fposthdr(soap, "Location", soap->endpoint)))
-        return err;
-    }
-  }
-  else
-  { const char *s = *soap_faultcode(soap);
-    if (soap->version == 2 && !strcmp(s, "SOAP-ENV:Sender"))
-      s = "400 Bad Request";
-    else
-      s = "500 Internal Server Error";
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Error %s (status=%d)\n", s, status));
-/* WR[ */
-#ifdef WMW_RPM_IO
-    if (soap->rpmreqid || soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* RPM behaves as if standalone */
-#else
-/* ]WR */
-    if (soap_valid_socket(soap->master) || soap_valid_socket(soap->socket)) /* standalone application */
-/* WR[ */
-#endif /* WMW_RPM_IO */
-/* ]WR */
-    { sprintf(soap->tmpbuf, "HTTP/%s %s", soap->http_version, s);
-      if ((err = soap->fposthdr(soap, soap->tmpbuf, NULL)))
-        return err;
-    }
-    else if ((err = soap->fposthdr(soap, "Status", s)))
-      return err;
-  }
-  if ((err = soap->fposthdr(soap, "Server", "gSOAP/2.7"))
-   || (err = soap_puthttphdr(soap, status, count)))
-    return err;
-#ifdef WITH_COOKIES
-  if (soap_putsetcookies(soap))
-    return soap->error;
-#endif
-  return soap->fposthdr(soap, NULL, NULL);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_response(struct soap *soap, int status)
-{ register size_t count;
-  if (!(soap->omode & (SOAP_ENC_XML | SOAP_IO_STORE /* this tests for chunking too */))
-   && (status == SOAP_HTML || status == SOAP_FILE))
-  { soap->omode &= ~SOAP_IO;
-    soap->omode |= SOAP_IO_STORE;
-  }
-  soap->status = status;
-  count = soap_count_attachments(soap);
-  if (soap_begin_send(soap))
-    return soap->error;
-  if ((soap->mode & SOAP_IO) != SOAP_IO_STORE && !(soap->mode & SOAP_ENC_XML))
-  { register int n = soap->mode;
-    soap->mode &= ~(SOAP_IO | SOAP_ENC_ZLIB);
-    if ((n & SOAP_IO) != SOAP_IO_FLUSH)
-      soap->mode |= SOAP_IO_BUFFER;
-    if ((soap->error = soap->fresponse(soap, status, count)))
-      return soap->error;
-    if ((n & SOAP_IO) == SOAP_IO_CHUNK)
-    { if (soap_flush(soap))
-        return soap->error;
-    }
-    soap->mode = n;
-  }
-  return SOAP_OK;
-}
-#endif
-
-/******************************************************************************/
-#ifndef WITH_LEAN
-static const char*
-soap_set_validation_fault(struct soap *soap, const char *s, const char *t)
-{ sprintf(soap->msgbuf, "Validation constraint violation: %s%s in element <%s>", s, t?t:SOAP_STR_EOS, soap->tag);
-  return soap->msgbuf;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_set_fault(struct soap *soap)
-{ const char **c = soap_faultcode(soap);
-  const char **s = soap_faultstring(soap);
-  if (!*c)
-  { if (soap->version == 2)
-      *c = "SOAP-ENV:Sender";
-    else
-      *c = "SOAP-ENV:Client";
-  }
-  if (*s)
-    return;
-  switch (soap->error)
-  {
-#ifndef WITH_LEAN
-    case SOAP_CLI_FAULT:
-      *s = "Client fault";
-      break;
-    case SOAP_SVR_FAULT:
-      *s = "Server fault";
-      break;
-    case SOAP_TAG_MISMATCH:
-      *s = soap_set_validation_fault(soap, "tag name or namespace mismatch", NULL);
-      break;
-    case SOAP_TAG_END:
-      *s = soap_set_validation_fault(soap, "incorrect end tag", NULL);
-      break;
-    case SOAP_TYPE:
-      *s = soap_set_validation_fault(soap, "data type mismatch ", soap->type);
-      break;
-    case SOAP_SYNTAX_ERROR:
-      *s = "Well-formedness constraint violation";
-      break;
-    case SOAP_NO_TAG:
-      *s = "No XML element tag found";
-      break;
-    case SOAP_MUSTUNDERSTAND:
-      *c = "SOAP-ENV:MustUnderstand";
-      sprintf(soap->msgbuf, "The data in element '%s' must be understood but cannot be handled", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_VERSIONMISMATCH:
-      *c = "SOAP-ENV:VersionMismatch";
-      *s = "SOAP version mismatch or invalid SOAP message";
-      break;
-    case SOAP_DATAENCODINGUNKNOWN:
-      *c = "SOAP-ENV:DataEncodingUnknown";
-      *s = "Unsupported SOAP data encoding";
-      break;
-    case SOAP_NAMESPACE:
-      *s = soap_set_validation_fault(soap, "namespace mismatch", NULL);
-      break;
-    case SOAP_FATAL_ERROR:
-      *s = "Fatal error";
-      break;
-    case SOAP_NO_METHOD:
-      sprintf(soap->msgbuf, "Method '%s' not implemented: method name or namespace not recognized", soap->tag);
-      *s = soap->msgbuf;
-      break;
-    case SOAP_GET_METHOD:
-      *s = "HTTP GET method not implemented";
-      break;
-    case SOAP_EOM:
-      *s = "Out of memory";
-      break;
-    case SOAP_IOB:
-      *s = "Array index out of bounds";
-      break;
-    case SOAP_NULL:
-      *s = soap_set_validation_fault(soap, "nil not allowed", NULL);
-      break;
-    case SOAP_MULTI_ID:
-      *s = soap_set_validation_fault(soap, "multiple definitions of id ", soap->id);
-      break;
-    case SOAP_MISSING_ID:
-      *s = soap_set_validation_fault(soap, "missing id for ref ", soap->id);
-      break;
-    case SOAP_HREF:
-      *s = soap_set_validation_fault(soap, "incompatible object ref ", soap->id);
-      break;
-    case SOAP_FAULT:
-      break;
-    case SOAP_TCP_ERROR:
-      *s = tcp_error(soap);
-      break;
-    case SOAP_HTTP_ERROR:
-      *s = "HTTP error";
-      break;
-    case SOAP_SSL_ERROR:
-      *s = "SSL error";
-      break;
-    case SOAP_PLUGIN_ERROR:
-      *s = "Plugin registry error";
-      break;
-    case SOAP_DIME_MISMATCH:
-      *s = "DIME version/transmission error";
-      break;
-    case SOAP_DIME_END:
-      *s = "End of DIME error";
-      break;
-    case SOAP_DIME_ERROR:
-      *s = "DIME format error";
-      break;
-    case SOAP_MIME_ERROR:
-      *s = "MIME format error";
-      break;
-    case SOAP_ZLIB_ERROR:
-#ifdef WITH_ZLIB
-      sprintf(soap->msgbuf, "Zlib/gzip error: '%s'", soap->d_stream.msg?soap->d_stream.msg:"");
-      *s = soap->msgbuf;
-#else
-      *s = "Zlib not installed for required message (de)compression";
-#endif
-      break;
-    case SOAP_REQUIRED:
-      *s = soap_set_validation_fault(soap, "missing required attribute", NULL);
-      break;
-    case SOAP_PROHIBITED:
-      *s = soap_set_validation_fault(soap, "prohibited attribute present", NULL);
-      break;
-    case SOAP_OCCURS:
-      *s = soap_set_validation_fault(soap, "a min/maxOccurs violation was detected", NULL);
-      break;
-    case SOAP_LENGTH:
-      *s = soap_set_validation_fault(soap, "content length violation", NULL);
-      break;
-#endif
-    case SOAP_EOF:
-      sprintf(soap->msgbuf, "End of file or no input: '%s'", soap_strerror(soap));
-      *s = soap->msgbuf;
-      break;
-    default:
-      if (soap->error > 200 && soap->error < 600)
-      { sprintf(soap->msgbuf, "HTTP Error: '%s'", http_error(soap, soap->error));
-        *s = soap->msgbuf;
-      }
-      else
-      { sprintf(soap->msgbuf, "Error code %d", soap->error);
-        *s = soap->msgbuf;
-      }
-    }
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_send_fault(struct soap *soap)
-{ register int status = soap->error;
-  if (status == SOAP_STOP)
-    return status;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Sending back fault struct for error code %d\n", soap->error));
-  soap->keep_alive = 0; /* to terminate connection */
-  soap_set_fault(soap);
-  if ((status != SOAP_EOF || (!soap->recv_timeout && !soap->send_timeout)) && (!soap->fpoll || soap->fpoll(soap) == SOAP_OK))
-  { soap->error = SOAP_OK;
-    soap_serializeheader(soap);
-    soap_serializefault(soap);
-    soap_begin_count(soap);
-    if (soap->mode & SOAP_IO_LENGTH)
-    { soap_envelope_begin_out(soap);
-      soap_putheader(soap);
-      soap_body_begin_out(soap);
-      soap_putfault(soap);
-      soap_body_end_out(soap);
-      soap_envelope_end_out(soap);
-    }
-    if (soap_response(soap, status)
-     || soap_envelope_begin_out(soap)
-     || soap_putheader(soap)
-     || soap_body_begin_out(soap)
-     || soap_putfault(soap)
-     || soap_body_end_out(soap)
-     || soap_envelope_end_out(soap))
-      return soap_closesock(soap);
-    soap_end_send(soap);
-  }
-  soap->error = status;
-  return soap_closesock(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_recv_fault(struct soap *soap)
-{ register int status = soap->error;
-  DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Receiving SOAP Fault\n"));
-  soap->error = SOAP_OK;
-  if (soap_getfault(soap))
-  { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Error: soap_get_soapfault() failed. Is this a SOAP message at all?\n"));
-    *soap_faultcode(soap) = (soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client");
-    soap->error = status;
-    soap_set_fault(soap);
-  }
-  else
-  { register const char *s = *soap_faultcode(soap);
-    if (!soap_match_tag(soap, s, "SOAP-ENV:Server") || !soap_match_tag(soap, s, "SOAP-ENV:Receiver"))
-      status = SOAP_SVR_FAULT; 
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:Client") || !soap_match_tag(soap, s, "SOAP-ENV:Sender"))
-      status = SOAP_CLI_FAULT;
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:MustUnderstand"))
-      status = SOAP_MUSTUNDERSTAND;
-    else if (!soap_match_tag(soap, s, "SOAP-ENV:VersionMismatch"))
-      status = SOAP_VERSIONMISMATCH;
-    else
-    { DBGLOG(TEST,SOAP_MESSAGE(fdebug, "Fault code %s\n", s));
-      status = SOAP_FAULT;
-    }
-    if (soap_body_end_in(soap)
-     || soap_envelope_end_in(soap)
-     || soap_end_recv(soap))
-      return soap_closesock(soap);
-    soap->error = status;
-  }
-  return soap_closesock(soap);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static const char*
-soap_strerror(struct soap *soap)
-{ int err = soap->errnum;
-  if (!err)
-    err = soap_errno;
-  if (err)
-  {
-#ifndef UNDER_CE
-    return strerror(err);
-#else
-    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, 0, (LPTSTR)&soap->werrorstr, sizeof(soap->werrorstr), NULL);
-    wcstombs(soap->errorstr, soap->werrorstr, sizeof(soap->errorstr));
-    return soap->errorstr;
-#endif
-  }
-  return "Operation interrupted or timed out";
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int
-soap_set_error(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail, int soaperror)
-{ *soap_faultcode(soap) = faultcode;
-  *soap_faultstring(soap) = faultstring;
-  if (faultdetail && *faultdetail)
-  { register const char **s = soap_faultdetail(soap);
-    if (s)
-      *s = faultdetail;
-  }
-  return soap->error = soaperror;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_sender_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
-{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail, soaperror);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_set_receiver_error(struct soap *soap, const char *faultstring, const char *faultdetail, int soaperror)
-{ return soap_set_error(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail, soaperror);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-static int
-soap_copy_fault(struct soap *soap, const char *faultcode, const char *faultstring, const char *faultdetail)
-{ char *s = NULL, *t = NULL;
-  if (faultstring)
-    s = soap_strdup(soap, faultstring);
-  if (faultdetail)
-    t = soap_strdup(soap, faultdetail);
-  return soap_set_error(soap, faultcode, s, t, SOAP_FAULT);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_sender_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
-{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Sender" : "SOAP-ENV:Client", faultstring, faultdetail);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_receiver_fault(struct soap *soap, const char *faultstring, const char *faultdetail)
-{ return soap_copy_fault(soap, soap->version == 2 ? "SOAP-ENV:Receiver" : "SOAP-ENV:Server", faultstring, faultdetail);
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_print_fault(struct soap *soap, FILE *fd)
-{ if (soap->error)
-  { const char **s;
-    if (!*soap_faultcode(soap))
-      soap_set_fault(soap);
-    fprintf(fd, "SOAP FAULT: %s\n\"%s\"\n", *soap_faultcode(soap), *soap_faultstring(soap));
-    s = soap_faultdetail(soap);
-    if (s && *s)
-      fprintf(fd, "Detail: %s\n", *s);
-  }
-}
-#endif
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-void
-SOAP_FMAC2
-soap_print_fault_location(struct soap *soap, FILE *fd)
-{ 
-#ifndef WITH_LEAN
-  int c;
-  if (soap->error && soap->buflen > 0)
-  { if (soap->bufidx == 0)
-      soap->bufidx = 1;
-    c = soap->buf[soap->bufidx - 1];
-    soap->buf[soap->bufidx - 1] = '\0';
-    if (soap->buflen - soap->bufidx > 1024)
-      soap->buf[soap->bufidx + 1024] = '\0';
-    else
-      soap->buf[soap->buflen - 1] = '\0';
-    fprintf(fd, "%s%c\n** HERE **\n", soap->buf, c);
-    if (soap->bufidx < soap->buflen)
-      fprintf(fd, "%s\n", soap->buf + soap->bufidx);
-  }
-#endif
-}
-#endif
-/******************************************************************************/
-#ifndef PALM_1
-SOAP_FMAC1
-int
-SOAP_FMAC2
-soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap*, struct soap_plugin*, void*), void *arg)
-{ register struct soap_plugin *p;
-  register int r;
-  if (!(p = (struct soap_plugin*)SOAP_MALLOC(sizeof(struct soap_plugin))))
-    return soap->error = SOAP_EOM;
-  p->id = NULL;
-  p->data = NULL;
-  p->fcopy = NULL;
-  p->fdelete = NULL;
-  r = fcreate(soap, p, arg);
-  if (!r && p->fdelete)
-  { p->next = soap->plugins;
-    soap->plugins = p;
-    DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Registered '%s' plugin\n", p->id));
-    return SOAP_OK;
-  }
-  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Could not register plugin '%s': plugin returned error %d (or fdelete callback not set)\n", p->id?p->id:"?", r));
-  SOAP_FREE(p);
-  return r;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_1
-static void *
-fplugin(struct soap *soap, const char *id)
-{ register struct soap_plugin *p;
-  for (p = soap->plugins; p; p = p->next)
-    if (p->id == id || !strcmp(p->id, id))
-      return p->data;
-  return NULL;
-}
-#endif
-
-/******************************************************************************/
-#ifndef PALM_2
-SOAP_FMAC1
-void *
-SOAP_FMAC2
-soap_lookup_plugin(struct soap *soap, const char *id)
-{ return soap->fplugin(soap, id);
-}
-#endif
-
-/******************************************************************************/
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/org.glite.lb.server/interface/index.h b/org.glite.lb.server/interface/index.h
deleted file mode 100644 (file)
index 2a6b9ad..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef GLITE_LB_INDEX_H
-#define GLITE_LB_INDEX_H
-
-#ident "$Header$"
-
-#include "glite/lb/query_rec.h"
-
-int edg_wll_QueryJobIndices(edg_wll_Context,edg_wll_QueryRec ***,char ***);
-int edg_wll_QueryNotifIndices(edg_wll_Context,edg_wll_QueryRec ***,char ***);
-int edg_wll_ColumnToQueryRec(const char *,edg_wll_QueryRec *);
-char * edg_wll_QueryRecToColumn(const edg_wll_QueryRec *);
-char * edg_wll_QueryRecToColumnExt(const edg_wll_QueryRec *);
-
-int edg_wll_ParseIndexConfig(edg_wll_Context,const char *,edg_wll_QueryRec ***);
-int edg_wll_DumpIndexConfig(edg_wll_Context,const char *,edg_wll_QueryRec * const *);
-
-int edg_wll_CmpColumn(const edg_wll_QueryRec *,const edg_wll_QueryRec *);
-
-char *edg_wll_StatToSQL(edg_wll_JobStat const *stat,edg_wll_QueryAttr attr);
-char *edg_wll_JDLStatToSQL(edg_wll_JobStat const *stat, edg_wll_QueryRec col_rec);
-
-
-typedef struct _edg_wll_IColumnRec {
-       edg_wll_QueryRec        qrec;
-       char *                  colname;
-} edg_wll_IColumnRec;
-
-void edg_wll_FreeIColumnRec(edg_wll_IColumnRec *);
-edg_wll_ErrorCode edg_wll_IColumnsSQLPart(edg_wll_Context, void *,  edg_wll_JobStat*, int , char **, char **);
-
-int yylex();
-
-extern int     lex_int;
-extern char    *lex_out;
-extern int     lex_line;
-
-#define STD_PREFIX     "STD_"
-#define USR_PREFIX     "USR_"
-#define TIME_PREFIX    "TIME_"
-#define JDL_PREFIX     "JDL_"
-
-#endif /* GLITE_LB_INDEX_H */
diff --git a/org.glite.lb.server/interface/lb_authz.h b/org.glite.lb.server/interface/lb_authz.h
deleted file mode 100644 (file)
index fb078b9..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef GLITE_LB_LB_AUTHZ_H
-#define GLITE_LB_LB_AUTHZ_H
-
-#ident "$Header$"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef NO_GACL
-#include <gridsite.h>
-#endif 
-
-typedef struct _edg_wll_Acl {
-#ifndef NO_GACL
-       GRSTgaclAcl     *value;
-#else
-       void    *value; /* XXX */
-#endif
-       char    *string;
-} _edg_wll_Acl;
-typedef struct _edg_wll_Acl *edg_wll_Acl;
-
-#ifndef NO_GACL
-
-extern int
-edg_wll_DecodeACL(char *, GRSTgaclAcl **);
-
-extern int
-edg_wll_EncodeACL(GRSTgaclAcl *, char **);
-
-#else
-
-extern int
-edg_wll_DecodeACL(char *, void **);
-
-extern int
-edg_wll_EncodeACL(void *, char **);
-
-#endif /* NO_GACL */
-
-/* we have NO_VOMS||NO_GACL placeholders for following routines */
-
-extern int
-edg_wll_InitAcl(edg_wll_Acl *);
-
-extern void
-edg_wll_FreeAcl(edg_wll_Acl);
-
-extern int
-edg_wll_UpdateACL(edg_wll_Context, glite_jobid_const_t, char *, int, int, int, int);
-
-extern int
-edg_wll_CheckACL(edg_wll_Context, edg_wll_Acl, int);
-
-extern int
-edg_wll_GetACL(edg_wll_Context, glite_jobid_const_t, edg_wll_Acl *);
-
-extern int
-edg_wll_SetVomsGroups(edg_wll_Context, edg_wll_GssConnection *, char *, char *, char *, char *);
-
-extern void
-edg_wll_FreeVomsGroups(edg_wll_VomsGroups *);
-
-extern int
-check_store_authz(edg_wll_Context ctx, edg_wll_Event *ev);
-
-int edg_wll_amIroot(const char *subj, char **fqans,char **super_users);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GLITE_LB_LB_AUTHZ_H */
diff --git a/org.glite.lb.server/interface/pretty_print_wrapper.h b/org.glite.lb.server/interface/pretty_print_wrapper.h
deleted file mode 100644 (file)
index e99a2af..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int pretty_print(char *jdl, char **formated_print);
-
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/org.glite.lb.server/interface/query.h b/org.glite.lb.server/interface/query.h
deleted file mode 100644 (file)
index e93a4a2..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef GLITE_LB_QUERY_H
-#define GLITE_LB_QUERY_H
-
-#ident "$Header$"
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lb/context.h"
-#include "glite/lb/events.h"
-#include "glite/lb/jobstat.h"
-#include "glite/lb/query_rec.h"
-
-int convert_event_head(edg_wll_Context,char **,edg_wll_Event *);
-int check_strict_jobid(edg_wll_Context, glite_jobid_const_t);
-int match_status(edg_wll_Context, const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat,const edg_wll_QueryRec **conditions);
-int check_job_query_index(edg_wll_Context, const edg_wll_QueryRec **);
-
-#define NOTIF_ALL_JOBS "all_jobs"
-
-#endif /* GLITE_LB_QUERY_H */
diff --git a/org.glite.lb.server/interface/srv_perf.h b/org.glite.lb.server/interface/srv_perf.h
deleted file mode 100644 (file)
index feb315b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef GLITE_LB_SRV_PERF_H
-#define GLITE_LB_SRV_PERF_H
-
-#ident "$Header$"
-
-enum lb_srv_perf_sink {
-       GLITE_LB_SINK_NONE = 0, // standard behaviour, no sinking
-
-       GLITE_LB_SINK_PARSE,    // skip everything, only read message and
-                               // generate reply 
-                               // skips decode_il_msg, db_store 
-
-       GLITE_LB_SINK_STORE,    // do no store data to DB, only decode_il_msg
-                               // and edg_wll_ParseEvent
-                               // skips edg_wll_LockJob, edg_wll_StoreEvent 
-                               // edg_wll_UpdateACL, edg_wll_StepIntState,
-                               // edg_wll_EventSendProxy, edg_wll_NotifMatch
-
-       GLITE_LB_SINK_STATE,    // do not perform state computation, only save 
-                               // event to DB
-                               // skips edg_wll_StepIntState
-                               // edg_wll_EventSendProxy, edg_wll_NotifMatch
-
-       GLITE_LB_SINK_SEND,
-};
-
-
-extern enum lb_srv_perf_sink sink_mode;
-
-#endif /* GLITE_LB_SRV_PERF_H */
diff --git a/org.glite.lb.server/interface/store.h b/org.glite.lb.server/interface/store.h
deleted file mode 100644 (file)
index f620b5d..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#ident "$Header$"
-
-#ifndef GLITE_LB_STORE_H
-#define GLITE_LB_STORE_H
-
-#include "jobstat.h"
-#include "lb_authz.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* store an event into the LB database */
-
-int edg_wll_StoreEvent(
-       edg_wll_Context,        /* INOUT */
-       edg_wll_Event *,        /* IN */
-       const char *,           /* IN */
-       int *
-);
-
-void edg_wll_StoreAnonymous(
-       edg_wll_Context,    /* INOUT */
-       int             /* IN (boolean) */
-);
-
-int db_store(edg_wll_Context, char *);
-int db_parent_store(edg_wll_Context, edg_wll_Event *, intJobStat *);
-int handle_request(edg_wll_Context,char *);
-int handle_il_message(edg_wll_Context,char *);
-int create_reply(const edg_wll_Context,char **);
-int is_job_local(edg_wll_Context, glite_jobid_const_t jobId);
-int store_job_server_proxy(edg_wll_Context ctx, edg_wll_Event *event, int *register_to_JP);
-int register_subjobs_embryonic(edg_wll_Context,const edg_wll_RegJobEvent *);
-edg_wll_ErrorCode intJobStat_embryonic(edg_wll_Context ctx, glite_jobid_const_t jobid, const edg_wll_RegJobEvent *e, intJobStat *stat);
-
-
-int edg_wll_delete_event(edg_wll_Context,const char *, int);
-
-
-#define USER_UNKNOWN   "unknown"
-
-/* flags for JP registrations */
-#define REG_JOB_TO_JP          1
-#define REG_SUBJOBS_TO_JP      2
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GLITE_LB_STORE_H */
diff --git a/org.glite.lb.server/project/.cvsignore b/org.glite.lb.server/project/.cvsignore
deleted file mode 100644 (file)
index 2b56473..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-MultiStruct.pm
-StructField.pm
-at3
-events.T
-status.T
-types.T
diff --git a/org.glite.lb.server/project/ChangeLog b/org.glite.lb.server/project/ChangeLog
deleted file mode 100644 (file)
index 57350d5..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-1.8.0-1 (lb-1.7.0-1)
-- add FQAN-based specification of superusers
-- avoid giving no answer to client on some errors during purge (bug #30256)
-
-1.8.1-1 (lb-1.7.1-1)
-- don't propagate errors from sent notifications to IL
-- added man pages (not perfect yet)
-- allow setting debug flags in startup script
-- added run-time dependence on mysql-server
-- fixed several memleaks
-- ignore shallow branch seqence code for events coming from UI and NS
-  (fixes impossibility to clear jobs with ReallyRunning events)
-
-1.8.2-1 (lb-1.7.2-1)
-- fix debug output redirection without tscat in startup script
-- support notification expiration in interlogger
-- implement expired notification purging on server
-- rewrite internal event number increment code to avoid race & inifinit loop
-  with read-consistent transactional database (should fix bug #27555)
-- revert enforced "strict locking" with transcactions (not needed anymore)
-
-1.8.3-1 (lb-1.7.4-1)
-- JP plugin: implementation of finalDoneStatus and history status attributes
-- fix double-free in state machine
-
-1.9.0-1 (lb-1.8.0-1)
-- store dumps in GLITE_LOCATION_VAR rather than /tmp
-- don't waste memory while reindexing
-- handle subjob embryos in reindexing
-- unify error handling for store and query
-- don't clobber store errors with job unlocking
-- don't send CollectionState from lb proxy to server
-- export UI host and VOMS FQAN to RGMA
-- don't coredump on requesting notifications that are denied
-- don't return empty results for some non-indexed queries
-
-1.9.1-1
-- clarified soap error messages
-
-2.0.0-1
-- LB 2.0 release
-
-2.0.0-2
-- fixed configure to work in etics
-
-2.0.0-3
-- configure script update (globus flavors added to configure call)
-
-2.0.0-4
-- fixed server dependency on voms-api-cpp instead of voms-api-c in configure
-
-2.0.0-5
-- fixed credential setting via gsoap-plugin (switching to a newly introduced API call)
-- minor initialization/freeing fixes
-- printout typo fix
-
-2.0.1-1
-- (from 1.9.2-1) Support for chconfig in startup scripts (#27055)
-- (from 1.9.2-1) Support for JP importer in startup scripts
-- (from 1.9.2-1) Support for variant DN certificates (workaround for #41820)
-- (from 1.9.2-1) Recalculate subjob states after DB version upgrade (#25871)
-- (from 1.9.2-1) Ignore reseource_usage events when computing job states (#43767)
-- (from 1.9.2-1) Fix sequence code processing for Change ACL events
-- (from 1.9.2-1) WS example fix
-- Reflect job conditions while processing queries for events (#32390)
-- Support for 'greater' and 'smalleer' comparisons in jobids 
-- Modified handling of state-dependent timeouts.
-
-2.0.1-2
-- Notif IL installation removed from makefile
-- configure script updated
-
-2.0.2-1
-- RSS feed implementation
-- Fixed notification expiry
-- Fixes to ACL handling
-- Fixed authorization in simple interface
-- Support for JDL changes in JDL-based notifications
-- Initial implementation of WS notifications
-
-2.0.2-2
-- build wrt. voms 1.9.8 (globus-less)
-
-2.0.2-3
-- Makefile relies on the libdir variable
-- New configure script
-
-2.0.3-1
-- Updated migration script
-- Memleak fixes
-- Support for background purge funcionality
-
-2.0.3-2
-- Rebuild with lb.state-machine 1.0.2-1
-
-2.0.6-1
-- Starting proxy support
-- Fixed collection state with cancelled subjobs
-
----
-Crystal ball:
-2.0.4-1
-- Consider arch libdir when linking c-ares
-- Checking the c-ares version, fix for c-ares >= 1.5.0.
-
-2.0.5-1
-- Reflect updates in the database module
-- Adjusted grey job purges (purge undefined jobs etc.)
-
-2.0.3-3
-- install libraries into $libdir
-- buildtime dependency pn c-ares
diff --git a/org.glite.lb.server/project/build.number b/org.glite.lb.server/project/build.number
deleted file mode 100644 (file)
index 10fccab..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#Fri Aug 18 12:32:02 CEST 2006
-module.build=0245
diff --git a/org.glite.lb.server/project/build.properties b/org.glite.lb.server/project/build.properties
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/org.glite.lb.server/project/configure.properties.xml b/org.glite.lb.server/project/configure.properties.xml
deleted file mode 100644 (file)
index 3a73336..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Configuration options for the GLite LB Client module
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-       Version info: $Id$
-       Release: $Name$
-
-       Revision history:
-       $Log$
-       Revision 1.11  2006/03/17 11:47:02  zsalvet
-       Adapt RGMA export file format and file handling to lcg-mon-job-status
-       use. Socket notification code is still available and is nonblocking now.
-       C ClassAd API is used to retrieve VO from JDL.
-
-       Revision 1.10  2006/03/15 18:13:51  akrenek
-       cares
-       
-       Revision 1.9  2006/03/15 18:12:21  akrenek
-       merge 1.5
-       
-       Revision 1.8.4.2  2006/02/20 09:14:30  zsalvet
-       Revert unfinished changes committed by mistake.
-       
-       Revision 1.8  2005/09/19 15:24:20  akrenek
-       "The gigantic merge"; from release 1.4 branch to HEAD
-       
-       Revision 1.7.2.1  2005/08/09 15:02:10  jskrabal
-       - build with broken gsoap 2.7.0 repository package
-       
-       Revision 1.7  2005/08/03 09:30:28  akrenek
-       Merged the release 1.0 branch
-       
-       Revision 1.6  2005/01/21 11:27:44  jpospi
-       completely remove gridsite.prefix and voms.prefix
-       
-       Revision 1.5  2005/01/20 11:43:00  jpospi
-       handle correctly gridsite_prefix and voms_prefix
-       
-       Revision 1.4.2.1  2005/05/19 13:41:22  akrenek
-       fix build with mysql 4.1.x
-       
-       Revision 1.4  2004/10/15 11:03:03  jskrabal
-       - merge fixes
-       
-       Revision 1.3  2004/10/06 08:14:36  dkouril
-       Support for VOMS and GACL (gridsite) from SCM CVS
-       - legacy names of GACL routines changed to new ones, which also prevents from
-         conflicts with a few older routine names being badly redefined to new ones
-       - VOMS and GACL are still commented out in the Makefile until a correct way
-         of defining dependencies is negotiated.
-       
-       Revision 1.2.2.1  2004/09/21 07:39:45  akrenek
-       
-       - First version of BK server using "server bones" library and WS protocol.
-       - Under hard development - unstable & buggy
-       
-       Revision 1.2  2004/09/08 13:38:03  akrenek
-       query event unit test (not complete yet)
-       
-       Revision 1.1  2004/07/07 12:08:09  akrenek
-       *** empty log message ***
-       
-       Revision 1.2  2004/07/06 20:47:11  flammer
-       Moved to configure.properties.xml
-       
-       
--->
-
-       <!-- ======================================================
-         Define extra properties here ...
-         ====================================================== -->
-        
-       <project name="LB Client configuration options">                                                                        
-               <target name="lbmakefiles">
-                       <exec executable="ln" failonerror="true">
-                               <arg line="-fs ${component.dir}/Makefile ${module.build.dir}/Makefile"/>
-                       </exec>
-                       <echo file="${module.build.dir}/Makefile.inc">
-top_srcdir=..
-builddir=build
-stagedir=${stage.abs.dir}
-distdir=${dist.dir}
-globalprefix=${global.prefix}
-lbprefix=${subsystem.prefix}
-package=${module.package.name}
-PREFIX=${install.dir}
-version=${module.version}
-glite_location=${with.glite.location}
-globus_prefix=${with.globus.prefix}
-expat_prefix=${with.expat.prefix}
-cares_prefix=${with.c-ares.prefix}
-mysql_prefix=${with.mysql.prefix}
-mysql_version=${ext.mysql.version}
-cppunit_prefix=${with.cppunit.prefix}
-gsoap_prefix=${with.gsoap.prefix}
-gsoap_version=${ext.gsoap.version}
-classads_prefix=${with.classads.prefix}
-thrflavour=${with.globus.thr.flavor}
-nothrflavour=${with.globus.nothr.flavor}
-                       </echo>
-           </target>
-       </project>
diff --git a/org.glite.lb.server/project/package.description b/org.glite.lb.server/project/package.description
deleted file mode 100644 (file)
index 9468cb5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-glite-lb-server is the gLite LB server. This package contains the LB server daemon (glite-lb-bkserverd) and a tool for rebuilding server indices (glite-lb-bkindex).
diff --git a/org.glite.lb.server/project/package.summary b/org.glite.lb.server/project/package.summary
deleted file mode 100644 (file)
index c5ac102..0000000
+++ /dev/null
@@ -1 +0,0 @@
-gLite Logging and Bookkeeping server
diff --git a/org.glite.lb.server/project/properties.xml b/org.glite.lb.server/project/properties.xml
deleted file mode 100755 (executable)
index 781ad01..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Common build properties file for the Glite LB Server component
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-       Version info: $Id$
-       Release: $Name$ 
-       
-       Revision history:
-       $Log$
--->
-
-<project name="LB Server component common properties">
-
-       <!-- Include build properties to allow overwriting 
-            of properties for subsystem                    -->
-       <property file="build.properties" />    
-
-       <!-- ======================================================
-          Define corresponding subsystem properties
-                ====================================================== -->
-
-       <!-- Subsystem name -->
-       <property name="subsystem.name" value="${lb.subsystem.name}"/>
-               
-       <!-- Subsystem prefix -->
-       <property name="subsystem.prefix" value="${lb.subsystem.prefix}"/>
-
-       <!-- ======================================================
-          Define component properties
-                ====================================================== -->
-                               
-       <!-- Component name prefix -->
-       <property name="component.prefix" value="server" />
-                       
-       <!-- ======================================================
-          Define general component properties
-                ====================================================== -->
-       
-       <import file="${component.general.properties.file}" />
-                                               
-       <!-- ======================================================
-                Define extra properties here ...
-                ====================================================== -->
-                
-                                                               
-</project>
\ No newline at end of file
diff --git a/org.glite.lb.server/project/tar_exclude b/org.glite.lb.server/project/tar_exclude
deleted file mode 100644 (file)
index b3133e4..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure-options.xml
-.cvsignore
-.project
-.cdtproject
diff --git a/org.glite.lb.server/project/version.properties b/org.glite.lb.server/project/version.properties
deleted file mode 100644 (file)
index 5b1ea84..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-# : /cvs/jra1mw/org.glite.lb.server/project/version.properties,v 1.185 2008/06/25 13:12:58 akrenek Exp $
-module.version=2.0.6
-module.age=1
diff --git a/org.glite.lb.server/src/bkindex.c b/org.glite.lb.server/src/bkindex.c
deleted file mode 100644 (file)
index acd7894..0000000
+++ /dev/null
@@ -1,443 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <sysexits.h>
-#include <assert.h>
-#include <errno.h>
-
-#include "glite/jobid/strmd5.h"
-#include "glite/lbu/trio.h"
-#include "glite/lb/context-int.h"
-#include "index.h"
-#include "jobstat.h"
-#include "db_supp.h"
-#include "openserver.h"
-#include "db_calls.h"
-
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#include "srv_perf.h"
-
-enum lb_srv_perf_sink sink_mode;
-#endif
-
-/* XXX: referenced global variables, unsed in bkindex */
-char   *server_key,*server_cert;
-int    enable_lcas;
-
-static struct option opts[] = {
-       { "mysql",1,NULL,'m' },
-       { "remove",0,NULL,'R' },
-       { "really",0,NULL,'r' },
-       { "dump",0,NULL,'d' },
-       { "verbose",0,NULL,'v' },
-       { NULL, 0, NULL, 0 }
-};
-
-static void usage(const char *);
-static void do_exit(edg_wll_Context,int);
-static char *col_list(const edg_wll_QueryRec *);
-static char *db_col_type(const edg_wll_QueryRec *);
-static edg_wll_ErrorCode edg_wll_RefreshIColumns(edg_wll_Context, void *);
-
-/* XXX: don't bother with malloc() of arrays that are tiny in real life */
-#define CI_MAX 200
-
-int debug;
-
-int main(int argc,char **argv)
-{
-       int     opt;
-       char    *dbstring = getenv("LBDB");
-       char    *fname = "-";
-       int     dump = 0, really = 0, verbose = 0, remove_all = 0;
-       edg_wll_Context ctx;
-       edg_wll_QueryRec        **old_indices = NULL,**new_indices;
-       edg_wll_QueryRec        *new_columns[CI_MAX],*old_columns[CI_MAX];
-       int     add_columns[CI_MAX],drop_columns[CI_MAX];
-       int     add_indices[CI_MAX],drop_indices[CI_MAX];
-       edg_wll_IColumnRec *added_icols;
-       int     nadd_icols;
-       char    **index_names = NULL;
-       int     i,j,k;
-       int     nnew,nold,nadd,ndrop;
-       char    *stmt;
-
-       for (i=0; i<CI_MAX; i++) add_indices[i] = drop_indices[i] = -1;
-       memset(new_columns,0,sizeof new_columns);
-       memset(old_columns,0,sizeof old_columns);
-       memset(add_columns,0,sizeof add_columns);
-       memset(drop_columns,0,sizeof drop_columns);
-
-       while ((opt = getopt_long(argc,argv,"m:rRdv",opts,NULL)) != EOF) switch (opt) {
-               case 'm': dbstring = optarg; break;
-               case 'r': really = 1; break;
-               case 'R': remove_all = 1; break;
-               case 'd': dump = 1; break;
-               case 'v': verbose++; break;
-               case '?': usage(argv[0]); exit(EX_USAGE);
-       }
-
-       if (really && dump) { usage(argv[0]); exit(EX_USAGE); }
-       if (really && remove_all) { usage(argv[0]); exit(EX_USAGE); }
-       if (optind < argc) {
-               if (dump || remove_all) { usage(argv[0]); exit(EX_USAGE); }
-               else fname = argv[optind];
-       }
-
-       edg_wll_InitContext(&ctx);
-       if (!dbstring) dbstring = DEFAULTCS;
-       if (edg_wll_Open(ctx,dbstring)) do_exit(ctx,EX_UNAVAILABLE);
-       if ((ctx->dbcaps = glite_lbu_DBQueryCaps(ctx->dbctx)) == -1) do_exit(ctx, EX_SOFTWARE);
-       if (!(ctx->dbcaps & GLITE_LBU_DB_CAP_INDEX)) {
-               edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_CALL, "index capability not available");
-               do_exit(ctx, EX_SOFTWARE);
-       }
-       if (!(ctx->dbcaps & GLITE_LBU_DB_CAP_TRANSACTIONS)) {
-               edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_CALL, "transactions capability not available");
-               do_exit(ctx, EX_SOFTWARE);
-       }
-       glite_lbu_DBSetCaps(ctx->dbctx, ctx->dbcaps);
-
-       if (edg_wll_QueryJobIndices(ctx,&old_indices,&index_names)) do_exit(ctx,EX_SOFTWARE);
-
-       if (dump) {
-               if (edg_wll_DumpIndexConfig(ctx,fname,old_indices)) do_exit(ctx,EX_SOFTWARE);
-               else if ( !remove_all ) goto quit;
-       }
-
-       if (remove_all) {
-               if (verbose) printf("Dropping all indices");
-               for (i=0; index_names && index_names[i]; i++) {
-                       asprintf(&stmt,"alter table states drop index `%s`",index_names[i]);
-                       if (verbose) putchar('.');
-                       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
-                       free(stmt);
-               }
-               if (verbose) puts(" done");
-               if (verbose) printf("Dropping index columns");
-               for (i=0; old_indices && old_indices[i]; i++) {
-                       char *cname = edg_wll_QueryRecToColumn(old_indices[i]);
-                       asprintf(&stmt,"alter table states drop column `%s`",cname);
-                       if (verbose) putchar('.');
-                       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
-                       free(stmt);
-                       free(cname);
-               }
-               if (verbose) puts(" done");
-               goto quit;
-       }
-
-       if (edg_wll_ParseIndexConfig(ctx,fname,&new_indices))
-               do_exit(ctx,edg_wll_Error(ctx,NULL,NULL) == EINVAL ? EX_DATAERR : EX_IOERR);
-
-       /* FIXME: check duplicate columns in indices */
-
-/* indices to add & drop */
-       nadd = ndrop = 0;
-       if (old_indices && new_indices) {
-               for (i=0; old_indices[i]; i++) {
-                       for (j=0; new_indices[j]; j++) {
-                               for (k=0; old_indices[i][k].attr &&
-                                       !edg_wll_CmpColumn(&old_indices[i][k],&new_indices[j][k]);
-                                       k++);
-                               if (!old_indices[i][k].attr && !new_indices[j][k].attr) break;
-                       }
-                       if (!new_indices[j]) drop_indices[ndrop++] = i;
-               }
-                                       
-               for (i=0; new_indices[i]; i++) {
-                       for (j=0; old_indices[j]; j++) {
-                               for (k=0; new_indices[i][k].attr &&
-                                       !edg_wll_CmpColumn(&new_indices[i][k],&old_indices[j][k]);
-                                       k++);
-                               if (!new_indices[i][k].attr && !old_indices[j][k].attr) break;
-                       }
-                       if (!old_indices[j]) add_indices[nadd++] = i;
-               }
-       }
-       else if (new_indices) for (i=0; new_indices[i]; i++) add_indices[i] = i;
-       else if (old_indices) for (i=0; old_indices[i]; i++) drop_indices[i] = i;
-
-/* old and new column sets */
-       nold = nnew = 0;
-       if (old_indices) for (i=0; old_indices[i]; i++) 
-               for (j=0; old_indices[i][j].attr; j++) {
-                       for (k=0; k<nold && edg_wll_CmpColumn(old_columns[k],&old_indices[i][j]); k++);
-                       if (k == nold) {
-                               assert(nold < CI_MAX);
-                               old_columns[nold++] = &old_indices[i][j];
-                       }
-               }
-
-       if (new_indices) for (i=0; new_indices[i]; i++) 
-               for (j=0; new_indices[i][j].attr; j++) {
-                       for (k=0; k<nnew && edg_wll_CmpColumn(new_columns[k],&new_indices[i][j]); k++);
-                       if (k == nnew) {
-                               assert(nnew < CI_MAX);
-                               new_columns[nnew++] = &new_indices[i][j];
-                       }
-               }
-
-/* go! */
-       if (!really) puts("\n** Dry run, no actual actions performed **\n");
-
-       if (verbose) puts("Dropping indices ...");
-       for (i=0; drop_indices[i] >= 0; i++) {
-               if (verbose) { 
-                       char    *n = col_list(old_indices[drop_indices[i]]);
-                       printf("\t%s(%s) ... ",index_names[drop_indices[i]],n); fflush(stdout);
-                       free(n);
-               }
-               if (really) {
-                       asprintf(&stmt,"alter table states drop index `%s`",index_names[drop_indices[i]]);
-                       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
-                       free(stmt);
-               }
-               if (verbose) puts(really ? "done" : "");
-       }
-
-       if (verbose) puts("Dropping columns ...");
-       for (i=0; i<nold; i++) {
-               for (j=0; j<nnew && edg_wll_CmpColumn(old_columns[i],new_columns[j]); j++);
-               if (j == nnew) {
-                       char    *cname = edg_wll_QueryRecToColumn(old_columns[i]);
-                       if (verbose) printf("\t%s\n",cname); 
-                       if (really) {
-                               asprintf(&stmt,"alter table states drop column `%s`",cname);
-                               if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
-                               free(stmt);
-                       }
-                       free(cname);
-               }
-       }
-
-       added_icols = calloc(nnew+1, sizeof(edg_wll_IColumnRec));
-       nadd_icols = 0;
-       if (verbose) puts("Adding columns ...");
-       for (i=0; i<nnew; i++) {
-               for (j=0; j<nold && edg_wll_CmpColumn(new_columns[i],old_columns[j]); j++);
-               if (j == nold) {
-                       char    *cname = edg_wll_QueryRecToColumn(new_columns[i]);
-                       if (verbose) printf("\t%s\n",cname); 
-                       if (really) {
-                               char    *ctype = db_col_type(new_columns[i]);
-                               asprintf(&stmt,"alter table states add `%s` %s",cname,ctype);
-                               if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
-                               free(stmt);
-                       }
-                       memcpy(&added_icols[nadd_icols].qrec, new_columns[i], sizeof(edg_wll_QueryRec));
-                       added_icols[nadd_icols].colname = strdup(cname);
-                       if (new_columns[i]->attr == EDG_WLL_QUERY_ATTR_USERTAG)
-                               added_icols[nadd_icols].qrec.attr_id.tag =
-                                       strdup(new_columns[i]->attr_id.tag);
-                       nadd_icols++;
-                       free(cname);
-               }
-       }
-
-       if (nadd_icols) {
-               added_icols[nadd_icols].qrec.attr = EDG_WLL_QUERY_ATTR_UNDEF;
-               added_icols[nadd_icols].colname = NULL;
-               if (verbose) puts("Refreshing data ...");
-               if (really && edg_wll_RefreshIColumns(ctx, (void*) added_icols)) do_exit(ctx,EX_SOFTWARE);
-       }
-       else if (verbose) puts("No data refresh required");
-
-       for (nadd_icols--; nadd_icols >= 0; nadd_icols--)
-               edg_wll_FreeIColumnRec(&added_icols[nadd_icols]);
-       free(added_icols);
-
-       if (verbose) puts("Creating indices ...");
-       for (i=0; add_indices[i] >= 0; i++) {
-               char    *l = col_list(new_indices[add_indices[i]]);
-               char    *n = str2md5base64(l);
-               if (verbose) { printf("\t%s(%s) ... ",n,l); fflush(stdout); }
-               if (really) {
-                       asprintf(&stmt,"create index `%s` on states(%s)",n,l);
-                       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) do_exit(ctx,EX_SOFTWARE);
-                       free(stmt);
-               }
-               free(n); free(l);
-               if (verbose) puts(really ? "done" : "");
-       }
-
-quit:
-       if (index_names) {
-               for (i = 0; index_names[i]; i++) free(index_names[i]);
-               free(index_names);
-       }
-       if (old_indices) {
-               for (i = 0; old_indices[i]; i++) {
-                       for (j = 0; old_indices[i][j].attr; j++) edg_wll_QueryRecFree(&old_indices[i][j]);
-                       free(old_indices[i]);
-               }
-               free(old_indices);
-       }
-       edg_wll_Close(ctx);
-       edg_wll_FreeContext(ctx);
-
-       return 0;
-}
-
-static char *col_list(const edg_wll_QueryRec *ind)
-{
-       char    *ret,*aux,size[50] = "";
-       int     j;
-
-       aux = edg_wll_QueryRecToColumn(ind);
-       if (ind->value.i) sprintf(size,"(%d)",ind->value.i);
-       asprintf(&ret,"`%s`%s",aux,size);
-       free(aux);
-
-       for (j=1; ind[j].attr; j++) {
-               char    *n = edg_wll_QueryRecToColumn(ind+j),size[50] = "";
-               if (ind[j].value.i) sprintf(size,"(%d)",ind[j].value.i);
-               aux = ret;
-               asprintf(&ret,"%s,`%s`%s",aux,n,size);
-               free(n); free(aux);
-       }
-       return ret;
-}
-
-static char *db_col_type(const edg_wll_QueryRec *r)
-{
-       switch (r->attr) {
-               case EDG_WLL_QUERY_ATTR_OWNER:
-               case EDG_WLL_QUERY_ATTR_LOCATION:
-               case EDG_WLL_QUERY_ATTR_DESTINATION:
-               case EDG_WLL_QUERY_ATTR_USERTAG:
-               case EDG_WLL_QUERY_ATTR_HOST:
-               case EDG_WLL_QUERY_ATTR_CHKPT_TAG:
-               case EDG_WLL_QUERY_ATTR_NETWORK_SERVER:
-               case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                       /* XXX: 255 may not be enough for location or destination */
-                       return "varchar(255) binary null"; 
-
-               case EDG_WLL_QUERY_ATTR_TIME:
-               case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-               case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                       return "datetime null";
-               default:
-                       return NULL;
-       }
-}
-
-static void do_exit(edg_wll_Context ctx,int code)
-{
-       char    *et,*ed;
-
-       edg_wll_Error(ctx,&et,&ed);
-       fprintf(stderr,"glite-lb-bkindex: %s (%s)\n",et,ed);
-       edg_wll_Close(ctx);
-       edg_wll_FreeContext(ctx);
-       exit(code);
-}
-
-static void usage(const char *me)
-{
-       fprintf(stderr,"usage: %s <options> [file]\n"
-                       "       -m,--mysql <dbstring>   use non-default database connection\n"
-                       "       -r,--really             really perform reindexing\n"
-                       "       -R,--remove             remove all indexes from server\n"
-                       "       -d,--dump               dump current setup\n"
-                       "       -v,--verbose            increase verbosity (2 levels)\n"
-                       "\n     -r and -d are mutually exlusive\n"
-                       "\n     -r and -R are mutually exlusive\n"
-                       "       [file] is applicable only without -d and -R\n",
-                       me);
-}
-
-/*
- * Set values of index columns in state table (after index reconfiguration)
- */
-
-static edg_wll_ErrorCode edg_wll_RefreshIColumns(edg_wll_Context ctx, void *job_index_cols) {
-
-       glite_lbu_Statement sh;
-       glite_lbu_Statement sh0;
-       int njobs, ret = -1;
-       intJobStat *stat;
-       edg_wlc_JobId jobid;
-       char *res[5];
-       char *res0[1];
-       char *rest;
-       char *icvalues, *stmt;
-       int i;
-
-       edg_wll_ResetError(ctx);
-       if (!job_index_cols) return 0;
-
-       if ((njobs = edg_wll_ExecSQL(ctx, "select jobid from states", &sh0)) < 0) {
-               glite_lbu_FreeStmt(&sh0);
-               return edg_wll_Error(ctx, NULL, NULL);
-       }
-       while ((ret=edg_wll_FetchRow(ctx,sh0,sizeof(res0)/sizeof(res0[0]),NULL,res0)) >0) {
-               do {
-                       if (edg_wll_Transaction(ctx)) goto rollback;
-                       trio_asprintf(&stmt, "select s.jobid,s.int_status,s.seq,s.version,j.dg_jobid"
-                                       " from states s, jobs j where s.jobid='%|Ss' and s.jobid=j.jobid"
-                                       " for update",
-                                       res0[0]);
-                       if ((edg_wll_ExecSQL(ctx, stmt ,&sh)) < 1) {
-                               glite_lbu_FreeStmt(&sh);
-                               free(stmt); stmt = NULL;
-                               goto rollback;
-                       }
-                       free(stmt); stmt = NULL;
-                       if ((ret=edg_wll_FetchRow(ctx,sh,sizeof(res)/sizeof(res[0]),NULL,res)) <= 0) {
-                               glite_lbu_FreeStmt(&sh);
-                               goto rollback;
-                       }
-
-                       if (strcmp(res[3], INTSTAT_VERSION)) {
-                               stat = NULL;
-                               if (!edg_wlc_JobIdParse(res[4], &jobid)) {
-                                       if ((stat = malloc(sizeof(intJobStat))) != NULL) {
-                                               if (!edg_wll_LoadIntState(ctx, jobid, 0 /* DONT_LOCK */, -1 /*all events*/, &stat)) {
-                                                       destroy_intJobStat_extension(stat);
-                                                       free(stat);
-                                                       stat = NULL;
-                                               } else {
-                                                       if (edg_wll_intJobStatus(ctx, jobid, 0, stat, 1, 0)) {
-                                                               free(stat);
-                                                               stat = NULL;
-                                                               if (edg_wll_Error(ctx,NULL,NULL) != ENOENT) do_exit(ctx, EX_SOFTWARE);
-                                                       }
-                                               }
-                                       }
-                                       edg_wlc_JobIdFree(jobid);
-                               }
-                       } else {
-                               stat = dec_intJobStat(res[1], &rest);
-                               if (rest == NULL) stat = NULL;
-                               if (stat == NULL) fprintf(stderr,"glite-lb-bkindex: warning: "
-                                                       "cannot decode int_status for %s\n",res[4]);
-                       }
-                       if (stat != NULL) {
-                               edg_wll_IColumnsSQLPart(ctx, job_index_cols, &stat->pub, 0, NULL, &icvalues);
-                               trio_asprintf(&stmt, "update states set seq=%s%s where jobid='%|Ss'", res[2], icvalues, res[0]);
-                               ret = edg_wll_ExecSQL(ctx, stmt, NULL);
-                               free(icvalues);
-                               free(stmt);
-                               destroy_intJobStat(stat); free(stat);
-                       }
-
-                       for (i = 0; i < 5; i++) free(res[i]);
-                       free(res0[0]);
-                       glite_lbu_FreeStmt(&sh);
-
-                       if (ret < 0) goto rollback;
-rollback:;
-               }  while (edg_wll_TransNeedRetry(ctx));
-               if (edg_wll_Error(ctx, NULL, NULL))  goto err;
-       }
-err:
-       glite_lbu_FreeStmt(&sh0);
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
diff --git a/org.glite.lb.server/src/bkserverd.c b/org.glite.lb.server/src/bkserverd.c
deleted file mode 100644 (file)
index 8f8e62a..0000000
+++ /dev/null
@@ -1,1791 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <linux/limits.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <sys/un.h>
-#include <netinet/in.h>
-#include <signal.h>
-#include <errno.h>
-#include <netdb.h>
-#include <limits.h>
-#include <assert.h>
-#include <syslog.h>
-#include <sys/time.h>
-#include <arpa/inet.h>
-#include <arpa/nameser.h>
-#include <resolv.h>
-#include <ares.h>
-#include <errno.h>
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-#include "soap_version.h"
-#include <stdsoap2.h>
-#include "glite/security/glite_gsplugin.h"
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-#include "glite/jobid/cjobid.h"
-#include "glite/security/glite_gss.h"
-#include "glite/lbu/srvbones.h"
-#include "glite/lbu/maildir.h"
-#include "glite/lb/context.h"
-#include "glite/lb/mini_http.h"
-#include "glite/lb/context-int.h"
-
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#include "srv_perf.h"
-
-enum lb_srv_perf_sink sink_mode;
-#endif
-
-#include "lb_http.h"
-#include "lb_proto.h"
-#include "index.h"
-#include "lb_authz.h"
-#include "il_notification.h"
-#include "stats.h"
-#include "db_calls.h"
-#include "db_supp.h"
-#include "openserver.h"
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-#  if GSOAP_VERSION < 20700
-        /*     defined in <arpa/nameser.h> and it's includes
-         *     break the build
-         */
-#    undef STATUS
-#    undef REFUSED
-#  endif
-#include "LoggingAndBookkeeping.nsmap"
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-extern int edg_wll_StoreProto(edg_wll_Context ctx);
-extern int edg_wll_StoreProtoProxy(edg_wll_Context ctx);
-
-extern char *lbproxy_ilog_socket_path;
-extern char *lbproxy_ilog_file_prefix;
-
-
-#ifdef LB_PERF
-extern void _start (void), etext (void);
-#endif
-
-#define CON_QUEUE              20      /* accept() */
-#define SLAVE_OVERLOAD         10      /* queue items per slave */
-#define CONNECT_TIMEOUT                30
-#define IDLE_TIMEOUT           10      /* keep idle connection that many seconds */
-#define REQUEST_TIMEOUT                120     /* one client may ask one slave multiple times */
-                                       /* but only limited time to avoid DoS attacks */
-#define DNS_TIMEOUT            5       /* how long wait for DNS lookup */
-#define SLAVE_CONNS_MAX                500     /* commit suicide after that many connections */
-
-#ifndef EDG_PURGE_STORAGE
-#define EDG_PURGE_STORAGE      "/tmp/purge"
-#endif
-
-#ifndef EDG_DUMP_STORAGE
-#define EDG_DUMP_STORAGE       "/tmp/dump"
-#endif
-
-#ifndef JPREG_DEF_DIR
-#define JPREG_DEF_DIR          "/tmp/jpreg"
-#endif
-
-/* file to store pid and generate semaphores key */
-#ifndef EDG_BKSERVERD_PIDFILE
-#define EDG_BKSERVERD_PIDFILE  "/var/run/glite-lb-bkserverd.pid"
-#endif
-
-#ifndef GLITE_LBPROXY_SOCK_PREFIX
-#define GLITE_LBPROXY_SOCK_PREFIX       "/tmp/lb_proxy_"
-#endif
-
-#ifndef dprintf
-#define dprintf(x)             { if (debug) printf x; }
-#endif
-
-#define sizofa(a)              (sizeof(a)/sizeof((a)[0]))
-
-#define        SERVICE_PROXY           DB_PROXY_JOB
-#define SERVICE_SERVER         DB_SERVER_JOB
-#define SERVICE_PROXY_SERVER   SERVICE_PROXY+SERVICE_SERVER
-
-
-
-int                                    enable_lcas = 0;
-int                                            debug  = 0;
-int                                            rgma_export = 0;
-static const int               one = 1;
-static int                             noAuth = 0;
-static int                             noIndex = 0;
-static int                             strict_locking = 0;
-static int greyjobs = 0;
-static int count_statistics = 0;
-static int                             hardJobsLimit = 0;
-static int                             hardEventsLimit = 0;
-static int                             hardRespSizeLimit = 0;
-static char                       *dbstring = NULL,*fake_host = NULL;
-int                                    transactions = -1;
-int                                    use_dbcaps = 0;
-static int                             fake_port = 0;
-static char                      **super_users = NULL;
-static int                             slaves = 10;
-static char                       *purgeStorage = EDG_PURGE_STORAGE;
-static char                       *dumpStorage = EDG_DUMP_STORAGE;
-static char                       *jpregDir = JPREG_DEF_DIR;
-static int                             jpreg = 0;
-static char                            *server_subject = NULL;
-
-
-static time_t                  purge_timeout[EDG_WLL_NUMBER_OF_STATCODES];
-static time_t                  notif_duration_max = 60*60*24,
-                               notif_duration = 60*60*2;
-
-static edg_wll_GssCred mycred = NULL;
-time_t                                 cert_mtime = 0;
-char                              *cadir = NULL,
-                                          *vomsdir = NULL,
-                                          *server_key = NULL,
-                                          *server_cert = NULL;
-static int             mode = SERVICE_SERVER;
-static char             sock_store[PATH_MAX],
-                        sock_serve[PATH_MAX];
-static int             con_queue = CON_QUEUE;
-static char             host[300];
-static char *           port;
-static time_t          rss_time = 60*60;
-
-
-
-
-static struct option opts[] = {
-        {"enable-lcas", 0, NULL,       'A'},
-       {"cert",        1, NULL,        'c'},
-       {"key",         1, NULL,        'k'},
-       {"CAdir",       1, NULL,        'C'},
-       {"VOMSdir",     1, NULL,        'V'},
-       {"port",        1, NULL,        'p'},
-#ifdef GLITE_LB_SERVER_WITH_WS
-       {"wsport",  1, NULL,    'w'},
-#endif /* GLITE_LB_SERVER_WITH_WS */
-       {"address",     1, NULL,        'a'},
-       {"debug",       0, NULL,        'd'},
-       {"rgmaexport",  0, NULL,        'r'},
-       {"mysql",       1, NULL,        'm'},
-       {"noauth",      0, NULL,        'n'},
-       {"slaves",      1, NULL,        's'},
-       {"pidfile",     1, NULL,        'i'},
-       {"purge-prefix",        1, NULL,        'S'},
-       {"dump-prefix", 1, NULL,        'D'},
-       {"jpreg-dir",   1, NULL,        'J'},
-       {"enable-jpreg-export", 1, NULL,        'j'},
-       {"super-user",  1, NULL,        'R'},
-       {"super-users-file",    1, NULL,'F'},
-       {"no-index",    1, NULL,        'x'},
-       {"strict-locking",0, NULL,      'O'},
-       {"limits",      1, NULL,        'L'},
-       {"notif-dur",   1, NULL,        'N'},
-       {"notif-il-sock",       1, NULL,        'X'},
-       {"notif-il-fprefix",    1, NULL,        'Y'},
-       {"count-statistics",    1, NULL,        'T'},
-       {"request-timeout",     1, NULL,        't'},
-       {"silent",      0, NULL, 'z' },
-#ifdef LB_PERF
-       {"perf-sink",           1, NULL,        'K'},
-#endif
-       {"transactions",        1,      NULL,   'b'},
-       {"greyjobs",    0,      NULL,   'g'},
-       {"withproxy",   0,      NULL,   'B'},
-       {"proxyonly",   0,      NULL,   'P'},
-       {"sock",        1,      NULL,   'o'},
-       {"con-queue",   1,      NULL,   'q'},
-       {"proxy-il-sock",       1,      NULL,   'W'},
-       {"proxy-il-fprefix",    1,      NULL,   'Z'},
-       {"rss-time",    1,      NULL,   'I'},
-       {NULL,0,NULL,0}
-};
-
-static const char *get_opt_string = "Ac:k:C:V:p:a:drm:ns:i:S:D:J:jR:F:xOL:N:X:Y:T:t:zb:gPBo:q:W:Z:I:"
-#ifdef GLITE_LB_SERVER_WITH_WS
-       "w:"
-#endif
-#ifdef LB_PERF
-       "K:"
-#endif
-;
-
-static void usage(char *me) 
-{
-       fprintf(stderr,"usage: %s [option]\n"
-               "\t-A, --enable-lcas\t activate LCAS-based authorization\n"
-               "\t-a, --address\t use this server address (may be faked for debugging)\n"
-               "\t-b, --transactions\t transactions switch (0, 1)\n"
-               "\t-k, --key\t private key file\n"
-               "\t-c, --cert\t certificate file\n"
-               "\t-C, --CAdir\t trusted certificates directory\n"
-               "\t-V, --VOMSdir\t trusted VOMS servers certificates directory\n"
-               "\t-p, --port\t port to listen\n"
-#ifdef GLITE_LB_SERVER_WITH_WS
-               "\t-w, --wsport\t port to serve the web services requests\n"
-#endif /* GLITE_LB_SERVER_WITH_WS */
-               "\t-m, --mysql\t database connect string\n"
-               "\t-d, --debug\t don't run as daemon, additional diagnostics\n"
-               "\t-r, --rgmaexport write state info to RGMA interface\n"
-               "\t-n, --noauth\t don't check user identity with result owner\n"
-               "\t-s, --slaves\t number of slave servers to fork\n"
-               "\t-i, --pidfile\t file to store master pid\n"
-               "\t-L, --limits\t query limits numbers in format \"events_limit:jobs_limit:size_limit\"\n"
-               "\t-N, --notif-dur default[:max]\t Duration of notification registrations in seconds (default and maximal)\n"
-               "\t-S, --purge-prefix\t purge files full-path prefix\n"
-               "\t-D, --dump-prefix\t dump files full-path prefix\n"
-               "\t-J, --jpreg-dir\t JP registration temporary files prefix (implies '-j')\n"
-               "\t-j, --enable-jpreg-export\t enable JP registration export (disabled by default)\n"
-               "\t--super-user\t user allowed to bypass authorization and indexing\n"
-               "\t--super-users-file\t the same but read the subjects from a file\n"
-               "\t--no-index=1\t don't enforce indices for superusers\n"
-               "\t          =2\t don't enforce indices at all\n"
-               "\t--strict-locking=1\t lock jobs also on storing events (may be slow)\n"
-               "\t--notif-il-sock\t socket to send notifications\n"
-               "\t--notif-il-fprefix\t file prefix for notifications\n"
-               "\t--count-statistics=1\t count certain statistics on jobs\n"
-               "\t                  =2\t ... and allow anonymous access\n"
-               "\t-t, --request-timeout\t request timeout for one client\n"
-               "\t--silent\t don't print diagnostic, even if -d is on\n"
-#ifdef LB_PERF
-               "\t-K, --perf-sink\t where to sink events\n"
-#endif
-               "\t-g,--greyjobs\t allow delayed registration (grey jobs), implies --strict-locking\n"
-               "\t-P,--proxyonly\t     run only proxy service\n"
-               "\t-B,--withproxy\t     run both server and proxy service\n"
-               "\t-o,--sock\t path-name to the local socket for communication with LB proxy\n"
-               "\t-q,--con-queue\t size of the connection queue (accept)\n"
-               "\t-W,--proxy-il-sock\t socket to send events to\n"
-               "\t-Z,--proxy-il-fprefix\t file prefix for events\n"
-               "\t-I,--rss-time age\t (in seconds) of job states published via RSS\n"
-
-       ,me);
-}
-
-static int wait_for_open(edg_wll_Context,const char *);
-static int decrement_timeout(struct timeval *, struct timeval, struct timeval);
-static int add_root(char *);
-static int read_roots(const char *);
-static int asyn_gethostbyaddr(char **, const char *, int, int, struct timeval *);
-static int parse_limits(char *, int *, int *, int *);
-static int check_mkdir(const char *);
-
-
-/*
- *     SERVER BONES structures and handlers
- */
-int bk_clnt_data_init(void **);
-
-       /*
-        *      Serve & Store handlers
-        */
-int bk_clnt_reject(int);
-int bk_handle_connection(int, struct timeval *, void *);
-int bk_accept_serve(int, struct timeval *, void *);
-int bk_accept_store(int, struct timeval *, void *);
-int bk_clnt_disconnect(int, struct timeval *, void *);
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-       /*
-        *      WS handlers
-        */
-int bk_handle_ws_connection(int, struct timeval *, void *);
-int bk_accept_ws(int, struct timeval *, void *);
-int bk_ws_clnt_reject(int);
-int bk_ws_clnt_disconnect(int, struct timeval *, void *);
-#endif         /*GLITE_LB_SERVER_WITH_WS */
-
-        /*
-         *      Proxy handlers
-         */
-int bk_clnt_reject_proxy(int);
-int bk_handle_connection_proxy(int, struct timeval *, void *);
-int bk_clnt_disconnect_proxy(int, struct timeval *, void *);
-
-  
-  #define SERVICE_SERVER_START 0 
-  #define SRV_SERVE                    0
-  #define SRV_STORE                    1
-#ifdef GLITE_LB_SERVER_WITH_WS
-  #define SRV_WS                       2
-  #define SERVICE_SERVER_SIZE          3
-
-  #define SERVICE_PROXY_START          3
-  #define SRV_SERVE_PROXY              3
-  #define SRV_STORE_PROXY              4
-  #define SERVICE_PROXY_SIZE           2
-#else
-  #define SERVICE_SERVER_SIZE          2
-
-  #define SERVICE_PROXY_START          2
-  #define SRV_SERVE_PROXY              2
-  #define SRV_STORE_PROXY              3
-  #define SERVICE_PROXY_SIZE           2
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-
-
-static struct glite_srvbones_service service_table[] = {
-       { "serve",      -1, bk_handle_connection, bk_accept_serve, bk_clnt_reject, bk_clnt_disconnect },
-       { "store",      -1, bk_handle_connection, bk_accept_store, bk_clnt_reject, bk_clnt_disconnect },
-#ifdef GLITE_LB_SERVER_WITH_WS
-       { "WS",         -1, bk_handle_ws_connection, bk_accept_ws, bk_ws_clnt_reject, bk_ws_clnt_disconnect },
-#endif /* GLITE_LB_SERVER_WITH_WS */
-       { "serve_proxy",        -1, bk_handle_connection_proxy, bk_accept_serve, bk_clnt_reject_proxy, bk_clnt_disconnect_proxy },
-       { "store_proxy",        -1, bk_handle_connection_proxy, bk_accept_store, bk_clnt_reject_proxy, bk_clnt_disconnect_proxy }
-};
-
-struct clnt_data_t {
-       edg_wll_Context                 ctx;
-#ifdef GLITE_LB_SERVER_WITH_WS
-       struct soap                        *soap;
-#endif /* GLITE_LB_SERVER_WITH_WS */
-       glite_lbu_DBContext     dbctx;
-       int                     dbcaps;
-       edg_wll_QueryRec          **job_index,**notif_index;
-       edg_wll_IColumnRec         *job_index_cols,*notif_index_cols;;
-       int                     mode;
-};
-
-
-
-int main(int argc, char *argv[])
-{
-       int                     i;
-       struct sockaddr_in      a;
-       int                                     opt, pidfile_forced = 0;
-       char                            pidfile[PATH_MAX] = EDG_BKSERVERD_PIDFILE,
-                                          *name;
-#ifdef GLITE_LB_SERVER_WITH_WS
-       char                       *ws_port;
-#endif /* GLITE_LB_SERVER_WITH_WS */
-       FILE                       *fpid;
-       edg_wll_Context         ctx;
-       edg_wll_GssStatus       gss_code;
-       struct timeval          to;
-       int                     request_timeout = REQUEST_TIMEOUT;
-       int                     silent = 0;
-       char                    socket_path_prefix[PATH_MAX] = GLITE_LBPROXY_SOCK_PREFIX;
-
-
-       name = strrchr(argv[0],'/');
-       if (name) name++; else name = argv[0];
-
-       memset(host, 0, sizeof host);
-       edg_wll_gss_gethostname(host,sizeof host);
-       host[sizeof host - 1] = 0;
-
-       asprintf(&port, "%d", GLITE_JOBID_DEFAULT_PORT);
-#ifdef GLITE_LB_SERVER_WITH_WS
-       asprintf(&ws_port, "%d", GLITE_JOBID_DEFAULT_PORT+3);
-#endif         /* GLITE_LB_SERVER_WITH_WS */
-       server_cert = server_key = cadir = vomsdir = NULL;
-
-/* no magic here: 1 month, 3 and 7 days */
-       for (i=0; i < EDG_WLL_NUMBER_OF_STATCODES; i++) purge_timeout[i] = 60*60*24*31; 
-       purge_timeout[EDG_WLL_JOB_CLEARED] = 60*60*24*3;
-       purge_timeout[EDG_WLL_JOB_ABORTED] = 60*60*24*7;
-       purge_timeout[EDG_WLL_JOB_CANCELLED] = 60*60*24*7;
-
-       while ((opt = getopt_long(argc,argv,get_opt_string,opts,NULL)) != EOF) switch (opt) {
-               case 'A': enable_lcas = 1; break;
-               case 'a': fake_host = strdup(optarg); break;
-               case 'b': transactions = atoi(optarg); break;
-               case 'c': server_cert = optarg; break;
-               case 'k': server_key = optarg; break;
-               case 'C': cadir = optarg; break;
-               case 'V': vomsdir = optarg; break;
-               case 'p': free(port); port = strdup(optarg); break;
-#ifdef GLITE_LB_SERVER_WITH_WS
-               case 'w': free(ws_port); ws_port = strdup(optarg); break;
-#endif /* GLITE_LB_SERVER_WITH_WS */
-               case 'd': debug = 1; break;
-               case 'z': silent = 1; break;
-               case 'r': rgma_export = 1; break;
-               case 'm': dbstring = optarg; break;
-               case 'n': noAuth = 1; break;
-               case 's': slaves = atoi(optarg); break;
-               case 'S': purgeStorage = optarg; break;
-               case 'D': dumpStorage = optarg; break;
-               case 'J': jpregDir = optarg; jpreg = 1; break;
-               case 'j': jpreg = 1; break;
-               case 'L':
-                       if ( !parse_limits(optarg, &hardJobsLimit, &hardEventsLimit, &hardRespSizeLimit) )
-                       {
-                               usage(name);
-                               return 1;
-                       }
-                       break;
-               case 'N': {
-                               int     std,max;
-                               switch (sscanf(optarg,"%d:%d",&std,&max)) {
-                                       case 2: notif_duration_max = max;
-                                               /* fallthrough */
-                                       case 1: notif_duration = std;
-                                               break;
-                                       default: 
-                                               usage(name);
-                                               return 1;
-                               }
-                       }  break;
-               case 'X': notif_ilog_socket_path = strdup(optarg); break;
-               case 'Y': notif_ilog_file_prefix = strdup(optarg); break;
-               case 'i': strcpy(pidfile,optarg); pidfile_forced = 1; break;
-               case 'R': add_root(optarg); break;
-               case 'F': if (read_roots(optarg)) return 1;
-                         break;
-               case 'x': noIndex = atoi(optarg);
-                         if (noIndex < 0 || noIndex > 2) { usage(name); return 1; }
-                         break;
-               case 'O': strict_locking = 1;
-                         break;
-               case 'T': count_statistics = atoi(optarg);
-                         break;
-               case 't': request_timeout = atoi(optarg);
-                         break;
-#ifdef LB_PERF
-               case 'K': sink_mode = atoi(optarg);
-                         break;
-#endif
-               case 'g': greyjobs = strict_locking = 1;
-                         break;
-               case 'P': mode = SERVICE_PROXY;
-                         break;
-               case 'B': mode = SERVICE_PROXY_SERVER;
-                         break;
-               case 'o': strcpy(socket_path_prefix, optarg);
-                         break;
-               case 'q': con_queue = atoi(optarg); 
-                         break;
-               case 'W': lbproxy_ilog_socket_path = strdup(optarg); 
-                         break;
-               case 'Z': lbproxy_ilog_file_prefix = strdup(optarg);
-                         break;
-               case 'I': rss_time = atol(optarg);
-                         break;
-               case '?': usage(name); return 1;
-       }
-
-       if ( optind < argc ) { usage(name); return 1; }
-
-       setlinebuf(stdout);
-       setlinebuf(stderr);
-
-       dprintf(("\n"));
-       if (mode & SERVICE_PROXY) dprintf(("Starting LB proxy service\n"));
-       if (mode & SERVICE_SERVER) dprintf(("Starting LB server service\n"));
-       dprintf(("\n"));
-
-       // XXX: workaround for only preudoparallel job registration
-       //      we need at least 2 slaves to avoid locking misbehaviour
-       if ((mode == SERVICE_PROXY_SERVER) && (slaves == 1)) {
-               dprintf(("WARNING: Running both proxy and server services enforces at least 2 slaves\n"));
-               dprintf(("Starting 2 slaves\n"));
-               slaves = 2;
-       }
-
-       if (!pidfile_forced && geteuid())
-               snprintf(pidfile,sizeof pidfile, "%s/glite-lb-bkserverd.pid", getenv("HOME"));
-
-       fpid = fopen(pidfile,"r");
-       if ( fpid )
-       {
-               int     opid = -1;
-
-               if ( fscanf(fpid,"%d",&opid) == 1 )
-               {
-                       if ( !kill(opid,0) )
-                       {
-                               fprintf(stderr,"%s: another instance running, pid = %d\n",argv[0],opid);
-                               return 1;
-                       }
-                       else if (errno != ESRCH) { perror("kill()"); return 1; }
-               }
-               fclose(fpid);
-       } else if (errno != ENOENT) { perror(pidfile); return 1; }
-
-       fpid = fopen(pidfile, "w");
-       if (!fpid) { perror(pidfile); return 1; }
-       if (fprintf(fpid, "%d", getpid()) <= 0) { perror(pidfile); return 1; }
-       if (fclose(fpid) != 0) { perror(pidfile); return 1; }
-
-       if (mode & SERVICE_SERVER) {
-               if (check_mkdir(dumpStorage)) exit(1);
-               if (check_mkdir(purgeStorage)) exit(1);
-               if ( jpreg ) {
-                       if ( glite_lbu_MaildirInit(jpregDir) ) {
-                               dprintf(("[%d] glite_lbu_MaildirInit failed: %s\n", getpid(), lbm_errdesc));
-                               if (!debug) syslog(LOG_CRIT, "glite_lbu_MaildirInit failed: %s", lbm_errdesc);
-                               exit(1);
-                       }
-               }
-       }
-
-       if (mode & SERVICE_SERVER) {
-               if ( fake_host )
-               {
-                       char    *p = strchr(fake_host,':');
-
-                       if (p)
-                       {
-                               *p = 0;
-                               fake_port = atoi(p+1);
-                       }
-                       else fake_port = atoi(port);
-               }
-               else {
-                       fake_host = strdup(host);
-                       fake_port = atoi(port); 
-               }
-
-               dprintf(("Server address: %s:%d\n", fake_host, fake_port));
-       }
-       if ((mode & SERVICE_SERVER)) {
-               service_table[SRV_SERVE].conn = socket(PF_INET, SOCK_STREAM, 0);
-               if ( service_table[SRV_SERVE].conn < 0 ) { perror("socket()"); return 1; }
-               a.sin_family = AF_INET;
-               a.sin_port = htons(atoi(port));
-               a.sin_addr.s_addr = INADDR_ANY;
-               setsockopt(service_table[SRV_SERVE].conn, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-               if ( bind(service_table[SRV_SERVE].conn, (struct sockaddr *) &a, sizeof(a)) )
-               { 
-                       char    buf[100];
-
-                       snprintf(buf,sizeof(buf),"bind(%d)",atoi(port));
-                       perror(buf);
-                       return 1;
-               }
-               if ( listen(service_table[SRV_SERVE].conn, CON_QUEUE) ) { perror("listen()"); return 1; }
-
-               service_table[SRV_STORE].conn = socket(PF_INET, SOCK_STREAM, 0);
-               if ( service_table[SRV_STORE].conn < 0) { perror("socket()"); return 1; }
-               a.sin_family = AF_INET;
-               a.sin_port = htons(atoi(port)+1);
-               a.sin_addr.s_addr = INADDR_ANY;
-               setsockopt(service_table[SRV_STORE].conn, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-               if ( bind(service_table[SRV_STORE].conn, (struct sockaddr *) &a, sizeof(a)))
-               {
-                       char    buf[100];
-
-                       snprintf(buf,sizeof(buf), "bind(%d)", atoi(port)+1);
-                       perror(buf);
-                       return 1;
-               }
-               if ( listen(service_table[SRV_STORE].conn, CON_QUEUE) ) { perror("listen()"); return 1; }
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-               service_table[SRV_WS].conn = socket(PF_INET, SOCK_STREAM, 0);
-               if ( service_table[SRV_WS].conn < 0) { perror("socket()"); return 1; }
-               a.sin_family = AF_INET;
-               a.sin_port = htons(atoi(ws_port));
-               a.sin_addr.s_addr = INADDR_ANY;
-               setsockopt(service_table[SRV_WS].conn, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
-               if ( bind(service_table[SRV_WS].conn, (struct sockaddr *) &a, sizeof(a)))
-               {
-                       char    buf[100];
-
-                       snprintf(buf, sizeof(buf), "bind(%d)", atoi(ws_port));
-                       perror(buf);
-                       return 1;
-               }
-               if ( listen(service_table[SRV_WS].conn, CON_QUEUE) ) { perror("listen()"); return 1; }
-
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-               if (!server_cert || !server_key)
-                       fprintf(stderr, "%s: key or certificate file not specified"
-                                                       " - unable to watch them for changes!\n", argv[0]);
-
-               if ( cadir ) setenv("X509_CERT_DIR", cadir, 1);
-               edg_wll_gss_watch_creds(server_cert, &cert_mtime);
-               if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &mycred, &gss_code) )
-               {
-                       int     i;
-
-                       dprintf(("Server identity: %s\n",mycred->name));
-                       server_subject = strdup(mycred->name);
-                       for ( i = 0; super_users && super_users[i]; i++ ) ;
-                       super_users = realloc(super_users, (i+2)*sizeof(*super_users));
-                       super_users[i] = strdup(mycred->name);
-                       super_users[i+1] = NULL;
-               }
-               else {
-                       dprintf(("Server running unauthenticated\n"));
-                       server_subject = strdup("anonymous LB");
-               }
-
-               if ( noAuth ) dprintf(("Server in promiscuous mode\n"));
-               dprintf(("Server listening at %d,%d (accepting protocols: " COMP_PROTO " and compatible) ...\n",atoi(port),atoi(port)+1));
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-               dprintf(("Server listening at %d (accepting web service protocol) ...\n", atoi(ws_port)));
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-       }
-#ifdef GLITE_LB_SERVER_WITH_WS
-       free(ws_port);
-       ws_port = NULL;
-#endif
-       if (mode & SERVICE_PROXY) {     /* proxy stuff */
-               struct sockaddr_un      a;
-
-               service_table[SRV_SERVE_PROXY].conn = socket(PF_UNIX, SOCK_STREAM, 0);
-               if ( service_table[SRV_SERVE_PROXY].conn < 0 ) { perror("socket()"); return 1; }
-               memset(&a, 0, sizeof(a));
-               a.sun_family = AF_UNIX;
-               sprintf(sock_serve, "%s%s", socket_path_prefix, "serve.sock");
-               strcpy(a.sun_path, sock_serve);
-
-               if( connect(service_table[SRV_SERVE_PROXY].conn, (struct sockaddr *)&a, sizeof(a.sun_path)) < 0) {
-                       if( errno == ECONNREFUSED ) {
-                               dprintf(("removing stale input socket %s\n", sock_serve));
-                               unlink(sock_serve);
-                       }
-               } else { perror("another instance of lb-proxy is running"); return 1; }
-
-               if ( bind(service_table[SRV_SERVE_PROXY].conn, (struct sockaddr *) &a, sizeof(a)) < 0 ) {
-                       char    buf[100];
-
-                       snprintf(buf, sizeof(buf), "bind(%s)", sock_serve);
-                       perror(buf);
-                       return 1;
-               }
-
-               if ( listen(service_table[SRV_SERVE_PROXY].conn, con_queue) ) { perror("listen()"); return 1; }
-
-               service_table[SRV_STORE_PROXY].conn = socket(PF_UNIX, SOCK_STREAM, 0);
-               if ( service_table[SRV_STORE_PROXY].conn < 0 ) { perror("socket()"); return 1; }
-               memset(&a, 0, sizeof(a));
-               a.sun_family = AF_UNIX;
-               sprintf(sock_store, "%s%s", socket_path_prefix, "store.sock");
-               strcpy(a.sun_path, sock_store);
-
-               if( connect(service_table[SRV_STORE_PROXY].conn, (struct sockaddr *)&a, sizeof(a.sun_path)) < 0) {
-                       if( errno == ECONNREFUSED ) {
-                               dprintf(("removing stale input socket %s\n", sock_store));
-                               unlink(sock_store);
-                       }
-               } else { perror("another instance of lb-proxy is running"); return 1; }
-
-               if ( bind(service_table[SRV_STORE_PROXY].conn, (struct sockaddr *) &a, sizeof(a))) {
-                       char    buf[100];
-
-                       snprintf(buf, sizeof(buf), "bind(%s)", sock_store);
-                       perror(buf);
-                       return 1;
-               }
-               if ( listen(service_table[SRV_STORE_PROXY].conn, con_queue) ) { perror("listen()"); return 1; }
-
-               dprintf(("Proxy listening at %s, %s ...\n", sock_store, sock_serve));
-       }
-
-       if (!dbstring) dbstring = getenv("LBDB");
-       if (!dbstring) dbstring = strdup(DEFAULTCS);
-               
-       /* Just check the database and let it be. The slaves do the job. */
-       edg_wll_InitContext(&ctx);
-       if (wait_for_open(ctx, dbstring)) {
-               edg_wll_Close(ctx);
-               edg_wll_FreeContext(ctx);
-               return 1;
-       }
-
-       if ((ctx->dbcaps = glite_lbu_DBQueryCaps(ctx->dbctx)) == -1)
-       {
-               char    *et,*ed;
-               glite_lbu_DBError(ctx->dbctx,&et,&ed);
-
-               fprintf(stderr,"%s: open database: %s (%s)\n",argv[0],et,ed);
-               free(et); free(ed);
-               return 1;
-       }
-       edg_wll_Close(ctx);
-       ctx->dbctx = NULL;
-       fprintf(stderr, "[%d]: DB '%s'\n", getpid(), dbstring);
-
-       if ((ctx->dbcaps & GLITE_LBU_DB_CAP_INDEX) == 0) {
-               fprintf(stderr,"%s: missing index support in DB layer\n",argv[0]);
-               return 1;
-       }
-       if ((ctx->dbcaps & GLITE_LBU_DB_CAP_TRANSACTIONS) == 0)
-               fprintf(stderr, "[%d]: transactions aren't supported!\n", getpid());
-       if (transactions >= 0) {
-               fprintf(stderr, "[%d]: transactions forced from %d to %d\n", getpid(), ctx->dbcaps & GLITE_LBU_DB_CAP_TRANSACTIONS ? 1 : 0, transactions);
-               ctx->dbcaps &= ~GLITE_LBU_DB_CAP_TRANSACTIONS;
-               ctx->dbcaps |= transactions ? GLITE_LBU_DB_CAP_TRANSACTIONS : 0;
-       }
-       use_dbcaps = ctx->dbcaps;
-
-       if (count_statistics) edg_wll_InitStatistics(ctx);
-       edg_wll_FreeContext(ctx);
-
-       if ( !debug ) {
-               if (daemon(1,0) == -1) {
-                       perror("deamon()");
-                       exit(1);
-               }
-#ifdef LB_PERF
-               monstartup((u_long)&_start, (u_long)&etext);
-#endif
-
-               fpid = fopen(pidfile,"w");
-               if (!fpid) { perror(pidfile); return 1; }
-               fprintf(fpid,"%d",getpid());
-               fclose(fpid);
-
-               openlog(name,LOG_PID,LOG_DAEMON);
-       } else {
-               setpgid(0, getpid());
-       }
-
-       if (silent) debug = 0;
-
-       glite_srvbones_set_param(GLITE_SBPARAM_SLAVES_COUNT, slaves);
-       glite_srvbones_set_param(GLITE_SBPARAM_SLAVE_OVERLOAD, SLAVE_OVERLOAD);
-       glite_srvbones_set_param(GLITE_SBPARAM_SLAVE_CONNS_MAX, SLAVE_CONNS_MAX);
-
-       if (mode & SERVICE_SERVER) {
-               to = (struct timeval){CONNECT_TIMEOUT, 0};
-               glite_srvbones_set_param(GLITE_SBPARAM_CONNECT_TIMEOUT, &to);
-               to.tv_sec = request_timeout;
-       }
-       // proxy using default from srvbones, 5s
-
-       glite_srvbones_set_param(GLITE_SBPARAM_REQUEST_TIMEOUT, &to);
-       to = (struct timeval){IDLE_TIMEOUT, 0};
-       glite_srvbones_set_param(GLITE_SBPARAM_IDLE_TIMEOUT, &to);
-
-       switch (mode) {
-               case SERVICE_PROXY:
-                       glite_srvbones_run(bk_clnt_data_init,service_table+SERVICE_PROXY_START,
-                               SERVICE_PROXY_SIZE, debug);
-                       break;
-               case SERVICE_SERVER:
-                       glite_srvbones_run(bk_clnt_data_init,service_table+SERVICE_SERVER_START,
-                               SERVICE_SERVER_SIZE, debug);
-                       break;
-               case SERVICE_PROXY_SERVER:
-                       glite_srvbones_run(bk_clnt_data_init,service_table+SERVICE_SERVER_START,
-                               SERVICE_PROXY_SIZE+SERVICE_SERVER_SIZE, debug);
-                       break;
-               default:
-                       assert(0);
-                       break;
-       }
-
-
-       unlink(pidfile);
-
-       for ( i = 0; i < sizofa(service_table); i++ )
-               if ( service_table[i].conn >= 0 ) close(service_table[i].conn);
-
-       if (mode & SERVICE_PROXY) {
-               unlink(sock_serve);
-               unlink(sock_store);
-       }
-
-        if (port) free(port);
-       edg_wll_gss_release_cred(&mycred, NULL);
-
-
-       return 0;
-}
-
-static void list_index_cols(edg_wll_QueryRec **index,edg_wll_IColumnRec **index_cols_out)
-{
-       int i,j, k, maxncol, ncol;
-       edg_wll_IColumnRec      *index_cols;
-
-       ncol = maxncol = 0;
-       for ( i = 0; index[i]; i++ )
-               for ( j = 0; index[i][j].attr; j++ )
-                       maxncol++;
-
-       index_cols = calloc(maxncol+1, sizeof(edg_wll_IColumnRec));
-       for ( i = 0; index[i]; i++ )
-       {
-               for ( j = 0; index[i][j].attr; j++)
-               {
-                       for ( k = 0;
-                                 k < ncol && edg_wll_CmpColumn(&index_cols[k].qrec, &index[i][j]);
-                                 k++);
-
-                       if ( k == ncol)
-                       {
-                               index_cols[ncol].qrec = index[i][j];
-                               if ( index[i][j].attr == EDG_WLL_QUERY_ATTR_USERTAG )
-                               {
-                                       index_cols[ncol].qrec.attr_id.tag =
-                                                       strdup(index[i][j].attr_id.tag);
-                               }
-                               index_cols[ncol].colname =
-                                               edg_wll_QueryRecToColumn(&index_cols[ncol].qrec);
-                               ncol++;
-                       }
-               }
-       }
-       index_cols[ncol].qrec.attr = EDG_WLL_QUERY_ATTR_UNDEF;
-       index_cols[ncol].colname = NULL;
-       *index_cols_out = index_cols;
-}
-
-int bk_clnt_data_init(void **data)
-{
-       edg_wll_Context                 ctx;
-       struct clnt_data_t         *cdata;
-       edg_wll_QueryRec          **job_index,**notif_index;
-
-
-       if ( !(cdata = calloc(1, sizeof(*cdata))) )
-               return -1;
-
-       cdata->mode = mode;
-
-       if ( edg_wll_InitContext(&ctx) ) 
-       {
-               free(cdata);
-               return -1;
-       }
-
-       dprintf(("[%d] opening database ...\n", getpid()));
-       wait_for_open(ctx, dbstring);
-       glite_lbu_DBSetCaps(ctx->dbctx, use_dbcaps);
-       cdata->dbctx = ctx->dbctx;
-       cdata->dbcaps = use_dbcaps;
-
-       if ( edg_wll_QueryJobIndices(ctx, &job_index, NULL) )
-       {
-               char       *et, *ed;
-
-               edg_wll_Error(ctx,&et,&ed);
-               dprintf(("[%d]: query_job_indices(): %s: %s, no custom indices available\n",getpid(),et,ed));
-               if (!debug) syslog(LOG_ERR,"[%d]: query_job_indices(): %s: %s, no custom indices available\n",getpid(),et,ed);
-               free(et);
-               free(ed);
-       }
-       cdata->job_index = job_index;
-       if ( job_index ) list_index_cols(job_index,&cdata->job_index_cols);
-
-       if (edg_wll_QueryNotifIndices(ctx,&notif_index,NULL)) {
-               char    *et,*ed;
-               edg_wll_Error(ctx,&et,&ed);
-
-               dprintf(("[%d]: query notif indices: %s: %s\n",getpid(),et,ed));
-               free(et); free(ed);
-       }
-       cdata->notif_index = notif_index;
-       if (notif_index) list_index_cols(notif_index,&cdata->notif_index_cols);
-
-       edg_wll_FreeContext(ctx);
-               
-#ifdef LB_PERF
-       glite_wll_perftest_init(NULL, NULL, NULL, NULL, 0);
-#endif
-
-       *data = cdata;
-       return 0;
-}
-
-
-/*
- *     Creates context (initializes it from global vatiables and data given
- *     from server_bones)
- *     gets the connection info
- *     and accepts the gss connection
- */
-int bk_handle_connection(int conn, struct timeval *timeout, void *data)
-{
-       struct clnt_data_t *cdata = (struct clnt_data_t *)data;
-       edg_wll_Context         ctx;
-       edg_wll_GssPrincipal    client = NULL;
-       edg_wll_GssCred         newcred = NULL;
-       edg_wll_GssStatus       gss_code;
-       struct timeval          dns_to = {DNS_TIMEOUT, 0},
-                                               conn_start, now;
-       struct sockaddr_in      a;
-       socklen_t                                       alen;
-       char                       *server_name = NULL,
-                                          *name = NULL;
-       int                                     h_errno, ret;
-
-
-
-       switch ( edg_wll_gss_watch_creds(server_cert, &cert_mtime) ) {
-       case 0: break;
-       case 1:
-               if ( !edg_wll_gss_acquire_cred_gsi(server_cert, server_key, &newcred, &gss_code) ) {
-                       dprintf(("[%d] reloading credentials successful\n", getpid()));
-                       edg_wll_gss_release_cred(&mycred, NULL);
-                       mycred = newcred;
-               } else { dprintf(("[%d] reloading credentials failed, using old ones\n", getpid())); }
-               break;
-       case -1: dprintf(("[%d] edg_wll_gss_watch_creds failed\n", getpid())); break;
-       }
-
-       if ( edg_wll_InitContext(&ctx) )
-       {
-               fprintf(stderr, "Couldn't create context");
-               return -1;
-       }
-       cdata->ctx = ctx;
-
-       /* Shared structures (pointers)
-        */
-       ctx->serverRunning = cdata->mode & SERVICE_SERVER;
-       ctx->proxyRunning = cdata->mode & SERVICE_PROXY;
-       ctx->dbctx = cdata->dbctx;
-       ctx->dbcaps = cdata->dbcaps;
-       ctx->job_index_cols = cdata->job_index_cols;
-       ctx->job_index = cdata->job_index; 
-       ctx->notif_index_cols = cdata->notif_index_cols;
-       ctx->notif_index = cdata->notif_index; 
-       
-       /*      set globals
-        */
-       ctx->notifDuration = notif_duration;
-       ctx->notifDurationMax = notif_duration_max;
-       ctx->purgeStorage = strdup(purgeStorage);
-       ctx->dumpStorage = strdup(dumpStorage);
-       if ( jpreg ) ctx->jpreg_dir = strdup(jpregDir); else ctx->jpreg_dir = NULL;
-       ctx->hardJobsLimit = hardJobsLimit;
-       ctx->hardEventsLimit = hardEventsLimit;
-       if ( noAuth ) ctx->noAuth = 1;
-       ctx->rgma_export = rgma_export;
-       memcpy(ctx->purge_timeout, purge_timeout, sizeof(ctx->purge_timeout));
-
-       ctx->p_tmp_timeout.tv_sec = timeout->tv_sec;
-       ctx->p_tmp_timeout.tv_usec = timeout->tv_usec;
-       
-       edg_wll_initConnections();
-
-       alen = sizeof(a);
-       getpeername(conn, (struct sockaddr *)&a, &alen);
-       ctx->connections->serverConnection->peerName = strdup(inet_ntoa(a.sin_addr));
-       ctx->connections->serverConnection->peerPort = ntohs(a.sin_port);
-       ctx->count_statistics = count_statistics;
-
-       ctx->serverIdentity = strdup(server_subject);
-
-       ctx->rssTime = rss_time;
-
-       gettimeofday(&conn_start, 0);
-
-       h_errno = asyn_gethostbyaddr(&name, (char *)&a.sin_addr.s_addr,sizeof(a.sin_addr.s_addr), AF_INET, &dns_to);
-       switch ( h_errno )
-       {
-       case NETDB_SUCCESS:
-               if (name) dprintf(("[%d] connection from %s:%d (%s)\n",
-                                       getpid(), inet_ntoa(a.sin_addr), ntohs(a.sin_port), name));
-               free(ctx->connections->serverConnection->peerName);
-               ctx->connections->serverConnection->peerName = name;
-               name = NULL;
-               break;
-
-       default:
-               if (debug) fprintf(stderr, "gethostbyaddr(%s): %s", inet_ntoa(a.sin_addr), hstrerror(h_errno));
-               dprintf(("[%d] connection from %s:%d\n", getpid(), inet_ntoa(a.sin_addr), ntohs(a.sin_port)));
-               free(ctx->connections->serverConnection->peerName);
-               ctx->connections->serverConnection->peerName = strdup(inet_ntoa(a.sin_addr));
-               break;
-       }
-       
-       gettimeofday(&now, 0);
-       if ( decrement_timeout(timeout, conn_start, now) )
-       {
-               if (debug) fprintf(stderr, "gethostbyaddr() timeout");
-               else syslog(LOG_ERR, "gethostbyaddr(): timeout");
-               free(name);
-
-               return -1;
-       }
-                               
-       if (fake_host)
-       {
-               ctx->srvName = strdup(fake_host);
-               ctx->srvPort = fake_port;
-       }
-       else
-       {
-               alen = sizeof(a);
-               getsockname(conn,(struct sockaddr *) &a,&alen);
-       
-               dns_to.tv_sec = DNS_TIMEOUT;
-               dns_to.tv_usec = 0;
-               h_errno = asyn_gethostbyaddr(&name,
-                                               (char *) &a.sin_addr.s_addr,sizeof(a.sin_addr.s_addr),
-                                               AF_INET,&dns_to);
-
-               switch ( h_errno )
-               {
-               case NETDB_SUCCESS:
-                       ctx->srvName = name;
-                       if ( server_name != NULL )
-                       {
-                               if ( strcmp(name, server_name))
-                               {
-                                       if (debug) fprintf(stderr, "different server endpoint names (%s,%s),"
-                                                                                       " check DNS PTR records\n", name, server_name);
-                                       else syslog(LOG_ERR,"different server endpoint names (%s,%s),"
-                                                                                       " check DNS PTR records\n", name, server_name);
-                               }
-                       }
-                       else server_name = strdup(name);
-                       break;
-
-               default:
-                       if ( debug )
-                               fprintf(stderr, "gethostbyaddr(%s): %s", inet_ntoa(a.sin_addr), hstrerror(h_errno));
-                       else
-                               syslog(LOG_ERR,"gethostbyaddr(%s): %s", inet_ntoa(a.sin_addr), hstrerror(h_errno));
-                       if ( server_name != NULL )
-                               ctx->srvName = strdup(server_name);
-                       break;
-               }
-               ctx->srvPort = ntohs(a.sin_port);
-       }
-
-/* XXX: ugly workaround, we may detect false expired certificated
- * probably due to bug in Globus GSS/SSL. Treated as fatal,
- * restarting the server solves the problem */ 
-#define _EXPIRED_CERTIFICATE_MESSAGE "certificate has expired"
-
-       if ( (ret = edg_wll_gss_accept(mycred, conn, timeout, &ctx->connections->serverConnection->gss, &gss_code)) )
-       {
-               if ( ret == EDG_WLL_GSS_ERROR_TIMEOUT )
-               {
-                       dprintf(("[%d] %s: Client authentication failed - timeout reached, closing.\n", getpid(),ctx->connections->serverConnection->peerName));
-                       if (!debug) syslog(LOG_ERR, "%s: Client authentication failed - timeout reached",ctx->connections->serverConnection->peerName);
-               }
-               else if (ret == EDG_WLL_GSS_ERROR_GSS) {
-                       edg_wll_SetErrorGss(ctx,"Client authentication",&gss_code);
-                       if (strstr(ctx->errDesc,_EXPIRED_CERTIFICATE_MESSAGE)) {
-                               dprintf(("[%d] %s: false expired certificate: %s\n",getpid(),ctx->connections->serverConnection->peerName,ctx->errDesc));
-                               if (!debug) syslog(LOG_ERR,"[%d] %s: false expired certificate: %s",getpid(),ctx->connections->serverConnection->peerName,ctx->errDesc);
-                               edg_wll_FreeContext(ctx);
-                               return -1;
-                       }
-                       dprintf(("[%d] %s: GSS error: %s, closing.\n", getpid(),ctx->connections->serverConnection->peerName,ctx->errDesc));
-                       if (!debug) syslog(LOG_ERR, "%s: GSS error: %s",ctx->connections->serverConnection->peerName,ctx->errDesc);
-               }
-               else
-               {
-                       dprintf(("[%d] %s: Client authentication failed, closing.\n", getpid(),ctx->connections->serverConnection->peerName));
-                       if (!debug) syslog(LOG_ERR, "%s: Client authentication failed",ctx->connections->serverConnection->peerName);
-
-               }
-               edg_wll_FreeContext(ctx);
-               return 1;
-       } 
-
-       ret = edg_wll_gss_get_client_conn(&ctx->connections->serverConnection->gss, &client, NULL);
-       if (ret || client->flags & EDG_WLL_GSS_FLAG_ANON) {
-               dprintf(("[%d] anonymous client\n",getpid()));
-               ctx->peerName = NULL;
-       } else {
-               if (ctx->peerName) free(ctx->peerName);
-               ctx->peerName = strdup(client->name);
-               edg_wll_gss_free_princ(client);
-
-               dprintf(("[%d] client DN: %s\n",getpid(),ctx->peerName));
-       }
-
-       if ( edg_wll_SetVomsGroups(ctx, &ctx->connections->serverConnection->gss, server_cert, server_key, vomsdir, cadir) )
-       {
-               char *errt, *errd;
-
-               edg_wll_Error(ctx, &errt, &errd);
-               dprintf(("[%d] %s (%s)\n[%d]\tignored, continuing without VOMS\n", getpid(), errt, errd,getpid()));
-               free(errt); free(errd);
-               edg_wll_ResetError(ctx); 
-       }
-       if (debug && ctx->vomsGroups.len > 0)
-       {
-               int i;
-  
-               dprintf(("[%d] client's VOMS groups:\n",getpid()));
-               for ( i = 0; i < ctx->vomsGroups.len; i++ )
-                       dprintf(("\t%s:%s\n", ctx->vomsGroups.val[i].vo, ctx->vomsGroups.val[i].name));
-       }
-       if (debug && ctx->fqans && *(ctx->fqans))
-       {
-               char **f;
-
-               dprintf(("[%d] client's FQANs:\n",getpid()));
-               for (f = ctx->fqans; f && *f; f++)
-                       dprintf(("\t%s\n", *f));
-       }
-       
-       /* used also to reset start_time after edg_wll_ssl_accept! */
-       /* gettimeofday(&start_time,0); */
-       
-       ctx->noAuth = noAuth || edg_wll_amIroot(ctx->peerName, ctx->fqans,super_users);
-       switch ( noIndex )
-       {
-       case 0: ctx->noIndex = 0; break;
-       case 1: ctx->noIndex = edg_wll_amIroot(ctx->peerName, ctx->fqans,super_users); break;
-       case 2: ctx->noIndex = 1; break;
-       }
-       ctx->strict_locking = strict_locking;
-       ctx->greyjobs = greyjobs;
-
-       ctx->super_users = super_users;
-
-       return 0;
-}
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-int bk_handle_ws_connection(int conn, struct timeval *timeout, void *data)
-{
-    struct clnt_data_t    *cdata = (struct clnt_data_t *) data;
-       struct soap                        *soap = NULL;
-       glite_gsplugin_Context  gsplugin_ctx;
-       int                                             rv = 0;
-
-
-       if ( glite_gsplugin_init_context(&gsplugin_ctx) ) {
-               fprintf(stderr, "Couldn't create gSOAP plugin context");
-               return -1;
-       }
-
-       if ( !(soap = soap_new()) ) {
-               fprintf(stderr, "Couldn't create soap environment");
-               goto err;
-       }
-
-       soap_init2(soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);
-    if ( soap_set_namespaces(soap, namespaces) ) { 
-               soap_done(soap);
-               perror("Couldn't set soap namespaces");
-               goto err;
-       }
-    if ( soap_register_plugin_arg(soap, glite_gsplugin, gsplugin_ctx) ) {
-               soap_done(soap);
-               perror("Couldn't set soap namespaces");
-               goto err;
-       }
-       if ( (rv = bk_handle_connection(conn, timeout, data)) ) {
-               soap_done(soap);
-               goto err;
-       }
-       glite_gsplugin_set_connection(gsplugin_ctx, &cdata->ctx->connections->serverConnection->gss);
-       glite_gsplugin_use_credential(gsplugin_ctx, mycred);
-       cdata->soap = soap;
-
-
-       return 0;
-
-err:
-       if ( gsplugin_ctx ) glite_gsplugin_free_context(gsplugin_ctx);
-       if ( soap ) soap_destroy(soap);
-
-       return rv? : -1;
-}
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-int bk_handle_connection_proxy(int conn, struct timeval *timeout, void *data)
-{
-       struct clnt_data_t *cdata = (struct clnt_data_t *)data;
-       edg_wll_Context         ctx;
-       struct timeval          conn_start, now;
-
-        if ( edg_wll_InitContext(&ctx) ) {
-               dprintf(("Couldn't create context"));
-               return -1;
-       }
-       cdata->ctx = ctx;
-
-       /* Shared structures (pointers)
-        */
-       ctx->serverRunning = cdata->mode & SERVICE_SERVER;
-       ctx->proxyRunning = cdata->mode & SERVICE_PROXY;
-       ctx->dbctx = cdata->dbctx;
-       ctx->dbcaps = cdata->dbcaps;
-       
-       /*      set globals
-        */
-       ctx->notifDuration = notif_duration;
-       ctx->notifDurationMax = notif_duration_max;
-       if ( jpreg ) ctx->jpreg_dir = strdup(jpregDir); else ctx->jpreg_dir = NULL;
-       ctx->allowAnonymous = 1;
-       ctx->isProxy = 1;
-       ctx->noAuth = 1;
-       ctx->noIndex = 1;
-
-       /* required to match superuser-authorized notifications */
-       ctx->super_users = super_users;
-
-       if (fake_host)
-       {
-               ctx->srvName = strdup(fake_host);
-               ctx->srvPort = fake_port;
-       }
-       else {
-               ctx->srvName = strdup(host);
-               ctx->srvPort = atoi(port);
-       }
-       
-       ctx->connProxy = (edg_wll_ConnProxy *) calloc(1, sizeof(edg_wll_ConnProxy));
-       if ( !ctx->connProxy ) {
-               perror("calloc");
-               edg_wll_FreeContext(ctx);
-
-               return -1;
-       }
-
-       gettimeofday(&conn_start, 0);
-       if ( edg_wll_plain_accept(conn, &ctx->connProxy->conn) ) {
-               perror("accept");
-               edg_wll_FreeContext(ctx);
-
-               return -1;
-       } 
-
-       gettimeofday(&now, 0);
-       if ( decrement_timeout(timeout, conn_start, now) ) {
-               if (debug) fprintf(stderr, "edg_wll_plain_accept() timeout");
-               else syslog(LOG_ERR, "edg_wll_plain_accept(): timeout");
-
-               return -1;
-       }
-
-       ctx->rssTime = rss_time;
-
-       return 0;
-}
-
-
-static int handle_server_error(edg_wll_Context ctx)
-{ 
-       char    *errt = NULL, *errd = NULL;
-       int             err,ret = 0;
-
-       
-       errt = errd = NULL;
-       switch ( (err = edg_wll_Error(ctx, &errt, &errd)) )
-       {
-       case ETIMEDOUT:
-       case EDG_WLL_ERROR_GSS:
-       case EPIPE:
-       case EIO:
-       case EDG_WLL_IL_PROTO:
-               dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
-               if (!debug) syslog(LOG_ERR,"%s (%s)", errt, errd);
-               /*      fallthrough
-                */
-       case ENOTCONN:
-       case ECONNREFUSED:
-               /*
-                *      "recoverable" error - return (>0)
-                */
-               ret = err;
-               break;
-
-       case ENOENT:
-       case EPERM:
-       case EEXIST:
-       case EDG_WLL_ERROR_NOINDEX:
-       case E2BIG:
-               dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
-               break;
-       case EINVAL:
-       case EDG_WLL_ERROR_PARSE_BROKEN_ULM:
-       case EDG_WLL_ERROR_PARSE_EVENT_UNDEF:
-       case EDG_WLL_ERROR_PARSE_MSG_INCOMPLETE:
-       case EDG_WLL_ERROR_PARSE_KEY_DUPLICITY:
-       case EDG_WLL_ERROR_PARSE_KEY_MISUSE:
-       case EDG_WLL_ERROR_PARSE_OK_WITH_EXTRA_FIELDS:
-       case EDG_WLL_ERROR_JOBID_FORMAT:
-       case EDG_WLL_ERROR_MD5_CLASH:
-               dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
-               if ( !debug ) syslog(LOG_ERR,"%s (%s)", errt, errd);
-               /*
-                *      no action for non-fatal errors
-                */
-               break;
-               
-       case EDG_WLL_ERROR_DB_INIT:
-       case EDG_WLL_ERROR_DB_CALL:
-       case EDG_WLL_ERROR_SERVER_RESPONSE:
-       default:
-               dprintf(("[%d] %s (%s)\n", getpid(), errt, errd));
-               if (!debug) syslog(LOG_CRIT,"%s (%s)",errt,errd);
-               /*
-                *      unknown error - do rather return (<0) (slave will be killed)
-                */
-               ret = -EIO; 
-       } 
-       free(errt); free(errd);
-       return ret;
-}
-
-int bk_accept_store(int conn, struct timeval *timeout, void *cdata)
-{
-       edg_wll_Context         ctx = ((struct clnt_data_t *) cdata)->ctx;
-       struct timeval          before, after;
-       int     err;
-
-       /*
-        *      serve the request
-        */
-       memcpy(&ctx->p_tmp_timeout, timeout, sizeof(ctx->p_tmp_timeout));
-       gettimeofday(&before, NULL);
-       if ( edg_wll_StoreProto(ctx) && (err = handle_server_error(ctx))) return err;
-
-       gettimeofday(&after, NULL);
-       if ( decrement_timeout(timeout, before, after) ) {
-               if (debug) fprintf(stderr, "Serving store connection timed out");
-               else syslog(LOG_ERR, "Serving store connection timed out");
-               return ETIMEDOUT;
-       }
-
-       return 0;
-}
-
-
-int bk_accept_serve(int conn, struct timeval *timeout, void *cdata)
-{
-       edg_wll_Context         ctx = ((struct clnt_data_t *) cdata)->ctx;
-       struct timeval          before, after;
-       int     err;
-
-       /*
-        *      serve the request
-        */
-       memcpy(&ctx->p_tmp_timeout, timeout, sizeof(ctx->p_tmp_timeout));
-       gettimeofday(&before, NULL);
-       if ( edg_wll_ServerHTTP(ctx) && (err = handle_server_error(ctx))) return err;
-
-       gettimeofday(&after, NULL);
-       if ( decrement_timeout(timeout, before, after) ) {
-               if (debug) fprintf(stderr, "Serving store connection timed out");
-               else syslog(LOG_ERR, "Serving store connection timed out");
-               return ETIMEDOUT;
-       }
-
-       return 0;
-}
-
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-int bk_accept_ws(int conn, struct timeval *timeout, void *cdata)
-{
-       struct soap                        *soap = ((struct clnt_data_t *) cdata)->soap;
-       edg_wll_Context                 ctx = ((struct clnt_data_t *) cdata)->ctx;
-       glite_gsplugin_Context  gsplugin_ctx;
-       int                                             err;
-
-
-       gsplugin_ctx = glite_gsplugin_get_context(soap);
-       glite_gsplugin_set_timeout(gsplugin_ctx, timeout);
-       glite_gsplugin_set_udata(soap, ctx);
-       /*      soap->max_keep_alive must be higher tha 0,
-        *      because on 0 value soap closes the connection
-        */
-       soap->max_keep_alive = 10;
-       soap->keep_alive = 1;
-       soap_begin(soap);
-       err = 0;
-       if ( soap_begin_recv(soap) ) {
-               if ( soap->error == SOAP_EOF ) {
-                       soap_send_fault(soap);
-                       return ENOTCONN;
-               }
-               if ( soap->error < SOAP_STOP ) err = soap_send_fault(soap);
-               else soap_closesock(soap);      /*      XXX: Do close the socket here? */
-       } else {
-               /* XXX: An ugly hack!
-                * soap->keep_alive is reset to 0 by soap->fparse (http_parse)
-                * handler
-                * Disabling http_parse function would be nice :)
-                */
-               soap->keep_alive = 1;
-               if (   soap_envelope_begin_in(soap)
-                          || soap_recv_header(soap)
-                          || soap_body_begin_in(soap)
-                          || soap_serve_request(soap)
-#if GSOAP_VERSION >= 20700
-                          /* XXX: Is it really neccesary ? */
-                          || (soap->fserveloop && soap->fserveloop(soap))
-#endif
-                          )
-               err = soap_send_fault(soap);
-       }
-
-       if ( err ) {
-               // soap_print_fault(struct soap *soap, FILE *fd) maybe useful here
-               dprintf(("[%d] SOAP error (bk_accept_ws) \n", getpid()));
-               if (!debug) syslog(LOG_CRIT,"SOAP error (bk_accept_ws)");
-               return ECANCELED;
-       }
-
-       return ENOTCONN;
-}
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-
-int bk_clnt_disconnect(int conn, struct timeval *timeout, void *cdata)
-{
-       edg_wll_Context         ctx = ((struct clnt_data_t *) cdata)->ctx;
-
-
-       if ( ctx->connections->serverConnection->gss.context != NULL)
-               edg_wll_gss_close(&ctx->connections->serverConnection->gss, timeout);
-       edg_wll_FreeContext(ctx);
-       ctx = NULL;
-
-       return 0;
-}
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-int bk_ws_clnt_disconnect(int conn, struct timeval *timeout, void *cdata)
-{
-       struct soap                        *soap = ((struct clnt_data_t *) cdata)->soap;
-       glite_gsplugin_Context  gsplugin_ctx;
-       int                                             rv;
-
-
-       gsplugin_ctx = glite_gsplugin_get_context(soap);
-       glite_gsplugin_set_connection(gsplugin_ctx, NULL);
-       glite_gsplugin_use_credential(gsplugin_ctx, NULL);
-       if ( (rv = bk_clnt_disconnect(conn, timeout, cdata)) )
-               return rv;
-
-       soap_destroy(((struct clnt_data_t *)cdata)->soap);
-       glite_gsplugin_free_context(gsplugin_ctx);
-
-       return 0;
-}
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-
-int bk_clnt_disconnect_proxy(int conn, struct timeval *timeout, void *cdata)
-{
-       edg_wll_Context         ctx = ((struct clnt_data_t *) cdata)->ctx;
-
-       /* XXX: handle the timeout
-        */
-    if ( ctx->connProxy && ctx->connProxy->conn.sock >= 0 )
-               edg_wll_plain_close(&ctx->connProxy->conn);
-
-       edg_wll_FreeContext(ctx);
-       ctx = NULL;
-
-       return 0;
-}
-
-int bk_clnt_reject(int conn)
-{
-       int             flags = fcntl(conn, F_GETFL, 0);
-
-       if ( fcntl(conn, F_SETFL, flags | O_NONBLOCK) < 0 ) 
-               return 1;
-
-       edg_wll_gss_reject(conn);
-
-       return 0;
-}
-
-#ifdef GLITE_LB_SERVER_WITH_WS
-int bk_ws_clnt_reject(int conn)
-{
-       return bk_clnt_reject(conn);
-}
-#endif /* GLITE_LB_SERVER_WITH_WS */
-
-int bk_clnt_reject_proxy(int conn)
-{
-       return 0;
-}
-
-
-static int wait_for_open(edg_wll_Context ctx, const char *dbstring)
-{
-       char    *dbfail_string1, *dbfail_string2;
-       char    *errt,*errd;
-       int err;
-
-       dbfail_string1 = dbfail_string2 = NULL;
-
-       while (((err = edg_wll_Open(ctx, (char *) dbstring)) != EDG_WLL_ERROR_DB_INIT) && err) {
-               if (dbfail_string1) free(dbfail_string1);
-               edg_wll_Error(ctx,&errt,&errd);
-               asprintf(&dbfail_string1,"%s (%s)\n",errt,errd);
-               free(errt);
-               free(errd);
-               if (dbfail_string1 != NULL) {
-                       if (dbfail_string2 == NULL || strcmp(dbfail_string1,dbfail_string2)) {
-                               if (dbfail_string2) free(dbfail_string2);
-                               dbfail_string2 = dbfail_string1;
-                               dbfail_string1 = NULL;
-                               dprintf(("[%d]: %s\nStill trying ...\n",getpid(),dbfail_string2));
-                               if (!debug) syslog(LOG_ERR,dbfail_string2);
-                       }
-               }
-               sleep(5);
-       }
-
-       if (dbfail_string1) free(dbfail_string1);
-       if (dbfail_string2 != NULL) {
-               free(dbfail_string2);
-               dprintf(("[%d]: DB connection established\n",getpid()));
-               if (!debug) syslog(LOG_INFO,"DB connection established\n");
-       }
-
-       if (err) {
-               edg_wll_Error(ctx,&errt,&errd);
-               asprintf(&dbfail_string1,"%s (%s)\n",errt,errd);
-               free(errt);
-               free(errd);
-               dprintf(("[%d]: %s\n", getpid(), dbfail_string1));
-               if (!debug) syslog(LOG_ERR,dbfail_string1);
-               free(dbfail_string1);
-       }
-
-       return err;
-}
-
-static void free_hostent(struct hostent *h){
-       int i;
-
-       if (h) {
-               if (h->h_name) free(h->h_name);
-               if (h->h_aliases) {
-                       for (i=0; h->h_aliases[i]; i++) free(h->h_aliases[i]);
-                       free(h->h_aliases);
-               }
-               if (h->h_addr_list) {
-                       for (i=0; h->h_addr_list[i]; i++) free(h->h_addr_list[i]);
-                       free(h->h_addr_list);
-               }
-               free(h);
-       }
-}
-
-struct asyn_result {
-       struct hostent *ent;
-       int             err;
-};
-
-/* ares callback handler for ares_gethostbyaddr()       */
-static void callback_handler(void *arg, int status, struct hostent *h)
-{
-       struct asyn_result *arp = (struct asyn_result *) arg;
-
-       switch (status) {
-          case ARES_SUCCESS:
-               if (h && h->h_name) {
-                       arp->ent->h_name = strdup(h->h_name);           
-                       if (arp->ent->h_name == NULL) {
-                               arp->err = NETDB_INTERNAL;
-                       } else {
-                               arp->err = NETDB_SUCCESS;
-                       }
-               } else {
-                       arp->err = NO_DATA;
-               }
-               break;
-           case ARES_EBADNAME:
-           case ARES_ENOTFOUND:
-               arp->err = HOST_NOT_FOUND;
-               break;
-           case ARES_ENOTIMP:
-               arp->err = NO_RECOVERY;
-               break;
-           case ARES_ENOMEM:
-           case ARES_EDESTRUCTION:
-           default:
-               arp->err = NETDB_INTERNAL;
-               break;
-       }
-}
-
-static int asyn_gethostbyaddr(char **name, const char *addr,int len, int type, struct timeval *timeout)
-{
-       struct asyn_result ar;
-       ares_channel channel;
-       int nfds;
-       fd_set readers, writers;
-       struct timeval tv, *tvp;
-       struct timeval start_time,check_time;
-
-
-/* start timer */
-        gettimeofday(&start_time,0);
-
-/* ares init */
-        if ( ares_init(&channel) != ARES_SUCCESS ) return(NETDB_INTERNAL);
-       ar.ent = (struct hostent *) malloc (sizeof(*ar.ent));
-       memset((void *) ar.ent, 0, sizeof(*ar.ent));
-
-/* query DNS server asynchronously */
-       ares_gethostbyaddr(channel, addr, len, type, callback_handler, (void *) &ar);
-
-/* wait for result */
-        while (1) {
-                FD_ZERO(&readers);
-                FD_ZERO(&writers);
-                nfds = ares_fds(channel, &readers, &writers);
-                if (nfds == 0)
-                        break;
-
-                gettimeofday(&check_time,0);
-               if (decrement_timeout(timeout, start_time, check_time)) {
-                       ares_destroy(channel);
-                       free_hostent(ar.ent);
-                       return(TRY_AGAIN);
-               }
-               start_time = check_time;
-
-                tvp = ares_timeout(channel, timeout, &tv);
-
-                switch ( select(nfds, &readers, &writers, NULL, tvp) ) {
-                       case -1: if (errno != EINTR) {
-                                       ares_destroy(channel);
-                                       free_hostent(ar.ent);
-                                       return NETDB_INTERNAL;
-                                } else
-                                       continue;
-                       case 0: 
-                               FD_ZERO(&readers);
-                               FD_ZERO(&writers);
-                               /* fallthrough */
-                        default : ares_process(channel, &readers, &writers);
-                }
-
-        }
-
-       
-       ares_destroy(channel);
-               
-       if (ar.err == NETDB_SUCCESS) {
-               *name = strdup(ar.ent->h_name); 
-               free_hostent(ar.ent); 
-       }
-       return (ar.err);
-}
-
-static int add_root(char *root)
-{
-       char *null_suffix, **tmp;
-       int i, cnt;
-
-       for (cnt = 0; super_users && super_users[cnt]; cnt++)
-               ;
-       /* try to be compliant with the new FQAN format that excludes
-          the Capability and empty Role components */
-       null_suffix = strstr(root, "/Role=NULL/Capability=NULL");
-       if (null_suffix == NULL)
-               null_suffix = strstr(root, "/Capability=NULL");
-       i = (null_suffix == NULL) ? 0 : 1;
-
-       tmp = realloc(super_users, (cnt+2+i) * sizeof super_users[0]);
-       if (tmp == NULL)
-               return ENOMEM;
-       super_users = tmp;
-       super_users[cnt] = strdup(root);
-       if (null_suffix) {
-               *null_suffix = '\0'; /* changes the input, should be harmless */
-               super_users[++cnt] = strdup(root);
-       }
-       super_users[++cnt] = NULL;
-
-       return 0;
-}
-
-static int read_roots(const char *file)
-{
-       FILE    *roots = fopen(file,"r");
-       char    buf[BUFSIZ];
-
-       if (!roots) {
-               syslog(LOG_WARNING,"%s: %m, continuing without --super-users-file",file);
-               dprintf(("%s: %s, continuing without --super-users-file\n",file,strerror(errno)));
-               return 0;
-       }
-
-       while (fgets(buf,sizeof buf,roots) != NULL) {
-               char    *nl;
-               nl = strchr(buf,'\n');
-               if (nl) *nl = 0;
-               add_root(buf);
-       }
-
-       fclose(roots);
-
-       return 0;
-}
-
-static int parse_limits(char *opt, int *j_limit, int *e_limit, int *size_limit)
-{
-       return (sscanf(opt, "%d:%d:%d", j_limit, e_limit, size_limit) == 3);
-}
-
-
-static int check_mkdir(const char *dir)
-{
-       struct stat     sbuf;
-
-       if ( stat(dir, &sbuf) )
-       {
-               if ( errno == ENOENT )
-               {
-                       if ( mkdir(dir, S_IRWXU) )
-                       {
-                               dprintf(("[%d] %s: %s\n", getpid(), dir, strerror(errno)));
-                               if (!debug) syslog(LOG_CRIT, "%s: %m", dir);
-                               return 1;
-                       }
-               }
-               else
-               {
-                       dprintf(("[%d] %s: %s\n", getpid(), dir, strerror(errno)));
-                       if (!debug) syslog(LOG_CRIT, "%s: %m", dir);
-                       return 1;
-               }
-       }
-
-       if (!S_ISDIR(sbuf.st_mode))
-       {
-               dprintf(("[%d] %s: not a directory\n", getpid(),dir));
-               if (!debug) syslog(LOG_CRIT,"%s: not a directory",dir);
-               return 1;
-       }
-
-       if (access(dir, R_OK | W_OK))
-       {
-               dprintf(("[%d] %s: directory is not readable/writable\n", getpid(),dir));
-               if (!debug) syslog(LOG_CRIT,"%s: directory is not readable/writable",dir);
-               return 1;
-       }
-               
-
-       return 0;
-}
-
-static int decrement_timeout(struct timeval *timeout, struct timeval before, struct timeval after)
-{
-        (*timeout).tv_sec = (*timeout).tv_sec - (after.tv_sec - before.tv_sec);
-        (*timeout).tv_usec = (*timeout).tv_usec - (after.tv_usec - before.tv_usec);
-        while ( (*timeout).tv_usec < 0) {
-                (*timeout).tv_sec--;
-                (*timeout).tv_usec += 1000000;
-        }
-        if ( ((*timeout).tv_sec < 0) || (((*timeout).tv_sec == 0) && ((*timeout).tv_usec == 0)) ) return(1);
-        else return(0);
-}
-
diff --git a/org.glite.lb.server/src/cond_dump.c b/org.glite.lb.server/src/cond_dump.c
deleted file mode 100644 (file)
index fbf72e9..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-#ident "$Header$"
-
-#include "glite/lb/context-int.h"
-#include "lb_proto.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <assert.h>
-
-#define TR(name,type,field)             \
-        if (field) {            \
-                asprintf(&pomA,"%s<tr><th align=\"left\">" name ":</th>"        \
-                        "<td>" type "</td></tr>",pomB,(field)); \
-                free(pomB);                                     \
-                pomB = pomA;                                    \
-        }
-
-#define GS(string){    \
-       asprintf(&pomA, "%s %s", pomB, (string)); \
-       free(pomB); \
-       pomB = pomA; \
-}
-
-int edg_wll_Condition_Dump(notifInfo *ni, char **output, int oneline){
-       if (! ni->conditions){
-               *output = strdup("");
-               return -1;
-       }
-
-       char *pomA = NULL, *pomB;
-       pomB = strdup("");
-
-       edg_wll_QueryRec **l1;
-       edg_wll_QueryRec *l2;
-       for (l1 = ni->conditions; *l1; l1++){
-               if (l1 != ni->conditions)
-                       GS ("and");
-               if (oneline)
-                       GS("(");
-               l2 = *l1;
-               switch (l2->attr){
-                       case EDG_WLL_QUERY_ATTR_JOBID: GS("jobId");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_OWNER: GS("owner");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_STATUS: GS("status");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_LOCATION: GS("location");
-                               break;
-                        case EDG_WLL_QUERY_ATTR_DESTINATION: GS("destination");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_DONECODE: GS("donecode");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_USERTAG:
-                               GS(l2->attr_id.tag);
-                               break;
-                       case EDG_WLL_QUERY_ATTR_TIME: GS("time");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_LEVEL: GS("level");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_HOST: GS("host");
-                               break;
-                        case EDG_WLL_QUERY_ATTR_SOURCE: GS("source");
-                               break;
-                        case EDG_WLL_QUERY_ATTR_INSTANCE: GS("instance");
-                               break;
-                        case EDG_WLL_QUERY_ATTR_EVENT_TYPE: GS("eventtype");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_CHKPT_TAG: GS("chkpttag");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_RESUBMITTED: GS("resubmitted");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_PARENT: GS("parent_job");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_EXITCODE: GS("exitcode");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_JDL_ATTR: 
-                               GS(l2->attr_id.tag);  //get JDL attribute name
-                               break;
-                       case EDG_WLL_QUERY_ATTR_STATEENTERTIME: GS("stateentertime");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: GS("lastupdatetime");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: GS("networkserver");
-                               break;
-                       default:
-                               assert(! "Unknown attribute!");
-                               break;
-               }
-               for (l2 = *l1; l2->attr; l2++){
-                       if (l2 != *l1 && !oneline) GS ("        or");
-                       if (l2 != *l1 && oneline) GS("or");
-                       switch(l2->op){
-                               case EDG_WLL_QUERY_OP_EQUAL: GS("=");
-                                       break;
-                               case EDG_WLL_QUERY_OP_LESS: GS ("<");
-                                       break;
-                               case EDG_WLL_QUERY_OP_GREATER: GS ("<");
-                                       break;
-                               case EDG_WLL_QUERY_OP_WITHIN: GS ("within");
-                                       break;
-                               case EDG_WLL_QUERY_OP_UNEQUAL: GS ("!=");
-                       }
-                       char *buf;
-                       switch (l2->attr){
-                               case EDG_WLL_QUERY_ATTR_JOBID:
-                               case EDG_WLL_QUERY_ATTR_PARENT:
-                                       GS(edg_wlc_JobIdUnparse(l2->value.j));
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_DESTINATION:
-                               case EDG_WLL_QUERY_ATTR_LOCATION:
-                               case EDG_WLL_QUERY_ATTR_OWNER:
-                               case EDG_WLL_QUERY_ATTR_HOST:
-                               case EDG_WLL_QUERY_ATTR_INSTANCE:
-                               case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                               case EDG_WLL_QUERY_ATTR_NETWORK_SERVER:
-                                       GS(l2->value.c);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_STATUS:
-                                       if (l2->op == EDG_WLL_QUERY_OP_WITHIN)
-                                                asprintf(&buf, "%i and %i",
-                                                        edg_wll_StatToString((edg_wll_JobStatCode)l2->value.i), 
-                                                       edg_wll_StatToString((edg_wll_JobStatCode)l2->value2.i));
-                                       else
-                                               asprintf(&buf, "%i", edg_wll_StatToString((edg_wll_JobStatCode)l2->value.i));
-                                       GS(buf);
-                                       free(buf);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_DONECODE:
-                               case EDG_WLL_QUERY_ATTR_EXITCODE:
-                                       if (l2->op == EDG_WLL_QUERY_OP_WITHIN)
-                                               asprintf(&buf, "%i and %i",
-                                                        l2->value.i, l2->value2.i);
-                                       else
-                                               asprintf(&buf, "%i", l2->value.i);
-                                        GS(buf);
-                                        free(buf);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
-                                       if (l2->op == EDG_WLL_QUERY_OP_WITHIN)
-                                               asprintf(&buf, "%s and %s", 
-                                                       edg_wll_EventToString((edg_wll_EventCode)l2->value.i),
-                                                       edg_wll_EventToString((edg_wll_EventCode)l2->value2.i));
-                                       else
-                                               asprintf(&buf, "%s", 
-                                                       edg_wll_EventToString((edg_wll_EventCode)l2->value.i));
-                                       GS(buf);
-                                       free(buf);
-                                        break;
-                               case EDG_WLL_QUERY_ATTR_USERTAG:
-                                       GS(l2->attr_id.tag);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_TIME:
-                               case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-                                case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                                       buf = strdup(ctime(&(l2->value.t.tv_sec)));
-                                       buf[strlen(buf)-1] = 0; // cut out '\n'
-                                       if (l2->op == EDG_WLL_QUERY_OP_WITHIN){
-                                               char *buf_ptr = buf;
-                                               asprintf(&buf, "%s and %s", buf_ptr, ctime(&(l2->value2.t.tv_sec)));
-                                               free(buf_ptr);
-                                               buf[strlen(buf)-1] = 0;
-                                               GS(buf);
-                                       }
-                                       else
-                                               GS(buf);
-                                       free(buf);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_LEVEL:
-                                       if (l2->op == EDG_WLL_QUERY_OP_WITHIN)
-                                               asprintf(&buf, "%i and %i",
-                                                       l2->value.i, l2->value2.i);
-                                       else
-                                               asprintf(&buf, "%i", l2->value.i);
-                                       GS(buf);        
-                                       free(buf);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_SOURCE:
-                                       buf = edg_wll_SourceToString(l2->value.i);
-                                       GS(buf);
-                                       free(buf);
-                                       if (l2->op == EDG_WLL_QUERY_OP_WITHIN){
-                                               GS("and");
-                                               buf = edg_wll_SourceToString(l2->value2.i);
-                                               GS(buf);
-                                               free(buf);
-                                       }
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_CHKPT_TAG:
-                                       //XXX: what kind of data is it?
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-                                       asprintf(&buf, "%i", l2->value.i);
-                                       GS(buf);
-                                        free(buf);
-                                       break;
-                               default:
-                                       assert(! "Unknown condition attribute!");
-                                       break;
-                       }
-                       if (! oneline)
-                               GS("\n");
-               }
-               if (oneline)
-                       GS(")");
-       }
-
-       *output = pomA;
-
-       return 0;
-}
-
diff --git a/org.glite.lb.server/src/cond_dump.h b/org.glite.lb.server/src/cond_dump.h
deleted file mode 100644 (file)
index 7a31251..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef GLITE_NOPTIF_DUMP_H
-#define GLITE_NOTIF_DUMP_H
-
-#include "lb_proto.h"
-
-int edg_wll_Condition_Dump(notifInfo *ni, char **output, int oneline);
-
-#endif /* GLITE_NOTIF_DUMP */
-
diff --git a/org.glite.lb.server/src/db_calls.c b/org.glite.lb.server/src/db_calls.c
deleted file mode 100644 (file)
index 4ef3e96..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-#ident "$Header: "
-
-#include <string.h>
-#include <errno.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lbu/trio.h"
-
-#include "glite/lb/context-int.h"
-
-#include "db_calls.h"
-#include "db_supp.h"
-
-/** Returns bitmask of job membership in common server/proxy database 
- */
-int edg_wll_jobMembership(edg_wll_Context ctx, glite_jobid_const_t job)
-{
-        char            *dbjob;
-        char            *stmt = NULL;
-        glite_lbu_Statement q;
-        int             ret, result = -1;
-        char            *res[2] = { NULL, NULL};
-
-        edg_wll_ResetError(ctx);
-
-        dbjob = edg_wlc_JobIdGetUnique(job);
-
-        trio_asprintf(&stmt,"select proxy,server from jobs where jobid = '%|Ss' for update",dbjob);
-        ret = edg_wll_ExecSQL(ctx,stmt,&q);
-        if (ret <= 0) {
-                if (ret == 0) {
-                        fprintf(stderr,"%s: no such job\n",dbjob);
-                        edg_wll_SetError(ctx,ENOENT,dbjob);
-                }
-                goto clean;
-        }
-        free(stmt); stmt = NULL;
-
-        if ((ret = edg_wll_FetchRow(ctx,q,sizeof(res)/sizeof(res[0]),NULL,res)) > 0) {
-               result = 0;
-                if (strcmp(res[0],"0")) result += DB_PROXY_JOB;
-                if (strcmp(res[1],"0")) result += DB_SERVER_JOB;
-        }
-        else {
-               fprintf(stderr,"Error retrieving proxy&server fields of jobs table. Missing column?\n");
-                edg_wll_SetError(ctx,ENOENT,dbjob);
-        }
-
-clean:
-        glite_lbu_FreeStmt(&q);
-
-       free(res[0]); free(res[1]);
-        free(dbjob);
-        free(stmt);
-        return(result);
-}
-
-
-/* just lock one row corresponding to job in table jobs
- * lock_mode: 0 = lock in share mode / 1 = for update
- */
-int edg_wll_LockJobRow(edg_wll_Context ctx, const char *job, int lock_mode) 
-{
-       char                    *stmt = NULL;
-       glite_lbu_Statement     sh;
-       int                     nr;
-
-
-       edg_wll_ResetError(ctx);
-
-       if (lock_mode) 
-               trio_asprintf(&stmt, "select * from jobs where jobid='%|Ss' for update", job);
-       else
-               trio_asprintf(&stmt, "select * from jobs where jobid='%|Ss' lock in share mode", job);
-
-       if ((nr = edg_wll_ExecSQL(ctx,stmt,&sh)) < 0) goto cleanup;
-       if (nr == 0) {
-               char *err;
-
-               asprintf(&err,"jobid='%s' not registered in DB", job);
-                edg_wll_SetError(ctx,ENOENT, err);
-               free(err);
-                goto cleanup;
-       }
-       
-cleanup:
-       if (sh) glite_lbu_FreeStmt(&sh);
-       free(stmt); stmt = NULL;
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
diff --git a/org.glite.lb.server/src/db_calls.h b/org.glite.lb.server/src/db_calls.h
deleted file mode 100644 (file)
index ff4910d..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef GLITE_LB_LB_CALLS_H
-#define GLITE_LB_LB_CALLS_H
-
-#ident "$Header:"
-
-#define DB_PROXY_JOB    1
-#define DB_SERVER_JOB   2
-
-int edg_wll_jobMembership(edg_wll_Context ctx, glite_jobid_const_t job);
-
-#define edg_wll_LockJobRowInShareMode(X,Y) edg_wll_LockJobRow(X,Y,0)
-#define edg_wll_LockJobRowForUpdate(X,Y) edg_wll_LockJobRow(X,Y,1)
-int edg_wll_LockJobRow(edg_wll_Context ctx, const char *job, int lock_mode);
-
-
-#endif /* GLITE_LB_LB_CALLS_H */
diff --git a/org.glite.lb.server/src/db_store.c b/org.glite.lb.server/src/db_store.c
deleted file mode 100644 (file)
index dde7ce4..0000000
+++ /dev/null
@@ -1,307 +0,0 @@
-#ident "$Header$"
-
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <assert.h>
-
-#include "glite/lbu/maildir.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/events.h"
-#include "glite/lb/events_parse.h"
-#include "purge.h"
-#include "store.h"
-#include "il_lbproxy.h"
-#include "jobstat.h"
-#include "db_supp.h"
-
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#include "srv_perf.h"
-#endif
-
-
-extern int unset_proxy_flag(edg_wll_Context, edg_wlc_JobId);
-extern int edg_wll_NotifMatch(edg_wll_Context, const edg_wll_JobStat *, const edg_wll_JobStat *);
-extern int enable_lcas;
-
-
-static int db_store_finalize(edg_wll_Context ctx, char *event, edg_wll_Event *ev, edg_wll_JobStat *oldstat, edg_wll_JobStat *newstat, int reg_to_JP);
-
-
-int
-db_store(edg_wll_Context ctx, char *event)
-{
-  edg_wll_Event        *ev = NULL;
-  int                  seq, reg_to_JP = 0, local_job;
-  edg_wll_JobStat      newstat;
-  edg_wll_JobStat      oldstat;
-
-
-  edg_wll_ResetError(ctx);
-  memset(&newstat,0,sizeof newstat);
-  memset(&oldstat,0,sizeof oldstat);
-
-  if(edg_wll_ParseEvent(ctx, event, &ev)) goto err;
-
-  local_job = is_job_local(ctx, ev->any.jobId);
-
-  if (enable_lcas && check_store_authz(ctx, ev) != 0)
-    goto err;
-
-#ifdef LB_PERF
-  if (sink_mode == GLITE_LB_SINK_STORE) {
-         glite_wll_perftest_consumeEvent(ev);
-         edg_wll_FreeEvent(ev);
-         free(ev);
-         return 0;
-  }
-#endif
-
-  do {
-       if (edg_wll_Transaction(ctx)) goto err;
-
-       if (store_job_server_proxy(ctx, ev, &reg_to_JP)) goto rollback;
-
-       /* events logged to proxy and server (DIRECT flag) may be ignored on proxy
-       * if jobid prefix hostname matches server hostname -> they will
-       * sooner or later arrive to server too and are stored in common DB 
-       */
-       if (ctx->isProxy && local_job && (ev->any.priority & EDG_WLL_LOGFLAG_DIRECT)) {
-               goto commit;
-       }
-
-       if (edg_wll_StoreEvent(ctx, ev, event, &seq)) goto rollback;
-       
-       if ( ev->any.type == EDG_WLL_EVENT_CHANGEACL ) {
-               if (edg_wll_UpdateACL(ctx, ev->any.jobId,
-                       ev->changeACL.user_id, ev->changeACL.user_id_type,
-                       ev->changeACL.permission, ev->changeACL.permission_type,
-                       ev->changeACL.operation)) goto rollback;                
-                       
-       }
-       else {
-#ifdef LB_PERF
-               if(sink_mode == GLITE_LB_SINK_STATE) {
-                       glite_wll_perftest_consumeEvent(ev);
-                       goto commit;
-               }
-#endif
-
-               if ( newstat.state )  { /* prevent memleaks in case of transaction retry */
-                       edg_wll_FreeStatus(&newstat);
-                       newstat.state = EDG_WLL_JOB_UNDEF;
-               }
-               if (edg_wll_StepIntState(ctx,ev->any.jobId, ev, seq, &oldstat, &newstat)) goto rollback;
-               
-               if (newstat.remove_from_proxy) 
-                       if (edg_wll_PurgeServerProxy(ctx, ev->any.jobId)) goto rollback;
-       }
-
-
-       if (ev->any.type == EDG_WLL_EVENT_REGJOB &&
-               (ev->regJob.jobtype == EDG_WLL_REGJOB_DAG ||
-                ev->regJob.jobtype == EDG_WLL_REGJOB_PARTITIONED ||
-                ev->regJob.jobtype == EDG_WLL_REGJOB_COLLECTION) &&
-               ev->regJob.nsubjobs > 0) { 
-
-                       if (register_subjobs_embryonic(ctx,&ev->regJob)) goto rollback;
-                       reg_to_JP |= REG_SUBJOBS_TO_JP;
-       }
-
-commit:
-rollback:;
-  } while (edg_wll_TransNeedRetry(ctx));
-
-  if (edg_wll_Error(ctx, NULL, NULL)) goto err;
-
-
-  db_store_finalize(ctx, event, ev, &oldstat, &newstat, reg_to_JP);
-
-
-err:
-  if(ev) { edg_wll_FreeEvent(ev); free(ev); }
-  if ( newstat.state ) edg_wll_FreeStatus(&newstat);
-  if ( oldstat.state ) edg_wll_FreeStatus(&oldstat);
-
-  return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-
-/* Called only when CollectionStateEvent generated */
-int
-db_parent_store(edg_wll_Context ctx, edg_wll_Event *ev, intJobStat *is)
-{
-  char  *event = NULL;
-  int  seq;
-  int   err;
-  edg_wll_JobStat      newstat;
-  edg_wll_JobStat      oldstat;
-
-
-  edg_wll_ResetError(ctx);
-  memset(&newstat,0,sizeof newstat);
-  memset(&oldstat,0,sizeof oldstat);
-
-  /* Transaction opened from db_store */
-
-#ifdef LB_PERF
-  if (sink_mode == GLITE_LB_SINK_STORE) {
-         glite_wll_perftest_consumeEvent(ev);
-         edg_wll_FreeEvent(ev);
-         free(ev);
-         return 0;
-  }
-#endif
-
-
-  assert(ev->any.user);
-
-    // locked from edg_wll_LoadIntState() <- load_parent_intJobStat() <- update_parent_status()
-    // XXX: maybe it can be locked InShareMode there and re-locked ForUpdate here?
-
-    if(edg_wll_StoreEvent(ctx, ev, NULL, &seq))
-      goto err;
-
-#ifdef LB_PERF
-  if(sink_mode == GLITE_LB_SINK_STATE) {
-            glite_wll_perftest_consumeEvent(ev);
-            goto err;
-  }
-#endif
-
-  err = edg_wll_StepIntStateParent(ctx,ev->any.jobId, ev, seq, is, &oldstat, ctx->isProxy? NULL: &newstat);
-
-  if (err) goto err;
-
-  if ( ctx->isProxy ) {
-    event = edg_wll_UnparseEvent(ctx, ev);
-    assert(event);
-  }
-
-  db_store_finalize(ctx, event, ev, &oldstat, &newstat, 0);
-
-err:
-
-  free(event);
-  if ( newstat.state ) edg_wll_FreeStatus(&newstat);
-  if ( oldstat.state ) edg_wll_FreeStatus(&oldstat);
-  
-  return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-/* Send regitration to JP 
- */
-static int register_to_JP(edg_wll_Context ctx, edg_wlc_JobId jobid, char *user)
-{
-       char *jids, *msg;
-       
-       
-       if ( !(jids = edg_wlc_JobIdUnparse(jobid)) ) {
-               return edg_wll_SetError(ctx, errno, "Can't unparse jobid when registering to JP");
-       }
-       if ( !(msg = calloc(strlen(jids)+strlen(user)+2, sizeof(char) )) ) {
-               free(jids);
-               return edg_wll_SetError(ctx, errno, "Can't allocate buffer when registering to JP");
-       }
-       strcat(msg, jids);
-       free(jids);
-       strcat(msg, "\n");
-       strcat(msg, user);
-       if ( glite_lbu_MaildirStoreMsg(ctx->jpreg_dir, ctx->srvName, msg) ) {
-               free(msg);
-               return edg_wll_SetError(ctx, errno, lbm_errdesc);
-       }
-       free(msg);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-static int register_subjobs_to_JP(edg_wll_Context ctx, edg_wll_Event *ev)
-{
-       edg_wlc_JobId   *subjobs = NULL;
-       int             i = 0, j;
-
-
-       if (edg_wll_GenerateSubjobIds(ctx, ev->regJob.jobId, 
-                       ev->regJob.nsubjobs, ev->regJob.seed, &subjobs)) 
-               goto err;
-
-       for (i=0; i<ev->regJob.nsubjobs; i++) {
-               if (register_to_JP(ctx, subjobs[i], ev->any.user))
-                       goto err;
-       }
-
-err:
-       for (j=i; j<ev->regJob.nsubjobs; j++) edg_wlc_JobIdFree(subjobs[j]);
-       free(subjobs);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-static int forward_event_to_server(edg_wll_Context ctx, char *event, edg_wll_Event *ev, int local_job)
-{
-       if ( ctx->isProxy ) {
-               /*
-                *      send event to the proper BK server
-                *      event with priority flag EDG_WLL_LOGFLAG_DIRECT (typically RegJob) is not sent
-                */
-
-               /* XXX: ending here may break the backward compatibility */
-               if (!(ev->any.priority & EDG_WLL_LOGFLAG_PROXY)) {
-                       edg_wll_UpdateError(ctx, 0, "db_actual_store() WARNING: the event is not PROXY");
-                       //return edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "db_actual_store() ERROR: the event is not PROXY");
-               }
-
-               if (!(ev->any.priority & (EDG_WLL_LOGFLAG_DIRECT | EDG_WLL_LOGFLAG_INTERNAL)) && !local_job) {
-                       if (edg_wll_EventSendProxy(ctx, ev->any.jobId, event) )  {
-                               return edg_wll_SetError(ctx, EDG_WLL_IL_PROTO, "edg_wll_EventSendProxy() error.");
-                       }
-               }
-       }
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-static int db_store_finalize(edg_wll_Context ctx, char *event, edg_wll_Event *ev, edg_wll_JobStat *oldstat, edg_wll_JobStat *newstat, int reg_to_JP) 
-{
-       int     local_job = is_job_local(ctx, ev->any.jobId);
-
-
-#ifdef LB_PERF
-       if( sink_mode == GLITE_LB_SINK_SEND ) {
-               glite_wll_perftest_consumeEvent(ev);
-               return edg_wll_Error(ctx,NULL,NULL);
-       }
-#endif
-       
-       if (ctx->jpreg_dir) {
-               if (reg_to_JP & REG_JOB_TO_JP) 
-                       if (register_to_JP(ctx,ev->any.jobId,ev->any.user)) goto err;
-               if (reg_to_JP & REG_SUBJOBS_TO_JP)
-                       if (register_subjobs_to_JP(ctx,ev)) goto err;
-       }
-
-       if (forward_event_to_server(ctx, event, ev, local_job)) goto err;
-       
-       if (newstat->state) {
-               if ( ctx->isProxy ) {
-                       if ((ev->any.priority & EDG_WLL_LOGFLAG_DIRECT) || local_job) 
-                               /* event will not arrive to server, only flag was set           */
-                               /* check whether some pending notifications are not triggered   */
-                               edg_wll_NotifMatch(ctx, oldstat, newstat);
-                       }
-               else {
-                               edg_wll_NotifMatch(ctx, oldstat, newstat);
-               }
-       }
-
-err:
-       return edg_wll_Error(ctx,NULL,NULL);
-}
diff --git a/org.glite.lb.server/src/db_supp.c b/org.glite.lb.server/src/db_supp.c
deleted file mode 100644 (file)
index 3577037..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-#include <stdlib.h>
-#include <errno.h>
-#include <syslog.h>
-#include <unistd.h>
-#include <stdio.h>
-
-
-#include "glite/lbu/db.h"
-#include "glite/lb/context-int.h"
-
-extern int     debug;  // declared and set in bkserver.c
-
-
-int edg_wll_SetErrorDB(edg_wll_Context ctx) {
-       int code;
-       char *ed;
-
-       if (ctx->dbctx) {
-               code = glite_lbu_DBError(ctx->dbctx, NULL, &ed);
-               if (code == EDEADLOCK) code = EDG_WLL_ERROR_DB_TRANS_DEADLOCK;
-               if (code == ERESTART) code = EDG_WLL_ERROR_DB_LOST_CONNECTION;
-               edg_wll_SetError(ctx, code, ed);
-               free(ed);
-       } else {
-               code = EINVAL;
-               edg_wll_SetError(ctx, EINVAL, "DB context isn't created");
-       }
-
-       return code;
-}
-
-
-int edg_wll_ExecSQL(edg_wll_Context ctx, const char *cmd, glite_lbu_Statement *stmt) {
-       int retval;
-
-       if ((retval = glite_lbu_ExecSQL(ctx->dbctx, cmd, stmt)) < 0) edg_wll_SetErrorDB(ctx);
-       return retval;
-}
-
-
-int edg_wll_FetchRow(edg_wll_Context ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results) {
-       int retval;
-
-       if ((retval = glite_lbu_FetchRow(stmt, n, lengths, results)) < 0) edg_wll_SetErrorDB(ctx);
-       return retval;
-}
-
-int edg_wll_bufferedInsertInit(edg_wll_Context ctx, glite_lbu_bufInsert *bi, const char *table_name, long size_limit, long record_limit, const char *columns) {
-       int retval;
-
-       if ((retval = glite_lbu_bufferedInsertInit(ctx->dbctx, bi, table_name, size_limit, record_limit, columns)) != 0) edg_wll_SetErrorDB(ctx);
-       return retval;
-}
-
-int edg_wll_bufferedInsert(edg_wll_Context ctx, glite_lbu_bufInsert bi, const char *row) {
-       int retval;
-
-       if ((retval = glite_lbu_bufferedInsert(bi, row)) != 0) edg_wll_SetErrorDB(ctx);
-       return retval;
-}
-
-int edg_wll_bufferedInsertClose(edg_wll_Context ctx, glite_lbu_bufInsert bi) {
-       int retval;
-
-       if ((retval = glite_lbu_bufferedInsertClose(bi)) != 0) edg_wll_SetErrorDB(ctx);
-       return retval;
-}
-
-int edg_wll_Transaction(edg_wll_Context ctx) {
-       int retval;
-
-       if ((retval = glite_lbu_Transaction(ctx->dbctx)) != 0) edg_wll_SetErrorDB(ctx);
-
-// printf("edg_wll_Transaction(%d)\n", retval);
-       return retval;
-}
-
-int edg_wll_Commit(edg_wll_Context ctx) {
-       int retval;
-
-       if ((retval = glite_lbu_Commit(ctx->dbctx)) != 0) edg_wll_SetErrorDB(ctx);
-// printf("edg_wll_Commit(%d)\n", retval);
-       return retval;
-}
-
-int edg_wll_Rollback(edg_wll_Context ctx) {
-       int retval;
-
-       if ((retval = glite_lbu_Rollback(ctx->dbctx)) != 0) edg_wll_SetErrorDB(ctx);
-// printf("edg_wll_Rollback(%d)\n", retval);
-       return retval;
-}
-
-int edg_wll_TransNeedRetry(edg_wll_Context ctx) {
-       int ret;
-       char *errd;
-
-       ret = edg_wll_Error(ctx,NULL,NULL);
-
-       if (ret == EDG_WLL_ERROR_DB_TRANS_DEADLOCK) {
-               if (debug)
-                       printf("[%d]: DB deadlock detected. Rolling back transaction and retrying... \n",getpid());
-               else 
-                       syslog(LOG_INFO,"[%d]: DB deadlock detected. Rolling back transaction and retrying... \n",getpid());
-
-               edg_wll_ResetError(ctx);
-               return !edg_wll_Rollback(ctx);
-       }
-       if (ret == EDG_WLL_ERROR_DB_LOST_CONNECTION) {
-               if (debug)
-                       printf("[%d]: Lost connection to DB. "
-                               "Rolling back transaction and retrying... \n",getpid());
-               else 
-                       syslog(LOG_INFO,"[%d]: Lost connection to DB. "
-                               "Rolling back transaction and retrying... \n",getpid());
-
-               edg_wll_ResetError(ctx);
-               return !edg_wll_Rollback(ctx);
-       } else if (ret==0) {
-               edg_wll_Commit(ctx); /* errors propagated further */
-               return 0;
-       } else {
-               edg_wll_Error(ctx, NULL, &errd);
-               edg_wll_Rollback(ctx);
-               edg_wll_SetError(ctx, ret, errd);
-               free(errd);
-               return 0;
-       }
-}
-
-
diff --git a/org.glite.lb.server/src/db_supp.h b/org.glite.lb.server/src/db_supp.h
deleted file mode 100644 (file)
index 2abf777..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef EDG_WLL_DB_SUPP_H
-#define EDG_WLL_DB_SUPP_H
-
-#ident "$Header:"
-
-#include "glite/lbu/db.h"
-
-#define DEFAULTCS "lbserver/@localhost:lbserver20"
-
-/**
- * Set the current database error.
- */
-int edg_wll_SetErrorDB(edg_wll_Context ctx);
-
-int edg_wll_ExecSQL(edg_wll_Context ctx, const char *cmd, glite_lbu_Statement *stmt);
-int edg_wll_FetchRow(edg_wll_Context ctx, glite_lbu_Statement stmt, unsigned int n, unsigned long *lengths, char **results);
-
-int edg_wll_bufferedInsertInit(edg_wll_Context ctx, glite_lbu_bufInsert *bi, const char *table_name, long size_limit, long record_limit, const char *columns);
-int edg_wll_bufferedInsert(edg_wll_Context ctx, glite_lbu_bufInsert bi, const char *row);
-int edg_wll_bufferedInsertClose(edg_wll_Context ctx, glite_lbu_bufInsert bi);
-
-int edg_wll_Transaction(edg_wll_Context ctx);
-int edg_wll_Commit(edg_wll_Context ctx);
-int edg_wll_Rollback(edg_wll_Context ctx);
-int edg_wll_TransNeedRetry(edg_wll_Context ctx);
-
-#endif
diff --git a/org.glite.lb.server/src/dump.c b/org.glite.lb.server/src/dump.c
deleted file mode 100644 (file)
index 1b6771e..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-#ident "$Header$"
-
-#include <time.h>
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-#include <assert.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/jobid/cjobid.h"
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/events_parse.h"
-#include "glite/lb/ulm_parse.h"
-
-#include "query.h"
-#include "get_events.h"
-#include "server_state.h"
-#include "purge.h"
-#include "db_supp.h"
-#include "lb_proto.h"
-
-static char *time_to_string(time_t t, char **ptr);
-static int handle_specials(edg_wll_Context,time_t *);
-
-#define sizofa(a) (sizeof(a)/sizeof((a)[0]))
-
-int edg_wll_DumpEventsServer(edg_wll_Context ctx,const edg_wll_DumpRequest *req,edg_wll_DumpResult *result)
-{
-       char    *from_s, *to_s, *stmt, *time_s, *ptr;
-       char    *tmpfname;
-       time_t  start,end;
-       glite_lbu_Statement     q = NULL;
-       char            *res[10];
-       int     event;
-       edg_wll_Event   e;
-       int     ret,dump = 2;   /* TODO: manage dump file */
-       time_t  from = req->from,to = req->to;
-
-       from_s = to_s = stmt = NULL;
-       memset(res,0,sizeof res);
-       memset(&e,0,sizeof e);
-
-       time(&start);
-       edg_wll_ResetError(ctx);
-
-       if ( (dump = edg_wll_CreateTmpDumpFile(ctx, &tmpfname)) == -1 )
-               return edg_wll_Error(ctx, NULL, NULL);
-
-       if (handle_specials(ctx,&from) || handle_specials(ctx,&to))
-       {
-               unlink(tmpfname);
-               return edg_wll_Error(ctx,NULL,NULL);
-       }
-
-       glite_lbu_TimeToDB(from, &from_s);
-       glite_lbu_TimeToDB(to, &to_s);
-
-       trio_asprintf(&stmt,
-                       "select event,dg_jobid,code,prog,host,u.cert_subj,time_stamp,usec,level,arrived "
-                       "from events e,users u,jobs j "
-                       "where u.userid=e.userid "
-                       "and j.jobid = e.jobid "
-                       "and j.dg_jobid like 'https://%|Ss:%d%%' "
-                       "and arrived > %s and arrived <= %s "
-                       "order by arrived",
-                       ctx->srvName,ctx->srvPort,
-                       from_s,to_s);
-
-       if (edg_wll_ExecSQL(ctx,stmt,&q) < 0) goto clean;
-
-       while ((ret = edg_wll_FetchRow(ctx,q,sizeof(res)/sizeof(res[0]),NULL,res)) > 0) {
-               assert(ret == sizofa(res));
-               event = atoi(res[0]); free(res[0]); res[0] = NULL;
-
-               if (convert_event_head(ctx,res+1,&e)
-                       || edg_wll_get_event_flesh(ctx,event,&e))
-               {
-                       char    *et,*ed;
-                       int     i;
-
-               /* Most likely sort of internal inconsistency. 
-                * Must not be fatal -- just complain
-                */
-                       edg_wll_Error(ctx,&et,&ed);
-                       fprintf(stderr,"%s event %d: %s (%s)\n",res[1],event,et,ed);
-                       syslog(LOG_WARNING,"%s event %d: %s (%s)",res[1],event,et,ed);
-                       free(et); free(ed);
-                       for (i=0; i<sizofa(res); i++) free(res[i]);
-                       edg_wll_ResetError(ctx);
-               }
-               else {
-                       char    *event_s = edg_wll_UnparseEvent(ctx,&e);
-                       char    arr_s[100];
-                       int             len, written, total;
-
-                       strcpy(arr_s, "DG.ARRIVED=");
-                       edg_wll_ULMTimevalToDate(e.any.arrived.tv_sec,
-                                                       e.any.arrived.tv_usec,
-                                                       arr_s+strlen("DG.ARRIVED="));
-                       len = strlen(arr_s);
-                       total = 0;
-                       while (total != len) {
-                               written = write(dump,arr_s+total,len-total);
-                               if (written < 0 && errno != EAGAIN) {
-                                       edg_wll_SetError(ctx,errno,"writing dump file");
-                                       free(event_s);
-                                       goto clean;
-                               }
-                               total += written;
-                       }
-                       write(dump, " ", 1);
-                       len = strlen(event_s);
-                       total = 0;
-                       while (total != len) {
-                               written = write(dump,event_s+total,len-total);
-                               if (written < 0 && errno != EAGAIN) {
-                                       edg_wll_SetError(ctx,errno,"writing dump file");
-                                       free(event_s);
-                                       goto clean;
-                               }
-                               total += written;
-                       }
-                       write(dump,"\n",1);
-                       free(event_s);
-               }
-               edg_wll_FreeEvent(&e); memset(&e,0,sizeof e);
-       }
-
-       time(&end);
-       time_s = time_to_string(start, &ptr);
-       edg_wll_SetServerState(ctx,EDG_WLL_STATE_DUMP_START,time_s);
-       free(ptr);
-       
-       time_s = time_to_string(end, &ptr);
-       edg_wll_SetServerState(ctx,EDG_WLL_STATE_DUMP_END,time_s);
-       free(ptr);
-
-       result->from = from;
-       result->to = to;
-
-       edg_wll_CreateDumpFileFromTmp(ctx, tmpfname, &(result->server_file));
-       unlink(tmpfname);
-
-clean:
-       edg_wll_FreeEvent(&e);
-       glite_lbu_FreeStmt(&q);
-
-       free(stmt);
-       free(from_s);
-       free(to_s);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-static int handle_specials(edg_wll_Context ctx,time_t *t)
-{
-       char    *time_s;
-       int     ret;
-
-       edg_wll_ResetError(ctx);
-       switch (*t) {
-               case EDG_WLL_DUMP_NOW:
-                       time(t);
-                       return 0;
-               case EDG_WLL_DUMP_LAST_START:
-               case EDG_WLL_DUMP_LAST_END:
-                       switch (ret = edg_wll_GetServerState(ctx,
-                                       *t == EDG_WLL_DUMP_LAST_START ? 
-                                               EDG_WLL_STATE_DUMP_START:
-                                               EDG_WLL_STATE_DUMP_END,
-                                       &time_s))
-                       {
-                               case ENOENT: *t = 0; 
-                                            edg_wll_ResetError(ctx);
-                                            break;
-                               case 0: *t = glite_lbu_DBToTime(time_s); 
-                                       assert(*t >= 0);
-                                       break;
-                               default: break;
-                       }
-                       break;
-               default: if (*t < 0) return edg_wll_SetError(ctx,EINVAL,"special time limit unrecognized");
-       }
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-static char *time_to_string(time_t t, char **ptr) {
-       char *s;
-
-       glite_lbu_TimeToDB(t, &s);
-       s[strlen(s) - 1] = '\0';
-       *ptr = s;
-
-       return s + 1;
-}
diff --git a/org.glite.lb.server/src/get_events.c.T b/org.glite.lb.server/src/get_events.c.T
deleted file mode 100644 (file)
index c7c245e..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-#ident "$Header$"
-
-/*
-@@@AUTO
-*/
-@@@LANG: C
-
-/* Helper functions for getting events from the LB database *
- * XXX: lots of stuff still hadcoded:
- *             there's mapping db.columns <-> union event fields
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <syslog.h>
-
-#include "glite/lbu/trio.h"
-#include "get_events.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/events_parse.h"
-#include "db_supp.h"
-
-static void edg_wll_set_event_field(edg_wll_Event *,char *,char *);
-static void edg_wll_set_event_field_warn(edg_wll_Event *,char *,char *);
-
-int edg_wll_get_event_flesh(edg_wll_Context ctx,int n,edg_wll_Event *e)
-{
-       char    *jobid = edg_wlc_JobIdGetUnique(e->any.jobId),
-               *q = NULL,*nameval[2];
-       glite_lbu_Statement     sh;
-       int     ret,t;
-       const char      *tables[] = { "short_fields","long_fields" };
-       edg_wll_Event *f;
-
-       edg_wll_ResetError(ctx);
-
-       trio_asprintf(&q, "select ulm from events_flesh where jobid = '%|Ss' and event = %d", jobid, n);
-       if ((ret=edg_wll_ExecSQL(ctx,q,&sh)) < 0) goto cleanup;
-       if (edg_wll_FetchRow(ctx,sh,1,NULL,&nameval[0]) == 1) {
-               //fprintf(stderr, "got ulm: '%s'\n", nameval[0]);
-               // nasty ;-)
-               edg_wll_ParseEvent(ctx,nameval[0],&f);
-               free(nameval[0]);
-
-               f->any.arrived = e->any.arrived;
-               edg_wll_FreeEvent(e);
-
-               memcpy(e, f, sizeof *e);
-               free(f);
-               ret=edg_wll_CheckEvent(ctx,e);
-       } else ret = ENOENT;
-       free(q); q = NULL;
-       glite_lbu_FreeStmt(&sh);
-
-       // old way keeped for compatibility/slow migration
-       if (ret != 0) {
-       for (t=0; t<=1; t++) {
-               trio_asprintf(&q,"select name,value from %s "
-                               "where jobid = '%|Ss' and event = %d ",
-                               tables[t],jobid,n);
-
-               if ((ret=edg_wll_ExecSQL(ctx,q,&sh)) < 0) goto cleanup;
-
-               while ((ret=edg_wll_FetchRow(ctx,sh,sizeof(nameval)/sizeof(nameval[0]),NULL,nameval)) > 0) {
-                       assert(ret == 2);
-                       edg_wll_set_event_field(e,nameval[0],nameval[1]);
-                       free(nameval[0]);
-                       /* XXX: nameval[1] freed in edg_wll_set_event_field
-                        * if necessary
-                        */
-               }
-
-               if (ret<0) goto cleanup;
-               glite_lbu_FreeStmt(&sh);
-               free(q); q=NULL;
-       }
-       ret=edg_wll_CheckEvent(ctx,e);
-       }
-
-cleanup:
-       if (sh) glite_lbu_FreeStmt(&sh);
-       free(jobid);
-       free(q);
-
-       if (ret) { edg_wll_FreeEvent(e); memset(e,0,sizeof *e); }
-       return ret;
-}
-
-
-/* print/log  warning for database inconsistency */
-
-static void edg_wll_set_event_field_warn(
-               edg_wll_Event   *event,
-               char            *name,
-               char            *value)
-{
-       char *e = edg_wll_EventToString(event->any.type);
-
-       fprintf(stderr, "edg_wll_set_event_field: bad field:"
-               "code=\"%s\" name=\"%s\" value=\"%s\"\n",
-               e, name, value);
-       free(e);
-       /* XXX edg_wll_Log */
-}
-
-/* set event structure field */
-
-static void edg_wll_set_event_field(
-               edg_wll_Event   *event,
-               char            *name,
-               char            *value)
-{
-/* XXX: where's the best place to hande it? */
-       if (!strcasecmp(name,"SRC_INSTANCE")) {
-               event->any.src_instance = value;
-               return;
-       }
-
-/* XXX: handled separately, should go to event_head one day */
-       if (!strcasecmp(name,"SEQCODE")) {
-               event->any.seqcode = value;
-               return;
-       }
-
-@@@{
-       for my $n (getAllFieldsOrdered $event) {
-               my @occ = getFieldOccurence $event $n;
-               next if $#occ == 0 && $occ[0] eq '_common_';
-               selectType $event $occ[0];
-               my $f = selectField $event $n;
-               my $name = getName $f;
-               my $lcname = lc $name;
-               gen qq{
-!      if (!strcasecmp(name,"$lcname")) \{
-!              switch (event->any.type) \{
-};
-               for (@occ) {
-                       next if $_ eq '_common_';
-                       selectType $event $_;
-                       $f = selectField $event $n;
-                       my $fucname = ucfirst $n;
-                       my $uctype = uc $_;
-                       my $flctype = lcfirst $_;
-                       if ($flctype =~ m/^pBS/) { $flctype = ucfirst $flctype; }
-                       if ($flctype =~ m/^condor/) { $flctype = ucfirst $flctype; }
-                       my $frs = $f->{codes} ?
-                               "event->$flctype.$name = edg_wll_StringTo$_${fucname}(value);" :
-                               fromString $f 'value',"event->$flctype.$name";
-                       gen qq{
-!                      case EDG_WLL_EVENT_$uctype: $frs break;
-};
-               }
-               gen qq{
-!                      default: edg_wll_set_event_field_warn(event,name,value); break;
-!              \} /* switch */
-!              free(value);
-!              return;
-!      \}
-};
-       }
-@@@}
-
-       edg_wll_set_event_field_warn(event,name,value);
-       free(value);
-       return;
-}
-               
-
-int compare_events_by_tv(const void *a, const void *b)
-{
-       const edg_wll_Event *e = (edg_wll_Event *)a;
-       const edg_wll_Event *f = (edg_wll_Event *)b;
-
-       if (e->any.timestamp.tv_sec < f->any.timestamp.tv_sec) return -1;
-       if (e->any.timestamp.tv_sec > f->any.timestamp.tv_sec) return 1;
-       if (e->any.timestamp.tv_usec < f->any.timestamp.tv_usec) return -1;
-       if (e->any.timestamp.tv_usec > f->any.timestamp.tv_usec) return 1;
-       return 0;
-}
diff --git a/org.glite.lb.server/src/get_events.h b/org.glite.lb.server/src/get_events.h
deleted file mode 100644 (file)
index a45ac7f..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef GLITE_LB_GET_EVENTS_H
-#define GLITE_LB_GET_EVENTS_H
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-#include "glite/lb/events.h"
-#include "glite/lb/query_rec.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if 0  /* rel 1 */
-char *edg_wll_jobid_to_user( edg_wll_Context, char *);
-void edg_wll_set_event_field_warn( edg_wll_Event *, char *, char *);
-void edg_wll_set_event_field( edg_wll_Event *, char *, char *);
-int edg_wll_get_events_restricted( edg_wll_Context, edg_wlc_JobId, char *, int, int, char *, edg_wll_Event **);
-#define edg_wll_get_events(ctx,job,md5,emin,emax,ret) \
-       edg_wll_get_events_restricted((ctx),(job),(md5),(emin),(emax),NULL,(ret))
-int edg_wll_last_event( edg_wll_Context, char *);
-int compare_events_by_tv(const void *, const void *);
-#endif
-
-int edg_wll_get_event_flesh(edg_wll_Context,int,edg_wll_Event *);
-
-int edg_wll_QueryEventsServer(edg_wll_Context,int,const edg_wll_QueryRec **,const edg_wll_QueryRec **,edg_wll_Event **);
-
-int edg_wll_QueryJobsServer(edg_wll_Context, const edg_wll_QueryRec **, int, edg_wlc_JobId **, edg_wll_JobStat **);
-
-void edg_wll_SortEvents(edg_wll_Event *);
-
-void edg_wll_SortPEvents(edg_wll_Event **);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GLITE_LB_GET_EVENTS_H */
diff --git a/org.glite.lb.server/src/il_lbproxy.c b/org.glite.lb.server/src/il_lbproxy.c
deleted file mode 100644 (file)
index 29ab93b..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-#ident "$Header$"
-
-#include <syslog.h>
-#include <errno.h>
-#include <stdio.h>
-#include <string.h>
-#include "glite/lb/context-int.h"
-#include "glite/lb/log_proto.h"
-
-#include "il_lbproxy.h"
-
-#define FCNTL_ATTEMPTS         5
-#define FCNTL_TIMEOUT          1
-#define FILE_PREFIX            EDG_WLL_LOG_PREFIX_DEFAULT
-#define DEFAULT_SOCKET         "/tmp/interlogger.sock"
-
-char *lbproxy_ilog_socket_path = DEFAULT_SOCKET;
-char *lbproxy_ilog_file_prefix = FILE_PREFIX;
-
-
-int
-edg_wll_EventSendProxy(
-       edg_wll_Context                 ctx,
-       glite_jobid_const_t             jobid,
-       const char                         *event)
-{
-       long                    filepos;
-       char               *jobid_s,
-                                  *event_file = NULL;
-       int                             err = 0;
-
-#define _err(n)                { err = n; goto out; }
-
-       edg_wll_ResetError(ctx);
-
-       jobid_s = edg_wlc_JobIdGetUnique(jobid);
-       if ( !jobid_s ) {
-               edg_wll_SetError(ctx, ENOMEM, "edg_wlc_JobIdGetUnique()");
-               _err(1);
-       }
-
-       asprintf(&event_file, "%s.%s", lbproxy_ilog_file_prefix, jobid_s);
-       if ( !event_file ) {
-               edg_wll_SetError(ctx, ENOMEM, "asprintf()");
-               _err(1);
-       }
-
-       if ( edg_wll_log_event_write(ctx, event_file, event,
-                                       (ctx->p_tmp_timeout.tv_sec > FCNTL_ATTEMPTS ?
-                                               ctx->p_tmp_timeout.tv_sec : FCNTL_ATTEMPTS),
-                                       FCNTL_TIMEOUT, &filepos) ) {
-
-               edg_wll_UpdateError(ctx, 0, "edg_wll_log_event_write()");
-               _err(1);
-       }
-
-       if ( edg_wll_log_event_send(ctx, lbproxy_ilog_socket_path, filepos,
-                                               event, strlen(event), 1, &ctx->p_tmp_timeout) ) {
-               char *errt, *errd;
-               errt = errd = NULL;
-       
-               edg_wll_UpdateError(ctx, EDG_WLL_IL_PROTO, "edg_wll_log_event_send()");
-               edg_wll_Error(ctx, &errt, &errd);
-               syslog(LOG_ERR,"%s (%s)", errt, errd);
-               free(errt); free(errd);
-               _err(-1);
-       }
-
-out:
-       if ( jobid_s ) free(jobid_s);
-       if ( event_file ) free(event_file);
-
-       if ( !err ) return 0;
-       if ( err < 0 ) {
-               /* do not propagate IL errors */
-               edg_wll_ResetError(ctx);
-               return 0;
-       } else {
-               edg_wll_UpdateError(ctx, 0, "edg_wll_EventSendProxy()");
-               return edg_wll_Error(ctx, NULL, NULL);
-       }
-}
diff --git a/org.glite.lb.server/src/il_lbproxy.h b/org.glite.lb.server/src/il_lbproxy.h
deleted file mode 100644 (file)
index 7399567..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef GLITE_LB_IL_LBPROXY_H
-#define GLITE_LB_IL_LBPROXY_H
-
-#include "glite/lb/context.h"
-
-#ifdef __cplusplus
-#extern "C" {
-#endif
-
-extern char *lbproxy_ilog_socket_path;
-extern char *lbproxy_ilog_file_prefix;
-
-int edg_wll_EventSendProxy(edg_wll_Context ctx, glite_jobid_const_t jobid, const char *event);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GLITE_LB_IL_LBPROXY_H */
diff --git a/org.glite.lb.server/src/il_notification.c b/org.glite.lb.server/src/il_notification.c
deleted file mode 100644 (file)
index a9708db..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-#ident "$Header$"
-/**
- * il_notification.c
- *   - implementation of IL API calls for notifications
- *
- */
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-#include <stdio.h>
-#include <syslog.h>
-
-#include "glite/lbu/escape.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/notifid.h"
-#include "glite/lb/events_parse.h"
-#include "glite/lb/log_proto.h"
-
-#include "il_notification.h"
-#include "lb_xml_parse.h"
-
-
-
-#define FCNTL_ATTEMPTS         5
-#define FCNTL_TIMEOUT          1
-#define FILE_PREFIX             "/tmp/notif_events"
-#define DEFAULT_SOCKET          "/tmp/notif_interlogger.sock"
-#define NOTIF_TIMEOUT          1
-
-char *notif_ilog_socket_path = DEFAULT_SOCKET;
-char *notif_ilog_file_prefix = FILE_PREFIX;
-
-
-static
-int
-notif_create_ulm(
-       edg_wll_Context context,
-       edg_wll_NotifId reg_id,
-       const char      *host,
-       const uint16_t  port,
-       const char      *owner,
-       int             expires,
-       const char      *notif_data,
-       char            **ulm_data,
-       char            **reg_id_s)
-{
-       int             ret;
-       edg_wll_Event   *event=NULL;
-
-       *ulm_data = NULL;
-       *reg_id_s = NULL;
-
-       event = edg_wll_InitEvent(EDG_WLL_EVENT_NOTIFICATION);
-
-       gettimeofday(&event->any.timestamp,0);
-       if (context->p_host) event->any.host = strdup(context->p_host);
-       event->any.level = context->p_level;
-       event->any.source = context->p_source;
-       if (context->p_instance) event->notification.src_instance = strdup(context->p_instance);
-       event->notification.notifId = edg_wll_NotifIdDup(reg_id);
-       if (owner) event->notification.owner = strdup(owner);
-       if (host) event->notification.dest_host = strdup(host);
-       event->notification.dest_port = port;
-       if (notif_data) event->notification.jobstat = strdup(notif_data);
-
-       event->notification.expires = expires;
-
-       if ((*ulm_data = edg_wll_UnparseNotifEvent(context,event)) == NULL) {
-               edg_wll_SetError(context, ret = ENOMEM, "edg_wll_UnparseNotifEvent()"); 
-               goto out;
-       }
-
-       if((*reg_id_s = edg_wll_NotifIdGetUnique(reg_id)) == NULL) {
-               edg_wll_SetError(context, ret = ENOMEM, "edg_wll_NotifIdGetUnique()");
-               goto out;
-       }
-
-       ret = 0;
-
-out:
-       if(event) { 
-               edg_wll_FreeEvent(event);
-               free(event);
-       }
-       if(ret) edg_wll_UpdateError(context, ret, "notif_create_ulm()");
-       return(ret);
-}
-
-
-int
-edg_wll_NotifSend(edg_wll_Context       context,
-                 edg_wll_NotifId       reg_id,
-                 const char           *host,
-                  int                   port,
-                 const char           *owner,
-                 int                   expires,
-                  const char           *notif_data)
-{
-       struct timeval  timeout = {NOTIF_TIMEOUT, 0};
-       int                             ret;
-       long                    filepos;
-       char               *ulm_data,
-                                  *reg_id_s,
-                                  *event_file;
-
-       if((ret=notif_create_ulm(context, 
-                                reg_id, 
-                                host, 
-                                port, 
-                                owner, 
-                                expires,
-                                notif_data,
-                                &ulm_data,
-                                &reg_id_s))) {
-               goto out;
-       }
-
-       asprintf(&event_file, "%s.%s", notif_ilog_file_prefix, reg_id_s);
-       if(event_file == NULL) {
-               edg_wll_SetError(context, ret=ENOMEM, "asprintf()");
-               goto out;
-       }
-
-       if ( (ret = edg_wll_log_event_write(context, event_file, ulm_data,
-                                       FCNTL_ATTEMPTS, FCNTL_TIMEOUT, &filepos)) ) {
-               edg_wll_UpdateError(context, 0, "edg_wll_log_event_write()");
-               goto out;
-       }
-
-       if ( (ret = edg_wll_log_event_send(context, notif_ilog_socket_path,
-                                       filepos, ulm_data, strlen(ulm_data), 1, &timeout)) ) {
-               edg_wll_UpdateError(context, 0, "edg_wll_log_event_send()");
-               goto out;
-       }
-
-       ret = 0;
-
-out:
-       if(ulm_data) free(ulm_data);
-       if(reg_id_s) free(reg_id_s);
-       if(ret) edg_wll_UpdateError(context, ret, "edg_wll_NotifSend()");
-       return(ret);
-}
-
-
-int
-edg_wll_NotifJobStatus(edg_wll_Context context,
-                      edg_wll_NotifId  reg_id,
-                      const char      *host,
-                       int              port,
-                      const char      *owner,
-                       int             flags,
-                      int              expires,
-                      const edg_wll_JobStat notif_job_stat)
-{
-       int             ret=0;
-       char            *xml_data, *xml_esc_data=NULL;
-       edg_wll_JobStat stat = notif_job_stat;
-
-       
-       if (flags == 0) {
-               stat.jdl = NULL;
-               stat.matched_jdl = NULL;
-               stat.condor_jdl = NULL;
-               stat.rsl = NULL;
-       }
-
-       if(edg_wll_JobStatusToXML(context, stat, &xml_data)) 
-               goto out;
-       
-       if((xml_esc_data = glite_lbu_EscapeXML(xml_data)) == NULL) {
-               edg_wll_SetError(context, ret=ENOMEM, "glite_lbu_EscapeXML()");
-               goto out;
-       }
-
-       if ((ret=edg_wll_NotifSend(context, reg_id, host, port, owner, expires, xml_esc_data))) {
-               char *ed = NULL, *et = NULL;
-
-               if(ret) edg_wll_UpdateError(context, ret, "edg_wll_NotifJobStatus()");
-               edg_wll_Error(context,&et,&ed);
-               fprintf(stderr,"%s - %s\n", ed, et);
-               syslog(LOG_INFO,"%s - %s\n", ed, et);
-               edg_wll_ResetError(context);
-               free(et); 
-               free(ed);
-       }
-
-out:
-       if(xml_data) free(xml_data);
-       if(xml_esc_data) free(xml_esc_data);
-       return(edg_wll_Error(context,NULL,NULL));
-}
-
-
-int 
-edg_wll_NotifChangeIL(edg_wll_Context context,
-                               edg_wll_NotifId reg_id,
-                               const char      *host,
-                               int             port,
-                              int             expires)
-{
-       return(edg_wll_NotifSend(context, reg_id, host, port, "", expires, ""));
-}
-
-
-int
-edg_wll_NotifCancelRegId(edg_wll_Context context,
-                        edg_wll_NotifId reg_id)
-{
-/* XXX: Jan 1 1970 00:00:01 -- quite sure to make it expire immediately */
-       return(edg_wll_NotifSend(context, reg_id, NULL, 0, "", 1, ""));
-}
-
diff --git a/org.glite.lb.server/src/il_notification.h b/org.glite.lb.server/src/il_notification.h
deleted file mode 100644 (file)
index 45b396e..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef GLITE_LB_IL_NOTIFICATION_H
-#define GLITE_LB_IL_NOTIFICATION_H
-
-#ident "$Header$"
-
-/* needed for the edg_wll_NotifId */
-#include "glite/lb/notifid.h"
-
-/* import the edg_wll_JobStat structure */
-#include "glite/lb/jobstat.h"
-
-#ifdef __cplusplus
-#extern "C" {
-#endif
-
-extern char *notif_ilog_socket_path;
-extern char *notif_ilog_file_prefix;
-
-/** Send ULM notification string to interlogger.
- * Stores notification to file according to registration id and send it
- * to interlogger using local socket.
- * \param reg_id  registration id
- * \param host,port address to deliver the notification to.
- *                  If NULL, it means no further notifications will
- *                  follow (the client has unregistered). It always
- *                  overrides previous values (ie. changes the
- *                  reg_id->client address mapping in interlogger).
- * \param owner DN of the registration owner, this will be verified
- *              against client's certificate
- * \param notif_data ULM formatted notification string, may be NULL,
- *                   if there is nothing to be sent to client.
- * \retval 0 OK
- * \retval EINVAL      bad jobId, unknown event code, or the format
- *                      string together with the remaining arguments
- *                      does not form a valid event 
- * \retval ENOSPC      unable to accept the event due to lack of disk
- *                      space etc. 
- * \retval ENOMEM      failed to allocate memory
- * \retval EAGAIN      non blocking return from the call, the event
- *                      did not come through socket, but is backed up
- *                      in file
- */
-int
-edg_wll_NotifSend(edg_wll_Context       context,
-                 edg_wll_NotifId       reg_id,
-                 const char           *host,
-                  int                   port,
-                 const char           *owner,
-                 int                   expires,
-                  const char           *notif_data);
-
-
-/** Send job status notification.
- * Creates ULM notification string and sends it using
- * edg_wll_NotifSend(). The job status is encoded into XML and escaped
- * before inclusion into ULM.
- * \param reg_id registration id
- * \param host,port address to deliver the notification to.
- * \param owner DN of the registration owner, this will be verified
- *              against client's certificate
- * \param flags verbosity of returned status 
- * \param notif_job_stat structure describing job status
- * \see edg_wll_NotifSend()
- */
-int
-edg_wll_NotifJobStatus(edg_wll_Context context,
-                      edg_wll_NotifId  reg_id,
-                      const char      *host,
-                       int              port,
-                      const char      *owner,
-                       int              flags,
-                      int              expires,
-                      const edg_wll_JobStat notif_job_stat);
-
-
-/** Change address for notification delivery.
- * Creates ULM string and uses edg_wll_NotifSend() to pass it
- * to interlogger.
- * \param reg_id registration id
- * \param host,port new delivery address
- * \see edg_wll_NotifSend()
- */
-int 
-edg_wll_NotifChangeIL(edg_wll_Context context,
-                               edg_wll_NotifId reg_id,
-                               const char      *host,
-                               int             port,
-                              int              expires);
-
-/** Cancel registration.
- * Creates ULM string and uses edg_wll_NotifSend() to pass it to
- * interlogger.
- * \param reg_id registration id
- */
-int
-edg_wll_NotifCancelRegId(edg_wll_Context context,
-                        edg_wll_NotifId reg_id);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GLITE_LB_IL_NOTIFICATION_H */
diff --git a/org.glite.lb.server/src/index.c.T b/org.glite.lb.server/src/index.c.T
deleted file mode 100644 (file)
index de8a715..0000000
+++ /dev/null
@@ -1,435 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <cclassad.h>
-
-#include "glite/lb/context-int.h"
-#include "glite/lbu/trio.h"
-#include "db_supp.h"
-#include "index.h"
-
-extern int debug;
-
-#define const_len(c)   (sizeof((c))-1)
-
-static int parse_indices(edg_wll_Context ctx,char **keys,char ***column_names,const char **built_in_indices,edg_wll_QueryRec *** index_out,char ***keys_out);
-
-int edg_wll_QueryJobIndices(edg_wll_Context ctx,edg_wll_QueryRec *** index_out,char ***keys_out)
-{
-       static const char *built_in_indices[] = {
-               "PRIMARY",
-               "parent_job",
-               NULL
-       };
-       char    **keys = NULL;
-       char    ***column_names = NULL;
-
-       if (glite_lbu_QueryIndices(ctx->dbctx, "states", &keys, &column_names) != 0) {
-               edg_wll_SetErrorDB(ctx);
-               return EIO;
-       }
-
-       if (!keys) {
-               *index_out = NULL;
-               if (keys_out) *keys_out = NULL;
-               return edg_wll_ResetError(ctx);
-       }
-
-/* XXX: keys are passed up or freed, column_names are freed there */
-       if (parse_indices(ctx,keys,column_names,built_in_indices,index_out,keys_out)) 
-               return edg_wll_Error(ctx,NULL,NULL);
-       else return edg_wll_ResetError(ctx);
-
-}
-
-int edg_wll_QueryNotifIndices(edg_wll_Context ctx,edg_wll_QueryRec *** index_out,char ***keys_out)
-{
-       static const char *built_in_indices[] = {
-               "PRIMARY",
-               NULL
-       };
-       char    **keys = NULL;
-       char    ***column_names = NULL;
-
-       if (glite_lbu_QueryIndices(ctx->dbctx, "notif_registrations", &keys, &column_names) != 0) {
-               edg_wll_SetErrorDB(ctx);
-               return EIO;
-       }
-
-       if (!keys) {
-               *index_out = NULL;
-               if (keys_out) *keys_out = NULL;
-               return edg_wll_ResetError(ctx);
-       }
-
-/* XXX: keys are passed up or freed, column_names are freed there */
-       if (parse_indices(ctx,keys,column_names,built_in_indices,index_out,keys_out)) 
-               return edg_wll_Error(ctx,NULL,NULL);
-       else return edg_wll_ResetError(ctx);
-
-}
-
-/* TODO: 
-   - better error recovery (skip unrecognised indices etc.)
-   - leaks memory on errors
-*/
-
-static int parse_indices(edg_wll_Context ctx,char **keys,char ***column_names,const char **built_in_indices,edg_wll_QueryRec *** index_out,char ***keys_out)
-{
-
-       edg_wll_QueryRec        **idx = NULL;
-
-       int     *cols = NULL;
-
-       int     i, j;
-       int     nkeys = 0;
-
-
-
-       for (i = 0; keys[i]; i++) {
-               // skip builtin indices
-               for (j = 0; built_in_indices[j]; j++) {
-                       if (strcasecmp(keys[i], built_in_indices[j]) == 0)
-                               goto next_index;
-               }
-
-               cols = realloc(cols,(nkeys+1) * sizeof cols[0]); 
-               cols[nkeys] = 0;
-               idx = realloc(idx,(nkeys+2) * sizeof idx[0]);
-               idx[nkeys] = idx[nkeys+1] = NULL;
-               if (keys_out) {
-                       *keys_out = realloc(*keys_out, (nkeys + 2) * sizeof(char *));
-                       (*keys_out)[nkeys] = strdup(keys[i]);
-                       (*keys_out)[nkeys + 1] = NULL;
-               }
-
-               for (j = 0; column_names[i][j]; j++) {
-                       if (cols[nkeys] <= j) {
-                               cols[nkeys] = j+1;
-                               idx[nkeys] = realloc(idx[nkeys],(j+2)*sizeof idx[nkeys][0]);
-                               memset(&idx[nkeys][j+1],0,sizeof idx[nkeys][0]);
-                       }
-
-                       if (edg_wll_ColumnToQueryRec(column_names[i][j],&idx[nkeys][j])) {
-                               int   code;
-                               char *ed;
-
-                               asprintf(&ed, "%s(%s): unsupported column", keys[i], column_names[i][j]);
-                               code = edg_wll_SetError(ctx, EINVAL, ed);
-                               free(ed);
-                               return code;
-                       }
-#warning: TODO: needed Sub_part in value???
-//                            else idx[nkeys][j].value.i = atoi(showcol[Sub_part]);
-               }
-               nkeys++;
-next_index:
-               for (j = 0; column_names[i][j]; j++) free(column_names[i][j]);
-               free(column_names[i]);
-               column_names[i] = NULL;
-               free(keys[i]);
-               keys[i] = NULL;
-
-               // just for escaping from nested cycles
-               ;       /* prevent compiler to complain */
-       }
-       free(column_names);
-       free(keys);
-       free(cols);
-       *index_out = idx;
-
-       return edg_wll_ResetError(ctx);
-}
-
-int edg_wll_CmpColumn(const edg_wll_QueryRec *r1,const edg_wll_QueryRec *r2)
-{
-       if (r1->attr != r2->attr) return 1;
-       switch (r1->attr) {
-               case EDG_WLL_QUERY_ATTR_USERTAG:
-                       return strcasecmp(r1->attr_id.tag,r2->attr_id.tag);
-               case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                       return strcasecmp(r1->attr_id.tag,r2->attr_id.tag);
-               case EDG_WLL_QUERY_ATTR_TIME:
-                       return r1->attr_id.state != r2->attr_id.state;
-               default:
-                       return 0;
-       }
-}
-
-static char *to_sql_string(edg_wll_JobStat const *stat,int offset)
-{
-       char    *out = NULL,
-               *in = *((char **) (((char *) stat) + offset));
-
-               if (in) trio_asprintf(&out,"'%|Ss'",in);
-       return out;
-}
-
-static char *to_sql_timeval(edg_wll_JobStat const *stat,int offset)
-{
-       char    *out;
-       glite_lbu_TimeToDB( ((struct timeval *) (((char *) stat) + offset))->tv_sec, &out );
-       return out;
-}
-
-static edg_wll_JobStat fakestat;
-
-static struct {
-       const char      *name;
-       edg_wll_QueryAttr       attr;
-       int             offset;
-       char    * (*to_sql)(edg_wll_JobStat const *,int);
-} std_attrs[] =
-{
-@@@{
-       for my $n ($status->getAllFieldsOrdered) {
-               my $f = selectField $status $n;
-               next unless $f->{index};
-               my $u = uc $n;
-               gen "\t{ \"$n\", EDG_WLL_QUERY_ATTR_$u, ((char *) \&fakestat.$n) - ((char *) \&fakestat),\&to_sql_$f->{type} },\n";
-       }
-@@@}
-       { NULL, },
-};
-
-/* TODO: use in queries */
-char *edg_wll_StatToSQL(edg_wll_JobStat const *stat,edg_wll_QueryAttr attr)
-{
-       int     i;
-
-       for (i=0; std_attrs[i].attr && std_attrs[i].attr != attr; i++);
-
-       return std_attrs[i].attr ? std_attrs[i].to_sql(stat,std_attrs[i].offset) : (char *) -1;
-}
-
-char *edg_wll_JDLStatToSQL(edg_wll_JobStat const *stat,edg_wll_QueryRec col_rec)
-{
-        struct cclassad *ad = NULL;
-        char *extr_val = NULL;
-       char *extr_val_apostrophed = NULL;
-
-        ad = cclassad_create(stat->jdl);
-        if (ad) {
-                if (!cclassad_evaluate_to_string(ad, col_rec.attr_id.tag, &extr_val)) { // Extract attribute value
-                        extr_val = NULL;
-                        cclassad_delete(ad);
-                }
-        }
-
-       if (extr_val) {
-               trio_asprintf(&extr_val_apostrophed,"'%|Ss'", extr_val);
-               free(extr_val);
-       }
-
-        return extr_val_apostrophed;
-}
-
-int edg_wll_ColumnToQueryRec(const char *col_name,edg_wll_QueryRec *rec)
-{
-       int     i;
-
-       memset(rec,0,sizeof *rec);
-       if (strncasecmp(col_name,STD_PREFIX,const_len(STD_PREFIX)) == 0) {
-               for (i=0; std_attrs[i].name
-                       && strcasecmp(std_attrs[i].name,col_name+const_len(STD_PREFIX)); i++);
-
-               if (std_attrs[i].name) rec->attr = std_attrs[i].attr;
-       }
-       else if (strncasecmp(col_name,TIME_PREFIX,const_len(TIME_PREFIX)) == 0) {
-               rec->attr_id.state = edg_wll_StringToStat(col_name+const_len(TIME_PREFIX));
-               if (rec->attr_id.state != (edg_wll_JobStatCode) -1) rec->attr = EDG_WLL_QUERY_ATTR_TIME;
-       }
-       else if (strncasecmp(col_name,USR_PREFIX,const_len(USR_PREFIX)) == 0) {
-               rec->attr = EDG_WLL_QUERY_ATTR_USERTAG;
-               rec->attr_id.tag = strdup(col_name+const_len(USR_PREFIX));
-               rec->value.c = NULL;
-       }
-       else if (strncasecmp(col_name,JDL_PREFIX,const_len(JDL_PREFIX)) == 0) {
-               rec->attr = EDG_WLL_QUERY_ATTR_JDL_ATTR;
-               rec->attr_id.tag = strdup(col_name+const_len(JDL_PREFIX));
-               rec->value.c = NULL;
-       }
-
-       return !rec->attr;
-}
-
-char * edg_wll_QueryRecToColumn(const edg_wll_QueryRec *rec)
-{
-       char    col[100] = "";
-
-       if (rec->attr == EDG_WLL_QUERY_ATTR_USERTAG) {
-               strcpy(col,USR_PREFIX);
-               strcat(col,rec->attr_id.tag);
-       }
-       else if (rec->attr == EDG_WLL_QUERY_ATTR_TIME) {
-               char    *s = edg_wll_StatToString(rec->attr_id.state);
-
-               if (s) {
-                       strcpy(col,TIME_PREFIX);
-                       strcat(col,s);
-                       free(s);
-               }
-       }
-       else if (rec->attr == EDG_WLL_QUERY_ATTR_JDL_ATTR) {
-               strcpy(col,JDL_PREFIX);
-               strcat(col,rec->attr_id.tag);
-       }
-       else {
-               int     i;
-               for (i=0; std_attrs[i].name && std_attrs[i].attr != rec->attr; i++);
-               if (std_attrs[i].name) {
-                       strcpy(col,STD_PREFIX);
-                       strcat(col,std_attrs[i].name);
-               }
-       }
-
-       return col[0] ? strdup(col) : NULL;
-}
-
-char * edg_wll_QueryRecToColumnExt(const edg_wll_QueryRec *rec)
-{
-       char    *intern = edg_wll_QueryRecToColumn(rec),
-               *out;
-
-       if (!intern) return NULL;
-
-       switch (rec->attr) {
-               case EDG_WLL_QUERY_ATTR_USERTAG:
-                       out = strdup(intern+const_len(USR_PREFIX));
-                       break;
-               case EDG_WLL_QUERY_ATTR_TIME:
-                       out = strdup(intern+const_len(TIME_PREFIX));
-                       break;
-               default:
-                       out = strdup(intern+const_len(STD_PREFIX));
-                       break;
-       }
-       free(intern);
-       return out;
-}
-
-void edg_wll_FreeIColumnRec(edg_wll_IColumnRec *icrp)
-{
-       if (icrp->qrec.attr == EDG_WLL_QUERY_ATTR_USERTAG)
-               free(icrp->qrec.attr_id.tag);
-       free(icrp->colname);
-}
-
-
-/*
- * Compute part of SQL command used for indexed state table columns
- */
-
-edg_wll_ErrorCode edg_wll_IColumnsSQLPart(edg_wll_Context ctx,
-                                       void *job_index_cols_v,
-                                       edg_wll_JobStat *stat,
-                                       int is_insert,
-                                       char **names_out,
-                                       char **values_out)
-{
-       int i;
-       char *names, *values;
-       char *data;
-       char *tmp;
-       char *tmpval;
-       edg_wll_IColumnRec *job_index_cols = (edg_wll_IColumnRec *)job_index_cols_v;
-
-       edg_wll_ResetError(ctx);
-
-       if (is_insert) names = strdup(""); else names = NULL;
-       values = strdup("");
-
-       if (job_index_cols != NULL)
-       for (i=0; job_index_cols[i].colname; i++) {
-               data = NULL;
-               switch (job_index_cols[i].qrec.attr) {
-                       case EDG_WLL_QUERY_ATTR_OWNER:
-                               if (stat->owner) {
-                                       tmpval = edg_wll_gss_normalize_subj(stat->owner, 0);
-                                       trio_asprintf(&data, "'%|Ss'", tmpval);
-                                       free(tmpval);
-                               } else data = strdup("''");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_LOCATION:
-                               if (stat->location)
-                                       trio_asprintf(&data, "'%|Ss'", stat->location);
-                               else data = strdup("''");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_DESTINATION:
-                               if (stat->destination)
-                                       trio_asprintf(&data, "'%|Ss'", stat->destination);
-                               else data = strdup("''");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_DONECODE:
-                               asprintf(&data, "%d", stat->done_code);
-                               break;
-                       case EDG_WLL_QUERY_ATTR_USERTAG:
-                               if (stat->user_tags) {
-                                       int k;
-                                       for (k=0; stat->user_tags[k].tag &&
-                                                       strcmp(stat->user_tags[k].tag,job_index_cols[i].qrec.attr_id.tag);
-                                               k++);
-                                       if (stat->user_tags[k].tag != NULL) {
-                                               trio_asprintf(&data, "'%|Ss'", stat->user_tags[k].value);
-                                       } else data = strdup("''");
-                               } else data = strdup("''");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_TIME:
-                               if (stat->stateEnterTimes)
-                                       glite_lbu_TimeToDB(stat->stateEnterTimes[job_index_cols[i].qrec.attr_id.state+1], &data);
-                               else data = strdup("0");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-                               asprintf(&data, "%d", stat->resubmitted);
-                               break;
-                       case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-                               glite_lbu_TimeToDB(stat->stateEnterTime.tv_sec, &data);
-                               break;
-                       case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                               glite_lbu_TimeToDB(stat->lastUpdateTime.tv_sec, &data);
-                               break;
-                       case EDG_WLL_QUERY_ATTR_JDL_ATTR: // This is not the correct way to handle jdl searches.
-                                /* There's no way to index individual JDL attributes */
-                               if (stat->jdl)
-                                       trio_asprintf(&data, "'%|Ss'", stat->jdl);
-                               else data = strdup("''");
-                               break;
-/*                     case EDG_WLL_QUERY_ATTR_STATEENTERTIME: /// XXX: Which way of handling this is correct?
-                               if (stat->stateEnterTime)
-                                       glite_lbu_TimeToDB(stat->stateEnterTime, &data);
-                               else data = strdup("0");
-                               break;
-                       case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                               if (stat->lastUpdateTime)
-                                       glite_lbu_TimeToDB(stat->lastUpdateTime, &data);
-                               else data = strdup("0");
-                               break;*/
-
-                               /* XXX add more attributes when defined */
-                       default:
-                               /* do not use */
-                               break;
-               }
-
-               if (!data) continue;
-
-               if (is_insert) {
-                       asprintf(&tmp, "%s,`%s`", names, job_index_cols[i].colname);
-                       free(names); names = tmp;
-                       asprintf(&tmp, "%s,%s", values, data);
-                       free(values); values = tmp;
-               } else {
-                       /* update */
-                       asprintf(&tmp, "%s,`%s`=%s", values, job_index_cols[i].colname, data);
-                       free(values); values = tmp;
-               }
-               free(data);
-       }
-
-       if (is_insert) *names_out = names;
-       *values_out = values;
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
diff --git a/org.glite.lb.server/src/index_lex.l b/org.glite.lb.server/src/index_lex.l
deleted file mode 100644 (file)
index fa552a1..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-%{
-#ident "$Header$"
-
-#include <string.h>
-
-#include "glite/lb/context-int.h"
-#include "index_parse.h"
-#include "index.h"
-
-char   *lex_out;
-int    lex_int;
-int    lex_line;
-
-int yywrap(void) { return 1; }
-
-#define YY_NO_UNPUT
-
-%}
-
-
-delim  [ \t]
-ws     {delim}+
-string \"[^\"\n]*\"
-digit  [0-9]
-int    {digit}+
-
-%%
-{ws}   {}
-
-JobIndices     return JOB_INDICES;
-type           return TYPE;
-name           return NAME;
-prefixlen      return PREFIX;
-{int}          {
-                       lex_int = atoi(yytext);
-                       return INT;
-               }
-{string}       {
-                       int     len;
-                       lex_out = malloc(len = strlen(yytext)-1);
-                       strncpy(lex_out,yytext+1,len-1);
-                       lex_out[len-1] = 0;
-                       return STRING;
-               }
-\n     lex_line++;
-.              return *yytext;
-
diff --git a/org.glite.lb.server/src/index_parse.y b/org.glite.lb.server/src/index_parse.y
deleted file mode 100644 (file)
index 50d74d9..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-%{
-#ident "$Header$"
-
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#include "glite/lb/context-int.h"
-
-#include "index.h"
-
-#define yyerror(x) {}
-
-#define YYDEBUG        1
-
-#define ATTR_TYPE_SYSTEM       "system"
-#define ATTR_TYPE_USER         "user"
-#define ATTR_TYPE_TIME         "time"
-
-static edg_wll_Context parse_ctx;
-static const char      *parse_fname;
-
-#define bailout(msg) \
-{ \
-       char    *buf; \
- \
-       asprintf(&buf,"%s:%d: %s",parse_fname,lex_line,(msg)); \
-       edg_wll_SetError(parse_ctx,EINVAL,buf); \
-       free(buf); \
-       YYABORT; \
-}
-
-extern FILE *yyin;
-
-edg_wll_QueryRec       **indices_out;
-
-%}
-
-%term JOB_INDICES
-%term STRING
-%term INT
-%term TYPE
-%term NAME
-%term PREFIX
-
-%union
-{
-       char    *s;
-       int     i;
-       edg_wll_QueryRec        qr;
-       edg_wll_QueryRec        *qrl;
-       edg_wll_QueryRec        **qrll;
-       struct elem_attr {
-               int     attr;
-               char    *val;
-       }                       attr;
-}
-
-%type <s> string
-%type <i> int
-%type <qr> job_index_elem
-%type <qrl> job_index job_index_elem_list
-%type <qrll> job_index_list job_indices;
-%type <attr> elem_attr opt_elem_attr
-
-%%
-
-config : '[' job_indices soft_semicolon ']'    { indices_out = $2; }
-       ;
-
-job_indices    : JOB_INDICES '=' '{' job_index_list soft_comma '}' { $$ = $4; }
-               ;
-
-job_index_list : job_index     { $$ = calloc(2,sizeof (*$$)); *$$ = $1; }
-               | job_index_list ',' job_index
-{
-       int     i;
-       for (i=0; $1[i]; i++);
-       $$ = realloc($1,(i+2) * sizeof *$1);
-       $$[i] = $3;
-       $$[i+1] = NULL;
-}
-               ;
-
-job_index      : job_index_elem                { $$ = calloc(2,sizeof (*$$)); memcpy($$,&$1,sizeof $1); }
-               | '{' job_index_elem_list '}'   { $$ = $2; }
-               ;
-
-job_index_elem_list    : job_index_elem        { $$ = calloc(2,sizeof (*$$)); memcpy($$,&$1,sizeof $1); }
-               | job_index_elem_list ',' job_index_elem
-{
-       int     i;
-       for (i=0; $1[i].attr; i++);
-       $$ = realloc($1,(i+2) * sizeof *$1);
-       memcpy($$+i,&$3,sizeof $3);
-       memset($$+i+1,0,sizeof *$$);
-}
-               ;
-
-job_index_elem : '[' elem_attr ';' elem_attr opt_elem_attr ']'
-{
-       char    *name = $2.attr == NAME ? $2.val :
-                               $4.attr == NAME ? $4.val : 
-                               $5.attr == NAME ? $5.val : NULL,
-               *type = $2.attr == TYPE ? $2.val :
-                               $4.attr == TYPE ? $4.val :
-                               $5.attr == TYPE ? $5.val : NULL;
-       int     prefix = $2.attr == PREFIX ? (int) $2.val :
-                               $4.attr == PREFIX ? (int) $4.val :
-                               $5.attr == PREFIX ? (int) $5.val : 0;
-
-
-       if (!name) bailout("`name' required");
-       if (!type) bailout("`type' required");
-
-       if (strcasecmp(type,ATTR_TYPE_SYSTEM) == 0) {
-               char    *name2;
-               asprintf(&name2,STD_PREFIX "%s",name);
-               if (edg_wll_ColumnToQueryRec(name2,&$$)) bailout("unknown attribute");
-               free(name2);
-               free(name);
-       }
-       else if (strcasecmp(type,ATTR_TYPE_USER) == 0) {
-               $$.attr = EDG_WLL_QUERY_ATTR_USERTAG;
-               $$.attr_id.tag = name;
-       }
-       else if (strcasecmp(type,ATTR_TYPE_TIME) == 0) {
-               char    *name2;
-               if (prefix) bailout("PREFIXLEN is not valid with time attributes");
-               asprintf(&name2,TIME_PREFIX "%s",name);
-               if (edg_wll_ColumnToQueryRec(name2,&$$)) bailout("unknown attribute");
-               free(name2);
-               free(name);
-       }
-       else bailout("unknown attr type");
-
-       $$.value.i = prefix;
-}
-               ;
-
-elem_attr      : TYPE '=' string       { $$.attr = TYPE; $$.val = $3; }
-               | NAME '=' string       { $$.attr = NAME; $$.val = $3; }
-               | PREFIX '=' int        { $$.attr = PREFIX; $$.val = (char *) $3; }
-               ;
-
-opt_elem_attr  :       { $$.attr = 0; $$.val = NULL; }
-               |       ';' elem_attr   { $$ = $2; }
-               ;
-
-string         : STRING        { $$ = lex_out; lex_out = NULL; }
-               ;
-
-int            : INT           { $$ = lex_int; }
-               ;
-
-soft_semicolon :
-               | ';'
-               ;
-
-soft_comma     :
-               | ','
-               ;
-
-
-%%
-
-
-/* XXX: uses static variables -- non thread-safe */
-
-int edg_wll_ParseIndexConfig(edg_wll_Context ctx,const char *fname,edg_wll_QueryRec ***out)
-{
-       yyin = strcmp(fname,"-") ? fopen(fname,"r") : stdin;
-       lex_line = 1;
-
-       if (!yyin) return edg_wll_SetError(ctx,errno,fname);
-
-       parse_ctx = ctx;
-       parse_fname = fname;
-       edg_wll_ResetError(ctx);
-
-       /* yydebug = 1; */
-       if (yyparse() && !edg_wll_Error(ctx,NULL,NULL)) {
-               char    buf[100];
-               if (yyin != stdin) fclose(yyin);
-               sprintf(buf,"%s:%d: parse error",fname,lex_line);
-               return edg_wll_SetError(ctx,EINVAL,buf);
-       }
-       if (yyin != stdin) fclose(yyin);
-
-       if (!edg_wll_Error(ctx,NULL,NULL)) *out = indices_out;
-       indices_out = NULL;     /* XXX: memory leak on error but who cares? */
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-int edg_wll_DumpIndexConfig(edg_wll_Context ctx,const char *fname,edg_wll_QueryRec * const *idx)
-{
-       int     haveit = 0;
-
-       FILE    *f = strcmp(fname,"-") ? fopen(fname,"w") : stdout;
-
-       if (!f) return edg_wll_SetError(ctx,errno,fname);
-       if (idx && *idx) { haveit = 1; fputs("[\n\tJobIndices = {\n",f); }
-
-       while (idx && *idx) {
-               const edg_wll_QueryRec *i;
-               int     multi = (*idx)[1].attr;
-
-               fputs(multi ? "\t\t{\n" : "\t\t",f);
-
-               for (i=*idx; i->attr; i++) {
-                       char    *cn = edg_wll_QueryRecToColumnExt(i);
-                       char    prefix[100] = "";
-                       char    *type;
-
-                       switch (i->attr) {
-                               case EDG_WLL_QUERY_ATTR_USERTAG: type = ATTR_TYPE_USER; break;
-                               case EDG_WLL_QUERY_ATTR_TIME: type = ATTR_TYPE_TIME; break;
-                               default: type = ATTR_TYPE_SYSTEM; break;
-                       }
-                               
-                       if (i->value.i) sprintf(prefix,"; prefixlen = %d ",i->value.i);
-                       if (multi) fputs("\t\t\t",f);
-                       fprintf(f,"[ type = \"%s\"; name = \"%s\" %s]",type,cn,prefix);
-                       if (multi) fputs(i[1].attr ? ",\n" : "\n",f);
-                       free(cn);
-               }
-
-               if (multi) fputs("\t\t}",f);
-               fputs(idx[1] ? ",\n" : "\n",f);
-
-               idx++;
-       }
-
-       if (haveit) {
-               fputs("\t}\n]\n",f);
-               return edg_wll_ResetError(ctx);
-       }
-       else return edg_wll_SetError(ctx,ENOENT,"no indices");
-}
-
-
diff --git a/org.glite.lb.server/src/jobstat.c b/org.glite.lb.server/src/jobstat.c
deleted file mode 100644 (file)
index ad71ecf..0000000
+++ /dev/null
@@ -1,1322 +0,0 @@
-#ident "$Header$"
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <stdarg.h>
-#include <regex.h>
-#include <syslog.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/lb/events.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/intjobstat.h"
-#include "glite/lb/process_event.h"
-
-#include "get_events.h"
-#include "store.h"
-#include "index.h"
-#include "jobstat.h"
-#include "lb_authz.h"
-#include "stats.h"
-#include "db_supp.h"
-#include "db_calls.h"
-
-#define DAG_ENABLE     1
-
-#define        DONT_LOCK       0
-#define        LOCK            1
-
-/* TBD: share in whole logging or workload */
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-  
-
-#define mov(a,b) { free(a); a = b; b = NULL; }
-
-static void warn (const char* format, ...) UNUSED_VAR ;
-static char *job_owner(edg_wll_Context,char *);
-static edg_wll_ErrorCode get_job_parent(edg_wll_Context ctx, glite_jobid_const_t job, glite_jobid_t *parent);
-
-
-int js_enable_store = 1;
-
-/*
- * Basic manipulations with the internal representation of job state
- */
-
-#if 0
-static int eval_expect_update(intJobStat *, int *, char **);
-#endif
-
-static char* matched_substr(char *, regmatch_t) UNUSED_VAR;
-
-static char* matched_substr(char *in, regmatch_t match)
-{
-       int len;
-       char *s;
-
-       len = match.rm_eo - match.rm_so;
-       s = calloc(1, len + 1);
-       if (s != NULL) {
-               strncpy(s, in + (int)match.rm_so, len);
-       }
-
-       return s;
-}
-
-
-int edg_wll_JobStatusServer(
-       edg_wll_Context ctx,
-       glite_jobid_const_t             job,
-       int             flags,
-       edg_wll_JobStat *stat)
-{
-
-/* Local variables */
-       char            *string_jobid = NULL;
-       char            *md5_jobid = NULL;
-
-       intJobStat      jobstat;
-       intJobStat      *ijsp;
-       int             whole_cycle;
-       edg_wll_Acl     acl = NULL;
-#if DAG_ENABLE 
-       char            *stmt = NULL;
-#endif
-       char *s_out;
-       intJobStat *js;
-       char *out[1], *out_stat[3];
-       glite_lbu_Statement sh = NULL;
-       int num_sub, num_f, i, ii;
-
-
-       edg_wll_ResetError(ctx);
-
-       memset(&jobstat, 0, sizeof(jobstat));
-       string_jobid = edg_wlc_JobIdUnparse(job);
-       if (string_jobid == NULL || stat == NULL)
-               return edg_wll_SetError(ctx,EINVAL, NULL);
-       md5_jobid = edg_wlc_JobIdGetUnique(job);
-
-       do {
-               whole_cycle = 0;
-
-               if (edg_wll_Transaction(ctx)) goto rollback;
-               if (edg_wll_LockJobRowInShareMode(ctx, md5_jobid)) goto rollback;
-
-
-               if (!edg_wll_LoadIntState(ctx, job, DONT_LOCK, -1 /*all events*/, &ijsp)) {
-                       memcpy(stat, &(ijsp->pub), sizeof(ijsp->pub));
-                       destroy_intJobStat_extension(ijsp);
-                       free(ijsp);
-               } else {
-                       if (edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store, 0)) {
-                               goto rollback;
-                       }
-                       memcpy(stat, &(jobstat.pub), sizeof(jobstat.pub));
-               }
-               
-               if (edg_wll_GetACL(ctx, job, &acl)) goto rollback;
-
-               /* authorization check */
-               if ( !(ctx->noAuth) &&
-                   (!(ctx->peerName) ||  !edg_wll_gss_equal_subj(ctx->peerName, stat->owner))) {
-                     if ((acl == NULL) || edg_wll_CheckACL(ctx, acl, EDG_WLL_CHANGEACL_READ)) {
-                        if (acl) {
-                               goto rollback;
-                        } else {
-                               edg_wll_SetError(ctx,EPERM, "not owner, no ACL is set");
-                               goto rollback;
-                        }
-                     }
-               }
-
-               if (acl) {
-                       stat->acl = strdup(acl->string);
-                       edg_wll_FreeAcl(acl);
-                       acl = NULL;
-               }
-
-               if ((flags & EDG_WLL_STAT_CLASSADS) == 0) {
-                       char *null = NULL;
-
-                       mov(stat->jdl, null);
-                       mov(stat->matched_jdl, null);
-                       mov(stat->condor_jdl, null);
-                       mov(stat->rsl, null);
-                       // !! if adding something here, add it also to edg_wll_NotifJobStatus() !!
-               }
-
-       #if DAG_ENABLE
-               if (stat->jobtype == EDG_WLL_STAT_DAG || stat->jobtype == EDG_WLL_STAT_COLLECTION) {
-
-       //      XXX: The users does not want any histogram. What do we do about it? 
-       //              if ((!(flags & EDG_WLL_STAT_CHILDHIST_FAST))&&(!(flags & EDG_WLL_STAT_CHILDHIST_THOROUGH))) { /* No Histogram */
-       //                        if (stat->children_hist != NULL) {    /* No histogram will be sent even if there was one */
-       //
-       //                              printf("\nNo Histogram required\n\n");
-       //
-       //                              free(stat->children_hist);
-       //                      }
-       //                      
-       //              }
-
-
-                       if (flags & EDG_WLL_STAT_CHILDSTAT) {
-
-                               trio_asprintf(&stmt, "SELECT version,int_status,jobid FROM states WHERE parent_job='%|Ss'", md5_jobid);
-                               if (stmt != NULL) {
-                                       num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
-                                       if (num_sub >=0 ) {
-                                               i = 0;
-                                               stat->children_states = calloc(num_sub+1, sizeof(edg_wll_JobStat));
-                                               if (stat->children_states == NULL) {
-                                                       edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() calloc children_states failed!");
-                                                       goto rollback;
-                                               }
-                                               while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out_stat), NULL, out_stat)) == 3
-                                                       && i < num_sub) {
-                                                       if (!strcmp(INTSTAT_VERSION,out_stat[0])) {
-                                                               js = dec_intJobStat(out_stat[1], &s_out);
-                                                               if (s_out != NULL && js != NULL) {
-                                                                       stat->children_states[i] = js->pub;
-                                                                       destroy_intJobStat_extension(js);
-                                                                       free(js);
-                                                                       i++; // Careful, this value will also be used further
-                                                               }
-                                                       }
-                                                       else { // recount state
-                                                               glite_jobid_t   subjob;
-                                                               intJobStat      js_real;
-                                                               char            *name;
-                                                               int             port;
-
-
-                                                               js = &js_real;
-                                                               glite_jobid_getServerParts(job, &name, &port);
-                                                               if (glite_jobid_recreate(name, port, out_stat[2], &subjob)) {
-                                                                       goto rollback;
-                                                               }
-                                                               free(name);
-
-                                                               if (edg_wll_intJobStatus(ctx, subjob, flags, js, js_enable_store, 0)) {
-                                                                       goto rollback;
-                                                               }
-                                                               glite_jobid_free(subjob);
-                                                               stat->children_states[i] = js->pub;
-                                                               destroy_intJobStat_extension(js);
-                                                               i++; // Careful, this value will also be used further
-                                                       }
-                                                       free(out_stat[0]); out_stat[0] = NULL;
-                                                       free(out_stat[1]); out_stat[1] = NULL;  
-                                                       free(out_stat[2]); out_stat[2] = NULL;
-                                               }
-                                               if (num_f < 0) goto rollback;
-
-                                               glite_lbu_FreeStmt(&sh); sh = NULL;
-                                       }
-                                       else goto rollback;
-
-                                       free(stmt); stmt = NULL;
-                               } else {
-                                       edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() trio_asprintf failed!");
-                                       goto rollback;
-                               }
-                       }
-
-
-                       if (flags & EDG_WLL_STAT_CHILDHIST_THOROUGH) { /* Full (thorough) Histogram */
-
-
-                               if (stat->children_hist == NULL) {
-                                       stat->children_hist = (int*) calloc(1+EDG_WLL_NUMBER_OF_STATCODES, sizeof(int));
-                                       if (stat->children_hist == NULL) {
-                                               edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() calloc children_hist failed!");
-                                               goto rollback;
-                                       }
-
-                                       stat->children_hist[0] = EDG_WLL_NUMBER_OF_STATCODES;
-                               }
-                               else {
-                                       /* If hist is loaded, it probably contain only incomplete histogram
-                                        * built in update_parent_status. Count it from scratch...*/
-                                       for (ii=1; ii<=EDG_WLL_NUMBER_OF_STATCODES; ii++)
-                                               stat->children_hist[ii] = 0;
-                               }
-
-                               if (flags & EDG_WLL_STAT_CHILDSTAT) { // Job states have already been loaded
-                                       for ( ii = 0 ; ii < i ; ii++ ) {
-                                               stat->children_hist[(stat->children_states[ii].state)+1]++;
-                                       }
-                               }
-                               else {
-                                       // Get child states from the database
-                                       trio_asprintf(&stmt, "SELECT version,status,jobid FROM states WHERE parent_job='%|Ss'", md5_jobid);
-                                       if (stmt != NULL) {
-                                               num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
-                                               if (num_sub >=0 ) {
-                                                       while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out_stat)/sizeof(out_stat[0]), NULL, out_stat)) == 3 ) {
-                                                               if (!strcmp(INTSTAT_VERSION,out_stat[0])) {
-                                                                       num_f = atoi(out_stat[1]);
-                                                                       if (num_f > EDG_WLL_JOB_UNDEF && num_f < EDG_WLL_NUMBER_OF_STATCODES)
-                                                                               stat->children_hist[num_f+1]++;
-                                                               }
-                                                               else { // recount state
-                                                                       glite_jobid_t   subjob;
-                                                                       intJobStat      js_real;
-                                                                       char            *name;
-                                                                       int             port;
-
-
-                                                                       js = &js_real;
-                                                                       glite_jobid_getServerParts(job, &name, &port);
-                                                                       if (glite_jobid_recreate(name, port, out_stat[2], &subjob)) {
-                                                                               goto rollback;
-                                                                       }
-                                                                       free(name);
-
-                                                                       if (edg_wll_intJobStatus(ctx, subjob, flags, js, js_enable_store, 0)) {
-                                                                               goto rollback;
-                                                                       }
-                                                                       glite_jobid_free(subjob);
-                                                                       num_f = js->pub.state;
-                                                                       if (num_f > EDG_WLL_JOB_UNDEF && num_f < EDG_WLL_NUMBER_OF_STATCODES)
-                                                                               stat->children_hist[num_f+1]++;
-
-                                                                       destroy_intJobStat(js);
-                                                               }
-                                                               free(out_stat[0]); out_stat[0] = NULL;
-                                                               free(out_stat[1]); out_stat[1] = NULL;  
-                                                               free(out_stat[2]); out_stat[2] = NULL;
-                                                       }
-                                                       if (num_f < 0) goto rollback;
-
-                                                       glite_lbu_FreeStmt(&sh); sh = NULL;
-                                               }
-                                               else goto rollback;
-
-                                               free(stmt); stmt = NULL;
-                                       } else {
-                                               edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() trio_asprintf failed!");
-                                               goto rollback;
-                                       }
-                               }
-                       }
-                       else {
-                               if (flags & EDG_WLL_STAT_CHILDHIST_FAST) { /* Fast Histogram */
-                                       
-                                       if (stat->children_hist == NULL) {
-                                               // If the histogram exists, assume that it was already filled during job state retrieval
-                                               stat->children_hist = (int*) calloc(1+EDG_WLL_NUMBER_OF_STATCODES, sizeof(int));
-                                               if (stat->children_hist == NULL) {
-                                                       edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() calloc children_hist failed!");
-                                                       goto rollback;
-                                               }
-
-                                               if (edg_wll_GetSubjobHistogram(ctx, job, stat->children_hist))
-                                                       goto rollback;
-                                       }
-                               }
-                               else {
-                                       if (stat->children_hist) {
-                                               free (stat->children_hist);
-                                               stat->children_hist = NULL;
-                                       }
-                               }
-
-                       }
-
-
-                       if (flags & EDG_WLL_STAT_CHILDREN) {
-
-                               trio_asprintf(&stmt, "SELECT j.dg_jobid FROM states s,jobs j "
-                                               "WHERE s.parent_job='%|Ss' AND s.jobid=j.jobid",
-                                       md5_jobid);
-                               if (stmt != NULL) {
-                                       num_sub = edg_wll_ExecSQL(ctx, stmt, &sh);
-                                       if (num_sub >=0 ) {
-                                               while ((num_f = edg_wll_FetchRow(ctx, sh, sizeof(out)/sizeof(out[0]), NULL, out)) == 1 ) {
-                                                       add_stringlist(&stat->children, out[0]);
-                                                       free(out[0]); 
-                                               }
-                                               if (num_f < 0) goto rollback;
-
-                                               glite_lbu_FreeStmt(&sh); sh = NULL;
-                                       }
-                                       else goto rollback;
-
-                                       free(stmt); stmt = NULL;
-                               } else {
-                                       edg_wll_SetError(ctx, ENOMEM, "edg_wll_JobStatusServer() trio_asprintf failed!");
-                                       goto rollback;
-                               }
-                       }
-               }
-#endif
-
-               whole_cycle = 1;
-rollback:
-               if (!whole_cycle) { 
-                       edg_wll_FreeStatus(&jobstat.pub);
-                       memset(stat, 0, sizeof(*stat));
-               }
-               destroy_intJobStat_extension(&jobstat);
-               if (acl) { edg_wll_FreeAcl(acl); acl = NULL; }
-               if (stmt) { free(stmt); stmt = NULL; }
-               if (sh) { glite_lbu_FreeStmt(&sh); sh = NULL; }
-
-        } while (edg_wll_TransNeedRetry(ctx));
-
-       free(string_jobid);
-       free(md5_jobid);
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-int edg_wll_intJobStatus(
-       edg_wll_Context ctx,
-       glite_jobid_const_t     job,
-       int                     flags,
-       intJobStat      *intstat,
-       int             update_db,
-       int             add_fqans)
-{
-
-/* Local variables */
-       char            *string_jobid;
-       char            *md5_jobid;
-
-       int             num_events;
-       edg_wll_Event   *events = NULL;
-
-       int             i, intErr = 0;
-       int             res;
-       int             be_strict = 0;
-               char            *errstring = NULL;
-
-       edg_wll_QueryRec        jqr[2];
-       edg_wll_QueryRec        **jqra;
-
-/* Processing */
-       edg_wll_ResetError(ctx);
-       init_intJobStat(intstat);
-
-       string_jobid = edg_wlc_JobIdUnparse(job);
-       if (string_jobid == NULL || intstat == NULL) {
-               free(string_jobid);
-               return edg_wll_SetError(ctx,EINVAL, NULL);
-       }
-       free(string_jobid);
-
-       /* can be already filled by public edg_wll_JobStat() */
-       if (intstat->pub.owner == NULL) {
-               md5_jobid = edg_wlc_JobIdGetUnique(job);
-               if ( !(intstat->pub.owner = job_owner(ctx,md5_jobid)) ) {
-                       free(md5_jobid);
-                       return edg_wll_Error(ctx,NULL,NULL);
-               }
-       }
-       
-       /* re-lock job from InShareMode to ForUpdate
-        * needed by edg_wll_RestoreSubjobState and edg_wll_StoreIntState
-        */
-       res = edg_wll_LockJobRowForUpdate(ctx, md5_jobid);
-       free(md5_jobid);
-       if (res) return edg_wll_Error(ctx, NULL, NULL);
-
-        jqr[0].attr = EDG_WLL_QUERY_ATTR_JOBID;
-        jqr[0].op = EDG_WLL_QUERY_OP_EQUAL;
-        jqr[0].value.j = (glite_jobid_t)job;
-        jqr[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-
-       jqra = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **));
-       jqra[0] = jqr;
-       jqra[1] = NULL;
-
-       if (edg_wll_QueryEventsServer(ctx,1, (const edg_wll_QueryRec **)jqra, NULL, &events)) {
-               if (edg_wll_Error(ctx, NULL, NULL) == ENOENT) {
-                       if (edg_wll_RestoreSubjobState(ctx, job, intstat)) {
-                               destroy_intJobStat(intstat);
-                               free(jqra);
-                               free(intstat->pub.owner); intstat->pub.owner = NULL;
-                               return edg_wll_Error(ctx, NULL, NULL);
-                       }
-               }
-               else {
-                       free(jqra);
-                       free(intstat->pub.owner); intstat->pub.owner = NULL;
-                       return edg_wll_Error(ctx, NULL, NULL);
-               }
-       }
-       else {
-               free(jqra);
-
-               for (num_events = 0; events[num_events].type != EDG_WLL_EVENT_UNDEF;
-                       num_events++);
-
-               if (num_events == 0) {
-                       free(intstat->pub.owner); intstat->pub.owner = NULL;
-                       return edg_wll_SetError(ctx,ENOENT,NULL);
-               }
-
-               for (i = 0; i < num_events; i++) {
-                       res = processEvent(intstat, &events[i], i, be_strict, &errstring);
-                       if (res == RET_FATAL || res == RET_INTERNAL) { /* !strict */
-                               intErr = 1; break;
-                       }
-               }
-               if (intstat->pub.state == EDG_WLL_JOB_UNDEF) {
-                       intstat->pub.state = EDG_WLL_JOB_UNKNOWN;
-               }
-
-
-               for (i=0; i < num_events ; i++) edg_wll_FreeEvent(&events[i]);
-               free(events);
-       }
-
-       if (intErr) {
-               destroy_intJobStat(intstat);
-               return edg_wll_SetError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, NULL);
-       } else {
-               /* XXX intstat->pub.expectUpdate = eval_expect_update(intstat, &intstat->pub.expectFrom); */
-               intErr = edg_wlc_JobIdDup(job, &intstat->pub.jobId);
-               if (intErr) return edg_wll_SetError(ctx, intErr, NULL);
-
-               if (update_db) {
-                       int tsq = num_events - 1;
-                       if (add_fqans && tsq == 0 && ctx->fqans != NULL) {
-                               for (i=0; ctx->fqans[i]; i++);
-                               intstat->pub.user_fqans = malloc(sizeof(*ctx->fqans)*(i+1));
-                               for (i=0; ctx->fqans[i]; i++) {
-                                       intstat->pub.user_fqans[i] = strdup(ctx->fqans[i]);
-                               }
-                               intstat->pub.user_fqans[i] = NULL;
-                       }
-
-                       edg_wll_StoreIntState(ctx, intstat, tsq);
-                       /* recheck
-                        * intJobStat *reread;
-                        * edg_wll_LoadIntState(ctx, job, tsq, &reread);
-                        * destroy_intJobStat(reread);
-                       */
-               }
-       }
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-/* 
- * Regenarate state of subjob without any event from its parent JobReg Event 
- */
-edg_wll_ErrorCode edg_wll_RestoreSubjobState(
-       edg_wll_Context         ctx,
-       glite_jobid_const_t     job,
-       intJobStat              *intstat)
-{
-       glite_jobid_t           parent_job = NULL;
-       edg_wll_QueryRec        jqr_p1[2], jqr_p2[2];
-       edg_wll_QueryRec        **ec, **jc;
-       edg_wll_Event           *events_p;
-       int                     err, i;
-
-       
-       /* find job parent */
-       if (get_job_parent(ctx, job, &parent_job)) goto err;
-
-       /* get registration event(s) of parent*/
-       jqr_p1[0].attr = EDG_WLL_QUERY_ATTR_JOBID;
-       jqr_p1[0].op = EDG_WLL_QUERY_OP_EQUAL;
-       jqr_p1[0].value.j = parent_job;
-       jqr_p1[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-
-       jqr_p2[0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE;
-       jqr_p2[0].op = EDG_WLL_QUERY_OP_EQUAL;
-       jqr_p2[0].value.i = EDG_WLL_EVENT_REGJOB;
-       jqr_p2[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-
-       jc = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **));
-       jc[0] = jqr_p1;
-       jc[1] = NULL;
-
-       ec = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **));
-       ec[0] = jqr_p2;
-       ec[1] = NULL;
-
-       if (edg_wll_QueryEventsServer(ctx,1, (const edg_wll_QueryRec **)jc, 
-                               (const edg_wll_QueryRec **)ec, &events_p)) {
-               glite_jobid_free(parent_job);
-               free(jc);
-               free(ec);
-               return edg_wll_Error(ctx, NULL, NULL);
-       }
-       glite_jobid_free(parent_job);
-       free(jc);
-       free(ec);
-
-       /* recreate job status of subjob */
-       err = intJobStat_embryonic(ctx, job, (const edg_wll_RegJobEvent *) &(events_p[0]), intstat);
-
-       for (i=0; events_p[i].type != EDG_WLL_EVENT_UNDEF ; i++) 
-               edg_wll_FreeEvent(&events_p[i]);
-       free(events_p);
-
-       if (err) goto err;
-
-err:
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-/*
- * Helper for warning printouts
- */
-
-static void warn(const char* format, ...)
-{
-       va_list l;
-       va_start(l, format);
-
-       /*
-       fprintf(stderr, "Warning: ");
-       vfprintf(stderr, format, l);
-       fputc('\n', stderr);
-       */
-
-       va_end(l);
-}
-
-static char *job_owner(edg_wll_Context ctx,char *md5_jobid)
-{
-       char    *stmt = NULL,*out = NULL;
-       glite_lbu_Statement     sh;
-       int     f = -1;
-       
-       edg_wll_ResetError(ctx);
-       trio_asprintf(&stmt,"select cert_subj from users,jobs "
-               "where users.userid = jobs.userid "
-               "and jobs.jobid = '%|Ss'",md5_jobid);
-
-       if (stmt==NULL) {
-               edg_wll_SetError(ctx,ENOMEM, NULL);
-               return NULL;
-       }
-       if (edg_wll_ExecSQL(ctx,stmt,&sh) >= 0) {
-               f=edg_wll_FetchRow(ctx,sh,1,NULL,&out);
-               if (f == 0) {
-                       if (out) free(out);
-                       out = NULL;
-                       edg_wll_SetError(ctx,ENOENT,md5_jobid);
-               }
-       }
-       glite_lbu_FreeStmt(&sh);
-       free(stmt);
-
-       return out;
-}
-
-
-static edg_wll_ErrorCode get_job_parent(edg_wll_Context ctx, glite_jobid_const_t job, glite_jobid_t *parent)
-{
-       glite_lbu_Statement     sh = NULL;
-       char    *stmt = NULL, *out = NULL;
-       char    *md5_jobid = edg_wlc_JobIdGetUnique(job);
-       int     ret;
-
-       
-       edg_wll_ResetError(ctx);
-       trio_asprintf(&stmt,"select parent_job from states "
-               "where jobid = '%|Ss'" ,md5_jobid);
-
-       if (stmt==NULL) {
-               edg_wll_SetError(ctx,ENOMEM, NULL);
-               goto err;
-       }
-
-       if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0) goto err;
-
-       if (!edg_wll_FetchRow(ctx,sh,1,NULL,&out)) {
-               edg_wll_SetError(ctx,ENOENT,md5_jobid);
-               goto err;
-       }
-
-       ret = glite_jobid_recreate((const char*) ctx->srvName,
-                       ctx->srvPort, (const char *) out, parent);
-
-       if (ret) {
-               edg_wll_SetError(ctx,ret,"Error creating jobid");
-               goto err;
-       }
-
-err:
-       if (sh) glite_lbu_FreeStmt(&sh);
-       free(md5_jobid);
-       free(stmt);
-       free(out);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-#if 0
-/* XXX went_through went out */
-static int eval_expect_update(intJobStat *js, int* went_through, char **expect_from)
-{
-       int em = 0;
-       int ft = 0; /* fall through following tests */
-
-       if (ft || (went_through[ EDG_WLL_JOB_OUTPUTREADY ] && !js->done_failed)) ft = 1;
-       if (ft || (went_through[ EDG_WLL_JOB_DONE ] && !js->done_failed)) ft = 1;
-       if (ft || went_through[ EDG_WLL_JOB_CHECKPOINTED ]) ft = 1;
-       if (ft || went_through[ EDG_WLL_JOB_RUNNING ]) {
-               if (js->pub.node == NULL) em |= EXPECT_MASK_JOBMGR;
-               ft = 1;
-       }
-       if (ft || went_through[ EDG_WLL_JOB_SCHEDULED ]) {
-                       if (js->pub.jssId == NULL) em |= EXPECT_MASK_JSS;
-                       if (js->pub.rsl == NULL) em |= EXPECT_MASK_JSS;
-                       if (js->pub.globusId == NULL) em |= EXPECT_MASK_JOBMGR;
-                       if (js->pub.localId == NULL) em |= EXPECT_MASK_JOBMGR;
-                       if (js->pub.jss_jdl == NULL) em |= EXPECT_MASK_RB;
-                       ft = 1;
-       }
-       if (ft || went_through[ EDG_WLL_JOB_READY ]) {
-               if (js->pub.destination == NULL) em |= EXPECT_MASK_RB;
-               ft = 1;
-       }
-       if (ft || went_through[ EDG_WLL_JOB_SUBMITTED ]) {
-               if (js->pub.jdl == NULL) em |= EXPECT_MASK_UI;
-               ft = 1;
-       }
-       
-       if (em == 0) 
-               *expect_from = NULL;
-       else {
-               asprintf(expect_from, "%s%s%s%s%s%s%s",
-                       (em & EXPECT_MASK_UI ) ? EDG_WLL_SOURCE_UI : "",
-                       (em & EXPECT_MASK_UI ) ? " " : "",
-                       (em & EXPECT_MASK_RB ) ? EDG_WLL_SOURCE_RB : "",
-                       (em & EXPECT_MASK_RB ) ? " " : "",
-                       (em & EXPECT_MASK_JSS ) ? EDG_WLL_SOURCE_JSS : "",
-                       (em & EXPECT_MASK_JSS ) ? " " : "",
-                       (em & EXPECT_MASK_JOBMGR ) ? EDG_WLL_SOURCE_JOBMGR : ""
-                       );
-       }
-
-       return (em == 0) ? 0 : 1;
-}
-#endif
-
-/* XXX more thorough malloc, calloc, and asprintf failure handling */
-/* XXX indexes in {short,long}_fields */
-/* XXX strict mode */
-/* XXX caching */
-
-/*
- * Store current job state to states and status_tags DB tables.
- * Should be called with the job locked.
- */
-
-edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context ctx,
-                                    intJobStat *stat,
-                                    int seq)
-{
-       char *jobid_md5, *stat_enc, *parent_md5 = NULL;
-       char *stmt;
-       edg_wll_TagValue *tagp;
-       int update;
-       int dbret;
-       char *icnames, *icvalues;
-
-
-       /* check size of intstat version, its only varchar(32) */
-       assert(strlen(INTSTAT_VERSION) <= 32);
-       
-       update = (seq > 0);
-       jobid_md5 = edg_wlc_JobIdGetUnique(stat->pub.jobId);
-       stat_enc = enc_intJobStat(strdup(""), stat);
-
-       tagp = stat->pub.user_tags;
-       if (tagp) {
-               while ((*tagp).tag != NULL) {
-                       trio_asprintf(&stmt, "insert into status_tags"
-                                       "(jobid,seq,name,value) values "
-                                       "('%|Ss',%d,'%|Ss','%|Ss')",
-                                       jobid_md5, seq, (*tagp).tag, (*tagp).value);
-                       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) {
-                               if (EEXIST == edg_wll_Error(ctx, NULL, NULL)) {
-                               /* XXX: this should not happen */
-                                       edg_wll_ResetError(ctx);
-                                       free(stmt); stmt = NULL;
-                                       tagp++;
-                                       continue;
-                               }
-                               else
-                                       goto cleanup;
-                       }
-                       free(stmt); stmt = NULL;
-                       tagp++;
-               }
-       }
-
-       parent_md5 = edg_wlc_JobIdGetUnique(stat->pub.parent_job);
-       if (parent_md5 == NULL) parent_md5 = strdup("*no parent job*");
-
-
-       edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, &stat->pub, 0, NULL, &icvalues);
-
-       trio_asprintf(&stmt,
-               "update states set "
-               "status=%d,seq=%d,int_status='%|Ss',version='%|Ss'"
-                       ",parent_job='%|Ss'%s "
-               "where jobid='%|Ss'",
-               stat->pub.state, seq, stat_enc, INTSTAT_VERSION,
-               parent_md5, icvalues,
-               jobid_md5);
-       free(icvalues);
-
-       if ((dbret = edg_wll_ExecSQL(ctx,stmt,NULL)) < 0) goto cleanup;
-       free(stmt); stmt = NULL;
-
-       if (dbret == 0) {
-               edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, &stat->pub, 1, &icnames, &icvalues);
-               trio_asprintf(&stmt,
-                       "insert into states"
-                       "(jobid,status,seq,int_status,version"
-                               ",parent_job%s) "
-                       "values ('%|Ss',%d,%d,'%|Ss','%|Ss','%|Ss'%s)",
-                       icnames,
-                       jobid_md5, stat->pub.state, seq, stat_enc,
-                       INTSTAT_VERSION, parent_md5, icvalues);
-               free(icnames); free(icvalues);
-
-               if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup;
-               free(stmt); stmt = NULL;
-       }
-
-       if (update) {
-               trio_asprintf(&stmt, "delete from states "
-                       "where jobid ='%|Ss' and ( seq<%d or version !='%|Ss')",
-                       jobid_md5, seq, INTSTAT_VERSION);
-               if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup;
-               free(stmt); stmt = NULL;
-       }
-       if (update) {
-               trio_asprintf(&stmt, "delete from status_tags "
-                       "where jobid ='%|Ss' and seq<%d", jobid_md5, seq);
-               if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup;
-               free(stmt); stmt = NULL;
-       }
-
-cleanup:
-       free(stmt); 
-       free(jobid_md5); free(stat_enc);
-       free(parent_md5);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-edg_wll_ErrorCode edg_wll_StoreIntStateEmbryonic(edg_wll_Context ctx,
-        char *icnames, 
-       char *values)
-{
-       char *stmt = NULL;
-
-/* TODO
-               edg_wll_UpdateStatistics(ctx, NULL, e, &jobstat.pub);
-               if (ctx->rgma_export) write2rgma_status(&jobstat);
-*/
-
-       trio_asprintf(&stmt,
-               "insert into states"
-               "(jobid,status,seq,int_status,version"
-                       ",parent_job%s) "
-               "values (%s)",
-               icnames, values);
-
-       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto cleanup;
-
-cleanup:
-       free(stmt); 
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-/*
- * Retrieve stored job state from states and status_tags DB tables.
- * Should be called with the job locked.
- */
-
-edg_wll_ErrorCode edg_wll_LoadIntState(edg_wll_Context ctx,
-                                   glite_jobid_const_t jobid,
-                                   int lock,
-                                   int seq,
-                                   intJobStat **stat)
-{
-       char *jobid_md5;
-       char *stmt;
-       glite_lbu_Statement sh;
-       char *res, *res_rest;
-       int nstates;
-
-       edg_wll_ResetError(ctx);
-       jobid_md5 = edg_wlc_JobIdGetUnique(jobid);
-
-       if (lock) {
-               edg_wll_LockJobRowForUpdate(ctx,jobid_md5);
-       }
-
-       if (seq == -1) {
-               /* any sequence number */
-               trio_asprintf(&stmt,
-                       "select int_status from states "
-                       "where jobid='%|Ss' and version='%|Ss'",
-                       jobid_md5, INTSTAT_VERSION);
-       } else {
-               trio_asprintf(&stmt,
-                       "select int_status from states "
-                       "where jobid='%|Ss' and seq='%d' and version='%|Ss'",
-                       jobid_md5, seq, INTSTAT_VERSION);
-       }
-
-       if (stmt == NULL) {
-               return edg_wll_SetError(ctx, ENOMEM, NULL);
-       }
-
-       if ((nstates = edg_wll_ExecSQL(ctx,stmt,&sh)) < 0) goto cleanup;
-       if (nstates == 0) {
-               edg_wll_SetError(ctx,ENOENT,"no state in DB");
-               goto cleanup;
-       }
-       if (edg_wll_FetchRow(ctx,sh,1,NULL,&res) < 0) goto cleanup;
-
-       *stat = dec_intJobStat(res, &res_rest);
-       if (res_rest == NULL) {
-               edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_CALL,
-                               "error decoding DB intJobStatus");
-       }
-
-       free(res);
-cleanup:
-       free(jobid_md5);
-       free(stmt); 
-       if (sh) glite_lbu_FreeStmt(&sh);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-static char* hist_to_string(int * hist)
-{
-       int i;
-       char *s, *s1;
-
-
-       assert(hist[0] == EDG_WLL_NUMBER_OF_STATCODES);
-       asprintf(&s, "%s=%d", edg_wll_StatToString(1), hist[2]);
-
-       for (i=2; i<hist[0] ; i++) {
-               asprintf(&s1, "%s, %s=%d", s, edg_wll_StatToString(i), hist[i+1]);
-               free(s); s=s1; s1=NULL;
-       }
-
-       return s;
-}
-
-#if 0  // should not be needed anymore
-
-/* checks whether parent jobid would generate the same sem.num. */
-/* as children jobid                                           */
-static int dependent_parent_lock(edg_wll_Context ctx, glite_jobid_const_t p,glite_jobid_const_t c)
-{
-       int     p_id, c_id;
-
-       if ((p_id=edg_wll_JobSemaphore(ctx, p)) == -1) return -1;
-       if ((c_id=edg_wll_JobSemaphore(ctx, c)) == -1) return -1;
-
-       if (p_id == c_id) return 1;
-       else return 0;
-}
-#endif
-
-
-static edg_wll_ErrorCode load_parent_intJobStat(edg_wll_Context ctx, intJobStat *cis, intJobStat **pis)
-{
-       if (*pis) return edg_wll_Error(ctx, NULL, NULL); // already loaded and locked
-
-       if (edg_wll_LoadIntState(ctx, cis->pub.parent_job, LOCK, - 1, pis))
-               goto err;
-
-       assert(*pis);   // deadlock would happen with next call of this function
-
-err:
-       return edg_wll_Error(ctx, NULL, NULL);
-
-}
-
-
-static int log_collectionState_event(edg_wll_Context ctx, edg_wll_JobStatCode state, enum edg_wll_StatDone_code done_code, intJobStat *cis, intJobStat *pis, edg_wll_Event *ce) 
-{
-       int     ret = 0;
-
-       edg_wll_Event  *event = 
-               edg_wll_InitEvent(EDG_WLL_EVENT_COLLECTIONSTATE);
-
-       event->any.priority = EDG_WLL_LOGFLAG_INTERNAL;
-
-       if (ctx->serverIdentity) 
-               event->any.user = strdup(ctx->serverIdentity);  
-       else
-               event->any.user = strdup("LBProxy");
-
-       if (!edg_wll_SetSequenceCode(ctx,pis->last_seqcode,EDG_WLL_SEQ_NORMAL)) {
-               ctx->p_source = EDG_WLL_SOURCE_LB_SERVER;
-                edg_wll_IncSequenceCode(ctx);
-        }
-       event->any.seqcode = edg_wll_GetSequenceCode(ctx);
-       edg_wlc_JobIdDup(pis->pub.jobId, &(event->any.jobId));
-       gettimeofday(&event->any.timestamp,0);
-       if (ctx->p_host) event->any.host = strdup(ctx->p_host);
-       event->any.level = ctx->p_level;
-       event->any.source = EDG_WLL_SOURCE_LB_SERVER; 
-               
-                                       
-       event->collectionState.state = edg_wll_StatToString(state);
-       event->collectionState.done_code = done_code;
-       event->collectionState.histogram = hist_to_string(pis->pub.children_hist);
-       edg_wlc_JobIdDup(cis->pub.jobId, &(event->collectionState.child));
-       event->collectionState.child_event = edg_wll_EventToString(ce->any.type);
-
-       ret = db_parent_store(ctx, event, pis);
-
-       edg_wll_FreeEvent(event);
-       free(event);
-
-       return ret;     
-}
-
-
-/* returns state class of subjob of job collection     */
-static subjobClassCodes class(edg_wll_JobStat *stat)
-{
-       switch (stat->state) {
-               case EDG_WLL_JOB_RUNNING:
-                       return(SUBJOB_CLASS_RUNNING);
-                       break;
-               case EDG_WLL_JOB_DONE:
-                       if (stat->done_code == EDG_WLL_STAT_OK)
-                               return(SUBJOB_CLASS_DONE);
-                       else
-                               // failed & cancelled
-                               return(SUBJOB_CLASS_REST);
-                       break;
-               case EDG_WLL_JOB_CANCELLED:
-                       return(SUBJOB_CLASS_CLEARED);
-                       break;
-               case EDG_WLL_JOB_ABORTED:
-                       return(SUBJOB_CLASS_ABORTED);
-                       break;
-               case EDG_WLL_JOB_CLEARED:
-                       return(SUBJOB_CLASS_CLEARED);
-                       break;
-               default:
-                       return(SUBJOB_CLASS_REST);
-                       break;
-       }
-}
-
-/* Mapping of subjob class to some field in childen_hist */
-static edg_wll_JobStatCode class_to_statCode(subjobClassCodes code)
-{
-       switch (code) {
-               case SUBJOB_CLASS_RUNNING:      return(EDG_WLL_JOB_RUNNING); break;
-               case SUBJOB_CLASS_DONE:         return(EDG_WLL_JOB_DONE); break;
-               case SUBJOB_CLASS_ABORTED:      return(EDG_WLL_JOB_ABORTED); break;
-               case SUBJOB_CLASS_CLEARED:      return(EDG_WLL_JOB_CLEARED); break;
-               case SUBJOB_CLASS_REST:         return(EDG_WLL_JOB_UNKNOWN); break;
-               default:                        assert(0); break;
-       }
-}
-
-/* count parent state from subjob histogram */
-static edg_wll_JobStatCode process_Histogram(intJobStat *pis)
-{
-       if (pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_RUNNING)+1] > 0) {
-               return EDG_WLL_JOB_RUNNING;
-       }
-       else if (pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_CLEARED)+1] == pis->pub.children_num) {
-               return EDG_WLL_JOB_CLEARED;
-       }
-       else if (pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_DONE)+1] 
-                       + pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_CLEARED)+1] == pis->pub.children_num) {
-               return EDG_WLL_JOB_DONE;
-       }
-       else if (pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_ABORTED)+1]
-                       + pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_DONE)+1]
-                       + pis->pub.children_hist[class_to_statCode(SUBJOB_CLASS_CLEARED)+1] == pis->pub.children_num) {
-               return EDG_WLL_JOB_ABORTED;
-       }
-       else
-               return EDG_WLL_JOB_WAITING;
-}
-
-static edg_wll_ErrorCode update_parent_status(edg_wll_Context ctx, edg_wll_JobStat *subjob_stat_old, intJobStat *cis, edg_wll_Event *ce)
-{
-       intJobStat              *pis = NULL;
-       subjobClassCodes        subjob_class, subjob_class_old;
-       edg_wll_JobStatCode     parent_new_state;
-
-
-       subjob_class = class(&cis->pub);
-       subjob_class_old = class(subjob_stat_old);
-
-
-       if (subjob_class_old != subjob_class) {
-               if (load_parent_intJobStat(ctx, cis, &pis)) goto err;
-
-               pis->pub.children_hist[class_to_statCode(subjob_class)+1]++;
-               pis->pub.children_hist[class_to_statCode(subjob_class_old)+1]--;
-
-               edg_wll_StoreSubjobHistogram(ctx, cis->pub.parent_job, pis);
-
-
-               if (pis->pub.jobtype == EDG_WLL_STAT_COLLECTION) {
-                       parent_new_state = process_Histogram(pis);
-                       if (pis->pub.state != parent_new_state) {
-                               // XXX: we do not need  EDG_WLL_STAT_code any more
-                               //      doneFailed subjob is stored in REST class and
-                               //      inducting collection Waiting state
-                               //      -> in future may be removed from collectionState event
-                               //         supposing collection Done state to be always DoneOK
-                               if (log_collectionState_event(ctx, parent_new_state, EDG_WLL_STAT_OK, cis, pis, ce))
-                                       goto err;
-                       }
-               }
-       }
-
-err:
-       if (pis)
-               destroy_intJobStat(pis);
-
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-
-/*
- * update stored state according to the new event
- * (must be called with the job locked)
- */
-
-edg_wll_ErrorCode edg_wll_StepIntStateParent(edg_wll_Context ctx,
-                                       glite_jobid_const_t job,
-                                       edg_wll_Event *e,
-                                       int seq,
-                                       intJobStat *ijsp,
-                                       edg_wll_JobStat *oldstat,
-                                       edg_wll_JobStat *stat_out)
-{
-       int             res;
-       int             be_strict = 0;
-       char            *errstring = NULL;
-       char            *oldstat_rgmaline = NULL;
-
-
-       edg_wll_CpyStatus(&ijsp->pub,oldstat);
-
-       if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(ijsp);
-
-       res = processEvent(ijsp, e, seq, be_strict, &errstring);
-       if (res == RET_FATAL || res == RET_INTERNAL) { /* !strict */
-               edg_wll_FreeStatus(oldstat);
-               memset(oldstat,0,sizeof *oldstat);
-               return edg_wll_SetError(ctx, EINVAL, errstring);
-       }
-       // XXX: store it in update_parent status ?? 
-       edg_wll_StoreIntState(ctx, ijsp, seq);
-
-       edg_wll_UpdateStatistics(ctx,oldstat,e,&ijsp->pub);
-
-       if (ctx->rgma_export) write2rgma_chgstatus(ijsp, oldstat_rgmaline);
-
-       if (stat_out) {
-               edg_wll_CpyStatus(&ijsp->pub, stat_out);
-       }
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-
-/*
- * update stored state according to the new event
- * (must be called with the job locked)
-
- * XXX: job is locked on entry, unlocked in this function
- */
-
-edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx,
-                                       glite_jobid_const_t job,
-                                       edg_wll_Event *e,
-                                       int seq,
-                                       edg_wll_JobStat *oldstat,
-                                       edg_wll_JobStat *stat_out)
-{
-       intJobStat      *ijsp;
-       int             flags = 0;
-       int             res;
-       int             be_strict = 0;
-       char            *errstring = NULL;
-       intJobStat      jobstat;
-       char            *oldstat_rgmaline = NULL;
-
-
-       if (!edg_wll_LoadIntState(ctx, job, DONT_LOCK, seq - 1, &ijsp)) {
-               edg_wll_CpyStatus(&ijsp->pub,oldstat);
-
-               if (ctx->rgma_export) oldstat_rgmaline = write2rgma_statline(ijsp);
-
-               res = processEvent(ijsp, e, seq, be_strict, &errstring);
-               if (res == RET_FATAL || res == RET_INTERNAL) { /* !strict */
-                       edg_wll_FreeStatus(oldstat);
-                       memset(oldstat,0,sizeof *oldstat);
-                       return edg_wll_SetError(ctx, EINVAL, errstring);
-               }
-               edg_wll_StoreIntState(ctx, ijsp, seq);
-
-               edg_wll_UpdateStatistics(ctx,oldstat,e,&ijsp->pub);
-
-               /* check whether subjob state change does not change parent state */
-               if ((ijsp->pub.parent_job) && (oldstat->state != ijsp->pub.state)) { 
-                       if (update_parent_status(ctx, oldstat, ijsp, e)) {
-                               edg_wll_FreeStatus(oldstat);
-                               memset(oldstat,0,sizeof *oldstat);
-                               return edg_wll_SetError(ctx, EINVAL, "update_parent_status()");
-                       }
-               }
-
-               if (ctx->rgma_export) write2rgma_chgstatus(ijsp, oldstat_rgmaline);
-
-               if (stat_out) {
-                       memcpy(stat_out,&ijsp->pub,sizeof *stat_out);
-                       destroy_intJobStat_extension(ijsp);
-               }
-               else destroy_intJobStat(ijsp);
-               free(ijsp);
-       }
-       else if (!edg_wll_intJobStatus(ctx, job, flags,&jobstat, js_enable_store, 1)) 
-       {
-               /* FIXME: we miss state change in the case of seq != 0 
-                * Does anybody care? */
-
-               /* FIXME: collection parent status is wrong in this case.
-                  However, it should not happen (frequently).
-                  Right approach is computing parent status from scratch.
-               */
-
-               edg_wll_UpdateStatistics(ctx,NULL,e,&jobstat.pub);
-
-               if (ctx->rgma_export) write2rgma_status(&jobstat);
-
-               if (stat_out) {
-                       memcpy(stat_out,&jobstat.pub,sizeof *stat_out);
-                       destroy_intJobStat_extension(&jobstat);
-               }
-               else destroy_intJobStat(&jobstat);
-       }
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-edg_wll_ErrorCode edg_wll_GetSubjobHistogram(edg_wll_Context ctx, glite_jobid_const_t parent_jobid, int *hist)
-{
-
-        char    *stmt = NULL,*out = NULL, *rest = NULL;
-        glite_lbu_Statement    sh;
-        int     f = -1, i;
-       char *jobid_md5;
-       intJobStat *ijs = NULL;
-
-       jobid_md5 = edg_wlc_JobIdGetUnique(parent_jobid);
-
-        edg_wll_ResetError(ctx);
-        trio_asprintf(&stmt,"select int_status from states where (jobid='%|Ss') AND (version='%|Ss')", jobid_md5, INTSTAT_VERSION);
-
-       free(jobid_md5);
-
-        if (stmt==NULL) {
-                return edg_wll_SetError(ctx,ENOMEM, NULL);
-        }
-
-        if (edg_wll_ExecSQL(ctx,stmt,&sh) >= 0) {
-                f=edg_wll_FetchRow(ctx,sh,1,NULL,&out);
-                if (f == 0) {
-                        if (out) free(out);
-                        out = NULL;
-                        edg_wll_SetError(ctx, ENOENT, NULL);
-                }
-               else {
-                       // Ready to read the histogram from the record returned
-                       rest = (char *)calloc(1,strlen(out));   
-                       ijs = dec_intJobStat(out, &rest);
-                       for (i=0;i<=EDG_WLL_NUMBER_OF_STATCODES;i++) hist[i] = ijs->pub.children_hist[i];
-               }
-        }
-        glite_lbu_FreeStmt(&sh);
-        free(stmt);
-       if (rest==NULL) free(rest);
-       if (ijs==NULL) free(rest);
-
-
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-/* Make a histogram of all subjobs belonging to the parent job */
-
-edg_wll_ErrorCode edg_wll_StoreSubjobHistogram(edg_wll_Context ctx, glite_jobid_const_t parent_jobid, intJobStat *ijs)
-{
-        char *stat_enc = NULL;
-        char *stmt;
-        int dbret;
-       char *jobid_md5;
-
-        stat_enc = enc_intJobStat(strdup(""), ijs);
-
-       jobid_md5 = edg_wlc_JobIdGetUnique(parent_jobid);
-
-        trio_asprintf(&stmt,
-                "update states set "
-                "status=%d,int_status='%|Ss',version='%|Ss'"
-                "where jobid='%|Ss'",
-                ijs->pub.state, stat_enc, INTSTAT_VERSION, jobid_md5);
-
-       free(jobid_md5);
-
-       if (stmt==NULL) {
-               return edg_wll_SetError(ctx,ENOMEM, NULL);
-       }
-
-//printf ("\n\n\n Would like to run SQL statament: %s\n\n\n\n", stmt);
-
-        if ((dbret = edg_wll_ExecSQL(ctx,stmt,NULL)) < 0) goto cleanup;
-
-       assert(dbret);  /* update should come through OK as the record exists */
-
-cleanup:
-        free(stmt);
-        free(stat_enc);
-
-       return edg_wll_Error(ctx, NULL, NULL);
-
-}
-
-
diff --git a/org.glite.lb.server/src/jobstat.h b/org.glite.lb.server/src/jobstat.h
deleted file mode 100644 (file)
index 8494a60..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-#ident "$Header$"
-
-#ifndef GLITE_LB_LBS_JOBSTAT_H
-#define GLITE_LB_LBS_JOBSTAT_H
-
-#include "glite/lb/jobstat.h"
-#include "glite/lb/intjobstat.h"
-#include "glite/lbu/db.h"
-
-int edg_wll_JobStatusServer(edg_wll_Context, glite_jobid_const_t, int, edg_wll_JobStat *);
-
-
-int edg_wll_intJobStatus( edg_wll_Context, glite_jobid_const_t, int, intJobStat *, int, int);
-edg_wll_ErrorCode edg_wll_StoreIntState(edg_wll_Context, intJobStat *, int);
-edg_wll_ErrorCode edg_wll_StoreIntStateEmbryonic(edg_wll_Context, char *icnames, char *values);
-edg_wll_ErrorCode edg_wll_LoadIntState(edg_wll_Context , glite_jobid_const_t , int, int, intJobStat **);
-edg_wll_ErrorCode edg_wll_RestoreSubjobState(edg_wll_Context , glite_jobid_const_t , intJobStat *);
-
-
-/* update stored job state according to new event */
-edg_wll_ErrorCode edg_wll_StepIntState(edg_wll_Context ctx, glite_jobid_const_t job, edg_wll_Event *e, int seq, edg_wll_JobStat *old_stat, edg_wll_JobStat *stat_out);
-
-edg_wll_ErrorCode edg_wll_StepIntStateParent(edg_wll_Context,glite_jobid_const_t,edg_wll_Event *,int,intJobStat *, edg_wll_JobStat *old_stat, edg_wll_JobStat *);
-
-/* create embriotic job state for DAGs' subjob */
-
-edg_wll_ErrorCode edg_wll_StepIntStateEmbriotic(
-       edg_wll_Context ctx,    /* INOUT */
-        edg_wll_Event *e       /* IN */
-);
-
-
-
-intJobStat* dec_intJobStat(char *, char **);
-char *enc_intJobStat(char *, intJobStat* );
-
-void write2rgma_status(intJobStat *);
-void write2rgma_chgstatus(intJobStat *, char *);
-char* write2rgma_statline(intJobStat *);
-
-int add_stringlist(char ***, const char *);
-
-edg_wll_ErrorCode edg_wll_GetSubjobHistogram(edg_wll_Context, glite_jobid_const_t parent_jobid, int *hist);
-edg_wll_ErrorCode edg_wll_StoreSubjobHistogram(edg_wll_Context, glite_jobid_const_t parent_jobid, intJobStat *ijs);
-
-#endif /* GLITE_LB_LBS_JOBSTAT_H*/
diff --git a/org.glite.lb.server/src/jobstat_supp.c b/org.glite.lb.server/src/jobstat_supp.c
deleted file mode 100644 (file)
index 2619550..0000000
+++ /dev/null
@@ -1,728 +0,0 @@
-#ident "$Header$"
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <stdarg.h>
-#include <regex.h>
-#include <syslog.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lbu/trio.h"
-#include "glite/lbu/db.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/intjobstat.h"
-#include "glite/lb/seqcode_aux.h"
-
-#include "store.h"
-#include "index.h"
-#include "jobstat.h"
-#include "get_events.h"
-
-
-/* TBD: share in whole logging or workload */
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-static char* enc_strlist(char *, char **) UNUSED_VAR;
-static char **dec_strlist(char *, char **) UNUSED_VAR;
-
-/*
- * string encoding routines for safe DB store
- */
-
-static char *enc_string(char *old, char *item)
-{
-       char *out;
-       if (item == NULL) {
-               asprintf(&out,"%s-1 ", old);
-       } else {
-               asprintf(&out,"%s%ld %s",old, (long)strlen(item), item);
-       }
-       free(old);
-       return out;
-}
-
-static char *dec_string(char *in, char **rest)
-{
-       int scret;
-       long len = -1;
-       char *out;
-       
-       scret = sscanf(in, "%ld", &len);
-       if (scret < 1) {
-               *rest = NULL;
-               return NULL;
-       }
-       if (len == -1) {
-               out = NULL;
-               *rest = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
-       } else {
-               in = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
-               out = (char *)malloc(len+1);
-               if (out) {
-                       memcpy(out, in, len);
-                       *(out+len) = '\0';
-               }
-               *rest = in+len;
-       }
-       return out;
-}
-
-static char *enc_int(char *old, int item)
-{
-        char *out;
-        asprintf(&out,"%s%d ", old, item);
-       free(old);
-        return out;
-}
-
-static char *enc_int_array(char *old, int *item, int itemsNo)
-{
-        char *out;
-       int index;
-       char *strpom;
-
-       strpom=(char*)calloc(strlen(old)+1,sizeof(char));
-
-       for (index=0; index <= itemsNo; index++) sprintf(strpom+strlen(strpom),"%d%s", item[index],index==itemsNo?"":";");
-
-        asprintf(&out,"%s%s ", old, strpom);
-       free(strpom);
-        free(old);
-
-        return out;
-}
-
-static int dec_int(char* in, char **rest)
-{
-       int scret;
-       int out;
-
-       scret = sscanf(in, "%d", &out);
-       if (scret == 1) {
-               *rest = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
-       } else {
-               out = 0;
-               *rest = in;
-       }
-       return out;
-}
-
-static int dec_int_array(char* in, char **rest, int *out)      // Returns the number of items found in the array
-{
-       int charNo, itemsNo = 0, cindex, iindex = 0, lenindex;
-       char *tempstr;
-
-        /* Find out the number of items in the field first */
-
-       for (charNo = 0;charNo<strlen(in);charNo++)     {
-               if (in[charNo] == ' ') {        /* Only ' ' (space) is accepted as a separator. Should not be a broblem. */
-                       itemsNo++;
-                       break;
-               }
-               if (in[charNo] == ';') {
-                       itemsNo++;
-               }
-       }
-       if (!itemsNo) {         /* No separator has been found. This is the last input string */
-               itemsNo = 1;    /* - consider it an one-item array */
-               *rest = NULL;
-       }
-       else *rest = in + charNo + 1;
-
-       tempstr = (char*)calloc(charNo+1,sizeof(char));
-
-       strcpy(tempstr,"");
-
-       for (cindex = 0; cindex<charNo; cindex++) {
-               if ((in[cindex] == ';') || (in[cindex] == ' ')) {
-                       out[iindex] = atoi(tempstr);
-                       strcpy(tempstr,"");
-                       iindex++;
-               }
-               else {
-                       lenindex=strlen(tempstr);
-                       tempstr[lenindex]=in[cindex];
-                       tempstr[lenindex+1]=0;
-               }
-       }
-       if (in[cindex] != ' ') out[iindex] = atoi(tempstr);     /* string not terminated with a separator */
-
-       free(tempstr);
-       *rest = in + charNo + 1;
-
-        return itemsNo;
-}
-
-
-static char* enc_jobid(char *old, edg_wlc_JobId item)
-{
-       char *str;
-       char *out;
-
-       str = edg_wlc_JobIdUnparse(item);
-       out = enc_string(old, str);
-       free(str);
-       return out;
-}
-static edg_wlc_JobId dec_jobid(char *in, char **rest)
-{
-       char *str;
-       edg_wlc_JobId jobid;
-       
-       str = dec_string(in, rest);
-       if (str == NULL) return NULL;
-       edg_wlc_JobIdParse(str, &jobid);
-       free(str);
-       return jobid;
-}
-
-static char* enc_strlist(char *old, char **item)
-{
-       char *ret;
-
-       if (item == NULL) {
-               asprintf(&ret,"%s-1 ", old);
-               free(old);
-               return ret;
-       } else {
-               asprintf(&ret,"%s1 ",old);
-               free(old);
-               if (ret == NULL) return ret;
-       }
-       do {
-               ret = enc_string(ret, *item);
-       } while (*(item++) != NULL);
-       return ret;
-}
-
-static char **dec_strlist(char *in, char **rest)
-{
-       char **out;
-       int len = -1;
-       char *tmp_in, *tmp_ret;
-       int scret;
-
-       scret = sscanf(in, "%d", &len);
-       if (scret < 1) {
-               *rest = NULL;
-               return NULL;
-       }
-       if (len == -1) {
-               *rest = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
-               return NULL;
-       }
-
-       /* count number of fields only */
-       len = 0;
-       tmp_in = in = strchr(in, ' ') + 1 ;
-       do {
-               tmp_ret = dec_string(tmp_in, &tmp_in);
-               free(tmp_ret); 
-               len++;
-       }  while (tmp_ret != NULL);
-
-       out = (char**) malloc(len*sizeof(char*));
-
-       /* get them */
-       if (out) {
-               len = 0;
-               tmp_in = in;
-               do {
-                       out[len] = dec_string(tmp_in, &tmp_in);
-               } while  (out[len++] != NULL);
-       }
-       *rest = tmp_in;
-       return out;
-}
-
-static char *enc_branch_states(char *old, branch_state *item)
-{
-       char *ret;
-
-       if (item == NULL) {
-               asprintf(&ret,"%s-1 ", old);
-               free(old);
-               return ret;
-       } else {
-               asprintf(&ret,"%s1 ",old);
-               free(old);
-               if (ret == NULL) return ret;
-       }
-       do {
-               ret = enc_int(ret, (*item).branch);
-               ret = enc_string(ret, (*item).destination);
-               ret = enc_string(ret, (*item).ce_node);
-               ret = enc_string(ret, (*item).jdl);
-       } while ((*(item++)).branch != 0);
-       return ret;
-}
-
-static branch_state *dec_branch_states(char *in, char **rest)
-{
-       branch_state *out;
-       int len = -1, b = 0;
-       char *tmp_in, *tmp_ret;
-       int scret;
-
-       scret = sscanf(in, "%d", &len);
-       if (scret < 1) {
-               *rest = NULL;
-               return NULL;
-       }
-       if (len == -1) {
-               *rest = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
-               return NULL;
-       }
-
-       len = 0;
-       tmp_in = in = strchr(in, ' ') + 1 ;
-       do {
-               b = dec_int(tmp_in, &tmp_in);
-               tmp_ret = dec_string(tmp_in, &tmp_in); free(tmp_ret);
-               if (!tmp_in) { *rest = tmp_in; return NULL; }
-               tmp_ret = dec_string(tmp_in, &tmp_in); free(tmp_ret);
-               if (!tmp_in) { *rest = tmp_in; return NULL; }
-               tmp_ret = dec_string(tmp_in, &tmp_in); free(tmp_ret);
-               if (!tmp_in) { *rest = tmp_in; return NULL; }
-               len++;
-       }  while (b != 0);
-
-       out = (branch_state *) calloc(len+1, sizeof(branch_state));
-
-       if (out) {
-               len = 0;
-               tmp_in = in;
-
-               do {
-                       out[len].branch = dec_int(tmp_in, &tmp_in);
-                       out[len].destination = dec_string(tmp_in, &tmp_in);
-                       out[len].ce_node = dec_string(tmp_in, &tmp_in);
-                       out[len].jdl = dec_string(tmp_in, &tmp_in);
-               } while  (out[len++].branch != 0);
-               *rest = tmp_in;
-       }
-       else 
-               *rest = 0;
-
-       return out;
-
-}
-
-static char* enc_taglist(char *old, edg_wll_TagValue *item)
-{
-       char *ret;
-
-       if (item == NULL) {
-               asprintf(&ret,"%s-1 ", old);
-               free(old);
-               return ret;
-       } else {
-               asprintf(&ret,"%s1 ",old);
-               free(old);
-               if (ret == NULL) return ret;
-       }
-       do {
-               ret = enc_string(ret, (*item).tag);
-               ret = enc_string(ret, (*item).value);
-       } while ((*(item++)).tag != NULL);
-       return ret;
-}
-
-static edg_wll_TagValue *dec_taglist(char *in, char **rest)
-{
-       edg_wll_TagValue *out;
-       int len = -1;
-       char *tmp_in, *tmp_ret;
-       int scret, end = 0;
-
-       scret = sscanf(in, "%d", &len);
-       if (scret < 1) {
-               *rest = NULL;
-               return NULL;
-       }
-       if (len == -1) {
-               *rest = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
-               return NULL;
-       }
-
-       len = 0;
-       tmp_in = in = strchr(in, ' ') + 1 ;
-       do {
-               tmp_ret = dec_string(tmp_in, &tmp_in);
-               if (tmp_ret) free(tmp_ret); 
-               else end = 1;
-               if (!tmp_in) { *rest = tmp_in; return NULL; }
-               tmp_ret = dec_string(tmp_in, &tmp_in); 
-               free(tmp_ret);
-               if (!tmp_in) { *rest = tmp_in; return NULL; }
-               len++;
-       }  while (!end);
-
-       out = (edg_wll_TagValue *) malloc(len*sizeof(edg_wll_TagValue));
-
-       if (out) {
-               len = 0;
-               tmp_in = in;
-
-               do {
-                       out[len].tag = dec_string(tmp_in, &tmp_in);
-                       out[len].value = dec_string(tmp_in, &tmp_in);
-               } while  (out[len++].tag != NULL);
-               *rest = tmp_in;
-       }
-       else 
-               *rest = 0;
-
-       return out;
-}
-
-static char *enc_intlist(char *old, int *item)
-{
-       int len;
-       char *ret;
-
-       if (item == NULL) {
-               asprintf(&ret,"%s-1 ", old);
-               free(old);
-               return ret;
-       } else {
-               asprintf(&ret,"%s1 ",old);
-               free(old);
-               if (ret == NULL) return ret;
-       }
-       len = *item; item++;
-       ret = enc_int(ret, len);
-       for (; len > 0 ; len--, item++) {
-               ret = enc_int(ret, *item);
-       }
-
-       return ret;
-}
-
-static int *dec_intlist(char *in, char **rest)
-{
-       int len = -1;
-       int *out, *ptr;
-       char *tmp_in;
-       int scret;
-
-       scret = sscanf(in, "%d", &len);
-       if (scret < 1) {
-               *rest = NULL;
-               return NULL;
-       }
-       tmp_in = strchr(in, ' ') ? strchr(in, ' ') + 1 : NULL;
-       if (len == -1 || tmp_in == NULL) {
-               *rest = tmp_in;
-               return NULL;
-       }
-
-       len = dec_int(tmp_in, &tmp_in);
-       out = (int *)malloc( (len+1) *sizeof(int));
-       if (out) {
-               *out = len; 
-               ptr = out+1;
-               while (len) {
-                       *ptr = dec_int(tmp_in, &tmp_in);
-                       len--; ptr++;
-               }
-       }
-       *rest = tmp_in;
-       return out;
-}
-
-static char* enc_timeval(char *old, struct timeval item)
-{
-       char *ret;
-       
-       ret = enc_int(old, (int)item.tv_sec);
-       if (ret) {
-               ret = enc_int(ret, (int)item.tv_usec);
-       }
-       return ret;
-}
-
-static struct timeval dec_timeval(char *in, char **rest)
-{
-       struct timeval t;
-       char *tmp_in;
-       
-       t.tv_sec = dec_int(in, &tmp_in);
-       if (tmp_in != NULL) t.tv_usec = dec_int(tmp_in, &tmp_in);
-       *rest = tmp_in;
-       return t;
-}
-
-static char *enc_JobStat(char *old, edg_wll_JobStat* stat)
-{
-       char *ret;
-
-       ret = enc_int(old, stat->state);
-       if (ret) ret = enc_jobid(ret, stat->jobId);
-       if (ret) ret = enc_string(ret, stat->owner);
-       if (ret) ret = enc_int(ret, stat->jobtype);
-       if (ret) ret = enc_jobid(ret, stat->parent_job);
-       if (ret) ret = enc_string(ret, stat->seed);
-       if (ret) ret = enc_int(ret, stat->children_num);
-       if (ret) ret = enc_int_array(ret, stat->children_hist, EDG_WLL_NUMBER_OF_STATCODES);
-               /* children histogram stored in the DB, other children data not stored. */
-       if (ret) ret = enc_string(ret, stat->condorId);
-       if (ret) ret = enc_string(ret, stat->globusId);
-       if (ret) ret = enc_string(ret, stat->localId);
-       if (ret) ret = enc_string(ret, stat->jdl);
-       if (ret) ret = enc_string(ret, stat->matched_jdl);
-       if (ret) ret = enc_string(ret, stat->destination);
-       if (ret) ret = enc_string(ret, stat->condor_jdl);
-       if (ret) ret = enc_string(ret, stat->rsl);
-       if (ret) ret = enc_string(ret, stat->reason);
-       if (ret) ret = enc_string(ret, stat->location);
-       if (ret) ret = enc_string(ret, stat->ce_node);
-       if (ret) ret = enc_string(ret, stat->network_server);
-       if (ret) ret = enc_int(ret, stat->subjob_failed);
-       if (ret) ret = enc_int(ret, stat->done_code);
-       if (ret) ret = enc_int(ret, stat->exit_code);
-       if (ret) ret = enc_int(ret, stat->resubmitted);
-       if (ret) ret = enc_int(ret, stat->cancelling);
-       if (ret) ret = enc_string(ret, stat->cancelReason);
-       if (ret) ret = enc_int(ret, stat->cpuTime);
-       if (ret) ret = enc_taglist(ret, stat->user_tags);
-       if (ret) ret = enc_timeval(ret, stat->stateEnterTime);
-       if (ret) ret = enc_timeval(ret, stat->lastUpdateTime);
-       if (ret) ret = enc_intlist(ret, stat->stateEnterTimes);
-       if (ret) ret = enc_int(ret, stat->expectUpdate);
-       if (ret) ret = enc_string(ret, stat->expectFrom);
-       if (ret) ret = enc_string(ret, stat->acl);
-       if (ret) ret = enc_int(ret, stat->payload_running);
-       if (ret) ret = enc_strlist(ret, stat->possible_destinations);
-       if (ret) ret = enc_strlist(ret, stat->possible_ce_nodes);
-       if (ret) ret = enc_int(ret, stat->suspended);
-       if (ret) ret = enc_string(ret, stat->suspend_reason);
-       if (ret) ret = enc_string(ret, stat->failure_reasons);
-       if (ret) ret = enc_int(ret, stat->remove_from_proxy);
-       if (ret) ret = enc_string(ret, stat->ui_host);
-       if (ret) ret = enc_strlist(ret, stat->user_fqans);
-       if (ret) ret = enc_int(ret, stat->sandbox_retrieved);
-       if (ret) ret = enc_int(ret, stat->jw_status);
-       if (ret) ret = enc_string(ret, stat->pbs_state);
-       if (ret) ret = enc_string(ret, stat->pbs_queue);
-       if (ret) ret = enc_string(ret, stat->pbs_owner);
-       if (ret) ret = enc_string(ret, stat->pbs_name);
-       if (ret) ret = enc_string(ret, stat->pbs_reason);
-       if (ret) ret = enc_string(ret, stat->pbs_scheduler);
-       if (ret) ret = enc_string(ret, stat->pbs_dest_host);
-       if (ret) ret = enc_int(ret, stat->pbs_pid);
-       if (ret) ret = enc_string(ret, stat->pbs_resource_usage);
-       if (ret) ret = enc_int(ret, stat->pbs_exit_status);
-       if (ret) ret = enc_string(ret, stat->pbs_error_desc);
-       if (ret) ret = enc_string(ret, stat->condor_status);
-       if (ret) ret = enc_string(ret, stat->condor_universe);
-       if (ret) ret = enc_string(ret, stat->condor_owner);
-       if (ret) ret = enc_string(ret, stat->condor_preempting);
-       if (ret) ret = enc_int(ret, stat->condor_shadow_pid);
-       if (ret) ret = enc_int(ret, stat->condor_shadow_exit_status);
-       if (ret) ret = enc_int(ret, stat->condor_starter_pid);
-       if (ret) ret = enc_int(ret, stat->condor_starter_exit_status);
-       if (ret) ret = enc_int(ret, stat->condor_job_pid);
-       if (ret) ret = enc_int(ret, stat->condor_job_exit_status);
-       if (ret) ret = enc_string(ret, stat->condor_dest_host);
-       if (ret) ret = enc_string(ret, stat->condor_reason);
-       if (ret) ret = enc_string(ret, stat->condor_error_desc);
-
-       return ret;
-}
-static edg_wll_JobStat* dec_JobStat(char *in, char **rest)
-{
-       char *tmp_in;
-       edg_wll_JobStat *stat;
-
-       stat = (edg_wll_JobStat *) calloc(1,sizeof(edg_wll_JobStat));
-       if (!stat) return stat;
-       tmp_in = in;
-
-        stat->state = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->jobId = dec_jobid(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->owner = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->jobtype = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->parent_job = dec_jobid(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->seed = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->children_num = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) {
-                           stat->children_hist = (int*)calloc(EDG_WLL_NUMBER_OF_STATCODES+1, sizeof(int));
-                           dec_int_array(tmp_in, &tmp_in, stat->children_hist);
-       }
-                /* children histogram stored in the DB, other children data not stored. */
-        if (tmp_in != NULL) stat->condorId = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->globusId = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->localId = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->jdl = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->matched_jdl = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->destination = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->condor_jdl = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->rsl = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->reason = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->location = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->ce_node = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->network_server = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->subjob_failed = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->done_code = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->exit_code = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->resubmitted = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->cancelling = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->cancelReason = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->cpuTime = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->user_tags = dec_taglist(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->stateEnterTime = dec_timeval(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->lastUpdateTime = dec_timeval(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->stateEnterTimes = dec_intlist(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->expectUpdate = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->expectFrom = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->acl = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->payload_running = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->possible_destinations = dec_strlist(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->possible_ce_nodes = dec_strlist(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->suspended = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->suspend_reason = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->failure_reasons = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->remove_from_proxy = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->ui_host = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->user_fqans = dec_strlist(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->sandbox_retrieved = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->jw_status = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_state = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_queue = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_owner = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_name = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_reason = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_scheduler = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_dest_host = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_pid = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_resource_usage = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_exit_status = dec_int(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->pbs_error_desc = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->condor_status = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->condor_universe = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->condor_owner = dec_string(tmp_in, &tmp_in);
-        if (tmp_in != NULL) stat->condor_preempting = dec_string(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_shadow_pid = dec_int(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_shadow_exit_status = dec_int(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_starter_pid = dec_int(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_starter_exit_status = dec_int(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_job_pid = dec_int(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_job_exit_status = dec_int(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_dest_host = dec_string(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_reason = dec_string(tmp_in, &tmp_in);
-       if (tmp_in != NULL) stat->condor_error_desc = dec_string(tmp_in, &tmp_in);
-
-       *rest = tmp_in;
-
-       return stat;
-}
-
-char *enc_intJobStat(char *old, intJobStat* stat)
-{
-       char *ret;
-
-       ret = enc_JobStat(old, &stat->pub);
-       if (ret) ret = enc_int(ret, stat->resubmit_type);
-       if (ret) ret = enc_string(ret, stat->last_seqcode);
-       if (ret) ret = enc_string(ret, stat->last_cancel_seqcode);
-       if (ret) ret = enc_string(ret, stat->branch_tag_seqcode);
-       if (ret) ret = enc_string(ret, stat->last_branch_seqcode);
-       if (ret) ret = enc_string(ret, stat->deep_resubmit_seqcode);
-       if (ret) ret = enc_branch_states(ret, stat->branch_states);
-       if (ret) ret = enc_timeval(ret, stat->last_pbs_event_timestamp);
-       if (ret) ret = enc_int(ret, stat->pbs_reruning);
-       if (ret) ret = enc_strlist(ret, stat->tag_seq_codes);
-       return ret;
-}
-
-intJobStat* dec_intJobStat(char *in, char **rest)
-{
-       edg_wll_JobStat *pubstat;
-       intJobStat *stat = 0;
-       char *tmp_in;
-
-       pubstat = dec_JobStat(in, &tmp_in);
-
-       if (tmp_in != NULL) {
-               stat = (intJobStat *)calloc(1,sizeof(intJobStat));
-       } 
-       if (stat != NULL) {
-               stat->pub = *pubstat;
-               free(pubstat);
-               stat->resubmit_type = dec_int(tmp_in, &tmp_in);
-               if (tmp_in != NULL) {
-                       stat->last_seqcode = dec_string(tmp_in, &tmp_in);
-               }
-               if (tmp_in != NULL) {
-                       stat->last_cancel_seqcode = dec_string(tmp_in, &tmp_in);
-               }
-               if (tmp_in != NULL) {
-                       stat->branch_tag_seqcode = dec_string(tmp_in, &tmp_in);
-               }
-               if (tmp_in != NULL) {
-                       stat->last_branch_seqcode = dec_string(tmp_in, &tmp_in);
-               }
-               if (tmp_in != NULL) {
-                       stat->deep_resubmit_seqcode = dec_string(tmp_in, &tmp_in);
-               }
-               if (tmp_in != NULL) {
-                       stat->branch_states = dec_branch_states(tmp_in, &tmp_in);
-               }
-               if (tmp_in != NULL) {
-                       stat->last_pbs_event_timestamp = dec_timeval(tmp_in, &tmp_in);
-               }
-               if (tmp_in != NULL) {
-                       stat->pbs_reruning = dec_int(tmp_in, &tmp_in);
-               }
-               if (tmp_in != NULL) {
-                       stat->tag_seq_codes = dec_strlist(tmp_in, &tmp_in);
-               }
-       } else if (tmp_in != NULL) {
-               edg_wll_FreeStatus(pubstat);
-               free(pubstat);
-       }
-
-       *rest = tmp_in;
-       return stat;
-}
-
-
-static int compare_pevents_by_seq(const void *a, const void *b)
-{
-        const edg_wll_Event **e = (const edg_wll_Event **) a;
-        const edg_wll_Event **f = (const edg_wll_Event **) b;
-       return compare_events_by_seq(*e,*f);
-}
-
-void edg_wll_SortEvents(edg_wll_Event *e)
-{
-       int     n;
-
-       if (!e) return;
-       for (n=0; e[n].type; n++);
-       qsort(e,n,sizeof(*e),compare_events_by_seq);
-}
-
-void edg_wll_SortPEvents(edg_wll_Event **e)
-{
-       edg_wll_Event **p;
-       int     n;
-
-       if (!e) return;
-       p = e;
-       for (n=0; *p; n++) {
-               p++;
-       }
-       qsort(e,n,sizeof(*e),compare_pevents_by_seq);
-}
-
-
diff --git a/org.glite.lb.server/src/lb_authz.c b/org.glite.lb.server/src/lb_authz.c
deleted file mode 100644 (file)
index c4ac82c..0000000
+++ /dev/null
@@ -1,941 +0,0 @@
-#ident "$Header$"
-
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <syslog.h>
-
-#include "glite/lb/context-int.h"
-#include "lb_authz.h"
-
-#ifndef NO_VOMS
-
-#include <libxml/parser.h> 
-#undef WITHOUT_TRIO
-
-#include "glite/jobid/strmd5.h"
-#include "glite/jobid/cjobid.h"
-#include "glite/lbu/trio.h"
-#include "db_supp.h"
-#include <glite/security/lcas/lcas_pem.h>
-
-#include "glite/security/voms/voms_apic.h"
-
-/* XXX should be defined in gridsite-gacl.h */
-GRSTgaclEntry *GACLparseEntry(xmlNodePtr cur);
-
-extern char *server_key;
-extern char *server_cert;
-
-static int 
-get_fqans(edg_wll_Context ctx, struct vomsdata *voms_info,
-         char ***fqans)
-{
-   struct voms **voms_cert = NULL;
-   char **f, **attrs, **tmp;
-   int num;
-
-   attrs = NULL;
-   num = 0;
-
-   for (voms_cert = voms_info->data; voms_cert && *voms_cert; voms_cert++) {
-      for (f = (*voms_cert)->fqan; f && *f; f++) {
-         tmp = realloc(attrs, (num + 1) * sizeof(*attrs));
-         if (tmp == NULL) {
-            free(attrs);
-            return ENOMEM;
-         }
-         attrs = tmp;
-         attrs[num++] = strdup(*f);
-      }
-   }
-   if (attrs) {
-      tmp = realloc(attrs, (num + 1) * sizeof(*attrs));
-      if (tmp == NULL) {
-         free(attrs);
-         return ENOMEM;
-      }
-      attrs = tmp;
-      attrs[num++] = NULL;
-   }
-   
-   *fqans = attrs;
-   return 0;
-}
-
-static int
-add_groups(edg_wll_Context ctx, struct voms *voms_cert, char *vo_name,
-          edg_wll_VomsGroups *groups)
-{
-   struct data **voms_data;
-   edg_wll_VomsGroup *tmp = NULL;
-
-   if (voms_cert->type != TYPE_STD) {
-      edg_wll_SetError(ctx, EINVAL, "not supported VOMS certificate type");
-      return EINVAL;
-   }
-
-   for (voms_data = voms_cert->std; voms_data && *voms_data; voms_data++) {
-      if ((*voms_data)->group && *(*voms_data)->group) {
-        tmp = realloc(groups->val, (groups->len + 1) * sizeof(*groups->val));
-        if (tmp == NULL)
-           return edg_wll_SetError(ctx, ENOMEM, "not enough memory");
-        groups->val = tmp;
-        groups->val[groups->len].vo = strdup(vo_name);
-        groups->val[groups->len].name = strdup((*voms_data)->group);
-        groups->len++;
-      }
-   }
-   return 0;
-}
-
-static int 
-get_groups(edg_wll_Context ctx, struct vomsdata *voms_info,
-          edg_wll_VomsGroups *res_groups)
-{
-   struct voms **voms_cert = NULL;
-   edg_wll_VomsGroups groups;
-   int ret;
-
-   memset(&groups, 0, sizeof(groups));
-
-   for (voms_cert = voms_info->data; voms_cert && *voms_cert; voms_cert++) {
-      if ((*voms_cert)->voname) {
-        ret = add_groups(ctx, *voms_cert, (*voms_cert)->voname, &groups);
-        if (ret) {
-           edg_wll_FreeVomsGroups(&groups);
-           return ret;
-        }
-      }
-   }
-
-   res_groups->len = groups.len;
-   res_groups->val = groups.val;
-   return 0;
-}
-
-int
-edg_wll_SetVomsGroups(edg_wll_Context ctx, edg_wll_GssConnection *gss, char *server_cert, char *server_key, char *voms_dir, char *ca_dir)
-{
-   int ret;
-   int err = 0;
-   struct vomsdata *voms_info = NULL;
-   edg_wll_GssPrincipal principal;
-   edg_wll_GssStatus gss_code;
-
-
-   /* XXX DK: correct cleanup ?? */
-   memset (&ctx->vomsGroups, 0, sizeof(ctx->vomsGroups));
-   edg_wll_ResetError(ctx);
-
-   if (ctx->fqans) {
-      char **f;
-      for (f = ctx->fqans; f && *f; f++)
-         free(*f);
-      free(ctx->fqans);
-      ctx->fqans = NULL;
-   }
-
-   ret = edg_wll_gss_get_client_conn(gss, &principal, &gss_code);
-   if (ret) {
-       if (ret == EDG_WLL_GSS_ERROR_GSS) {
-               edg_wll_SetErrorGss(ctx,"edg_wll_SetVomsGroups()",&gss_code);
-       }
-       edg_wll_SetError(ctx, ret, "edg_wll_SetVomsGroups() - failed to get peer credentials");
-       goto end;       
-   }
-
-   /* uses X509_CERT_DIR and X509_VOMS_DIR vars */
-   voms_info = VOMS_Init(voms_dir, ca_dir);
-   if (voms_info == NULL) {
-      edg_wll_SetError(ctx, errno, "failed to initialize VOMS structures");
-      ret = -1; /* XXX VOMS Error */
-      goto end;
-   }
-
-   ret = VOMS_RetrieveFromCtx(gss->context, RECURSE_CHAIN, voms_info, &err);
-   if (ret == 0) {
-      if (err == VERR_NOEXT)
-        /* XXX DK:
-        edg_wll_SetError(ctx, EINVAL, "no client VOMS certificates found");
-        */
-        ret = 0;
-      else {
-        edg_wll_SetError(ctx, -1, "failed to retrieve VOMS info");
-        ret = -1; /* XXX VOMS Error */
-      }
-      goto end;
-   }
-
-   ret = get_groups(ctx, voms_info, &ctx->vomsGroups);
-   if (ret)
-      goto end;
-
-   ret = get_fqans(ctx, voms_info, &ctx->fqans);
-
-end:
-   edg_wll_gss_free_princ(principal);
-
-   if (voms_info)
-      VOMS_Destroy(voms_info);
-
-   return ret;
-}
-
-void
-edg_wll_FreeVomsGroups(edg_wll_VomsGroups *groups)
-{
-   size_t len;
-
-   if (groups == NULL)
-      return;
-
-   for (len = 0; len < groups->len; len++) {
-      if (groups->val[len].vo)
-        free(groups->val[len].vo);
-      if (groups->val[len].name)
-        free(groups->val[len].name);
-   }
-}
-
-#else /* NO_VOMS */
-
-int
-edg_wll_SetVomsGroups(edg_wll_Context ctx, edg_wll_GssConnection *gss, char *server_cert,
-       char *server_key, char *voms_dir, char *ca_dir)
-{
-       return 0;
-}
-
-void edg_wll_FreeVomsGroups(edg_wll_VomsGroups *groups) {}
-
-#endif
-
-
-#if !defined(NO_VOMS) && !defined(NO_GACL)
-
-static int
-parse_creds(edg_wll_Context ctx, edg_wll_VomsGroups *groups, char **fqans,
-            char *subject, GRSTgaclUser **gacl_user)
-{
-   GRSTgaclCred *cred = NULL;
-   GRSTgaclUser *user = NULL;
-   int i;
-   char **f;
-
-   edg_wll_ResetError(ctx);
-
-   GRSTgaclInit();
-
-   cred = GRSTgaclCredNew("person");
-   if (cred == NULL)
-      return edg_wll_SetError(ctx, ENOMEM, "Failed to create GACL person");
-   
-   if (!GRSTgaclCredAddValue(cred, "dn", subject)) {
-      edg_wll_SetError(ctx, EINVAL, "Failed to create GACL DN credential");
-      goto fail;
-   }
-
-   user = GRSTgaclUserNew(cred);
-   if (user == NULL) {
-      edg_wll_SetError(ctx, ENOMEM, "Failed to create GACL user");
-      goto fail;
-   }
-   cred = NULL; /* GACLnewUser() doesn't copy content, just store the pointer */
-
-   for (i = 0; i < groups->len; i++) {
-      cred = GRSTgaclCredNew("voms-cred");
-      if (cred == NULL) {
-        edg_wll_SetError(ctx, ENOMEM, "Failed to create GACL voms-cred credential");
-        goto fail;
-      }
-      if (!GRSTgaclCredAddValue(cred, "vo", groups->val[i].vo) ||
-         !GRSTgaclCredAddValue(cred, "group", groups->val[i].name)) {
-         edg_wll_SetError(ctx, EINVAL, "Failed to populate GACL voms-cred credential");
-        goto fail;
-      }
-      if (!GRSTgaclUserAddCred(user, cred)) {
-         edg_wll_SetError(ctx, EINVAL, "Failed to add GACL voms-cred credential");
-        goto fail;
-      }
-      cred = NULL;
-      /* GACLuserAddCred() doesn't copy content, just store the pointer. Cred
-       * mustn't be free()ed */
-   }
-
-   for (f = fqans; f && *f; f++) {
-      cred = GRSTgaclCredNew("voms");
-      if (cred == NULL) {
-         edg_wll_SetError(ctx, ENOMEM, "Failed to create GACL voms credential");
-         goto fail;
-      }
-      if (!GRSTgaclCredAddValue(cred, "fqan", *f)) {
-         edg_wll_SetError(ctx, EINVAL, "Failed to populate GACL voms credential");
-         goto fail;
-      }
-      if (!GRSTgaclUserAddCred(user, cred)) {
-         edg_wll_SetError(ctx, EINVAL, "Failed to add GACL voms credential");
-         goto fail;
-      }
-      cred = NULL;
-   }
-
-   *gacl_user = user;
-
-   return 0;
-
-fail:
-   if (cred)
-      GRSTgaclCredFree(cred);
-   if (user)
-      GRSTgaclUserFree(user);
-
-   return edg_wll_Error(ctx,NULL,NULL);
-}
-
-static int
-cmp_gacl_names(GRSTgaclNamevalue *n1, GRSTgaclNamevalue *n2)
-{
-   if (n1 == NULL && n2 == NULL)
-      return 1;
-
-   for ( ; n1; n1 = (GRSTgaclNamevalue *)n1->next, n2 = (GRSTgaclNamevalue *) n2->next) {
-      if (n2 == NULL)
-        return 0;
-      if (strcmp(n1->name, n2->name) != 0 ||
-         strcmp(n1->value, n2->value) != 0)
-        return 0;
-   }
-
-   return (n2 == NULL);
-}
-
-static int
-cmp_gacl_creds(GRSTgaclCred *c1, GRSTgaclCred *c2)
-{
-   /* XXX the GRSTgaclCred contains a bit more information to handle */
-   return (strcmp(c1->auri, c2->auri) == 0);
-}
-
-static int
-addEntry(edg_wll_Context ctx, GRSTgaclAcl *acl, GRSTgaclEntry *entry)
-{
-       GRSTgaclEntry   *cur = NULL;
-   
-
-       if ( acl == NULL )
-               return EINVAL;
-
-       if ( acl->firstentry == NULL )
-               return (GRSTgaclAclAddEntry(acl, entry) == 0) ? -1 /* GACL_ERR */ : 0;
-
-       for ( cur = acl->firstentry; cur; cur = cur->next )
-               if (   cmp_gacl_creds(cur->firstcred, entry->firstcred)
-                       && cur->allowed == entry->allowed
-                       && cur->denied == entry->denied ) 
-                       return edg_wll_SetError(ctx,EEXIST,"ACL entry already exists");;
-
-       return (GRSTgaclAclAddEntry(acl, entry) == 0) ? -1 /* GACL_ERR */ : 0;
-}
-
-static int
-delEntry(edg_wll_Context ctx, GRSTgaclAcl *acl, GRSTgaclEntry *entry)
-{
-   GRSTgaclEntry *cur = NULL, *prev = NULL;
-   int found = 0;
-   
-   if (acl == NULL || acl->firstentry == NULL)
-      return EINVAL;
-
-   cur = acl->firstentry;
-   while (cur) {
-      if (cmp_gacl_creds(cur->firstcred, entry->firstcred) &&
-         cur->allowed == entry->allowed &&
-         cur->denied == entry->denied) {
-        if (prev)
-           prev->next = cur->next;
-        else
-           acl->firstentry = cur->next;
-        /* XXX GRSTgaclEntryFree(cur); */
-        found = 1;
-        break;
-      }
-      prev = cur;
-      cur = cur->next; 
-   }
-
-   return (found) ? 0 : edg_wll_SetError(ctx,EINVAL,"ACL entry doesn't exist");
-}
-
-static int
-create_cred(edg_wll_Context ctx, char *userid, int user_type, GRSTgaclCred **cred)
-{
-   GRSTgaclCred *c = NULL;
-   char *group = NULL;
-
-   if (user_type == EDG_WLL_CHANGEACL_DN) {
-      c = GRSTgaclCredNew("person");
-      if (c == NULL)
-        return ENOMEM;
-      if (!GRSTgaclCredAddValue(c, "dn", userid)) {
-        GRSTgaclCredFree(c);
-        return -1; /* GACL_ERR */
-      }
-   } else if(user_type == EDG_WLL_CHANGEACL_GROUP) {
-      c = GRSTgaclCredNew("voms-cred");
-      if (c == NULL)
-        return ENOMEM;
-      group = strchr(userid, ':');
-      if ( !group )
-        return EINVAL;
-      *group++ = '\0';
-      if (!GRSTgaclCredAddValue(c, "vo", userid) ||
-         !GRSTgaclCredAddValue(c, "group", group)) {
-         GRSTgaclCredFree(c);
-        return -1; /* GACL_ERR */
-      }
-   } else if (user_type == EDG_WLL_CHANGEACL_FQAN) {
-      c = GRSTgaclCredNew("voms");
-      if (c == NULL)
-         return ENOMEM;
-      if (!GRSTgaclCredAddValue(c, "fqan", userid)) {
-         GRSTgaclCredFree(c);
-         return -1; /* GACL_ERR */
-      }
-   } else
-      return edg_wll_SetError(ctx,EINVAL,"Unknown user type for ACL");
-
-   *cred = c;
-
-   return 0;
-}
-
-static int
-change_acl(edg_wll_Context ctx, GRSTgaclAcl *acl, GRSTgaclEntry *entry, int operation)
-      /* creds, permission, permission_type */
-{
-   if (operation == EDG_WLL_CHANGEACL_ADD)
-      return addEntry(ctx, acl, entry);
-   
-   if (operation == EDG_WLL_CHANGEACL_REMOVE)
-      return delEntry(ctx, acl, entry);
-
-   return edg_wll_SetError(ctx,EINVAL,"Unknown ACL operation requested");
-}
-
-static int
-edg_wll_change_acl(edg_wll_Context ctx, edg_wll_Acl acl, char *user_id,
-                  int user_id_type, int permission, int perm_type,
-                  int operation)
-{
-   GRSTgaclCred *cred = NULL;
-   GRSTgaclEntry *entry = NULL;
-   int ret,p;
-
-   GRSTgaclInit();
-
-   if (acl == NULL || acl->value == NULL)
-      return edg_wll_SetError(ctx,EINVAL,"Change ACL");
-
-   ret = create_cred(ctx, user_id, user_id_type, &cred);
-   if (ret)
-      return ret;
-
-   entry = GRSTgaclEntryNew();
-   if (entry == NULL) {
-      ret = edg_wll_SetError(ctx,ENOMEM,"Change ACL");
-      goto end;
-   }
-
-   if (!GRSTgaclEntryAddCred(entry, cred)) {
-      ret = edg_wll_SetError(ctx,EINVAL,"Can't create ACL");
-      goto end;
-   }
-
-   switch (permission) {
-      case EDG_WLL_CHANGEACL_READ:
-          p = EDG_WLL_CHANGEACL_READ;
-         break;
-      default:
-          ret = edg_wll_SetError(ctx,EINVAL,"Unknown permission for ACL");
-         goto end;
-   }
-
-   if (perm_type == EDG_WLL_CHANGEACL_ALLOW)
-      GRSTgaclEntryAllowPerm(entry, p);
-   else if (perm_type == EDG_WLL_CHANGEACL_DENY)
-      GRSTgaclEntryDenyPerm(entry, p);
-   else {
-      ret = edg_wll_SetError(ctx,EINVAL,"Unknown permission type");
-      goto end;
-   }
-
-   ret = change_acl(ctx, acl->value, entry, operation);
-   if (ret)
-   {
-/*    XXX: mem leak?
-      GRSTgaclEntryFree(entry);
-*/
-      goto end;
-   }
-
-   if (acl->string) free(acl->string);
-   ret = edg_wll_EncodeACL(acl->value, &acl->string);
-
-end:
-
-   return ret;
-}
-
-int
-edg_wll_CheckACL(edg_wll_Context ctx, edg_wll_Acl acl, int requested_perm)
-{
-   int ret;
-   GRSTgaclUser *user = NULL;
-   unsigned int perm;
-
-   if (acl == NULL || acl->value == NULL)
-      return edg_wll_SetError(ctx,EINVAL,"CheckACL");
-
-   if (!ctx->peerName) return edg_wll_SetError(ctx,EPERM,"CheckACL");
-
-   ret = parse_creds(ctx, &ctx->vomsGroups, ctx->fqans, ctx->peerName, &user);
-   if (ret)
-      return edg_wll_Error(ctx,NULL,NULL);
-
-   perm = GRSTgaclAclTestUser(acl->value, user);
-
-   GRSTgaclUserFree(user);
-   
-   if (perm & requested_perm) return edg_wll_ResetError(ctx);
-   else return edg_wll_SetError(ctx,EPERM,"CheckACL");
-}
-
-int
-edg_wll_EncodeACL(GRSTgaclAcl *acl, char **str)
-{
-   int tmp_fd, ret;
-   FILE *fd = NULL;
-   char filename[16];
-   char line[4096];
-   char *buf = NULL;
-   size_t buf_len = 0;
-   char *p;
-
-   snprintf(filename, sizeof(filename), "/tmp/XXXXXX");
-   tmp_fd = mkstemp(filename);
-   if (tmp_fd == -1)
-      return errno;
-
-   fd = fdopen(tmp_fd, "r");
-
-   ret = GRSTgaclAclSave(acl, filename);
-   unlink(filename);
-   if (ret == 0) {
-      ret = -1; /* GACL_ERR */
-      goto end;
-   }
-
-   buf_len = 1024;
-   buf = calloc(buf_len, 1);
-   if (buf == NULL) {
-      ret = ENOMEM;
-      goto end;
-   }
-
-   while (fgets(line, sizeof(line), fd) != NULL) {
-      p = strchr(line, '\n');
-      if (p)
-        *p = '\0';
-
-      if (strlen(buf) + strlen(line) > buf_len) {
-        char *tmp;
-
-        tmp =  realloc(buf, buf_len + 1024);
-        if (tmp == NULL) {
-           ret = ENOMEM;
-           goto end;
-        }
-        buf = tmp;
-        buf_len += 1024;
-      }
-
-      strcat(buf, line);
-   }
-
-   *str = buf;
-   ret = 0;
-
-end:
-   fclose(fd);
-   return ret;
-}
-
-int
-edg_wll_DecodeACL(char *buf, GRSTgaclAcl **result_acl)
-{
-   /* Got from GACLloadAcl() available from GACL API */
-   xmlDocPtr   doc;
-   xmlNodePtr  cur;
-   GRSTgaclAcl    *acl;
-   GRSTgaclEntry  *entry;
-        
-   doc = xmlParseMemory(buf, strlen(buf));
-   if (doc == NULL) return EINVAL;
-    
-   cur = xmlDocGetRootElement(doc);
-  
-   if (xmlStrcmp(cur->name, (const xmlChar *) "gacl"))
-    {
-       free(doc);
-       free(cur);
-       return EINVAL;
-    }
-
-   cur = cur->xmlChildrenNode;
-
-   acl = GRSTgaclAclNew();
-  
-   while (cur != NULL)
-       {
-        /*
-        if (cur->type == XML_TEXT_NODE && cur->content == '\n') {
-           cur=cur->next;
-           continue;
-        }
-        */
-         entry = GACLparseEntry(cur);
-         if (entry == NULL)
-           {
-             /* XXX GRSTgaclAclFree(acl); */
-             xmlFreeDoc(doc);
-             return EINVAL;
-           }
-
-         GRSTgaclAclAddEntry(acl, entry);
-         
-         cur=cur->next;
-       }
-
-   xmlFreeDoc(doc);
-   *result_acl = acl;
-   return 0;
-}
-
-int
-edg_wll_InitAcl(edg_wll_Acl *acl)
-{
-   edg_wll_Acl tmp;
-
-   tmp = malloc(sizeof(*tmp));
-   if ( !tmp )
-      return ENOMEM;
-
-   tmp->value = GRSTgaclAclNew();
-   tmp->string = NULL;
-   *acl = tmp;
-   return 0;
-}
-
-void
-edg_wll_FreeAcl(edg_wll_Acl acl)
-{
-   if ( acl->value ) GRSTgaclAclFree(acl->value);
-   if ( acl->string ) free(acl->string);
-   free(acl);
-}
-
-int
-edg_wll_HandleCounterACL(edg_wll_Context ctx, edg_wll_Acl acl,
-                        char *aclid, int incr)
-{
-       char       *q1 = NULL,
-                          *q2 = NULL;
-
-       edg_wll_ResetError(ctx);
-
-       if ( incr > 0 )
-       {
-               trio_asprintf(&q1,
-                               "insert into acls(aclid,value,refcnt) "
-                               "values ('%|Ss','%|Ss',%d)",
-                               aclid, acl->string, incr);
-
-               for ( ; ; )
-               {
-                       if ( edg_wll_ExecSQL(ctx, q1, NULL) > 0 )
-                               goto end;
-
-                       if ( edg_wll_Error(ctx,NULL,NULL) != EEXIST )
-                               goto end;
-
-                       /*
-                        *      row allready in DB
-                        */
-                       if ( !q2 ) trio_asprintf(&q2,
-                                               "update acls set refcnt = refcnt+%d "
-                                               "where aclid = '%|Ss'",
-                                               incr, aclid);
-                       if ( edg_wll_ExecSQL(ctx, q2, NULL) < 0 )
-                               continue;
-
-                       goto end; 
-               }
-       }
-       else if (incr < 0)
-       {
-               trio_asprintf(&q1,
-                               "update acls set refcnt = refcnt-%d "
-                               "where aclid='%|Ss' and refcnt>=%d",
-                               -incr, aclid, -incr);
-
-               if ( edg_wll_ExecSQL(ctx, q1, NULL) > 0 )
-               {
-                       trio_asprintf(&q2,
-                                               "delete from acls "
-                                               "where aclid='%|Ss' and refcnt=0",
-                                               aclid);
-                       edg_wll_ExecSQL(ctx, q2, NULL);
-               }
-               else
-               {
-                       fprintf(stderr, "ACL with ID: %s has invalid reference count\n", aclid);
-                       syslog(LOG_WARNING, "ACL with ID: %s has invalid reference count\n", aclid);
-               }
-       }
-
-
-end:
-       if ( q1 ) free(q1);
-       if ( q2 ) free(q2);
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-int
-edg_wll_UpdateACL(edg_wll_Context ctx, glite_jobid_const_t job, 
-                 char *user_id, int user_id_type,
-                 int permission, int perm_type, int operation)
-{
-   char *md5_jobid;
-   edg_wll_Acl acl = NULL;
-   int ret;
-   char *stmt = NULL;
-   char *new_aclid = NULL, *old_aclid = NULL;
-   int updated;
-
-   edg_wll_ResetError(ctx);
-
-   md5_jobid = edg_wlc_JobIdGetUnique(job);
-
-   do {
-      if (acl)
-      {
-        edg_wll_FreeAcl(acl);
-        acl = NULL;
-      }
-      if (old_aclid)
-      {
-        free(old_aclid);
-        old_aclid = NULL;
-      }
-      if (new_aclid)
-      {
-        free(new_aclid);
-         new_aclid = NULL;
-      }
-        
-      if ( (ret = edg_wll_GetACL(ctx, job, &acl)) )
-        goto end;
-      if ( !acl && (ret = edg_wll_InitAcl(&acl)) )
-        goto end;
-        
-      old_aclid = acl->string? strdup(strmd5(acl->string, NULL)): NULL;
-
-      ret = edg_wll_change_acl(ctx, acl, user_id, user_id_type, 
-                              permission, perm_type, operation);
-      if (ret)
-      {
-        if ( ret == EEXIST )
-            ret = edg_wll_ResetError(ctx);
-        goto end;
-      }
-
-      new_aclid = strdup(strmd5(acl->string, NULL));
-
-      /* store new ACL or increment its counter if already present in db */
-      ret = edg_wll_HandleCounterACL(ctx, acl, new_aclid, 1);
-      if  (ret)
-        goto end;
-
-      if ( old_aclid )
-        trio_asprintf(&stmt,
-           "update jobs set aclid='%|Ss' where jobid='%|Ss' and aclid='%|Ss'",
-           new_aclid, md5_jobid, old_aclid);
-      else
-        trio_asprintf(&stmt,
-           "update jobs set aclid='%|Ss' where jobid='%|Ss' and ISNULL(aclid)",
-           new_aclid, md5_jobid);
-      updated = edg_wll_ExecSQL(ctx, stmt, NULL);
-      free(stmt); stmt = NULL;
-
-      if (updated > 0)
-        /* decrement reference counter of the old ACL, and possibly remove
-         * whole ACL if the counter becames zero */
-        ret = edg_wll_HandleCounterACL(ctx, NULL, old_aclid, -1);
-      else
-         /* We failed to store new ACL to db, most likely because the ACL has
-         * been changed. Decrement counter of new ACL set before trying
-         * updating */
-        ret = edg_wll_HandleCounterACL(ctx, NULL, new_aclid, -1);
-   } while (updated <= 0);
-
-end:
-   free(md5_jobid);
-   if (acl)
-      edg_wll_FreeAcl(acl);
-   if (new_aclid)
-      free(new_aclid);
-   if (old_aclid)
-      free(old_aclid);
-
-   return ret;
-}
-
-int edg_wll_GetACL(edg_wll_Context ctx, glite_jobid_const_t jobid, edg_wll_Acl *acl)
-{
-       char    *q = NULL;
-       char    *acl_id = NULL;
-       char    *acl_str = NULL;
-       glite_lbu_Statement    stmt = NULL;
-       int     ret;
-       GRSTgaclAcl     *gacl = NULL;
-       char    *jobstr = edg_wlc_JobIdGetUnique(jobid);
-
-       if (jobid == NULL || jobstr == NULL)
-          return edg_wll_SetError(ctx,EINVAL,"edg_wll_GetACL()");
-
-       edg_wll_ResetError(ctx);
-
-       trio_asprintf(&q,
-               "select aclid from jobs where jobid = '%|Ss'", jobstr);
-
-       if (edg_wll_ExecSQL(ctx, q, &stmt) < 0 ||
-               edg_wll_FetchRow(ctx, stmt, 1, NULL, &acl_id) < 0) {
-               goto end;
-       }
-       glite_lbu_FreeStmt(&stmt); stmt = NULL;
-       free(q); q = NULL;
-
-       if (acl_id == NULL || *acl_id == '\0') {
-               free(acl_id);
-               free(jobstr);
-               *acl = NULL;
-               return 0;
-       }
-
-       trio_asprintf(&q,
-               "select value from acls where aclid = '%|Ss'", acl_id);
-       if (edg_wll_ExecSQL(ctx, q, &stmt) < 0 ||
-               edg_wll_FetchRow(ctx, stmt, 1, NULL, &acl_str) < 0) {
-               goto end;
-       }
-
-       ret = edg_wll_DecodeACL(acl_str, &gacl);
-       if (ret) {
-               edg_wll_SetError(ctx, EINVAL, "encoding ACL");
-               goto end;
-       }
-
-       *acl = calloc(1, sizeof(**acl));
-       if (*acl == NULL) {
-               ret = ENOMEM;
-               edg_wll_SetError(ctx, ENOMEM, "not enough memory");
-               goto end;
-       }
-
-       (*acl)->value = gacl;
-       (*acl)->string = acl_str;
-       gacl = NULL; acl_str = NULL;
-       ret = 0;
-
-end:
-       if (q) free(q);
-       if (stmt) glite_lbu_FreeStmt(&stmt);
-       if (acl_id) free(acl_id);
-       if (acl_str) free(acl_str);
-       if (gacl) GRSTgaclAclFree(gacl);
-       if (jobstr) free(jobstr);
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-int
-check_store_authz(edg_wll_Context ctx, edg_wll_Event *ev)
-{
-   char *pem_string = NULL;
-   char *request = NULL;
-   int ret;
-
-   /* XXX make a real RSL ? */
-   request = edg_wll_EventToString(ev->any.type);
-   if (request == NULL)
-      return edg_wll_SetError(ctx, EINVAL, "Unknown event type");
-
-   ret = edg_wll_gss_get_client_pem(&ctx->connections->serverConnection->gss,
-                                   server_cert, server_key,
-                                    &pem_string);
-   if (ret)
-      return edg_wll_SetError(ctx, ret, "Failed to extract client's PEM string");
-
-   ret = lcas_pem(pem_string, request);
-   if (ret)
-      ret = edg_wll_SetError(ctx, EPERM, "Not allowed to log events here");
-
-   free(pem_string);
-
-   return ret;
-}
-
-#else /* VOMS & GACL */
-
-
-int edg_wll_CheckACL(edg_wll_Context ctx, edg_wll_Acl acl, int requested_perm) { return EPERM; }
-
-#ifndef NO_GACL
-int edg_wll_EncodeACL(GRSTgaclAcl *acl, char **str) { return 0; }
-int edg_wll_DecodeACL(char *buf, GRSTgaclAcl **result_acl) { return 0; }
-#else
-int edg_wll_EncodeACL(void *acl, char **str) { return 0; }
-int edg_wll_DecodeACL(char *buf, void **result_acl) { return 0; }
-#endif
-
-int edg_wll_InitAcl(edg_wll_Acl *acl) { return 0; }
-void edg_wll_FreeAcl(edg_wll_Acl acl) { }
-int edg_wll_HandleCounterACL(edg_wll_Context ctx, edg_wll_Acl acl,
-                         char *aclid, int incr) { return 0; }
-int edg_wll_UpdateACL(edg_wll_Context ctx, glite_jobid_const_t job,
-                  char *user_id, int user_id_type,
-                  int permission, int perm_type, int operation) { return 0; }
-int edg_wll_GetACL(edg_wll_Context ctx, glite_jobid_const_t jobid, edg_wll_Acl *acl) { return 0; }
-
-
-#endif
-
-
-int edg_wll_amIroot(const char *subj, char **fqans,char **super_users)
-{
-       int     i;
-       char    **f;
-
-       if (!subj && !fqans ) return 0;
-       for (i=0; super_users && super_users[i]; i++)
-               if (strncmp(super_users[i], "FQAN:", 5) == 0) {
-                       for (f = fqans; f && *f; f++)
-                               if (strcmp(*f, super_users[i]+5) == 0) return 1;
-               } else
-                       if (edg_wll_gss_equal_subj(subj,super_users[i])) return 1;
-
-       return 0;
-}
-
diff --git a/org.glite.lb.server/src/lb_html.c b/org.glite.lb.server/src/lb_html.c
deleted file mode 100644 (file)
index 30f3cad..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-#ident "$Header$"
-
-#include "lb_html.h"
-#include "lb_proto.h"
-#include "cond_dump.h"
-#include "pretty_print_wrapper.h"
-
-#include "glite/lb/context-int.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <assert.h>
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-static char *xmlToHTML(char *xml) {
-       char *html = strdup("");
-       int i = 0;
-       int j = 0;
-       while (xml[i]){
-               if (xml[i] == '<'){
-                       html = realloc(html, (j+strlen("&lt;")+1)*sizeof(*html) );
-                       strcpy(html+j, "&lt;");
-                       j += strlen("&lt;");
-               }
-               else if (xml[i] == '>'){
-                       html = realloc(html, (j+strlen("&gt;")+1)*sizeof(*html) );
-                       strcpy(html+j, "&gt;");
-                       j += strlen("&gt;");
-               }
-               else{
-                       html = realloc(html, (j+2)*sizeof(*html));
-                       html[j] = xml[i];
-                       j++;
-               }
-               i++;
-       }
-       html[j] = 0;
-
-       return html;
-}
-
-int edg_wll_QueryToHTML(edg_wll_Context ctx UNUSED_VAR, edg_wll_Event *eventsOut UNUSED_VAR, char **message UNUSED_VAR)
-{
-/* not implemented yet */
-       return -1;
-}
-
-/* construct Message-Body of Response-Line for edg_wll_UserJobs */
-int edg_wll_UserInfoToHTML(edg_wll_Context ctx UNUSED_VAR, edg_wlc_JobId *jobsOut, char **message)
-{
-        char *pomA = NULL, *pomB;
-        int i = 0;
-
-        /* head */
-        pomB = strdup("");
-
-        while (jobsOut && jobsOut[i]) {
-                char    *chid = edg_wlc_JobIdUnparse(jobsOut[i]);
-
-                asprintf(&pomA,"%s\t\t <li> <a href=\"%s\">%s</a>\r\n",
-                        pomB, chid,chid);
-
-                free(chid);
-                free(pomB);
-                pomB = pomA;
-                i++;
-        }
-
-       char *ret;
-       asprintf(&ret, "<html>\r\n\t<body>\r\n");
-       pomA = ret;
-       if (pomB[0]){
-               asprintf(&ret, "%s<h2><B>User jobs</B></h2>\r\n"
-                       "<ul>%s</ul>",
-                       pomA, pomB
-               );
-               free(pomA);
-               free(pomB);
-       }
-       pomA = ret;
-       asprintf(&ret, "%sUser subject: %s<p>"
-               "\t</body>\r\n</html>",
-               pomA, ctx->peerName?ctx->peerName: "&lt;anonymous&gt;"
-       );
-       free(pomA);
-
-        *message = ret;
-
-        return 0;
-}
-
-int edg_wll_UserNotifsToHTML(edg_wll_Context ctx UNUSED_VAR, char **notifids, char **message){
-       char *pomA = NULL, *pomB = NULL;
-        pomB = strdup("");
-
-       int i = 0;
-        while(notifids && notifids[i]){
-                asprintf(&pomA, "%s\t\t <li> <a href=\"/NOTIF:%s\">%s</a>\r\n",
-                                pomB,
-                                notifids[i],
-                                notifids[i]
-                        );
-                free(pomB);
-                pomB = pomA;
-                i++;
-        }
-
-       char *ret;
-        asprintf(&ret, "<html>\r\n\t<body>\r\n");
-       asprintf(&ret, "<html>\r\n\t<body>\r\n"
-                       "<h2><B>User notifications</B></h2>\r\n"
-                        "<ul>%s</ul>"
-                       "\t</body>\r\n</html>",
-                        pomA
-        );
-        free(pomA);
-
-       *message = ret;
-
-       return 0;
-}
-
-#define TR(name,type,field) \
-{ \
-       int l; \
-       if (field){ \
-               l = asprintf(&pomA,"<tr><th align=\"left\">" name ":</th>" \
-                       "<td>" type "</td></tr>", (field)); \
-       } \
-       else{ \
-               l = asprintf(&pomA,"<tr><th align=\"left\"><span style=\"color:grey\">" name \
-                       "</span></th></tr>"); \
-       } \
-       pomB = realloc(pomB, sizeof(*pomB)*(pomL+l+1)); \
-       strcpy(pomB+pomL, pomA); \
-       pomL += l; \
-       free(pomA); pomA=NULL; \ 
-}
-
-int edg_wll_NotificationToHTML(edg_wll_Context ctx UNUSED_VAR, notifInfo *ni, char **message){
-       char *pomA = NULL, *pomB = NULL, *flags, *cond;
-       int pomL = 0;
-
-       flags = edg_wll_stat_flags_to_string(ni->flags);
-       printf("flags %d - %s", ni->flags, flags);
-
-       TR("Destination", "%s", ni->destination);
-       TR("Valid until", "%s", ni->valid);
-       TR("Flags", "%s", flags);
-        free(flags);
-
-       if (! edg_wll_Condition_Dump(ni, &cond, 0)){
-               asprintf(&pomA, "%s<h3>Conditions</h3>\r\n<pre>%s</pre>\r\n",
-                       pomB, cond);
-               free(pomB);
-               pomB = pomA;
-               pomL = strlen(pomB);
-
-       }
-       free(cond);
-
-       asprintf(&pomA, "<html>\r\n\t<body>\r\n"
-               "<h2>Notification %s</h2>\r\n"
-               "<table halign=\"left\">%s</table>"
-               "\t</body>\r\n</html>",
-               ni->notifid, pomB);
-       
-       *message = pomA;
-
-       return 0;
-}
-
-/* construct Message-Body of Response-Line for edg_wll_JobStatus */
-int edg_wll_JobStatusToHTML(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat stat, char **message)
-{
-        char *pomA = NULL, *pomB = NULL;
-       int pomL = 0;
-       char    *chid,*chstat;
-       char    *jdl,*rsl;
-
-       jdl = strdup("");
-       rsl = strdup("");
-       
-        chid = edg_wlc_JobIdUnparse(stat.jobId);
-
-       TR("Status","%s",(chstat = edg_wll_StatToString(stat.state)));
-       free(chstat);
-       TR("owner","%s",stat.owner);
-       TR("Condor Id","%s",stat.condorId);
-       TR("Globus Id","%s",stat.globusId);
-       TR("Local Id","%s",stat.localId);
-       TR("Reason","%s",stat.reason);
-       if ( (stat.stateEnterTime.tv_sec) || (stat.stateEnterTime.tv_usec) ) {
-               time_t  time = stat.stateEnterTime.tv_sec;
-               TR("State entered","%s",ctime(&time));
-       }
-       else
-               TR("State entered", "%s", NULL);
-        if ( (stat.lastUpdateTime.tv_sec) || (stat.lastUpdateTime.tv_usec) ) {
-               time_t  time = stat.lastUpdateTime.tv_sec;
-               TR("Last update","%s",ctime(&time));
-       }
-       else
-               TR("Last update", "%s", NULL);
-       TR("Expect update","%s",stat.expectUpdate ? "YES" : "NO");
-       TR("Expect update from","%s",stat.expectFrom);
-       TR("Location","%s",stat.location);
-       TR("Destination","%s",stat.destination);
-       TR("Cancelling","%s",stat.cancelling>0 ? "YES" : "NO");
-       TR("Cancel reason","%s",stat.cancelReason);
-       TR("CPU time","%d",stat.cpuTime);
-
-       
-       TR("Done code","%d",stat.done_code);
-       TR("Exit code","%d",stat.exit_code);
-
-       if (stat.jdl){
-               char *jdl_unp;
-               if (pretty_print(stat.jdl, &jdl_unp) == 0)
-                       asprintf(&jdl,"<h3>Job description</h3>\r\n"
-                                "<pre>%s</pre>\r\n",jdl_unp);
-               else
-                       asprintf(&jdl,"<h3>Job description (not a ClassAd)"
-                               "</h3>\r\n<pre>%s</pre>\r\n",stat.jdl);
-       }
-
-       if (stat.rsl) asprintf(&rsl,"<h3>RSL</h3>\r\n"
-               "<pre>%s</pre>\r\n",stat.rsl);
-
-
-        asprintf(&pomA, "<html>\r\n\t<body>\r\n"
-                       "<h2>%s</h2>\r\n"
-                       "<table halign=\"left\">%s</table>"
-                       "%s%s"
-                       "\t</body>\r\n</html>",
-                       chid,pomB,jdl,rsl);
-        free(pomB);
-
-        *message = pomA;
-
-       free(chid);
-       free(jdl);
-       free(rsl);
-        return 0;
-}
-
-char *edg_wll_ErrorToHTML(edg_wll_Context ctx,int code)
-{
-       char    *out,*et,*ed;
-       char    *msg = edg_wll_HTTPErrorMessage(code);
-       edg_wll_ErrorCode       e;
-
-       e = edg_wll_Error(ctx,&et,&ed);
-       asprintf(&out,"<html><head><title>Error</title></head>\n"
-               "<body><h1>%s</h1>\n"
-               "%d: %s (%s)</body></html>",msg,e,et,ed);
-
-       free(et); free(ed);
-       return out;
-}
diff --git a/org.glite.lb.server/src/lb_html.h b/org.glite.lb.server/src/lb_html.h
deleted file mode 100644 (file)
index ac1d0e1..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef GLITE_LB_HTML_H
-#define GLITE_LB_HTML_H
-
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-#include "glite/lb/events.h"
-#include "glite/lb/jobstat.h"
-#include "lb_proto.h"
-
-int edg_wll_QueryToHTML(edg_wll_Context,edg_wll_Event *,char **);
-int edg_wll_JobStatusToHTML(edg_wll_Context, edg_wll_JobStat, char **);
-int edg_wll_UserInfoToHTML(edg_wll_Context, edg_wlc_JobId *, char **);
-int edg_wll_UserNotifsToHTML(edg_wll_Context ctx, char **notifids, char **message);
-int edg_wll_NotificationToHTML(edg_wll_Context ctx, notifInfo *ni, char **message);
-char *edg_wll_ErrorToHTML(edg_wll_Context,int);
-
-#endif /* GLITE_LB_HTML_H */
diff --git a/org.glite.lb.server/src/lb_http.c b/org.glite.lb.server/src/lb_http.c
deleted file mode 100644 (file)
index 99439d2..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-
-#include "glite/lb/mini_http.h"
-#include "glite/lb/context-int.h"
-
-#include "lb_http.h"
-#include "lb_proto.h"
-
-extern int debug;
-#define dprintf(x) if (debug) printf x
-
-
-int edg_wll_ServerHTTP(edg_wll_Context ctx)
-{
-       char    **hdr = NULL,*req = NULL,*body = NULL,
-               **hdrOut = NULL, *resp = NULL, *bodyOut = NULL,
-               *err_desc = NULL;
-       edg_wll_ErrorCode       err = 0;
-
-
-       if ( ctx->isProxy ) err = edg_wll_http_recv_proxy(ctx,&req,&hdr,&body);
-       else err = edg_wll_http_recv(ctx,&req,&hdr,&body,ctx->connections->serverConnection);
-
-       if (req) {
-               dprintf(("[%d] request: %s\n",getpid(),req));
-       } else {
-               dprintf(("no request\n"));
-       }
-       if (body) dprintf(("request body:\n%s\n\n",body));
-
-       if (!err) {
-               if ((err = edg_wll_Proto(ctx,req,hdr,body,&resp,&hdrOut,&bodyOut))) 
-                       edg_wll_Error(ctx,NULL,&err_desc);
-
-               if (resp) {
-                       if ( ctx->isProxy )
-                               edg_wll_http_send_proxy(ctx,resp,(char const * const *)hdrOut,bodyOut);
-                       else
-                               edg_wll_http_send(ctx,resp,(char const * const *)hdrOut,bodyOut,ctx->connections->serverConnection);
-               }
-       }
-
-       free(req);
-       free(resp);
-       if (hdr) {
-               char    **h;
-               for (h = hdr; *h; h++) free(*h);
-               free(hdr);
-       }
-       // hdrOut are static
-       free(body);
-       free(bodyOut);
-
-       if (err != edg_wll_Error(ctx,NULL,NULL)) edg_wll_SetError(ctx,err,err_desc);
-       free(err_desc);
-       return err;
-}
diff --git a/org.glite.lb.server/src/lb_http.h b/org.glite.lb.server/src/lb_http.h
deleted file mode 100644 (file)
index 421beea..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef GLITE_LB_HTTP_H
-#define GLITE_LB_HTTP_H
-
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-
-int edg_wll_ServerHTTP(edg_wll_Context);
-int edg_wll_ServerHTTPProxy(edg_wll_Context);
-
-#endif /* GLITE_LB_HTTP_H */
diff --git a/org.glite.lb.server/src/lb_proto.c b/org.glite.lb.server/src/lb_proto.c
deleted file mode 100644 (file)
index 649592a..0000000
+++ /dev/null
@@ -1,1247 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <signal.h>
-#include <unistd.h>
-
-#include <expat.h>
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/mini_http.h"
-#include "glite/lb/xml_conversions.h"
-#include "glite/jobid/strmd5.h"
-#include "glite/lbu/trio.h"
-
-#include "lb_proto.h"
-#include "lb_text.h"
-#include "lb_html.h"
-#include "stats.h"
-#include "jobstat.h"
-#include "get_events.h"
-#include "purge.h"
-#include "lb_xml_parse.h"
-#include "lb_xml_parse_V21.h"
-#include "db_supp.h"
-
-
-#define METHOD_GET      "GET "
-#define METHOD_POST     "POST "
-
-#define KEY_QUERY_JOBS         "/queryJobs "
-#define KEY_QUERY_EVENTS       "/queryEvents "
-#define KEY_PURGE_REQUEST      "/purgeRequest "
-#define KEY_DUMP_REQUEST       "/dumpRequest "
-#define KEY_LOAD_REQUEST       "/loadRequest "
-#define KEY_INDEXED_ATTRS      "/indexedAttrs "
-#define KEY_NOTIF_REQUEST      "/notifRequest "
-#define KEY_QUERY_SEQUENCE_CODE        "/querySequenceCode "
-#define KEY_STATS_REQUEST      "/statsRequest "
-#define KEY_HTTP               "HTTP/1.1"
-
-
-#define KEY_ACCEPT      "Accept:"
-#define KEY_APP         "application/x-dglb"
-#define KEY_AGENT      "User-Agent"
-
-
-static const char* const response_headers_dglb[] = {
-        "Cache-Control: no-cache",
-        "Server: edg_wll_Server/" PROTO_VERSION "/" COMP_PROTO,
-        "Content-Type: application/x-dglb",
-        NULL
-};
-
-static const char* const response_headers_html[] = {
-        "Cache-Control: no-cache",
-        "Server: edg_wll_Server/" PROTO_VERSION "/" COMP_PROTO,
-        "Content-Type: text/html",
-        NULL
-};
-
-volatile sig_atomic_t purge_quit = 0;
-
-extern int edg_wll_NotifNewServer(edg_wll_Context,
-                               edg_wll_QueryRec const * const *, int flags, char const *,
-                               const edg_wll_NotifId, time_t *);
-extern int edg_wll_NotifBindServer(edg_wll_Context,
-                               const edg_wll_NotifId, const char *, time_t *);
-extern int edg_wll_NotifChangeServer(edg_wll_Context,
-                               const edg_wll_NotifId, edg_wll_QueryRec const * const *,
-                               edg_wll_NotifChangeOp);
-extern int edg_wll_NotifRefreshServer(edg_wll_Context,
-                               const edg_wll_NotifId, time_t *);
-extern int edg_wll_NotifDropServer(edg_wll_Context, edg_wll_NotifId);
-
-
-
-char *edg_wll_HTTPErrorMessage(int errCode)
-{
-       char *msg;
-       
-       switch (errCode) {
-               case HTTP_OK: msg = "OK"; break;
-               case HTTP_ACCEPTED: msg = "Accepted"; break;
-               case HTTP_BADREQ: msg = "Bad Request"; break;
-               case HTTP_UNAUTH: msg = "Unauthorized"; break;
-               case HTTP_NOTFOUND: msg = "Not Found"; break;
-               case HTTP_NOTALLOWED: msg = "Method Not Allowed"; break;
-               case HTTP_UNSUPPORTED: msg = "Unsupported Media Type"; break;
-               case HTTP_NOTIMPL: msg = "Not Implemented"; break;
-               case HTTP_INTERNAL: msg = "Internal Server Error"; break;
-               case HTTP_UNAVAIL: msg = "Service Unavailable"; break;
-               case HTTP_INVALID: msg = "Invalid Data"; break;
-               default: msg = "Unknown error"; break;
-       }
-
-       return msg;
-}
-
-
-/* returns non-zero if old style (V21) protocols incompatible */
-static int is_protocol_incompatibleV21(char *user_agent)
-{
-        char *version, *comp_proto, *needle;
-        double  v, c, my_v = strtod(PROTO_VERSION_V21, (char **) NULL), my_c;
-
-
-       /* get version od the other side */
-        if ((version = strstr(user_agent,"/")) == NULL) return(-1);
-        else v = strtod(++version, &needle);
-
-       /* sent the other side list of compatible protocols? */
-       if ( needle[0] == '\0' ) return(-2);
-
-       /* test compatibility if server newer*/
-        if (my_v > v) {
-                comp_proto=COMP_PROTO_V21;
-                do {
-                        my_c = strtod(comp_proto, &needle);
-                        if (my_c == v) return(0);
-                        comp_proto = needle + 1;
-                } while (needle[0] != '\0');
-                return(1);
-        }
-
-       /* test compatibility if server is older */
-        else if (my_v < v) {
-                do {
-                        comp_proto = needle + 1;
-                        c = strtod(comp_proto, &needle);
-                        if (my_v == c) return(0);
-                } while (needle[0] != '\0');
-                return(1);
-        }
-
-       /* version match */
-        return(0);
-}
-
-
-/* returns non-zero if protocols incompatible */
-static int is_protocol_incompatible(char *user_agent)
-{
-        char *version, *comp_proto, *needle;
-        double  v, c, my_v = strtod(PROTO_VERSION, (char **) NULL), my_c;
-
-
-       /* get version od the other side */
-        if ((version = strstr(user_agent,"/")) == NULL) return(-1);
-        else v = strtod(++version, &needle);
-
-       /* sent the other side list of compatible protocols? */
-       if ( needle[0] == '\0' ) return(-2);
-
-       /* test compatibility if server newer*/
-        if (my_v > v) {
-                comp_proto=COMP_PROTO;
-                do {
-                        my_c = strtod(comp_proto, &needle);
-                        if (my_c == v) return(0);
-                        comp_proto = needle + 1;
-                } while (needle[0] != '\0');
-                return(1);
-        }
-
-       /* test compatibility if server is older */
-        else if (my_v < v) {
-                do {
-                        comp_proto = needle + 1;
-                        c = strtod(comp_proto, &needle);
-                        if (my_v == c) return(0);
-                } while (needle[0] != '\0');
-                return(1);
-        }
-
-       /* version match */
-        return(0);
-}
-
-
-static int outputHTML(char **headers)
-{
-       int i;
-
-       if (!headers) return 0;
-
-       for (i=0; headers[i]; i++)
-               if (!strncmp(headers[i], KEY_ACCEPT, sizeof(KEY_ACCEPT) - 1)) {
-                       if (strstr(headers[i],KEY_APP)) 
-                               return 0;               /* message sent by edg_wll_Api */
-                       else 
-                               return 1;               /* message sent by other application */
-               }
-       return 1;
-
-}
-
-
-static int drain_text_request(char *request){
-       int i = 0;
-       while (!isspace(request[i])) i++;
-       if (i < 5) 
-               return 0;
-       if (! strncmp(request+i-5, "?text", 5)){
-               if (i == 5)
-                       strcpy(request+i-4, request+i); // keep '/'
-               else
-                       strcpy(request+i-5, request+i);
-               return 1;
-       }
-       else
-               return 0;
-}
-
-static int getUserNotifications(edg_wll_Context ctx, char *user, char ***notifids){
-        char *q = NULL;
-        glite_lbu_Statement notifs = NULL;
-        char *notifc[1] = {NULL};
-
-        trio_asprintf(&q, "select notifid "
-                "from notif_registrations "
-                "where userid='%s'",
-                user);
-        if (edg_wll_ExecSQL(ctx, q, &notifs) < 0) goto err;
-        free(q); q = NULL;
-
-        int n = 0;
-        *notifids = NULL;
-        while(edg_wll_FetchRow(ctx, notifs, sizeof(notifc)/sizeof(notifc[0]), NULL, notifc)){
-                n++;
-                *notifids = realloc(*notifids, n*sizeof(**notifids));
-                (*notifids)[n-1] = strdup(notifc[n-1]);
-                printf("Notif %s found\n", notifc[n-1]);
-        }
-       if (n){
-               *notifids = realloc(*notifids, (n+1)*sizeof(**notifids));
-               (*notifids)[n] = NULL;
-       }
-        return n;
-
-err:
-        return 0;
-}
-
-static int getNotifInfo(edg_wll_Context ctx, char *notifId, notifInfo *ni){
-       char *q = NULL;
-        glite_lbu_Statement notif = NULL;
-       char *notifc[4] = {NULL, NULL, NULL, NULL};
-
-       trio_asprintf(&q, "select destination, valid, conditions, flags "
-                "from notif_registrations "
-                "where notifid='%s'",
-                notifId);
-       if (edg_wll_ExecSQL(ctx, q, &notif) < 0) goto err;
-        free(q); q = NULL;
-
-       ni->notifid = strdup(notifId);
-       if (edg_wll_FetchRow(ctx, notif, sizeof(notifc)/sizeof(notifc[0]), NULL, notifc)){
-               ni->destination = notifc[0];
-               ni->valid = notifc[1];
-               ni->conditions_text = notifc[2];
-               parseJobQueryRec(ctx, notifc[2], strlen(notifc[2]), &(ni->conditions));
-               ni->flags = atoi(notifc[3]);
-       }
-       else 
-               goto err;
-
-       return 0;
-
-err:
-       return  -1;
-}
-
-static void freeNotifInfo(notifInfo *ni){
-       if (ni->notifid) free(ni->notifid);
-       if (ni->destination) free(ni->destination);
-       if (ni->valid) free(ni->valid);
-       if (ni->conditions){
-               edg_wll_QueryRec **p;
-               int i;
-               for (p = ni->conditions; *p; p++){
-                       for (i = 0; (*p)[i].attr; i++)
-                               edg_wll_QueryRecFree((*p)+i);
-                       free(*p);
-               }
-               free(ni->conditions);
-       }
-       if (ni->conditions_text) free(ni->conditions_text);
-}
-
-static int getJobsRSS(edg_wll_Context ctx, char *feedType, edg_wll_JobStat **statesOut){
-       edg_wlc_JobId *jobsOut;
-        //edg_wll_JobStat *statesOut;
-        edg_wll_QueryRec **conds;
-       int i;
-
-       char *can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0);
-
-       if (strncmp(feedType, "finished", strlen("finished")) == 0){
-               conds = malloc(4*sizeof(*conds));
-               conds[0] = malloc(2*sizeof(**conds));
-               conds[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER;
-               conds[0][0].op = EDG_WLL_QUERY_OP_EQUAL;
-               conds[0][0].value.c = can_peername;
-               conds[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-               conds[1] = malloc(4*sizeof(**conds));
-               conds[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS;
-               conds[1][0].op = EDG_WLL_QUERY_OP_EQUAL;
-               conds[1][0].value.i = EDG_WLL_JOB_DONE;
-               conds[1][1].attr = EDG_WLL_QUERY_ATTR_STATUS;
-                conds[1][1].op = EDG_WLL_QUERY_OP_EQUAL;
-                conds[1][1].value.i = EDG_WLL_JOB_ABORTED;
-               conds[1][2].attr = EDG_WLL_QUERY_ATTR_STATUS;
-                conds[1][2].op = EDG_WLL_QUERY_OP_EQUAL;
-                conds[1][2].value.i = EDG_WLL_JOB_CANCELLED;
-               conds[1][3].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-               conds[2] = malloc(2*sizeof(**conds));
-               conds[2][0].attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME;
-               conds[2][0].op = EDG_WLL_QUERY_OP_GREATER;
-               conds[2][0].value.t.tv_sec = time(NULL) - ctx->rssTime;
-               conds[2][0].value.t.tv_usec = 0;
-               conds[2][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-               conds[3] = NULL;
-       }
-       else if (strncmp(feedType, "running", strlen("running")) == 0){
-                conds = malloc(4*sizeof(*conds));
-                conds[0] = malloc(2*sizeof(**conds));
-                conds[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER;
-                conds[0][0].op = EDG_WLL_QUERY_OP_EQUAL;
-                conds[0][0].value.c = can_peername;
-                conds[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-                conds[1] = malloc(2*sizeof(**conds));
-                conds[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS;
-                conds[1][0].op = EDG_WLL_QUERY_OP_EQUAL;
-                conds[1][0].value.i = EDG_WLL_JOB_RUNNING;
-                conds[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-                conds[2] = malloc(2*sizeof(**conds));
-                conds[2][0].attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME;
-                conds[2][0].op = EDG_WLL_QUERY_OP_GREATER;
-                conds[2][0].value.t.tv_sec = time(NULL) - ctx->rssTime;
-                conds[2][0].value.t.tv_usec = 0;
-                conds[2][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-                conds[3] = NULL;
-        }
-       else if (strncmp(feedType, "aborted", strlen("aborted")) == 0){
-                conds = malloc(4*sizeof(*conds));
-                conds[0] = malloc(2*sizeof(**conds));
-                conds[0][0].attr = EDG_WLL_QUERY_ATTR_OWNER;
-                conds[0][0].op = EDG_WLL_QUERY_OP_EQUAL;
-                conds[0][0].value.c = can_peername;
-                conds[0][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-                conds[1] = malloc(2*sizeof(**conds));
-                conds[1][0].attr = EDG_WLL_QUERY_ATTR_STATUS;
-                conds[1][0].op = EDG_WLL_QUERY_OP_EQUAL;
-                conds[1][0].value.i = EDG_WLL_JOB_ABORTED;
-                conds[1][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-                conds[2] = malloc(2*sizeof(**conds));
-                conds[2][0].attr = EDG_WLL_QUERY_ATTR_LASTUPDATETIME;
-                conds[2][0].op = EDG_WLL_QUERY_OP_GREATER;
-                conds[2][0].value.t.tv_sec = time(NULL) - ctx->rssTime;
-                conds[2][0].value.t.tv_usec = 0;
-                conds[2][1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-                conds[3] = NULL;
-        }
-       else{
-               *statesOut = NULL;
-               return -1;
-       }
-
-       edg_wll_QueryJobsServer(ctx, conds, 0, &jobsOut, statesOut);
-
-       for (i = 0; conds[i]; i++)
-               free(conds[i]);
-       free(conds);
-       free(can_peername);
-
-       return 0;
-}
-
-static int hup_handler(int sig) {
-       purge_quit = 1;
-       return 0;
-}
-
-edg_wll_ErrorCode edg_wll_ProtoV21(edg_wll_Context ctx,
-       char *request,char **headers,char *messageBody,
-       char **response,char ***headersOut,char **bodyOut)
-{
-       char *requestPTR, *message = NULL;
-       int     ret = HTTP_OK;
-       int     html = outputHTML(headers);
-       int     i;
-
-       edg_wll_ResetError(ctx);
-
-       for (i=0; headers[i]; i++) /* find line with version number in headers */
-               if ( strstr(headers[i], KEY_AGENT) ) break;
-  
-       if (headers[i] == NULL) { ret = HTTP_BADREQ; goto errV21; } /* if not present */
-       switch (is_protocol_incompatibleV21(headers[i])) { 
-               case 0  : /* protocols compatible */
-                         ctx->is_V21 = 1;
-                         break;
-               case -1 : /* malformed 'User Agent:' line */
-                         ret = HTTP_BADREQ;
-                         goto errV21;
-                         break;
-               case -2 : /* version of one protocol unknown */
-                         /* fallthrough */
-               case 1  : /* protocols incompatible */
-                         /* fallthrough */
-               default : ret = HTTP_UNSUPPORTED; 
-                         edg_wll_SetError(ctx,ENOTSUP,"Protocol versions are incompatible.");
-                         goto errV21; 
-                         break;
-       }
-
-
-/* GET */
-       if (!strncmp(request, METHOD_GET, sizeof(METHOD_GET)-1)) {
-               // Not supported
-               ret = HTTP_BADREQ;
-/* POST */
-       } else if (!strncmp(request,METHOD_POST,sizeof(METHOD_POST)-1)) {
-
-               requestPTR = request + sizeof(METHOD_POST)-1;
-       
-               if (!strncmp(requestPTR,KEY_QUERY_EVENTS,sizeof(KEY_QUERY_EVENTS)-1)) { 
-                       edg_wll_Event *eventsOut = NULL;
-                       edg_wll_QueryRec **job_conditions = NULL, **event_conditions = NULL;
-                       int i,j;
-
-                       if (parseQueryEventsRequestV21(ctx, messageBody, &job_conditions, &event_conditions)) 
-                               ret = HTTP_BADREQ;
-                               
-                       else {
-                               int     fatal = 0;
-
-                               switch (edg_wll_QueryEventsServer(ctx,ctx->noAuth,
-                                   (const edg_wll_QueryRec **)job_conditions, 
-                                   (const edg_wll_QueryRec **)event_conditions, &eventsOut)) {
-
-                                       case 0: if (html) ret = HTTP_NOTIMPL;
-                                               else      ret = HTTP_OK; 
-                                               break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM : ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               /* glue errors (if eny) to XML responce */ 
-                               if (!html && !fatal)
-                                       if (edg_wll_QueryEventsToXMLV21(ctx, eventsOut, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-
-                       if (job_conditions) {
-                               for (j = 0; job_conditions[j]; j++) {
-                                       for (i = 0 ; (job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                               edg_wll_QueryRecFree(&job_conditions[j][i]);
-                                       free(job_conditions[j]);
-                               }
-                               free(job_conditions);
-                       }
-
-                       if (event_conditions) {
-                               for (j = 0; event_conditions[j]; j++) {
-                                       for (i = 0 ; (event_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                               edg_wll_QueryRecFree(&event_conditions[j][i]);
-                                       free(event_conditions[j]);
-                               }
-                               free(event_conditions);
-                       }
-       
-                       if (eventsOut != NULL) {
-                               for (i=0; eventsOut[i].type != EDG_WLL_EVENT_UNDEF; i++) 
-                                       edg_wll_FreeEvent(&(eventsOut[i]));
-                               edg_wll_FreeEvent(&(eventsOut[i])); /* free last line */
-                               free(eventsOut);
-                       }
-               }
-               else if (!strncmp(requestPTR,KEY_QUERY_JOBS,sizeof(KEY_QUERY_JOBS)-1)) { 
-                       edg_wlc_JobId *jobsOut = NULL;
-                       edg_wll_JobStat *statesOut = NULL;
-                       edg_wll_QueryRec **conditions = NULL;
-                       int i,j, flags = 0;
-
-                       if (parseQueryJobsRequestV21(ctx, messageBody, &conditions, &flags))
-                               ret = HTTP_BADREQ;
-
-                       else { 
-                               int             fatal = 0,
-                                               retCode;
-                               if (flags & EDG_WLL_STAT_NO_JOBS) { 
-                                       flags -= EDG_WLL_STAT_NO_JOBS;
-                                       jobsOut = NULL;
-                                       if (flags & EDG_WLL_STAT_NO_STATES) {
-                                               flags -= EDG_WLL_STAT_NO_STATES;
-                                               statesOut = NULL;
-                                               retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, NULL);
-                                       }
-                                       else
-                                               retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, &statesOut);
-                               }
-                               else {
-                                       if (flags & EDG_WLL_STAT_NO_STATES) {
-                                               flags -= EDG_WLL_STAT_NO_STATES;
-                                               statesOut = NULL;
-                                               retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, NULL);
-                                       }
-                                       else
-                                               retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, &statesOut);
-                               }
-                               
-                               switch ( retCode ) {
-                                       // case EPERM : ret = HTTP_UNAUTH;
-                                       //              /* soft-error fall through */
-                                       case 0: if (html) ret =  HTTP_NOTIMPL;
-                                               else ret = HTTP_OK;
-
-                                               break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM: ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               if (!html && !fatal)
-                                       if (edg_wll_QueryJobsToXMLV21(ctx, jobsOut, statesOut, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-
-                       if (conditions) {
-                               for (j = 0; conditions[j]; j++) {
-                                       for (i = 0; (conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                               edg_wll_QueryRecFree(&conditions[j][i]);
-                                       free(conditions[j]);
-                               }
-                               free(conditions);
-                       }
-
-                       if (jobsOut) {
-                               for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]);
-                               free(jobsOut);
-                       }
-                       if (statesOut) {
-                               for (i=0; statesOut[i].state != EDG_WLL_JOB_UNDEF; i++) 
-                                       edg_wll_FreeStatus(&(statesOut[i]));
-                               edg_wll_FreeStatus(&(statesOut[i])); /* free last line */
-                               free(statesOut);
-                       }
-               }
-        /* POST [something else]: not understood */
-               else ret = HTTP_BADREQ;
-
-/* other HTTP methods */
-       } else ret = HTTP_NOTALLOWED;
-
-errV21:        asprintf(response,"HTTP/1.1 %d %s",ret,edg_wll_HTTPErrorMessage(ret));
-       *headersOut = (char **) (html? response_headers_html : response_headers_dglb);
-       if ((ret != HTTP_OK) && html)
-               *bodyOut = edg_wll_ErrorToHTML(ctx,ret);
-       else
-               *bodyOut = message;
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-
-edg_wll_ErrorCode edg_wll_Proto(edg_wll_Context ctx,
-       char *request,char **headers,char *messageBody,
-       char **response,char ***headersOut,char **bodyOut)
-{
-       char *requestPTR = NULL, *message = NULL;
-       int     ret = HTTP_OK;
-       int     html = outputHTML(headers);
-       int     text = 0; //XXX: Plain text communication is special case of html here, hence when text=1, html=1 too
-       int     i;
-
-       edg_wll_ResetError(ctx);
-
-       for (i=0; headers[i]; i++) /* find line with version number in headers */
-               if ( strstr(headers[i], KEY_AGENT) ) break;
-  
-       if (headers[i] == NULL) { ret = HTTP_BADREQ; goto err; } /* if not present */
-       if (!html) {
-               switch (is_protocol_incompatible(headers[i])) { 
-                       case 0  : /* protocols compatible */
-                                 ctx->is_V21 = 0;
-                                 break;
-                       case -1 : /* malformed 'User Agent:' line */
-                                 ret = HTTP_BADREQ;
-                                 goto err;
-                                 break;
-                       case 1  : /* protocols incompatible */
-                                 /* try old (V21) version compatibility */
-                                 edg_wll_ProtoV21(ctx, request, headers, messageBody, 
-                                                 response, headersOut, bodyOut);
-                                                 
-                                 /* and propagate errors or results */
-                                 return edg_wll_Error(ctx,NULL,NULL);
-                                 break;
-                       case -2 : /* version of one protocol unknown */
-                                 /* fallthrough */
-                       default : ret = HTTP_UNSUPPORTED; 
-                                 edg_wll_SetError(ctx,ENOTSUP,"Protocol versions are incompatible.");
-                                 goto err; 
-                                 break;
-               }
-       }
-
-
-/* GET */
-       if (!strncmp(request, METHOD_GET, sizeof(METHOD_GET)-1)) {
-               
-               requestPTR = strdup(request + sizeof(METHOD_GET)-1);
-               if (html) text = drain_text_request(requestPTR);
-
-
-       /* Is user authorised? */
-               if (!ctx->peerName){
-                       ret = HTTP_UNAUTH;
-                       edg_wll_SetError(ctx, EPERM, "user not authenticated");
-               }
-
-       /* GET /: Current User Jobs */
-               else if (requestPTR[0]=='/' && (requestPTR[1]==' ' || requestPTR[1]=='?')) {
-                       edg_wlc_JobId *jobsOut = NULL;
-                       int     i, flags;
-                       
-                       flags = (requestPTR[1]=='?') ? edg_wll_string_to_stat_flags(requestPTR + 2) : 0;
-
-// FIXME: edg_wll_UserJobs should take flags as parameter
-                       switch (edg_wll_UserJobsServer(ctx,&jobsOut,NULL)) {
-                               case 0: if (text)
-                                               edg_wll_UserInfoToText(ctx, jobsOut, &message);
-                                       else if (html)
-                                               edg_wll_UserInfoToHTML(ctx, jobsOut, &message);
-                                       else ret = HTTP_OK;
-                                       break;
-                               case ENOENT: ret = HTTP_NOTFOUND; break;
-                               case EPERM: ret = HTTP_UNAUTH; break;
-                               case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAVAIL; break;
-                               default: ret = HTTP_INTERNAL; break;
-                       }
-                       if (!html && (ret != HTTP_INTERNAL)) 
-                               if (edg_wll_UserJobsToXML(ctx, jobsOut, &message))
-                                       ret = HTTP_INTERNAL;
-
-                       if (jobsOut) {
-                               for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]);
-                               free(jobsOut);
-                       }
-               } 
-
-       /* GET /[jobId]: Job Status */
-               else if (*requestPTR=='/'
-                       && strncmp(requestPTR, "/RSS", strlen("/RSS")) 
-                       && strncmp(requestPTR, "/NOTIF", strlen("/NOTIF"))
-                       && *(requestPTR+strlen("/NOTIF")-1) != ':'
-                       && !isspace(*(requestPTR+strlen("/NOTIF")-1))) {
-                       edg_wlc_JobId jobId = NULL;
-                       char *pom1,*fullid = NULL;
-                       edg_wll_JobStat stat;
-                       char *pomCopy;
-
-                       if (ctx->srvName == NULL) {
-                               edg_wll_SetError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE,
-                                                       "no server name on GET /jobid");
-                               ret = HTTP_INTERNAL;
-                               goto err;
-                       }
-                       memset(&stat,0,sizeof(stat));
-                       pomCopy = strdup(requestPTR + 1);
-                       for (pom1=pomCopy; *pom1 && !isspace(*pom1); pom1++);
-                       *pom1 = 0;
-
-                       asprintf(&fullid,GLITE_JOBID_PROTO_PREFIX"%s:%u/%s",ctx->srvName,ctx->srvPort,pomCopy);
-                       free(pomCopy);  
-
-                       if (edg_wlc_JobIdParse(fullid, &jobId)) {
-                               edg_wll_SetError(ctx,EDG_WLL_ERROR_JOBID_FORMAT,fullid);
-                               ret = HTTP_BADREQ;
-                       }
-                       else switch (edg_wll_JobStatusServer(ctx,jobId,EDG_WLL_STAT_CLASSADS,&stat)) {
-                               case 0: if (text) 
-                                               edg_wll_JobStatusToText(ctx,stat,&message); 
-                                       else if (html)
-                                               edg_wll_JobStatusToHTML(ctx,stat,&message);
-                                       else ret = HTTP_OK;
-                                       break;
-                               case ENOENT: ret = HTTP_NOTFOUND; break;
-                               case EINVAL: ret = HTTP_INVALID; break;
-                               case EPERM : ret = HTTP_UNAUTH; break;
-                               default: ret = HTTP_INTERNAL; break;
-                       }
-                       if (!html && (ret != HTTP_INTERNAL))
-                               if (edg_wll_JobStatusToXML(ctx,stat,&message))
-                                       ret = HTTP_INTERNAL;
-
-                       free(fullid);
-                       edg_wlc_JobIdFree(jobId);
-                       edg_wll_FreeStatus(&stat);
-       /*GET /NOTIF: All user's notifications*/
-               } else if (strncmp(requestPTR, "/NOTIF", strlen("/NOTIF")) == 0                         && (isspace(*(requestPTR+strlen("/NOTIF")))
-                       || isspace(*(requestPTR+strlen("/NOTIF:"))))){
-                       char **notifids = NULL;
-                       char *can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0);
-                        char *userid = strmd5(can_peername, NULL);
-                       getUserNotifications(ctx, userid, &notifids);
-                       free(can_peername);
-                       if (text)
-                               edg_wll_UserNotifsToText(ctx, notifids, &message);
-                        else if (html)
-                               edg_wll_UserNotifsToHTML(ctx, notifids, &message);
-                        else ret = HTTP_OK;
-
-       /*GET /NOTIF:[notifId]: Notification info*/
-               } else if (strncmp(requestPTR, "/NOTIF:", strlen("/NOTIF:")) == 0){
-                       notifInfo ni;
-                       char *pomCopy, *pom;
-                       pomCopy = strdup(requestPTR + 1);
-                        for (pom=pomCopy; *pom && !isspace(*pom); pom++);
-                        *pom = 0;
-                       if (getNotifInfo(ctx, strrchr(pomCopy, ':')+1, &ni)){
-                               ret = HTTP_NOTFOUND;
-                               goto err;
-                       }
-                       free(pomCopy);
-
-                       if (text)
-                               edg_wll_NotificationToText(ctx, &ni, &message);
-                       else
-                               edg_wll_NotificationToHTML(ctx, &ni, &message);
-
-                       freeNotifInfo(&ni);
-
-       /*GET /RSS:[feed type] RSS feed */
-               } else if (strncmp(requestPTR, "/RSS:", strlen("/RSS:")) == 0){
-                       edg_wll_JobStat *states;
-                       char *feedType;
-                       int i;
-                       int idx;
-
-                       feedType = requestPTR + strlen("/RSS:");
-                       if (getJobsRSS(ctx, feedType, &states) < 0){
-                               ret = HTTP_INTERNAL;
-                                goto err;
-                       }
-
-                       // check if owner and lastupdatetime is indexed
-                       idx = 0;
-                       for (i = 0; ctx->job_index[i]; i++)
-                               if (ctx->job_index[i]->attr == EDG_WLL_QUERY_ATTR_OWNER)
-                                       idx++;
-                               else if (ctx->job_index[i]->attr == EDG_WLL_QUERY_ATTR_LASTUPDATETIME)
-                                       idx++;
-                       if (idx < 2){
-                               ret = HTTP_NOTFOUND;
-                               edg_wll_SetError(ctx, ENOENT, "current index configuration does not support RSS feeds");
-                       }
-                       edg_wll_RSSFeed(ctx, states, requestPTR, &message);
-
-       /* GET [something else]: not understood */
-               } else ret = HTTP_BADREQ;
-               free(requestPTR); requestPTR = NULL;
-
-/* POST */
-       } else if (!strncmp(request,METHOD_POST,sizeof(METHOD_POST)-1)) {
-
-               requestPTR = strdup(request + sizeof(METHOD_POST)-1);
-               if (html) text = drain_text_request(requestPTR);
-       
-               if (!strncmp(requestPTR,KEY_QUERY_EVENTS,sizeof(KEY_QUERY_EVENTS)-1)) { 
-                       edg_wll_Event *eventsOut = NULL;
-                       edg_wll_QueryRec **job_conditions = NULL, **event_conditions = NULL;
-                       int i,j;
-
-                       if (parseQueryEventsRequest(ctx, messageBody, &job_conditions, &event_conditions)) 
-                               ret = HTTP_BADREQ;
-                               
-                       else {
-                               int     fatal = 0;
-
-                               switch (edg_wll_QueryEventsServer(ctx,ctx->noAuth,
-                                   (const edg_wll_QueryRec **)job_conditions, 
-                                   (const edg_wll_QueryRec **)event_conditions, &eventsOut)) {
-
-                                       case 0: if (html) ret = HTTP_NOTIMPL;
-                                               else      ret = HTTP_OK; 
-                                               break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM : ret = HTTP_UNAUTH; break;
-                                       case E2BIG: ret = HTTP_UNAUTH; break;
-                                       case EINVAL: ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               /* glue errors (if eny) to XML responce */ 
-                               if (!html && !fatal)
-                                       if (edg_wll_QueryEventsToXML(ctx, eventsOut, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-
-                       if (job_conditions) {
-                               for (j = 0; job_conditions[j]; j++) {
-                                       for (i = 0 ; (job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                               edg_wll_QueryRecFree(&job_conditions[j][i]);
-                                       free(job_conditions[j]);
-                               }
-                               free(job_conditions);
-                       }
-
-                       if (event_conditions) {
-                               for (j = 0; event_conditions[j]; j++) {
-                                       for (i = 0 ; (event_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                               edg_wll_QueryRecFree(&event_conditions[j][i]);
-                                       free(event_conditions[j]);
-                               }
-                               free(event_conditions);
-                       }
-       
-                       if (eventsOut != NULL) {
-                               for (i=0; eventsOut[i].type != EDG_WLL_EVENT_UNDEF; i++) 
-                                       edg_wll_FreeEvent(&(eventsOut[i]));
-                               edg_wll_FreeEvent(&(eventsOut[i])); /* free last line */
-                               free(eventsOut);
-                       }
-               }
-               else if (!strncmp(requestPTR,KEY_QUERY_JOBS,sizeof(KEY_QUERY_JOBS)-1)) { 
-                       edg_wlc_JobId *jobsOut = NULL;
-                       edg_wll_JobStat *statesOut = NULL;
-                       edg_wll_QueryRec **conditions = NULL;
-                       int i,j, flags = 0;
-
-                       if (parseQueryJobsRequest(ctx, messageBody, &conditions, &flags))
-                               ret = HTTP_BADREQ;
-
-                       else { 
-                               int             fatal = 0,
-                                               retCode;
-                               if (flags & EDG_WLL_STAT_NO_JOBS) { 
-                                       flags -= EDG_WLL_STAT_NO_JOBS;
-                                       jobsOut = NULL;
-                                       if (flags & EDG_WLL_STAT_NO_STATES) {
-                                               flags -= EDG_WLL_STAT_NO_STATES;
-                                               statesOut = NULL;
-                                               retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, NULL);
-                                       }
-                                       else
-                                               retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, NULL, &statesOut);
-                               }
-                               else {
-                                       if (flags & EDG_WLL_STAT_NO_STATES) {
-                                               flags -= EDG_WLL_STAT_NO_STATES;
-                                               statesOut = NULL;
-                                               retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, NULL);
-                                       }
-                                       else
-                                               retCode = edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobsOut, &statesOut);
-                               }
-                               
-                               switch ( retCode ) {
-                                       case 0: if (html) ret =  HTTP_NOTIMPL;
-                                               else ret = HTTP_OK;
-
-                                               break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM: ret = HTTP_UNAUTH; break;
-                                       case E2BIG: ret = HTTP_UNAUTH; break;
-                                       case EINVAL: ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               if (!html && !fatal)
-                                       if (edg_wll_QueryJobsToXML(ctx, jobsOut, statesOut, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-
-                       if (conditions) {
-                               for (j = 0; conditions[j]; j++) {
-                                       for (i = 0; (conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                               edg_wll_QueryRecFree(&conditions[j][i]);
-                                       free(conditions[j]);
-                               }
-                               free(conditions);
-                       }
-
-                       if (jobsOut) {
-                               for (i=0; jobsOut[i]; i++) edg_wlc_JobIdFree(jobsOut[i]);
-                               free(jobsOut);
-                       }
-                       if (statesOut) {
-                               for (i=0; statesOut[i].state != EDG_WLL_JOB_UNDEF; i++) 
-                                       edg_wll_FreeStatus(&(statesOut[i]));
-                               edg_wll_FreeStatus(&(statesOut[i])); /* free last line */
-                               free(statesOut);
-                       }
-               }
-               else if (!strncmp(requestPTR,KEY_PURGE_REQUEST,sizeof(KEY_PURGE_REQUEST)-1)) {
-                       edg_wll_PurgeRequest    request;
-                       edg_wll_PurgeResult     result;
-                       struct sigaction        sa;
-                       sigset_t                sset;
-                       int                     fatal = 0, retval;
-
-                       ctx->p_tmp_timeout.tv_sec = 86400;  
-
-                       memset(&request,0,sizeof(request));
-                       memset(&result,0,sizeof(result));
-
-                       if ( !parsePurgeRequest(ctx,messageBody,(int (*)()) edg_wll_StringToStat,&request) ) {
-                               /* do throttled purge on background if requested */
-                               if ((request.flags & EDG_WLL_PURGE_BACKGROUND)) {
-                                       retval = fork();
-
-                                       switch (retval) {
-                                       case 0: /* forked cleaner */
-                                               memset(&sa, 0, sizeof(sa));
-                                               sa.sa_handler = hup_handler;
-                                               sigaction(SIGTERM, &sa, NULL);
-                                               sigaction(SIGINT, &sa, NULL);
-
-                                               sigemptyset(&sset);
-                                               sigaddset(&sset, SIGTERM);
-                                               sigaddset(&sset, SIGINT);
-                                               sigprocmask(SIG_UNBLOCK, &sset, NULL);
-                                               sigemptyset(&sset);
-                                               sigaddset(&sset, SIGCHLD);
-                                               sigprocmask(SIG_BLOCK, &sset, NULL);
-                                               break;
-                                       case -1: /* err */
-                                               ret = HTTP_INTERNAL;
-                                               edg_wll_SetError(ctx, errno, "can't fork purge process");
-                                               goto err;
-                                       default: /* client request handler */
-                                               ret = HTTP_ACCEPTED;
-                                               /* to end this parent */
-                                               edg_wll_SetError(ctx, EDG_WLL_ERROR_SERVER_RESPONSE, edg_wll_HTTPErrorMessage(ret));
-                                               goto err;
-                                       }
-                               }
-
-                               switch ( edg_wll_PurgeServer(ctx, (const edg_wll_PurgeRequest *)&request, &result)) {
-                                       case 0: if (html) ret =  HTTP_NOTIMPL;
-                                               else ret = HTTP_OK;
-
-                                               break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM: ret = HTTP_UNAUTH; break;
-                                       case EINVAL: ret = HTTP_INVALID; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               if (!html && !fatal) {
-                                       if (edg_wll_PurgeResultToXML(ctx, &result, &message))
-                                               ret = HTTP_INTERNAL;
-                                       else
-                                               printf("%s", message);
-                               }                               
-
-                               /* result is now packed in message, free it */  
-                               if ( result.server_file )
-                                       free(result.server_file);
-                               if ( result.jobs )
-                               {
-                                       for ( i = 0; result.jobs[i]; i++ )
-                                               free(result.jobs[i]);
-                                       free(result.jobs);
-                               }
-
-                               /* forked cleaner sends no results */
-                               if ((request.flags & EDG_WLL_PURGE_BACKGROUND)) {
-                                       *response = NULL;
-                                       free(message);
-                                       message = NULL;
-                                       if (requestPTR) free(requestPTR);
-                                       exit(0);
-                               }
-
-                       }
-
-                       if ( request.jobs )
-                       {
-                               int i;
-                               for ( i = 0; request.jobs[i]; i++ )
-                                       free(request.jobs[i]);
-                               free(request.jobs);
-                       }
-
-               }
-               else if (!strncmp(requestPTR,KEY_DUMP_REQUEST,sizeof(KEY_DUMP_REQUEST)-1)) {
-                       edg_wll_DumpRequest     request;
-                       edg_wll_DumpResult      result;
-               
-                       ctx->p_tmp_timeout.tv_sec = 86400;  
-
-                       memset(&request,0,sizeof(request));     
-                       memset(&result,0,sizeof(result));
-                       
-                       if (parseDumpRequest(ctx, messageBody, &request))
-                               ret = HTTP_BADREQ;
-                       else {
-                               int     fatal = 0;
-                               
-                               switch (edg_wll_DumpEventsServer(ctx,(const edg_wll_DumpRequest *) &request, &result)) {
-                                       case 0: if (html) ret = HTTP_NOTIMPL;
-                                               else      ret = HTTP_OK; 
-                                               break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM : ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               /* glue errors (if eny) to XML responce */ 
-                               if (!html && !fatal)
-                                       if (edg_wll_DumpResultToXML(ctx, &result, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-
-                       free(result.server_file);
-               }
-               else if (!strncmp(requestPTR,KEY_LOAD_REQUEST,sizeof(KEY_LOAD_REQUEST)-1)) {
-                       edg_wll_LoadRequest     request;
-                       edg_wll_LoadResult      result;
-               
-                       ctx->p_tmp_timeout.tv_sec = 86400;  
-
-                       memset(&request,0,sizeof(request));     
-                       memset(&result,0,sizeof(result));
-                       
-                       if (parseLoadRequest(ctx, messageBody, &request))
-                               ret = HTTP_BADREQ;
-                       else {
-                               int     fatal = 0;
-                               
-                               switch (edg_wll_LoadEventsServer(ctx,(const edg_wll_LoadRequest *) &request, &result)) {
-                                       case 0: if (html) ret = HTTP_NOTIMPL;
-                                               else      ret = HTTP_OK; 
-                                               break;
-                                       case EEXIST: ret = HTTP_OK; break;
-                                       case EINVAL: ret = HTTP_INVALID; break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM : ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               /* glue errors (if eny) to XML responce */ 
-                               if (!html && !fatal)
-                                       if (edg_wll_LoadResultToXML(ctx, &result, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-
-                       free(result.server_file);
-               }
-               else if (!strncmp(requestPTR,KEY_INDEXED_ATTRS,sizeof(KEY_INDEXED_ATTRS)-1)) {
-                       if (!html)
-                               if (edg_wll_IndexedAttrsToXML(ctx, &message))
-                                       ret = HTTP_INTERNAL;
-               }
-               else if (!strncmp(requestPTR,KEY_NOTIF_REQUEST,sizeof(KEY_NOTIF_REQUEST)-1)) {
-                       char *function, *address;
-                       edg_wll_NotifId notifId;
-                       edg_wll_NotifChangeOp op;
-                       edg_wll_QueryRec **conditions;
-                       int flags;
-                       time_t validity = -1;
-                       int i,j;
-                       
-                       
-                       if (parseNotifRequest(ctx, messageBody, &function, &notifId, 
-                                               &address, &op, &validity, &conditions, &flags))
-                               ret = HTTP_BADREQ;
-                       else {
-                               int     fatal = 0, err = 0;
-                               
-                               // XXX presne poradi parametru zatim neni znamo
-                               // navratove chyby nejsou zname, nutno predelat dle aktualni situace
-                               if (!strcmp(function,"New")) 
-                                       err = edg_wll_NotifNewServer(ctx,
-                                                               (edg_wll_QueryRec const * const *)conditions, flags,
-                                                               address, notifId, &validity);
-                               else if (!strcmp(function,"Bind"))
-                                       err = edg_wll_NotifBindServer(ctx, notifId, address, &validity);
-                               else if (!strcmp(function,"Change"))
-                                       err = edg_wll_NotifChangeServer(ctx, notifId,
-                                                               (edg_wll_QueryRec const * const *)conditions, op);
-                               else if (!strcmp(function,"Refresh"))
-                                       err = edg_wll_NotifRefreshServer(ctx, notifId, &validity);
-                               else if (!strcmp(function,"Drop"))
-                                       err = edg_wll_NotifDropServer(ctx, notifId);
-                               
-                               switch (err) {
-                                       case 0: if (html) ret = HTTP_NOTIMPL;
-                                               else      ret = HTTP_OK; 
-                                               break;
-                                       case EEXIST: ret = HTTP_OK; break;
-                                       case EINVAL: ret = HTTP_INVALID; break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM : ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               /* glue errors (if eny) to XML responce */ 
-                               if (!html && !fatal)
-                                       if (edg_wll_NotifResultToXML(ctx, validity, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-                       
-                       free(function);
-                       free(address);
-                       edg_wll_NotifIdFree(notifId);
-                       if (conditions) {
-                               for (j = 0; conditions[j]; j++) {
-                                       for (i = 0; (conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                               edg_wll_QueryRecFree(&conditions[j][i]);
-                                       free(conditions[j]);
-                               }
-                               free(conditions);
-                       }
-               }
-               else if (!strncmp(requestPTR,KEY_QUERY_SEQUENCE_CODE,sizeof(KEY_QUERY_SEQUENCE_CODE)-1)) {
-                       char            *source = NULL;
-                       char            *seqCode = NULL;
-                       edg_wlc_JobId   jobId = NULL;
-                       
-
-                       if (parseQuerySequenceCodeRequest(ctx, messageBody, &jobId, &source))
-                               ret = HTTP_BADREQ;
-                       else {
-                               int     fatal = 0;
-                               
-                               switch (edg_wll_QuerySequenceCodeServer(ctx, jobId, source, &seqCode)) {
-                                       case 0: if (html) ret = HTTP_NOTIMPL;
-                                               else      ret = HTTP_OK; 
-                                               break;
-                                       case EEXIST: ret = HTTP_OK; break;
-                                       case EINVAL: ret = HTTP_INVALID; break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM : ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               
-                               /* glue errors (if eny) to XML responce */ 
-                               if (!html && !fatal)
-                                       if (edg_wll_QuerySequenceCodeResultToXML(ctx, seqCode, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-
-                       if ( source ) free(source);
-                       if ( seqCode ) free(seqCode);
-                       edg_wlc_JobIdFree(jobId);
-               }
-               else if (!strncmp(requestPTR,KEY_STATS_REQUEST,sizeof(KEY_STATS_REQUEST)-1)) {
-                       char *function;
-                       edg_wll_QueryRec **conditions;
-                       edg_wll_JobStatCode major = EDG_WLL_JOB_UNDEF;
-                       time_t from, to;
-                       int i, j, minor, res_from, res_to;
-                       float rate = 0, duration = 0;
-                       
-                       
-                       
-                       if (parseStatsRequest(ctx, messageBody, &function, &conditions, 
-                                               &major, &minor, &from, &to))
-                               ret = HTTP_BADREQ;
-                       else {
-                               int     fatal = 0, err = 0;
-                               
-                               // XXX presne poradi parametru zatim neni znamo
-                               // navratove chyby nejsou zname, nutno predelat dle aktualni situace
-                               if (!strcmp(function,"Rate")) 
-                                       err = edg_wll_StateRateServer(ctx,
-                                               conditions[0], major, minor, 
-                                               &from, &to, &rate, &res_from, &res_to); 
-                               else if (!strcmp(function,"Duration"))
-                                       err = edg_wll_StateDurationServer(ctx,
-                                               conditions[0], major, minor, 
-                                               &from, &to, &duration, &res_from, &res_to); 
-                               
-                               switch (err) {
-                                       case 0: if (html) ret = HTTP_NOTIMPL;
-                                               else      ret = HTTP_OK; 
-                                               break;
-                                       case ENOSYS: ret = HTTP_NOTIMPL; break;
-                                       case EEXIST: ret = HTTP_OK; break;
-                                       case EINVAL: ret = HTTP_INVALID; break;
-                                       case ENOENT: ret = HTTP_NOTFOUND; break;
-                                       case EPERM : ret = HTTP_UNAUTH; break;
-                                       case EDG_WLL_ERROR_NOINDEX: ret = HTTP_UNAUTH; break;
-                                       case ENOMEM: fatal = 1; ret = HTTP_INTERNAL; break;
-                                       default: ret = HTTP_INTERNAL; break;
-                               }
-                               /* glue errors (if eny) to XML responce */ 
-                               if (!html && !fatal)
-                                       if (edg_wll_StatsResultToXML(ctx, from, to, rate, 
-                                                       duration, res_from, res_to, &message))
-                                               ret = HTTP_INTERNAL;
-                       }
-                       
-                       free(function);
-                       if (conditions) {
-                               for (j = 0; conditions[j]; j++) {
-                                       for (i = 0; (conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                               edg_wll_QueryRecFree(&conditions[j][i]);
-                                       free(conditions[j]);
-                               }
-                               free(conditions);
-                       }
-               }
-
-                       
-        /* POST [something else]: not understood */
-               else ret = HTTP_BADREQ;
-
-               free(requestPTR); requestPTR = NULL;
-
-/* other HTTP methods */
-       } else ret = HTTP_NOTALLOWED;
-
-err:   asprintf(response,"HTTP/1.1 %d %s",ret,edg_wll_HTTPErrorMessage(ret));
-       *headersOut = (char **) (html ? response_headers_html : response_headers_dglb);
-       if ((ret != HTTP_OK && ret != HTTP_ACCEPTED) && text)
-                *bodyOut = edg_wll_ErrorToText(ctx,ret);
-       else if ((ret != HTTP_OK && ret != HTTP_ACCEPTED) && html)
-               *bodyOut = edg_wll_ErrorToHTML(ctx,ret);
-       else
-               *bodyOut = message;
-
-       if (requestPTR) free(requestPTR);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
diff --git a/org.glite.lb.server/src/lb_proto.h b/org.glite.lb.server/src/lb_proto.h
deleted file mode 100644 (file)
index b3aaba0..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef GLITE_LB_PROTO_H
-#define GLITE_LB_PROTO_H
-
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-#include "glite/lb/query_rec.h"
-
-/* Handle a single request of the LB server protocol 
- * returns a complete response string (may contain a formatted error
- * message)
- * or NULL on fatal error*/
-
-extern edg_wll_ErrorCode edg_wll_Proto(
-       edg_wll_Context,        /* INOUT: context */
-       char *,         /* IN: HTTP request line */
-       char **,        /* IN: HTTP message headers */
-       char *,         /* IN: HTTP message body */
-       char **,        /* OUT: HTTP response line */
-       char ***,       /* OUT: HTTP response headers */
-       char **         /* OUT: HTTP response body */
-);
-
-typedef struct _notifInfo{
-        char *notifid;
-        char *destination;
-        char *valid;
-       edg_wll_QueryRec **conditions;
-       char *conditions_text;
-       int  flags;
-} notifInfo;
-
-extern char *edg_wll_HTTPErrorMessage(int);
-
-extern int edg_wll_UserJobsServer(edg_wll_Context ctx, edg_wlc_JobId  **jobs, edg_wll_JobStat **states);
-
-extern int edg_wll_QuerySequenceCodeServer(edg_wll_Context ctx, edg_wlc_JobId jobid, const char *source, char **seqcode);
-
-#endif /* GLITE_LB_PROTO_H */
diff --git a/org.glite.lb.server/src/lb_rss.c b/org.glite.lb.server/src/lb_rss.c
deleted file mode 100644 (file)
index bbf88da..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#ident "$Header:"
-
-#include "lb_rss.h"
-#include "lb_proto.h"
-
-#include "glite/lb/context-int.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <assert.h>
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-#define TR(type, field) \
-       if (field){ \
-               int l = asprintf(&pomA, type, (field)); \ 
-               pomB = realloc(pomB, sizeof(*pomB)*(pomL+l+1)); \
-               strcpy(pomB+pomL, pomA); \
-               pomL += l; \
-               free(pomA); pomA = NULL; \
-       }
-
-#define TRC(str) \
-       { \
-               int l = asprintf(&pomA, str); \
-               pomB = realloc(pomB, sizeof(*pomB)*(pomL+l+1)); \
-               strcpy(pomB+pomL, pomA); \
-                pomL += l; \
-                free(pomA); pomA = NULL; \ 
-       }
-
-
-int edg_wll_RSSFeed(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat *states, char *request, char **message){
-       char *pomA = NULL, *pomB = NULL;
-       int pomL = 0;
-       int i;
-       char *chid, *chstat, *rss_link, *tmp;
-       time_t time;
-       
-       TRC("<?xml version=\"1.0\"?>\n<rss version=\"2.0\">\n<channel>\n");
-       TRC("<title>LB feed</title>\n");
-       asprintf(&rss_link, "https://%s:%i%s", ctx->srvName, ctx->srvPort, request);
-       for (tmp = rss_link; *tmp && !isspace(*tmp); tmp++);
-       *tmp = 0;
-       TR("<link>%s</link>\n", rss_link);
-       TRC("<description>List of jobs.</description>");
-       if (states) for (i = 0; states[i].state != EDG_WLL_JOB_UNDEF; i++){
-               TRC("<item>\n");
-               TR("<title>%s</title>\n", (chid = edg_wlc_JobIdUnparse(states[i].jobId)));
-               TR("<link>%s</link>\n", chid);
-               TR("<guid>%s</guid>\n", chid);
-               // strip description to allow new lines
-               TR("<description>Status: %s\n", (chstat = edg_wll_StatToString(states[i].state)));
-               TRC("<![CDATA[<br/>]]>\n");
-               time = states[i].stateEnterTime.tv_sec;
-               TR("State entered: %s\n", ctime(&time));
-               TRC("<![CDATA[<br/>]]>\n");
-               TR("Destination: %s</description>\n", states[i].destination);
-               TRC("</item>\n");
-               
-               
-               free(chid);
-               free(chstat);
-       }
-       TRC("</channel>\n</rss>");
-
-       *message = pomB;
-
-       return 0;
-}
-
diff --git a/org.glite.lb.server/src/lb_rss.h b/org.glite.lb.server/src/lb_rss.h
deleted file mode 100644 (file)
index e690ee7..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef GLITE_LB_RSS_H
-#define GLITE_LB_RSS_H
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/jobstat.h"
-
-int edg_wll_RSSFeed(edg_wll_Context ctx, edg_wll_JobStat *states, char *request, char **message);
-
-#endif /* GLITE_LB_RSS_H */
diff --git a/org.glite.lb.server/src/lb_text.c b/org.glite.lb.server/src/lb_text.c
deleted file mode 100644 (file)
index 510441c..0000000
+++ /dev/null
@@ -1,243 +0,0 @@
-#ident "$Header$"
-
-#include "lb_text.h"
-#include "lb_proto.h"
-#include "cond_dump.h"
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/xml_conversions.h"
-#include "glite/lbu/trio.h"
-#include "glite/lbu/db.h"
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-static char *escape_text(char *text){
-       int len = strlen(text);
-       char *ret = malloc((len+1)*sizeof(char));
-       int reti = 0;
-       int retlen = len;
-       int i;
-       for (i = 0; i < len; i++){
-               // escape '\'
-               if (text[i] == '\\'){
-                       ret[reti] = '\\';
-                       reti++;
-                       retlen++;
-                       ret = realloc(ret, (retlen+1)*sizeof(char));
-               }
-               // replace newline by '\\n'
-               if (text[i] == '\n'){
-                       ret[reti] = '\\';
-                       reti++;
-                       ret[reti] = 'n';
-                       retlen++;
-                        ret = realloc(ret, (retlen+1)*sizeof(char));
-               }
-               else
-                       ret[reti] = text[i];
-               reti++;
-       }
-       ret[reti] = 0;
-       return ret;
-}
-
-int edg_wll_QueryToText(edg_wll_Context ctx UNUSED_VAR, edg_wll_Event *eventsOut UNUSED_VAR, char **message UNUSED_VAR)
-{
-/* not implemented yet */
-       return -1;
-}
-
-#define TR(name,type,field) \
-{ \
-       int l; \
-        if (field) \
-               l = asprintf(&a,"%s=" type "\n", \
-                       name, field); \
-       else \
-               l = asprintf(&a,"%s=\n", name); \
-       b = realloc(b, sizeof(*b)*(pomL+l+1)); \
-       strcpy(b+pomL, a); \
-       pomL += l; \
-       free(a); a=NULL; \
-}
-
-int edg_wll_UserInfoToText(edg_wll_Context ctx, edg_wlc_JobId *jobsOut, char **message)
-{
-        char *a = NULL, *b;
-        int i = 0;
-        b = strdup("");
-
-        while (jobsOut[i]){
-                char *chid = edg_wlc_JobIdUnparse(jobsOut[i]);
-
-                if (i == 0)
-                        asprintf(&a, "%s%s", b, chid);
-                else
-                        asprintf(&a, "%s,%s", b, chid);
-
-                free(chid);
-                free(b);
-                b = a;
-                i++;
-        }
-
-       if (a){
-               asprintf(&a, "User_jobs=%s\n", b);
-               free(b);
-               b = a;
-       }
-       b = a;
-
-       asprintf(&a, "%sUser_subject=%s\n", b, ctx->peerName ? ctx->peerName: "<anonymous>");
-
-        *message = a;
-
-        return 0;
-}
-
-int edg_wll_UserNotifsToText(edg_wll_Context ctx, char **notifids, char **message){
-       char *a = NULL, *b;
-        int i = 0;
-        b = strdup("");
-
-        while(notifids[i]){
-                if (i == 0)
-                        asprintf(&a, "%s", notifids[i]);
-                else
-                        asprintf(&a, "%s,%s", b, notifids[i]);
-                free(b);
-                b = a;
-                i++;
-        }
-       if (b)
-               asprintf(&a, "User_notifications=%s\n", b);
-
-       *message = a;
-
-       return 0;
-}
-
-int edg_wll_NotificationToText(edg_wll_Context ctx UNUSED_VAR, notifInfo *ni, char **message){
-       char *a = NULL, *b = NULL, *cond, *flags;
-       int pomL = 0;
-
-       TR("Notif_id", "%s", ni->notifid);
-       TR("Destination", "%s", ni->destination);
-       TR("Valid_until", "%s", ni->valid);
-       flags = edg_wll_stat_flags_to_string(ni->flags);
-       TR("Flags", "%s", flags);
-        free(flags);
-       if (! edg_wll_Condition_Dump(ni, &cond, 1)){
-               TR("Conditions", "%s", cond);
-       }
-       free(cond);
-
-       *message = b;
-
-       return 0;
-}
-
-/* construct Message-Body of Response-Line for edg_wll_JobStatus */
-int edg_wll_JobStatusToText(edg_wll_Context ctx UNUSED_VAR, edg_wll_JobStat stat, char **message)
-{
-       char *a = NULL, *b = NULL;
-       char    *chid,*chstat;
-        char    *jdl,*rsl;
-
-       jdl = strdup("");
-       rsl = strdup("");
-       
-       int pomL = 0;
-
-        chid = edg_wlc_JobIdUnparse(stat.jobId);
-
-       TR("Status","%s",(chstat = edg_wll_StatToString(stat.state)));
-       free(chstat);
-       TR("owner","%s",stat.owner);
-       TR("condorId","%s",stat.condorId);
-       TR("globusId","%s",stat.globusId);
-       TR("localId","%s",stat.localId);
-       TR("reason","%s",stat.reason);
-       if ( (stat.stateEnterTime.tv_sec) || (stat.stateEnterTime.tv_usec) ) {
-               time_t  time = stat.stateEnterTime.tv_sec;
-               //TR("State_entered","%s",ctime(&time));
-               asprintf(&a, "%sstateEnterTime=%s", b, ctime(&time));
-               free(b); b = a;
-       }
-       else{
-               asprintf(&a, "%sstateEnterTime=", b);
-                free(b); b = a;
-       }       
-        if ( (stat.lastUpdateTime.tv_sec) || (stat.lastUpdateTime.tv_usec) ) {
-               time_t  time = stat.lastUpdateTime.tv_sec;
-               //TR("Last_update","%s",ctime(&time));
-               asprintf(&a, "%slastUpdateTime=%s", b, ctime(&time));
-                free(b); b = a;
-       }
-       else{
-               asprintf(&a, "%slastUpdateTime=", b);
-                free(b); b = a;
-       }
-       TR("expectUpdate","%s",stat.expectUpdate ? "YES" : "NO");
-       TR("expectFrom","%s",stat.expectFrom);
-       TR("location","%s",stat.location);
-       TR("destination","%s",stat.destination);
-       TR("cancelling","%s",stat.cancelling>0 ? "YES" : "NO");
-       TR("cancelReason","%s",stat.cancelReason);
-       TR("cpuTime","%d",stat.cpuTime);
-       
-       TR("done_code","%d",stat.done_code);
-       TR("exit_code","%d",stat.exit_code);
-
-        if (stat.jdl){
-               char* my_jdl = escape_text(stat.jdl);
-               asprintf(&jdl,"jdl=%s\n", my_jdl);
-               free(my_jdl);
-       }
-       else
-               asprintf(&jdl,"jdl=\n");
-       if (stat.rsl) 
-               asprintf(&rsl,"rsl=%s\n", stat.rsl);
-       else
-               asprintf(&rsl,"rsl=\n");
-
-        asprintf(&a, "Job=%s\n"
-                       "%s"
-                       "%s"
-                       "%s",
-                       chid,b,jdl,rsl);
-        free(b);
-
-        *message = a;
-
-       free(chid);
-       free(jdl);
-       free(rsl);
-        return 0;
-}
-
-char *edg_wll_ErrorToText(edg_wll_Context ctx,int code)
-{
-       char    *out,*et,*ed;
-       char    *msg = edg_wll_HTTPErrorMessage(code);
-       edg_wll_ErrorCode       e;
-
-       e = edg_wll_Error(ctx,&et,&ed);
-       asprintf(&out,"Error=%s\n"
-               "Code=%d\n"
-               "Description=%s (%s)\n"
-               ,msg,e,et,ed);
-
-       free(et); free(ed);
-       return out;
-}
-
diff --git a/org.glite.lb.server/src/lb_text.h b/org.glite.lb.server/src/lb_text.h
deleted file mode 100644 (file)
index c72de74..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef GLITE_LB_TEXT_H
-#define GLITE_LB_TEXT_H
-
-#include "glite/lb/context.h"
-#include "glite/lb/events.h"
-#include "glite/lb/jobstat.h"
-#include "lb_proto.h"
-
-int edg_wll_QueryToText(edg_wll_Context,edg_wll_Event *,char **);
-int edg_wll_JobStatusToText(edg_wll_Context, edg_wll_JobStat, char **);
-int edg_wll_UserInfoToText(edg_wll_Context, edg_wlc_JobId *, char **);
-int edg_wll_UserNotifsToText(edg_wll_Context ctx, char **notifids, char **message);
-int edg_wll_NotificationToText(edg_wll_Context ctx, notifInfo *ni, char **message);
-char *edg_wll_ErrorToText(edg_wll_Context,int);
-
-#endif /* GLITE_LB_TEXT */
diff --git a/org.glite.lb.server/src/lb_xml_parse.c.T b/org.glite.lb.server/src/lb_xml_parse.c.T
deleted file mode 100644 (file)
index 88178dc..0000000
+++ /dev/null
@@ -1,2079 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <expat.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lbu/trio.h"
-#include "glite/lbu/escape.h"
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/xml_conversions.h"
-
-#include "lb_xml_parse.h"
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-#define QUERY_EVENTS_BEGIN                     "<edg_wll_QueryEventsResult"
-#define QUERY_EVENTS_END                       "</edg_wll_QueryEventsResult>\r\n"
-#define QUERY_JOBS_BEGIN                       "<edg_wll_QueryJobsResult"
-#define QUERY_JOBS_END                         "</edg_wll_QueryJobsResult>\r\n"
-#define PURGE_RESULT_BEGIN                     "<edg_wll_PurgeResult"
-#define PURGE_RESULT_END                       "</edg_wll_PurgeResult>\r\n"
-#define DUMP_RESULT_BEGIN                      "<edg_wll_DumpResult"
-#define DUMP_RESULT_END                                "</edg_wll_DumpResult>\r\n"
-#define LOAD_RESULT_BEGIN                      "<edg_wll_LoadResult"
-#define LOAD_RESULT_END                                "</edg_wll_LoadResult>\r\n"
-#define INDEXED_ATTRS_BEGIN                    "<edg_wll_GetIndexedAttributesResult"
-#define INDEXED_ATTRS_END                      "</edg_wll_GetIndexedAttributesResult>\r\n"
-#define NOTIF_RESULT_BEGIN                     "<edg_wll_NotifResult"
-#define NOTIF_RESULT_END                       "</edg_wll_NotifResult>\r\n"
-#define QUERY_SEQUENCE_CODE_RESULT_BEGIN       "<edg_wll_QuerySequenceCodeResult"
-#define QUERY_SEQUENCE_CODE_RESULT_END         "</edg_wll_QuerySequenceCodeResult>\r\n"
-
-#define STATS_RESULT_BEGIN     "<edg_wll_StatsResult"
-#define STATS_RESULT_END       "</edg_wll_StatsResult>\r\n"
-  
-  
-// XXX will be redundant soon
-#define USERJOBS_BEGIN         "<edg_wll_UserJobs"
-#define USERJOBS_END           "</edg_wll_UserJobs>\r\n"
-
-
-static char    *ops[] = { "equal","less","greater","within","unequal","changed" },
-               *attrs[] = {    "jobid","owner","status","location","destination",
-                               "donecode","usertag","time","level","host","source",
-                               "instance","type","chkpt_tag", "resubmitted", "parent_job",
-                               "exitcode", "jdl", "stateentertime", "lastupdatetime", 
-                               "networkserver"  };
-
-static const struct timeval null_timeval = {0,0};
-
-#define unexp() {\
-       char    *e;\
-\
-       if (XMLCtx->errtxt) {\
-               asprintf(&e,"%s\nunexpected <%s> at line %d",XMLCtx->errtxt,\
-                       el,XML_GetCurrentLineNumber(XMLCtx->p));\
-               free(XMLCtx->errtxt);\
-       } else asprintf(&e,"unexpected <%s> at line %d",\
-               el,XML_GetCurrentLineNumber(XMLCtx->p));\
-       XMLCtx->errtxt = e;\
-}
-
-
-
-static void startJobQueryRec(void *data, const char *el, const char **attr)
-{
-       unsigned int    i;
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"and")) unexp()
-                       break;
-               case 1: if (strcasecmp(el,"orJobConditions")) unexp()
-                       else {
-                               XMLCtx->position = -1;
-                               XMLCtx->job_conditions = realloc(XMLCtx->job_conditions,
-                                       (++XMLCtx->row+2)*sizeof(*XMLCtx->job_conditions));
-                               XMLCtx->job_conditions[XMLCtx->row] = NULL;
-                               XMLCtx->job_conditions[XMLCtx->row+1] = NULL;
-                       }
-                       break;
-               case 2:
-                       for (i=0; i<sizeof(ops)/sizeof(ops[0]); i++)
-                               if (!strcasecmp(el,ops[i])) break;
-                       if (i == sizeof(ops)/sizeof(ops[0])) unexp()
-                       else {
-                               if (!XMLCtx->job_conditions) break;
-
-                               /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */
-                               XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row],
-                                       (++XMLCtx->position+2)*sizeof(**XMLCtx->job_conditions));
-                               memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,2*sizeof(**XMLCtx->job_conditions));
-                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].op = i;
-                               XMLCtx->bound = 0;
-                       }
-                       break;
-               case 3: for (i=0; i<sizeof(attrs)/sizeof(attrs[0]) && 
-                               strcasecmp(el,attrs[i]); i++);
-                       if (i == sizeof(attrs)/sizeof(attrs[0])) unexp()
-                       else {
-                               if (!XMLCtx->job_conditions) break;
-                               if (!XMLCtx->job_conditions[XMLCtx->row]) break;
-
-                               if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                       if (strcmp(attr[0],"name")) { unexp() break;}
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]);
-                               } 
-                               else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME ) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                        if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
-                               }
-                               if ( (i+1) == EDG_WLL_QUERY_ATTR_JDL_ATTR) {
-                                       if (!attr[0] || !attr[1]) 
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = NULL;
-                                       else if (strcmp(attr[0],"name")) { unexp() break;}
-                                       else XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]);
-                               } 
-                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr = i+1;
-                       }               
-                       break;
-               default: unexp(); break;
-       }
-       XMLCtx->level++;
-}
-
-
-
-static void startQueryJobsRequest(void *data, const char *el, const char **attr)
-{
-       unsigned int    i;
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_QueryJobsRequest")) { unexp() break; }
-                       for ( i = 0; attr[i] && attr[i+1]; i += 2 )
-                       {
-                               if ( !strcmp(attr[i],"softLimit") )
-                                       XMLCtx->ctx->softLimit = atoi(attr[i+1]);
-                               else if ( !strcmp(attr[i],"queryRes") )
-                                       XMLCtx->ctx->p_query_results = atoi(attr[i+1]);
-                               else { unexp() break; }
-                       }
-                       break;
-               case 1: if (!strcasecmp(el,"and")) {
-                               XMLCtx->jobQueryRec_begin = XML_GetCurrentByteIndex(XMLCtx->p);
-                               break;
-                       }
-                       else if (!strcasecmp(el,"flags")) break;
-                       else unexp()
-                       break;
-               case 2: /* fall through */
-               case 3: /* do not check xml tags, processed in startJobQueryRec */
-               case 4: break;
-               default: unexp(); break;
-       }
-       XMLCtx->level++;
-}
-
-
-static void startQueryEventsRequest(void *data, const char *el, const char **attr UNUSED_VAR)
-{
-       unsigned int    i;
-       edg_wll_XML_ctx *XMLCtx = data;
-
-
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_QueryEventsRequest")) { unexp() break; }
-                       for ( i = 0; attr[i] && attr[i+1]; i += 2 )
-                       {
-                               if ( !strcmp(attr[i],"softLimit") )
-                                       XMLCtx->ctx->softLimit = atoi(attr[i+1]);
-                               else if ( !strcmp(attr[i],"queryRes") )
-                                       XMLCtx->ctx->p_query_results = atoi(attr[i+1]);
-                               else { unexp() break; }
-                       }
-                       break;
-               case 1: if (strcasecmp(el,"and")) unexp()
-                       break;
-               case 2: if (!strcasecmp(el,"orJobConditions")) {
-                               XMLCtx->type = EDG_WLL_QUERY_TYPE_JOB_CONDITION;
-                               XMLCtx->position = -1;
-                                XMLCtx->job_conditions = realloc(XMLCtx->job_conditions,
-                                        (++XMLCtx->row+2)*sizeof(*XMLCtx->job_conditions));
-                                XMLCtx->job_conditions[XMLCtx->row] = NULL;
-                                XMLCtx->job_conditions[XMLCtx->row+1] = NULL;
-
-                       }
-                       else if (!strcasecmp(el,"orEventConditions")) {
-                               XMLCtx->type = EDG_WLL_QUERY_TYPE_EVENT_CONDITION;
-                               XMLCtx->position2 = -1;
-                                XMLCtx->event_conditions = realloc(XMLCtx->event_conditions,
-                                        (++XMLCtx->row2+2)*sizeof(*XMLCtx->event_conditions));
-                                XMLCtx->event_conditions[XMLCtx->row2] = NULL;
-                                XMLCtx->event_conditions[XMLCtx->row2+1] = NULL;
-                       }
-                       else unexp()
-                       break;
-               case 3:
-                       for (i=0; i<sizeof(ops)/sizeof(ops[0]); i++)
-                               if (!strcasecmp(el,ops[i])) break;
-                       if (i == sizeof(ops)/sizeof(ops[0])) unexp()
-                       else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_JOB_CONDITION) {
-                               if (!XMLCtx->job_conditions) break;
-
-                               /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */
-                               XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row],
-                                       (++XMLCtx->position+2)*sizeof(**XMLCtx->job_conditions));
-                               memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,2*sizeof(**XMLCtx->job_conditions));
-                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].op = i;
-                               XMLCtx->bound = 0;
-                       }
-                       else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) {
-                               if (!XMLCtx->event_conditions) break;
-                               /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */
-                               XMLCtx->event_conditions[XMLCtx->row2] = realloc(XMLCtx->event_conditions[XMLCtx->row2],
-                                       (++XMLCtx->position2+2)*sizeof(**XMLCtx->event_conditions));
-                               memset(&XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2],0,2*sizeof(**XMLCtx->event_conditions));
-                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].op = i;
-                               XMLCtx->bound = 0;
-                       }
-                       
-                       break;
-               case 4: for (i=0; i<sizeof(attrs)/sizeof(attrs[0]) && 
-                               strcasecmp(el,attrs[i]); i++);
-                       if (i == sizeof(attrs)/sizeof(attrs[0])) unexp()
-                       else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_JOB_CONDITION) { 
-                               if (!XMLCtx->job_conditions[XMLCtx->row]) break;
-                               if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                       if (attr[0] && strcmp(attr[0],"name")) { unexp() break;}
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]);
-                               } 
-                               else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME ) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                        if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
-                                       printf("\nchecking time attr\n%s = %s (%d)\n\n", attr[0], attr[1], edg_wll_StringToStat(attr[1]));
-                               }
-                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr = i+1;
-                       }
-                       else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) {
-                               if (!XMLCtx->event_conditions[XMLCtx->row2]) break;
-                               if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                       if (attr[0] && strcmp(attr[0],"name")) { unexp() break;}
-                                       XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.tag = strdup(attr[1]);
-                               } 
-                               else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME ) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                        if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
-                                       XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
-                               }
-                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr = i+1;
-                       }
-                       break;
-               default: unexp(); break;
-       }
-       XMLCtx->level++;
-}
-
-
-
-static void startPurgeRequest(void *data, const char *el, const char **attr)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_PurgeRequest")) unexp()
-                       break;
-               case 1: if (strcasecmp(el,"jobs") && strcasecmp(el,"timeout")
-                               && strcasecmp(el,"flags") && strcasecmp(el,"target_runtime")) unexp()
-                       else 
-                               XMLCtx->position = 0;
-                       break;
-               case 2: if (!strcasecmp(el,"jobId")) {
-                               XMLCtx->purgeRequestGlobal.jobs = realloc(XMLCtx->purgeRequestGlobal.jobs,
-                                               (XMLCtx->position+2) * sizeof(XMLCtx->purgeRequestGlobal.jobs));
-
-                                if (!XMLCtx->purgeRequestGlobal.jobs) { 
-                                       edg_wll_SetError(XMLCtx->ctx, ENOMEM, NULL); 
-                                       unexp() return;
-                               }
-                                XMLCtx->purgeRequestGlobal.jobs[XMLCtx->position+1] = NULL;
-                       }
-                       else if (XMLCtx->tagToIndex(el) >= 0 ) {
-                               /* static array, no need to initialize & allocate anything */
-                       }
-                       else 
-                               unexp()
-                       break;
-               default: unexp() 
-                        break;
-       }
-       XMLCtx->level++;
-}
-
-
-static void startDumpRequest(void *data, const char *el, const char **attr)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_DumpRequest")) unexp()
-                       break;
-               case 1: if (strcasecmp(el,"from") && strcasecmp(el,"to")) unexp()
-                       break;
-               default: unexp() 
-                        break;
-       }
-       XMLCtx->level++;
-}
-
-
-
-static void startLoadRequest(void *data, const char *el, const char **attr)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_LoadRequest")) unexp()
-                       break;
-               case 1: if (strcasecmp(el,"server_file")) unexp()
-                       break;
-               default: unexp() 
-                        break;
-       }
-       XMLCtx->level++;
-}
-
-
-
-static void startNotifRequest(void *data, const char *el, const char **attr)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (!strcasecmp(el,"edg_wll_NotifRequest") && attr[0] && attr[1]) {
-                               if (strcmp(attr[0],"function")) { unexp() break;}
-                               else XMLCtx->notifFunction = strdup(attr[1]);
-                       }
-                       else unexp()
-                       break;
-               case 1: if (!strcasecmp(el,"and")) {
-                               XMLCtx->jobQueryRec_begin = XML_GetCurrentByteIndex(XMLCtx->p);
-                       }
-                       else if ( (strcasecmp(el,"notifId")) && (strcasecmp(el,"clientAddress")) && 
-                               (strcasecmp(el,"notifChangeOp")) && (strcasecmp(el,"requestedValidity")) &&
-                               (strcasecmp(el,"flags")) ) unexp()
-                       break;
-               case 2: /* fall through */
-               case 3: /* do not check xml tags, processed in startJobQueryRec */
-               case 4: break;
-               default: unexp() 
-                        break;
-       }
-       XMLCtx->level++;
-}
-
-
-
-static void startQuerySequenceCodeRequest(void *data, const char *el, const char **attr)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_QuerySequenceCodeRequest")) unexp()
-                       break;
-               case 1: if ( (strcasecmp(el,"jobId")) && (strcasecmp(el,"source")) ) unexp()
-                       break;
-               default: unexp() 
-                        break;
-       }
-       XMLCtx->level++;
-}
-
-
-
-static void startStatsRequest(void *data, const char *el, const char **attr)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (!strcasecmp(el,"edg_wll_StatsRequest") && attr[0] && attr[1]) {
-                               if (strcmp(attr[0],"function")) { unexp() break;}
-                               else XMLCtx->statsFunction = strdup(attr[1]);
-                       }
-                       else unexp()
-                       break;
-               case 1: if (!strcasecmp(el,"and")) {
-                               XMLCtx->jobQueryRec_begin = XML_GetCurrentByteIndex(XMLCtx->p);
-                       }
-                       else if ( (strcasecmp(el,"major")) && (strcasecmp(el,"minor")) && 
-                               (strcasecmp(el,"from")) && (strcasecmp(el,"to")) ) unexp()
-                       break;
-               case 2: /* fall through */
-               case 3: /* do not check xml tags, processed in startJobQueryRec */
-               case 4: break;
-               default: unexp() 
-                        break;
-       }
-       XMLCtx->level++;
-}
-
-#undef unexp
-
-
-static void char_handler(void *data, const char *s, int len)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-        int i, found = -1;
-       char *temp_s;
-
-
-       /* if date are only spaces, t\, \r, \n ... don't bother with them */
-        for (i=0; i<len; i++)  
-                       if (!isspace(s[i])) { found = i; break; }
-        if (found == -1) return;
-
-       temp_s = realloc(XMLCtx->char_buf, XMLCtx->char_buf_len + len + 1);
-       if (temp_s == NULL) {
-          /* XXX propagate ENOMEM somehow */
-          return;
-       }
-       XMLCtx->char_buf = temp_s;
-       memcpy(XMLCtx->char_buf + XMLCtx->char_buf_len, s, len);
-       XMLCtx->char_buf[XMLCtx->char_buf_len + len] = '\0';
-       XMLCtx->char_buf_len += len;
-}
-
-
-
-static void endJobQueryRec(void *data, const char *el UNUSED_VAR)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-       char *e;
-       char *s;
-
-
-       if (XMLCtx->level == 4 &&
-               XMLCtx->job_conditions != NULL &&
-               XMLCtx->job_conditions[XMLCtx->row] != NULL) {
-               switch (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr) {
-                       case EDG_WLL_QUERY_ATTR_JOBID:
-                       case EDG_WLL_QUERY_ATTR_PARENT:
-                               if ( (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.j = 
-                                       edg_wll_from_string_to_jobid(XMLCtx)) == NULL )
-                               {
-                                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                                       if (XMLCtx->errtxt) {
-                                               asprintf(&e,"%s\n%s: invalid JobId at line %d",
-                                                       XMLCtx->errtxt, s,
-                                                       XML_GetCurrentLineNumber(XMLCtx->p));
-                                               free(XMLCtx->errtxt);
-                                       } else asprintf(&e,"%s: invalid JobId at line %d",
-                                               s,XML_GetCurrentLineNumber(XMLCtx->p));
-                                       XMLCtx->errtxt = e;
-                                       free(s);
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_OWNER:
-                       // XXX - this is way how to pass NULL, user will be extracted from ssl partner later
-                               /* XXX char_buf contains an escaped value, however there's nothing to escape in 'NULL' so we're fine */
-                               if (XMLCtx->char_buf != NULL && !strcmp(XMLCtx->char_buf,"NULL")) {  
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c = NULL; 
-                                       break; 
-                               }
-                               else /* fall through */
-                       case EDG_WLL_QUERY_ATTR_LOCATION:
-                       case EDG_WLL_QUERY_ATTR_DESTINATION:
-                       case EDG_WLL_QUERY_ATTR_NETWORK_SERVER:
-                       case EDG_WLL_QUERY_ATTR_USERTAG:
-                       case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c = 
-                                       edg_wll_from_string_to_string(XMLCtx);
-                               break;
-                       case EDG_WLL_QUERY_ATTR_STATUS:
-                               if ( !XMLCtx->bound )
-                               {
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = 
-                                               edg_wll_from_string_to_edg_wll_JobStatCode(XMLCtx);
-                                       XMLCtx->bound++;
-                               }
-                               else
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.i = 
-                                               edg_wll_from_string_to_edg_wll_JobStatCode(XMLCtx);
-
-                               break;
-                       case EDG_WLL_QUERY_ATTR_DONECODE:
-                       case EDG_WLL_QUERY_ATTR_EXITCODE:
-                       case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-                               if ( !XMLCtx->bound )
-                               {
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = 
-                                               edg_wll_from_string_to_int(XMLCtx);
-                                       XMLCtx->bound++;
-                               }
-                               else
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.i = 
-                                               edg_wll_from_string_to_int(XMLCtx);
-
-                               break;
-                       case EDG_WLL_QUERY_ATTR_TIME:
-                       case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-                       case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                               if ( !XMLCtx->bound )
-                               {
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec = 
-                                               edg_wll_from_string_to_time_t(XMLCtx);
-                                       XMLCtx->bound++;
-                               }
-                               else
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec =
-                                               edg_wll_from_string_to_time_t(XMLCtx);
-                               break;
-                       default: 
-                               edg_wll_freeBuf(XMLCtx);
-                               XMLCtx->level--;
-                               s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                               if (XMLCtx->errtxt) {
-                                       asprintf(&e,"%s\n%s: invalid attribute type at line %d",
-                                               XMLCtx->errtxt, s,
-                                               XML_GetCurrentLineNumber(XMLCtx->p));
-                                       free(XMLCtx->errtxt);
-                               } else asprintf(&e,"%s: invalid attribute type at line %d",
-                                       s,XML_GetCurrentLineNumber(XMLCtx->p));
-                               XMLCtx->errtxt = e;
-                               free(s);
-                               break;
-               }
-       }
-       edg_wll_freeBuf(XMLCtx);
-       XMLCtx->level--;
-}
-
-
-
-static void endQueryJobsRequest(void *data, const char *el UNUSED_VAR)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-       char *s;
-
-
-       if (XMLCtx->level == 2) {
-               if (!strcmp(XMLCtx->element,"flags") && XMLCtx->char_buf) {
-                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                       // XXX: check if it works
-                       XMLCtx->flags = edg_wll_string_to_stat_flags(s);
-                       free(s);
-               }
-               else if (!strcmp(el,"and")) {
-                       long len = (XML_GetCurrentByteIndex(XMLCtx->p) + XML_GetCurrentByteCount(XMLCtx->p))
-                                       -  XMLCtx->jobQueryRec_begin;
-
-                       parseJobQueryRec(XMLCtx->ctx, XMLCtx->message_body + XMLCtx->jobQueryRec_begin, len,
-                               &XMLCtx->job_conditions);
-               }
-       }
-       edg_wll_freeBuf(XMLCtx);
-       XMLCtx->level--;
-}
-
-
-static void endQueryEventsRequest(void *data, const char *el UNUSED_VAR)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-       char *e;
-       char *s;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"orJobConditions")) {
-                        /* make end-of-row */
-                        XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row],
-                                (++XMLCtx->position+1)*sizeof(**XMLCtx->job_conditions));
-                        memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,sizeof(**XMLCtx->job_conditions));
-                }
-               else if (!strcmp(XMLCtx->element,"orEventConditions")) {
-                        /* make end-of-row */
-                        XMLCtx->event_conditions[XMLCtx->row2] = realloc(XMLCtx->event_conditions[XMLCtx->row2],
-                                (++XMLCtx->position2+1)*sizeof(**XMLCtx->event_conditions));
-                        memset(&XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2],0,sizeof(**XMLCtx->event_conditions));
-                }
-       }
-       else if (XMLCtx->level == 5) {
-               if (XMLCtx->type == EDG_WLL_QUERY_TYPE_JOB_CONDITION &&
-                       XMLCtx->job_conditions != NULL &&
-                       XMLCtx->job_conditions[XMLCtx->row] !=NULL) {
-                       switch (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr) {
-                               case EDG_WLL_QUERY_ATTR_JOBID:
-                               case EDG_WLL_QUERY_ATTR_PARENT:
-                                       if ( (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.j = 
-                                               edg_wll_from_string_to_jobid(XMLCtx)) == NULL )
-                                       {
-                                               s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                                               if (XMLCtx->errtxt) {
-                                                       asprintf(&e,"%s\n%s: invalid JobId at line %d",
-                                                               XMLCtx->errtxt, s,
-                                                               XML_GetCurrentLineNumber(XMLCtx->p));
-                                                       free(XMLCtx->errtxt);
-                                               } else asprintf(&e,"%s: invalid JobId at line %d",
-                                                       s,XML_GetCurrentLineNumber(XMLCtx->p));
-                                               XMLCtx->errtxt = e;
-                                               free(s);
-                                       }
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_OWNER:
-                               case EDG_WLL_QUERY_ATTR_LOCATION:
-                               case EDG_WLL_QUERY_ATTR_DESTINATION:
-                               case EDG_WLL_QUERY_ATTR_USERTAG:
-                               case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c = 
-                                               edg_wll_from_string_to_string(XMLCtx);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_STATUS:
-                               case EDG_WLL_QUERY_ATTR_DONECODE:
-                               case EDG_WLL_QUERY_ATTR_EXITCODE:
-                               case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-                                       if ( !XMLCtx->bound )
-                                       {
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = 
-                                                       edg_wll_from_string_to_int(XMLCtx);
-                                               XMLCtx->bound++;
-                                       }
-                                       else
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.i = 
-                                                       edg_wll_from_string_to_int(XMLCtx);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_TIME:
-                               case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-                                       if ( !XMLCtx->bound )
-                                       {
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec = 
-                                                       edg_wll_from_string_to_time_t(XMLCtx);
-                                               XMLCtx->bound++;
-                                       }
-                                       else
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec =
-                                                       edg_wll_from_string_to_time_t(XMLCtx);
-                                       break;
-                               default: 
-                                       edg_wll_freeBuf(XMLCtx);
-                                       XMLCtx->level--;
-                                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                                       if (XMLCtx->errtxt) {
-                                               asprintf(&e,"%s\n%s: invalid attribute type at line %d",
-                                                       XMLCtx->errtxt, s,
-                                                       XML_GetCurrentLineNumber(XMLCtx->p));
-                                               free(XMLCtx->errtxt);
-                                       } else asprintf(&e,"%s: invalid attribute type at line %d",
-                                               s,XML_GetCurrentLineNumber(XMLCtx->p));
-                                       XMLCtx->errtxt = e;
-                                       free(s);
-                                       break;
-                       }
-               }
-               else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION &&
-                       XMLCtx->event_conditions != NULL &&
-                       XMLCtx->event_conditions[XMLCtx->row2] != NULL) {
-                       switch (XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr) {
-                               case EDG_WLL_QUERY_ATTR_TIME:
-                                       if ( !XMLCtx->bound )
-                                       {
-                                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.t.tv_sec = 
-                                                       edg_wll_from_string_to_time_t(XMLCtx);
-                                               XMLCtx->bound++;
-                                       }
-                                       else
-                                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value2.t.tv_sec =
-                                                       edg_wll_from_string_to_time_t(XMLCtx);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_LEVEL:
-                               case EDG_WLL_QUERY_ATTR_SOURCE:
-                               case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
-                                       if ( !XMLCtx->bound )
-                                       {
-                                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.i =
-                                                       edg_wll_from_string_to_int(XMLCtx);
-                                               XMLCtx->bound++;
-                                       }
-                                       else
-                                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value2.i =
-                                                       edg_wll_from_string_to_int(XMLCtx);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_HOST:
-                               case EDG_WLL_QUERY_ATTR_INSTANCE:
-                               case EDG_WLL_QUERY_ATTR_USERTAG:
-                               case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                                       XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.c =
-                                               edg_wll_from_string_to_string(XMLCtx);
-                                       break;
-                               default: 
-                                       edg_wll_freeBuf(XMLCtx);
-                                       XMLCtx->level--;
-                                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                                       if (XMLCtx->errtxt) {
-                                               asprintf(&e,"%s\n%s: invalid attribute type at line %d",
-                                                       XMLCtx->errtxt, s,
-                                                       XML_GetCurrentLineNumber(XMLCtx->p));
-                                               free(XMLCtx->errtxt);
-                                       } else asprintf(&e,"%s: invalid attribute type at line %d",
-                                               s,XML_GetCurrentLineNumber(XMLCtx->p));
-                                       XMLCtx->errtxt = e;
-                                       free(s);
-                                       break;
-                       }
-               } 
-       
-               edg_wll_freeBuf(XMLCtx);
-       }
-       XMLCtx->level--;
-}
-
-
-static void endPurgeRequest(void *data, const char *el UNUSED_VAR)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-        char *e, *s;
-       int index;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"flags")) {
-                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                       XMLCtx->purgeRequestGlobal.flags = edg_wll_string_to_purge_flags(s);
-                       free(s);
-               } else if (!strcmp(XMLCtx->element,"target_runtime")) {
-                       XMLCtx->purgeRequestGlobal.target_runtime = edg_wll_from_string_to_time_t(XMLCtx);
-               }
-       }
-       else if (XMLCtx->level == 3) {
-               if (!strcmp(XMLCtx->element,"jobId") && XMLCtx->purgeRequestGlobal.jobs != NULL) {
-                       if ( (XMLCtx->purgeRequestGlobal.jobs[XMLCtx->position++] = 
-                               edg_wll_from_string_to_string(XMLCtx)) == NULL )
-                       {
-                               /* XXX char_buf contains an escaped value, unescaping is done within edg_wll_from_string_to_string(), which failed */
-                               if (XMLCtx->errtxt) {
-                                       asprintf(&e,"%s\n%s: invalid JobId at line %d",
-                                               XMLCtx->errtxt, XMLCtx->char_buf,
-                                               XML_GetCurrentLineNumber(XMLCtx->p));
-                                       free(XMLCtx->errtxt);
-                               } else asprintf(&e,"%s: invalid JobId at line %d",
-                                       XMLCtx->char_buf,XML_GetCurrentLineNumber(XMLCtx->p));
-                               XMLCtx->errtxt = e;
-                       }
-               }
-               else if ( ((index = XMLCtx->tagToIndex(XMLCtx->element)) >= 0 ) && XMLCtx->char_buf ) {
-                       XMLCtx->purgeRequestGlobal.timeout[index] = 
-                               edg_wll_from_string_to_time_t(XMLCtx);
-               }
-       }
-
-       edg_wll_freeBuf(XMLCtx);
-       XMLCtx->level--;
-}
-
-
-static void endDumpRequest(void *data, const char *el UNUSED_VAR)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-       char *s;
-
-        if (XMLCtx->level == 2) {
-               s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                if (!strcmp(XMLCtx->element,"from")) {
-                       if (isdigit(s[0]))
-                       XMLCtx->dumpRequestGlobal.from = edg_wll_from_string_to_time_t(XMLCtx);
-                       else
-                               XMLCtx->dumpRequestGlobal.from = edg_wll_StringToDumpConst(s);
-               }
-               else if (!strcmp(XMLCtx->element,"to")) {
-                       if (isdigit(s[0]))
-                        XMLCtx->dumpRequestGlobal.to = edg_wll_from_string_to_time_t(XMLCtx);
-                       else
-                               XMLCtx->dumpRequestGlobal.to = edg_wll_StringToDumpConst(s);
-               }
-               free(s);
-       }
-
-       edg_wll_freeBuf(XMLCtx);
-       XMLCtx->level--;
-}
-
-
-
-static void endLoadRequest(void *data, const char *el UNUSED_VAR)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"server_file")) 
-                       XMLCtx->loadRequestGlobal.server_file = edg_wll_from_string_to_string(XMLCtx);
-       }
-
-       edg_wll_freeBuf(XMLCtx);
-       XMLCtx->level--;
-}
-
-
-
-static void endNotifRequest(void *data, const char *el UNUSED_VAR)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-       char *pom;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"notifId")) {
-                       pom = edg_wll_from_string_to_string(XMLCtx);
-                       edg_wll_NotifIdParse(pom, &XMLCtx->notifId);
-                       free(pom);
-               }
-               else if (!strcmp(XMLCtx->element,"clientAddress")) {
-                       XMLCtx->notifClientAddress = edg_wll_from_string_to_string(XMLCtx);
-               }
-               else if (!strcmp(XMLCtx->element,"notifChangeOp")) {
-                       pom = edg_wll_from_string_to_string(XMLCtx);
-                       XMLCtx->notifChangeOp = edg_wll_StringToNotifChangeOp(pom);
-                       free(pom);
-               }
-               else if (!strcmp(XMLCtx->element,"requestedValidity")) {
-                       XMLCtx->notifValidity = edg_wll_from_string_to_time_t(XMLCtx);
-               }
-               else if (!strcmp(el,"and")) {
-                       long len = (XML_GetCurrentByteIndex(XMLCtx->p) + XML_GetCurrentByteCount(XMLCtx->p))
-                                       -  XMLCtx->jobQueryRec_begin;
-       
-                       parseJobQueryRec(XMLCtx->ctx, XMLCtx->message_body + XMLCtx->jobQueryRec_begin, len,
-                               &XMLCtx->job_conditions);
-               }
-               else if (!strcmp(XMLCtx->element,"flags") && XMLCtx->char_buf) {
-                       char    *s;
-
-                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                       // XXX: check if it works
-                       XMLCtx->flags = edg_wll_string_to_stat_flags(s);
-                       free(s);
-               }
-
-       }
-
-       edg_wll_freeBuf(XMLCtx);
-       XMLCtx->level--;
-}
-
-
-
-static void endQuerySequenceCodeRequest(void *data, const char *el UNUSED_VAR)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"jobId")) {
-                       XMLCtx->jobId = edg_wll_from_string_to_jobid(XMLCtx);
-               }
-               else if (!strcmp(XMLCtx->element,"source")) {
-                       XMLCtx->source = edg_wll_from_string_to_string(XMLCtx);
-               }
-       }
-
-       edg_wll_freeBuf(XMLCtx);
-       XMLCtx->level--;
-}
-
-
-
-
-static void endStatsRequest(void *data, const char *el UNUSED_VAR)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"major")) {
-                       XMLCtx->statsMajor = 
-                               edg_wll_from_string_to_edg_wll_JobStatCode(XMLCtx);
-               }
-               else if (!strcmp(XMLCtx->element,"minor")) {
-                       XMLCtx->statsMinor = edg_wll_from_string_to_int(XMLCtx);
-               }
-               else if (!strcmp(XMLCtx->element,"from")) {
-                       XMLCtx->statsFrom = edg_wll_from_string_to_time_t(XMLCtx);;
-               }
-               else if (!strcmp(XMLCtx->element,"to")) {
-                       XMLCtx->statsTo = edg_wll_from_string_to_time_t(XMLCtx);;
-               }
-               else if (!strcmp(el,"and")) {
-                       long len = (XML_GetCurrentByteIndex(XMLCtx->p) + XML_GetCurrentByteCount(XMLCtx->p))
-                                       -  XMLCtx->jobQueryRec_begin;
-       
-                       parseJobQueryRec(XMLCtx->ctx, XMLCtx->message_body + XMLCtx->jobQueryRec_begin, len,
-                               &XMLCtx->statsConditions);
-               }
-       }
-
-       edg_wll_freeBuf(XMLCtx);
-       XMLCtx->level--;
-}
-
-
-
-int parseJobQueryRec(edg_wll_Context ctx, const char *messageBody, long len, edg_wll_QueryRec ***conditions)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.row = -1;
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startJobQueryRec, endJobQueryRec);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, len, 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i,j;
-
-               if (XMLCtx.job_conditions) {
-                       for (j = 0; XMLCtx.job_conditions[j]; j++) {
-                               for (i = 0; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]);
-                               free(XMLCtx.job_conditions[j]);
-                       }
-                       free(XMLCtx.job_conditions);
-               }
-
-               /* empty list terminators */
-               conditions[0] = NULL;
-       } else {
-               *conditions = XMLCtx.job_conditions;
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-/* parse queryJobs request from client */
-int parseQueryJobsRequest(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***conditions, int *flags)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       XMLCtx.message_body = messageBody;
-       XMLCtx.position = 0;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startQueryJobsRequest, endQueryJobsRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i,j;
-
-               if (XMLCtx.job_conditions) {
-                       for (j = 0; XMLCtx.job_conditions[j]; j++) {
-                               for (i = 0; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]);
-                               free(XMLCtx.job_conditions[j]);
-                       }
-                       free(XMLCtx.job_conditions);
-               }
-
-               /* empty list terminators */
-               conditions[0] = NULL;
-               *flags = 0;
-       } else {
-               *conditions = XMLCtx.job_conditions;
-               *flags = XMLCtx.flags;
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-/* parse queryEvents request from client */
-int parseQueryEventsRequest(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***job_conditions, edg_wll_QueryRec ***event_conditions)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.row = -1;
-       XMLCtx.row2 = -1;
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startQueryEventsRequest, endQueryEventsRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i,j;
-
-               if (XMLCtx.job_conditions) {
-                       for (j = 0; XMLCtx.job_conditions[j]; j++) {
-                               for (i = 0 ; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]);
-                               free(XMLCtx.job_conditions[j]);
-                       }
-                       free(XMLCtx.job_conditions);
-               }
-               if (XMLCtx.event_conditions) {
-                       for (j = 0; XMLCtx.event_conditions[j]; j++) {
-                               for (i = 0 ; (XMLCtx.event_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.event_conditions[j][i]);
-                               free(XMLCtx.event_conditions[j]);
-                       }
-                       free(XMLCtx.event_conditions);
-               }
-
-               /* empty list terminators */
-               job_conditions[0] = NULL;
-               event_conditions[0] = NULL;
-       } else {
-               *job_conditions = XMLCtx.job_conditions;
-               *event_conditions = XMLCtx.event_conditions;
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-
-/* parse purge request from client */
-int parsePurgeRequest(edg_wll_Context ctx, char *messageBody, int (*tagToIndex)(), edg_wll_PurgeRequest *request)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-       XMLCtx.tagToIndex = tagToIndex;
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startPurgeRequest, endPurgeRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i;
-
-               if (XMLCtx.purgeRequestGlobal.jobs) {
-                       for (i=0; XMLCtx.purgeRequestGlobal.jobs[i]; i++) 
-                               free(XMLCtx.purgeRequestGlobal.jobs[i]);
-                       free(XMLCtx.purgeRequestGlobal.jobs);
-               }
-               memset(request,0,sizeof(*request));
-               
-       } else {
-               memcpy(request, &XMLCtx.purgeRequestGlobal, sizeof(XMLCtx.purgeRequestGlobal));
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-
-/* parse dump request from client */
-int parseDumpRequest(edg_wll_Context ctx, char *messageBody, edg_wll_DumpRequest *request)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startDumpRequest, endDumpRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) 
-               memset(request,0,sizeof(*request));
-               
-       else {
-               memcpy(request, &XMLCtx.dumpRequestGlobal, sizeof(XMLCtx.dumpRequestGlobal));
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-/* parse load request from client */
-int parseLoadRequest(edg_wll_Context ctx, char *messageBody, edg_wll_LoadRequest *request)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startLoadRequest, endLoadRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) 
-               memset(request,0,sizeof(*request));
-               
-       else {
-               memcpy(request, &XMLCtx.loadRequestGlobal, sizeof(XMLCtx.loadRequestGlobal));
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-
-
-/* parse Stats request from client */
-int parseStatsRequest(edg_wll_Context ctx, char *messageBody, char **function, edg_wll_QueryRec ***conditions, edg_wll_JobStatCode *major, int *minor, time_t *from, time_t *to) 
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       
-       /* returns emty variables as default; only some variables will be filled in */
-       /* depending on vaule of XMLCtx.notifFunction */
-       *function = NULL;
-       *major = EDG_WLL_JOB_UNDEF;
-       *minor = 0;
-       *from = 0;
-       *to = 0;
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       XMLCtx.message_body = messageBody;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startStatsRequest, endStatsRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i,j;
-
-               if (XMLCtx.statsConditions) {
-                       for (j = 0; XMLCtx.statsConditions[j]; j++) {
-                               for (i = 0; (XMLCtx.statsConditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.statsConditions[j][i]);
-                               free(XMLCtx.statsConditions[j]);
-                       }
-                       free(XMLCtx.statsConditions);
-               }
-               free(XMLCtx.notifFunction);
-
-               *function = NULL;
-               *conditions = NULL;
-               *major = EDG_WLL_JOB_UNDEF;
-               *minor = 0;
-               *from = 0;
-               *to = 0;
-       } 
-       else {
-               *function = XMLCtx.statsFunction;
-               *conditions = XMLCtx.statsConditions;
-               *major = XMLCtx.statsMajor;
-               *minor = XMLCtx.statsMinor;
-               *from = XMLCtx.statsFrom;
-               *to = XMLCtx.statsTo;
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-/* parse Notif request from client */
-int parseNotifRequest(edg_wll_Context ctx, char *messageBody, char **function, edg_wll_NotifId *notifId, char **address, edg_wll_NotifChangeOp *op, time_t *validity, edg_wll_QueryRec ***conditions, int *flags) 
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       
-       /* returns emty variables as default; only some variables will be filled in */
-       /* depending on vaule of XMLCtx.notifFunction */
-       *function = NULL;
-       *notifId = NULL;
-       *address = NULL;
-       *op = EDG_WLL_NOTIF_NOOP;
-       *conditions = NULL;
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       XMLCtx.message_body = messageBody;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startNotifRequest, endNotifRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i,j;
-
-               if (XMLCtx.job_conditions) {
-                       for (j = 0; XMLCtx.job_conditions[j]; j++) {
-                               for (i = 0; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]);
-                               free(XMLCtx.job_conditions[j]);
-                       }
-                       free(XMLCtx.job_conditions);
-               }
-               free(XMLCtx.notifFunction);
-               edg_wll_NotifIdFree(XMLCtx.notifId);
-               free(XMLCtx.notifClientAddress);
-
-               *function = NULL;
-               *notifId = NULL;
-               *address = NULL;
-               *op = EDG_WLL_NOTIF_NOOP;
-               *validity = 0;
-               *conditions = NULL;
-               *flags = 0;
-       } else {
-               *function = XMLCtx.notifFunction;
-               *notifId = XMLCtx.notifId;
-               *address = XMLCtx.notifClientAddress;
-               *op = XMLCtx.notifChangeOp;
-               *validity = XMLCtx.notifValidity;
-               *conditions = XMLCtx.job_conditions;
-               *flags = XMLCtx.flags;
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-
-/* parse Sequence Code request from client */
-int parseQuerySequenceCodeRequest(edg_wll_Context ctx, char *messageBody, edg_wlc_JobId *jobId, char **source)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startQuerySequenceCodeRequest, endQuerySequenceCodeRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               if (XMLCtx.jobId)
-                        edg_wlc_JobIdFree(XMLCtx.jobId);
-
-               *jobId = NULL;
-               *source = NULL;
-       }
-       else {
-               *jobId = XMLCtx.jobId;
-               *source = XMLCtx.source;
-       }
-       
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-
-
-int edg_wll_QueryEventsToXML(edg_wll_Context ctx, edg_wll_Event *eventsOut, char **message)
-{
-        char *pomA, *pomB;
-       char **list = NULL;
-        int i = 0, len, tot_len = 0;
-       int *len_list = NULL;
-
-
-        while (eventsOut && eventsOut[i].any.type != EDG_WLL_EVENT_UNDEF) {
-               pomB = edg_wll_EventToString(eventsOut[i].any.type);
-                trio_asprintf(&pomA,"      <edg_wll_Event name=\"%|Xs\">\r\n", pomB);
-               free(pomB);
-               pomB = pomA;
-
-
-@@@{
-        selectType $event '_common_';
-        for (getFieldsOrdered $event) {
-                my $f = selectField $event $_;
-                my $ft = $f->{type};
-               my $n = $f->{null};
-                gen "\tedg_wll_add_$ft\_to_XMLBody(&pomB, eventsOut[i].any.$_, \"$_\", $n);\n";
-        }
-
-        gen "\tswitch (eventsOut[i].any.type) {\n";
-        for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) {
-                if ($t ne 'any') {
-                        selectType $event $t;
-                        my $u = uc $t;
-                        gen "\t    case EDG_WLL_EVENT_$u :\n";
-                        for (getFieldsOrdered $event) {
-                                my $f = selectField $event $_;
-                                my $ft = $f->{type};
-                               my $n = $f->{null};
-                               $t = lcfirst $t;
-                               if ($t =~ m/^pBS/) { $t = ucfirst $t; }
-                               if ($t =~ m/^condor/) { $t = ucfirst $t; }
-                                gen "\t\tedg_wll_add_$ft\_to_XMLBody(&pomB, eventsOut[i].$t.$_, \"$_\", $n);\n";
-                        }
-                       gen "\t\tbreak;\n";
-               }
-        }
-        gen "\t    default : break;\n";
-        gen "\t}\n";
-@@@}
-
-
-
-                len = asprintf(&pomA,"%s      </edg_wll_Event>\r\n", pomB);
-                free(pomB);
-                i++;
-               tot_len += len;
-
-               list      = (char **) realloc(list, i * sizeof(*list));
-               list[i-1] = pomA;
-               len_list      = (int *) realloc(len_list, i * sizeof(*len_list));
-               len_list[i-1] = len;
-               
-        }
-
-       /* list termination */
-       list = (char **) realloc(list, (i+1) * sizeof(*list));
-        list[i] = NULL;
-
-       /* test errors */
-       if (ctx->errDesc || ctx->errCode)
-               len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc);
-       else
-               len = asprintf(&pomB,">\r\n");
-
-       /* glueing all list fields together & freeing the list */
-       pomA = (char *) malloc(tot_len  * sizeof(char) + 
-                               sizeof(QUERY_EVENTS_BEGIN) + len + sizeof(QUERY_EVENTS_END) - 1);
-       
-       memcpy(pomA, QUERY_EVENTS_BEGIN, sizeof(QUERY_EVENTS_BEGIN));
-       memcpy(pomA + sizeof(QUERY_EVENTS_BEGIN) - 1, pomB, len);
-       free(pomB);
-       pomB = pomA + sizeof(QUERY_EVENTS_BEGIN) + len - 1;     
-
-       i = 0;
-       while (list[i]) {
-                memcpy(pomB, list[i], len_list[i] );
-               pomB += len_list[i];
-
-               /* freeing the list */
-               free(list[i]);
-
-                i++;
-        }
-
-       strcpy(pomB, QUERY_EVENTS_END);
-
-
-       free(list);
-       free(len_list);
-
-
-        *message = pomA;
-
-        return 0;
-}
-
-int edg_wll_QueryJobsToXML(edg_wll_Context ctx, edg_wlc_JobId *jobsIn, edg_wll_JobStat *statesIn, char **message) 
-{
-        char *pomA, *pomB, *pomC;
-        char **list = NULL;
-        int i = 0, len, tot_len = 0, nres = 0;
-        int *len_list = NULL;
-
-       
-       if (jobsIn) for (nres = 0; jobsIn[nres]; nres++);
-       else if (statesIn) for (nres = 0; statesIn[nres].state; nres++);
-
-        while (i < nres) {
-                trio_asprintf(&pomA,"\t<edg_wll_Job>\r\n");
-                pomB = pomA;
-               
-               if (jobsIn) {
-                       trio_asprintf(&pomA,"%s\t\t<jobId>%|Xs</jobId>\r\n",
-                               pomB, pomC=edg_wlc_JobIdUnparse(jobsIn[i]));
-                       free(pomC);
-                       free(pomB);
-                       pomB = pomA;
-               }
-
-               if (statesIn) {
-                       edg_wll_JobStatusToXML(ctx, statesIn[i], &pomC);        
-                       trio_asprintf(&pomA,"%s\t\t%s",pomB,pomC);
-               }
-               else {
-                       pomC = edg_wll_StatToString(EDG_WLL_JOB_UNKNOWN);
-                       trio_asprintf(&pomA,"%s\t\t<jobStat name=\"%|Xs\">\r\n\r\n\t\t</jobStat>\r\n",
-                               pomB, pomC);
-               }
-
-               free(pomB);
-               free(pomC);
-               pomB = pomA;
-       
-
-                len = asprintf(&pomA,"%s\t</edg_wll_Job>\r\n", pomB);
-                free(pomB);
-                i++;
-                tot_len += len;
-
-                list      = (char **) realloc(list, i * sizeof(*list));
-                list[i-1] = pomA;
-                len_list      = (int *) realloc(len_list, i * sizeof(*len_list));
-                len_list[i-1] = len;   
-       }
-       
-       /* list termination */
-       list = (char **) realloc(list, (i+1) * sizeof(*list));
-        list[i] = NULL;
-
-        /* test errors */
-        if (ctx->errDesc || ctx->errCode)
-                len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc);
-        else
-                len = asprintf(&pomB,">\r\n");
-
-       /* glueing all list fields together & freeing the list */
-       pomA = (char *) malloc(tot_len  * sizeof(char) + 
-                               sizeof(QUERY_JOBS_BEGIN) + len + sizeof(QUERY_JOBS_END) - 1);
-       
-       memcpy(pomA, QUERY_JOBS_BEGIN, sizeof(QUERY_JOBS_BEGIN));       
-        memcpy((pomA + sizeof(QUERY_JOBS_BEGIN) - 1), pomB, len);
-        free(pomB);
-       pomB = pomA + sizeof(QUERY_JOBS_BEGIN) + len - 1;       
-
-       i = 0;
-       while (list[i]) {
-                memcpy(pomB, list[i], len_list[i] );
-               pomB += len_list[i];
-
-               /* freeing the list */
-               free(list[i]);
-
-                i++;
-        }
-
-       strcpy(pomB, QUERY_JOBS_END);
-
-
-       free(list);
-       free(len_list);
-
-
-        *message = pomA;
-
-       return 0;
-}
-
-/* construct Message-Body of Response-Line for edg_wll_UserJobs */
-int edg_wll_UserJobsToXML(edg_wll_Context ctx, edg_wlc_JobId *jobsOut, char **message)
-{
-        char *pomA, *pomB;
-        char **list = NULL;
-        int i = 0, len, tot_len = 0;
-        int *len_list = NULL;
-
-
-        while (jobsOut[i]) {
-               len = trio_asprintf(&pomA,"      <jobId>%|Xs</jobId>\r\n",
-                       pomB=edg_wlc_JobIdUnparse(jobsOut[i]));
-
-                free(pomB);
-
-                i++;
-                tot_len += len;
-
-                list      = (char **) realloc(list, i * sizeof(*list));
-                list[i-1] = pomA;
-               pomA = NULL;
-                len_list      = (int *) realloc(len_list, i * sizeof(*len_list));
-                len_list[i-1] = len;
-
-        }
-
-        /* list termination */
-        list = (char **) realloc(list, (i+1) * sizeof(*list));
-        list[i] = NULL;
-
-        /* test errors */
-        if (ctx->errDesc || ctx->errCode)
-                len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc);
-        else
-                len = asprintf(&pomB,">\r\n");
-
-        /* glueing all list fields together & freeing the list */
-        pomA = (char *) malloc(tot_len  * sizeof(char) +
-                                sizeof(USERJOBS_BEGIN) + len + sizeof(USERJOBS_END) - 1);
-
-        memcpy(pomA, USERJOBS_BEGIN, sizeof(USERJOBS_BEGIN));
-        memcpy((pomA + sizeof(USERJOBS_BEGIN) - 1), pomB, len);
-        free(pomB);
-        pomB = pomA + sizeof(USERJOBS_BEGIN) + len - 1;
-
-        i = 0;
-        while (list[i]) {
-                memcpy(pomB, list[i], len_list[i] );
-                pomB += len_list[i];
-
-                /* freeing the list */
-                free(list[i]);
-
-                i++;
-        }
-
-        strcpy(pomB, USERJOBS_END);
-
-
-        free(list);
-        free(len_list);
-
-
-        *message = pomA;
-
-        return 0;
-}
-
-static void edg_wll_add_stslist_to_XMLBody(edg_wll_Context ctx, char **body, const edg_wll_JobStat *toAdd, const char *tag, const char *UNUSED_subTag, const int null)
-{
-        char *pomA, *pomB, *newBody;
-        char **list = NULL;
-        int i = 0, len, tot_len = 0;
-        int *len_list = NULL;
-
-
-        while (toAdd[i].state != null) {
-                edg_wll_JobStatusToXML(ctx, toAdd[i], &pomA);
-                len = strlen(pomA);
-
-                i++;
-                tot_len += len;
-
-                list      = (char **) realloc(list, i * sizeof(*list));
-                list[i-1] = pomA;
-                pomA = NULL;
-                len_list      = (int *) realloc(len_list, i * sizeof(*len_list));
-                len_list[i-1] = len;
-        }
-
-        /* list termination */
-        list = (char **) realloc(list, (i+1) * sizeof(*list));
-        list[i] = NULL;
-
-        /* glueing all list fields together & freeing the list */
-        pomA = (char *) malloc(tot_len  * sizeof(char) + 1);
-       pomB = pomA;
-
-        i = 0;
-        while (list[i]) {
-                memcpy(pomB, list[i], len_list[i] );
-                pomB += len_list[i];
-
-                /* freeing the list */
-                free(list[i]);
-
-                i++;
-        }
-       *pomB = '\0';
-        free(list);
-        free(len_list);
-
-        asprintf(&newBody,"%s\t\t\t<%s>\r\n%s\t\t\t</%s>\r\n", *body, tag, pomA, tag);
-        free(*body);
-        free(pomA);
-        *body = newBody;
-}
-
-
-
-/* construct Message-Body of Response-Line for edg_wll_JobStatus */
-int edg_wll_JobStatusToXML(edg_wll_Context ctx, edg_wll_JobStat stat, char **message)
-{
-        char *pomA, *pomB, *pomC;
-
-       
-       pomB = strdup("");
-
-@@@{
-       selectType $status '_common_';
-        for (getFieldsOrdered $status) {
-                my $f = selectField $status $_;
-               next if defined($f->{special}) && $f->{special} eq 'XMLstructured';
-                my $ft = $f->{type};
-               my $n = $f->{null};
-                gen "edg_wll_add_$ft\_to_XMLBody(&pomB, stat.$_, \"$_\", $n);\n";
-        }
-@@@}
-       if (stat.possible_destinations) edg_wll_add_strlist_to_XMLBody(&pomB, stat.possible_destinations, "possible_destinations", "name", "\t\t\t", NULL);
-       if (stat.possible_ce_nodes) edg_wll_add_strlist_to_XMLBody(&pomB, stat.possible_ce_nodes, "possible_ce_nodes", "name", "\t\t\t", NULL);
-       if (stat.children) edg_wll_add_strlist_to_XMLBody(&pomB, stat.children, "children", "jobId", "\t\t\t", NULL);
-       if (stat.children_hist) edg_wll_add_intlist_to_XMLBody(&pomB, stat.children_hist, "children_hist", edg_wll_StatToString, "\t\t\t", 1, stat.children_hist[0]);
-       if (stat.children_states) edg_wll_add_stslist_to_XMLBody(ctx, &pomB, stat.children_states, "children_states", "", EDG_WLL_JOB_UNDEF);
-       if (stat.user_tags) edg_wll_add_taglist_to_XMLBody(&pomB, stat.user_tags, "user_tags", "tag", "name", "\t\t\t", NULL);
-       if (stat.stateEnterTimes) edg_wll_add_intlist_to_XMLBody(&pomB, stat.stateEnterTimes, "stateEnterTimes", edg_wll_StatToString, "\t\t\t",1, stat.stateEnterTimes[0]);
-
-       pomC = edg_wll_StatToString(stat.state);
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomA,"<jobStat name=\"%|Xs\" code=\"%d\" desc=\"%|Xs\">\r\n%s</jobStat>",
-                       pomC, ctx->errCode,ctx->errDesc, pomB);
-       else
-               trio_asprintf(&pomA,"<jobStat name=\"%|Xs\">\r\n%s</jobStat>",
-                       pomC, pomB);
-
-        free(pomB);
-       free(pomC);
-
-        *message = pomA;
-
-        return 0;
-}
-
-
-
-/* construct Message-Body of Request-Line for edg_wll_Purge */
-int edg_wll_PurgeResultToXML(
-                edg_wll_Context ctx,
-               edg_wll_PurgeResult *result,
-                char **message)
-{
-        char *pomA, *pomB;
-
-
-       if (!result) { *message = NULL; return(-1); }
-
-       pomA = strdup("");
-       edg_wll_add_strlist_to_XMLBody(&pomA, result->jobs, "jobs", "jobId", "\t", NULL);
-       edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL); 
-
-       if (ctx->errDesc || ctx->errCode)
-                trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       PURGE_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, PURGE_RESULT_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", PURGE_RESULT_BEGIN, pomA, PURGE_RESULT_END);
-       free(pomA);
-
-        *message = pomB;
-        return 0;
-}
-
-
-
-/* construct Message-Body of Request-Line for edg_wll_Dump */
-int edg_wll_DumpResultToXML(
-                edg_wll_Context ctx,
-               edg_wll_DumpResult *result,
-                char **message)
-{
-        char *pomA, *pomB;
-
-
-       if (!result) { *message = NULL; return(-1); }
-
-       pomA = strdup("");
-       edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL);
-        if (result->from < 0)
-                edg_wll_add_string_to_XMLBody(&pomA,
-                        edg_wll_DumpConstToString(result->from), "from", NULL);
-        else
-       edg_wll_add_time_t_to_XMLBody(&pomA, result->from, "from", 0);
-        if (result->to < 0)
-                edg_wll_add_string_to_XMLBody(&pomA,
-                        edg_wll_DumpConstToString(result->to), "to", NULL);
-        else
-       edg_wll_add_time_t_to_XMLBody(&pomA, result->to, "to", 0);
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       DUMP_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, DUMP_RESULT_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", DUMP_RESULT_BEGIN, pomA, DUMP_RESULT_END);
-       free(pomA);
-
-        *message = pomB;
-        return 0;
-}
-
-
-/* construct Message-Body of Request-Line for edg_wll_Load */
-int edg_wll_LoadResultToXML(
-                edg_wll_Context ctx,
-               edg_wll_LoadResult *result,
-                char **message)
-{
-        char *pomA, *pomB;
-
-
-       if (!result) { *message = NULL; return(-1); }
-
-       pomA = strdup("");
-       edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL);
-       edg_wll_add_time_t_to_XMLBody(&pomA, result->from, "from", 0);
-       edg_wll_add_time_t_to_XMLBody(&pomA, result->to, "to", 0);
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       LOAD_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, LOAD_RESULT_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", LOAD_RESULT_BEGIN, pomA, LOAD_RESULT_END);
-       free(pomA);
-
-        *message = pomB;
-        return 0;
-}
-
-
-/* construct Message-Body of Request-Line for edg_wll_GetIndexedAttrs */
-int edg_wll_IndexedAttrsToXML(
-                edg_wll_Context ctx,
-                char **message)
-{
-       int i,j;
-       char *pomA, *pomB;
-
-       pomA = strdup("");
-       if (ctx->job_index) {
-               for (i=0; ctx->job_index[i]; i++) {
-                       asprintf(&pomB, "%s\t%s\r\n",pomA,"<index>");
-                       free(pomA);
-                       pomA = pomB;
-
-                       for (j=0; ctx->job_index[i][j].attr != EDG_WLL_QUERY_ATTR_UNDEF; j++) {
-                               asprintf(&pomB, "%s\t\t%s\r\n",pomA,"<QueryRec>");
-                               free(pomA);
-                               pomA = pomB;
-
-                               edg_wll_add_string_to_XMLBody(&pomA, 
-                                       edg_wll_query_attrToString(ctx->job_index[i][j].attr), 
-                                       "attribute", NULL);
-
-                               if ( ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_TIME )
-                                       edg_wll_add_string_to_XMLBody(&pomA,
-                                               edg_wll_StatToString(ctx->job_index[i][j].attr_id.state),
-                                               "state", NULL);
-
-                               if (ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_USERTAG)
-                                        edg_wll_add_string_to_XMLBody(&pomA,
-                                               ctx->job_index[i][j].attr_id.tag,
-                                               "name", NULL);
-
-                               if (ctx->job_index[i][j].attr == EDG_WLL_QUERY_ATTR_JDL_ATTR)
-                                        edg_wll_add_string_to_XMLBody(&pomA,
-                                               ctx->job_index[i][j].attr_id.tag,
-                                               "name", NULL);
-
-                               asprintf(&pomB, "%s\t\t%s\r\n",pomA,"</QueryRec>");
-                               free(pomA);
-                               pomA = pomB;
-                       }
-                       
-                       asprintf(&pomB, "%s\t%s\r\n",pomA,"</index>");
-                       free(pomA);
-                       pomA = pomB;
-               }
-       }
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       INDEXED_ATTRS_BEGIN, ctx->errCode, ctx->errDesc, pomA, INDEXED_ATTRS_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", INDEXED_ATTRS_BEGIN, pomA, INDEXED_ATTRS_END);
-       free(pomA);
-
-
-        *message = pomB;
-        return 0;
-}
-
-
-
-/* construct Message-Body of Request-Line for edg_wll_Notif */
-int edg_wll_NotifResultToXML(
-                edg_wll_Context ctx,
-               time_t validity,
-                char **message)
-{
-        char *pomA, *pomB;
-
-
-       pomA = strdup("");
-       edg_wll_add_time_t_to_XMLBody(&pomA, validity, "validity", -1);
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       NOTIF_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, NOTIF_RESULT_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", NOTIF_RESULT_BEGIN, pomA, NOTIF_RESULT_END);
-       free(pomA);
-
-        *message = pomB;
-        return 0;
-}
-
-
-
-/* construct Message-Body of Request-Line for edg_wll_Notif */
-int edg_wll_QuerySequenceCodeResultToXML(
-                edg_wll_Context ctx,
-               char *seqCode,
-                char **message)
-{
-        char *pomA, *pomB;
-
-
-       pomA = strdup("");
-       edg_wll_add_string_to_XMLBody(&pomA, seqCode, "sequence_code", NULL);
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       QUERY_SEQUENCE_CODE_RESULT_BEGIN, ctx->errCode, 
-                       ctx->errDesc, pomA, QUERY_SEQUENCE_CODE_RESULT_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", QUERY_SEQUENCE_CODE_RESULT_BEGIN, 
-                       pomA, QUERY_SEQUENCE_CODE_RESULT_END);
-       free(pomA);
-
-        *message = pomB;
-        return 0;
-}
-
-
-
-/* construct Message-Body of Request-Line for edg_wll_Stats* */
-int edg_wll_StatsResultToXML(
-                edg_wll_Context ctx,
-               time_t from,
-               time_t to,
-               float rate,
-               float duration,
-               int res_from,
-               int res_to,
-                char **message)
-{
-        char *pomA, *pomB;
-
-
-       pomA = strdup("");
-       edg_wll_add_time_t_to_XMLBody(&pomA, from, "from", -1);
-       edg_wll_add_time_t_to_XMLBody(&pomA, to, "to", -1);
-       edg_wll_add_float_to_XMLBody(&pomA, rate, "rate", 0);
-       edg_wll_add_float_to_XMLBody(&pomA, duration, "duration", 0);
-       edg_wll_add_int_to_XMLBody(&pomA, res_from, "res_from", -1);
-       edg_wll_add_int_to_XMLBody(&pomA, res_to, "res_to", -1);
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       STATS_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, STATS_RESULT_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", STATS_RESULT_BEGIN, pomA, STATS_RESULT_END);
-       free(pomA);
-
-        *message = pomB;
-        return 0;
-}
-
-
diff --git a/org.glite.lb.server/src/lb_xml_parse.h b/org.glite.lb.server/src/lb_xml_parse.h
deleted file mode 100644 (file)
index 5ea1e3d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef GLITE_LB_LB_XML_PARSE_H
-#define GLITE_LB_LB_XML_PARSE_H
-
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-#include "glite/lb/jobstat.h"
-#include "glite/lb/notif_rec.h"
-#include "glite/lb/query_rec.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-       
-/* function for parsing/unparsing XML requests from client */
-
-int parseJobQueryRec(edg_wll_Context ctx, const char *messageBody, long len, edg_wll_QueryRec ***conditions);
-int parseQueryJobsRequest(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***conditions, int *flags);
-int parseQueryEventsRequest(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***job_conditions, edg_wll_QueryRec ***event_conditions);
-int parsePurgeRequest(edg_wll_Context ctx, char *messageBody, int (*tagToIndex)(), edg_wll_PurgeRequest *request);
-int parseDumpRequest(edg_wll_Context ctx, char *messageBody, edg_wll_DumpRequest *request);
-int parseLoadRequest(edg_wll_Context ctx, char *messageBody, edg_wll_LoadRequest *request);
-int parseNotifRequest(edg_wll_Context ctx, char *messageBody, char **function, edg_wll_NotifId *notifId, char **address, edg_wll_NotifChangeOp *op, time_t *validity, edg_wll_QueryRec ***conditions, int *flags);
-int parseQuerySequenceCodeRequest(edg_wll_Context ctx, char *messageBody, edg_wlc_JobId *jobId, char **source);
-int edg_wll_QueryEventsToXML(edg_wll_Context, edg_wll_Event *, char **);
-int edg_wll_QueryJobsToXML(edg_wll_Context, edg_wlc_JobId *, edg_wll_JobStat *, char **);
-int edg_wll_JobStatusToXML(edg_wll_Context, edg_wll_JobStat, char **);
-int edg_wll_UserJobsToXML(edg_wll_Context, edg_wlc_JobId *, char **);
-int edg_wll_PurgeResultToXML(edg_wll_Context ctx, edg_wll_PurgeResult *result, char **message);
-int edg_wll_DumpResultToXML(edg_wll_Context ctx, edg_wll_DumpResult *result, char **message);
-int edg_wll_LoadResultToXML(edg_wll_Context ctx, edg_wll_LoadResult *result, char **message);
-int edg_wll_IndexedAttrsToXML(edg_wll_Context ctx, char **message);
-int edg_wll_NotifResultToXML(edg_wll_Context ctx, time_t validity, char **message);
-int edg_wll_QuerySequenceCodeResultToXML(edg_wll_Context ctx, char *source, char **message);
-
-int edg_wll_StatsResultToXML(edg_wll_Context,time_t,time_t,float,float,int,int,char **);
-
-int parseStatsRequest(edg_wll_Context,char *,char **,edg_wll_QueryRec ***,edg_wll_JobStatCode *,int *,time_t *,time_t *);
-
-
-#ifdef __cplusplus
-}
-#endif
-       
-#endif /* GLITE_LB_LB_XML_PARSE_H */
diff --git a/org.glite.lb.server/src/lb_xml_parse_V21.c.T b/org.glite.lb.server/src/lb_xml_parse_V21.c.T
deleted file mode 100644 (file)
index 0aa51e5..0000000
+++ /dev/null
@@ -1,1244 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <ctype.h>
-#include <expat.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lbu/trio.h"
-#include "glite/lbu/escape.h"
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/xml_conversions.h"
-
-#include "lb_xml_parse_V21.h"
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-#define QUERY_EVENTS_BEGIN     "<edg_wll_QueryEventsResult"
-#define QUERY_EVENTS_END       "</edg_wll_QueryEventsResult>\r\n"
-#define QUERY_JOBS_BEGIN       "<edg_wll_QueryJobsResult"
-#define QUERY_JOBS_END         "</edg_wll_QueryJobsResult>\r\n"
-#define PURGE_RESULT_BEGIN     "<edg_wll_PurgeResult"
-#define PURGE_RESULT_END       "</edg_wll_PurgeResult>\r\n"
-#define DUMP_RESULT_BEGIN      "<edg_wll_DumpResult"
-#define DUMP_RESULT_END                "</edg_wll_DumpResult>\r\n"
-
-// XXX will be redundant soon
-#define USERJOBS_BEGIN         "<edg_wll_UserJobs"
-#define USERJOBS_END           "</edg_wll_UserJobs>\r\n"
-
-
-static char    *ops[] = { "equal","less","greater","within" },
-               *attrs[] = {    "jobid","owner","status","location","destination",
-                               "donecode","usertag","time","level","host","source",
-                               "instance","type","chkpt_tag", "resubmitted", "parent_job", "exitcode" };
-
-static const struct timeval null_timeval = {0,0};
-
-#define unexp() {\
-       char    *e;\
-\
-       if (XMLCtx->errtxt) {\
-               asprintf(&e,"%s\nunexpected <%s> at line %d",XMLCtx->errtxt,\
-                       el,XML_GetCurrentLineNumber(XMLCtx->p));\
-               free(XMLCtx->errtxt);\
-       } else asprintf(&e,"unexpected <%s> at line %d",\
-               el,XML_GetCurrentLineNumber(XMLCtx->p));\
-       XMLCtx->errtxt = e;\
-}
-
-
-/* Dummy function, returns only const string "el"; just for compatibility */
-static char *return_string_el(edg_wll_JobStatCode statCode) {
-       return("el");
-}
-
-
-static void startQueryJobsRequest(void *data, const char *el, const char **attr)
-{
-       unsigned int    i;
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_QueryJobsRequest")) { unexp() break; }
-                       for ( i = 0; attr[i] && attr[i+1]; i += 2 )
-                       {
-                               if ( !strcmp(attr[i],"softLimit") )
-                                       XMLCtx->ctx->softLimit = atoi(attr[i+1]);
-                               else if ( !strcmp(attr[i],"queryRes") )
-                                       XMLCtx->ctx->p_query_results = atoi(attr[i+1]);
-                               else { unexp() break; }
-                       }
-                       break;
-               case 1: if (strcasecmp(el,"and") && strcasecmp(el,"flags")) unexp()
-                       break;
-               case 2: if (strcasecmp(el,"or")) unexp()
-                       else {
-                               XMLCtx->position = -1;
-                               XMLCtx->conditions = realloc(XMLCtx->conditions,
-                                       (++XMLCtx->row+2)*sizeof(*XMLCtx->conditions));
-                               XMLCtx->conditions[XMLCtx->row] = NULL;
-                               XMLCtx->conditions[XMLCtx->row+1] = NULL;
-                       }
-                       break;
-               case 3:
-                       for (i=0; i<sizeof(ops)/sizeof(ops[0]); i++)
-                               if (!strcasecmp(el,ops[i])) break;
-                       if (i == sizeof(ops)/sizeof(ops[0])) unexp()
-                       else {
-                               /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */
-                               XMLCtx->conditions[XMLCtx->row] = realloc(XMLCtx->conditions[XMLCtx->row],
-                                       (++XMLCtx->position+2)*sizeof(**XMLCtx->conditions));
-                               memset(&XMLCtx->conditions[XMLCtx->row][XMLCtx->position],0,2*sizeof(**XMLCtx->conditions));
-                               XMLCtx->conditions[XMLCtx->row][XMLCtx->position].op = i;
-                               XMLCtx->bound = 0;
-                       }
-                       break;
-               case 4: for (i=0; i<sizeof(attrs)/sizeof(attrs[0]) && 
-                               strcasecmp(el,attrs[i]); i++);
-                       if (i == sizeof(attrs)/sizeof(attrs[0])) unexp()
-                       else {
-                               if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                       if (strcmp(attr[0],"name")) { unexp() break;}
-                                       XMLCtx->conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]);
-                               } 
-                               else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                        if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
-                                       XMLCtx->conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
-                               }
-                               XMLCtx->conditions[XMLCtx->row][XMLCtx->position].attr = i+1;
-                       }               
-                       break;
-               default: unexp(); break;
-       }
-       XMLCtx->level++;
-}
-
-
-static void startQueryEventsRequest(void *data, const char *el, const char **attr UNUSED_VAR)
-{
-       unsigned int    i;
-       edg_wll_XML_ctx *XMLCtx = data;
-
-
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_QueryEventsRequest")) { unexp() break; }
-                       for ( i = 0; attr[i] && attr[i+1]; i += 2 )
-                       {
-                               if ( !strcmp(attr[i],"softLimit") )
-                                       XMLCtx->ctx->softLimit = atoi(attr[i+1]);
-                               else if ( !strcmp(attr[i],"queryRes") )
-                                       XMLCtx->ctx->p_query_results = atoi(attr[i+1]);
-                               else { unexp() break; }
-                       }
-                       break;
-               case 1: if (strcasecmp(el,"and")) unexp()
-                       break;
-               case 2: if (!strcasecmp(el,"orJobConditions")) {
-                               XMLCtx->type = EDG_WLL_QUERY_TYPE_JOB_CONDITION;
-                               XMLCtx->position = -1;
-                                XMLCtx->job_conditions = realloc(XMLCtx->job_conditions,
-                                        (++XMLCtx->row+2)*sizeof(*XMLCtx->job_conditions));
-                                XMLCtx->job_conditions[XMLCtx->row] = NULL;
-                                XMLCtx->job_conditions[XMLCtx->row+1] = NULL;
-
-                       }
-                       else if (!strcasecmp(el,"orEventConditions")) {
-                               XMLCtx->type = EDG_WLL_QUERY_TYPE_EVENT_CONDITION;
-                               XMLCtx->position2 = -1;
-                                XMLCtx->event_conditions = realloc(XMLCtx->event_conditions,
-                                        (++XMLCtx->row2+2)*sizeof(*XMLCtx->event_conditions));
-                                XMLCtx->event_conditions[XMLCtx->row2] = NULL;
-                                XMLCtx->event_conditions[XMLCtx->row2+1] = NULL;
-                       }
-                       else unexp()
-                       break;
-               case 3:
-                       for (i=0; i<sizeof(ops)/sizeof(ops[0]); i++)
-                               if (!strcasecmp(el,ops[i])) break;
-                       if (i == sizeof(ops)/sizeof(ops[0])) unexp()
-                       else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_JOB_CONDITION) {
-                               /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */
-                               XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row],
-                                       (++XMLCtx->position+2)*sizeof(**XMLCtx->job_conditions));
-                               memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,2*sizeof(**XMLCtx->job_conditions));
-                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].op = i;
-                               XMLCtx->bound = 0;
-                       }
-                       else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) {
-                               /* malloc also terminator and set it to 0 (= EDG_WLL_QUERY_ATTR_UNDEF) */
-                               XMLCtx->event_conditions[XMLCtx->row2] = realloc(XMLCtx->event_conditions[XMLCtx->row2],
-                                       (++XMLCtx->position2+2)*sizeof(**XMLCtx->event_conditions));
-                               memset(&XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2],0,2*sizeof(**XMLCtx->event_conditions));
-                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].op = i;
-                               XMLCtx->bound = 0;
-                       }
-                       
-                       break;
-               case 4: for (i=0; i<sizeof(attrs)/sizeof(attrs[0]) && 
-                               strcasecmp(el,attrs[i]); i++);
-                       if (i == sizeof(attrs)/sizeof(attrs[0])) unexp()
-                       else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_JOB_CONDITION) { 
-                               if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                       if (attr[0] && strcmp(attr[0],"name")) { unexp() break;}
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.tag = strdup(attr[1]);
-                               } 
-                               else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                        if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
-                                       printf("\nchecking time attr\n%s = %s (%d)\n\n", attr[0], attr[1], edg_wll_StringToStat(attr[1]));
-                               }
-                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr = i+1;
-                       }
-                       else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) {
-                               if ( (i+1) == EDG_WLL_QUERY_ATTR_USERTAG) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                       if (attr[0] && strcmp(attr[0],"name")) { unexp() break;}
-                                       XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.tag = strdup(attr[1]);
-                               } 
-                               else if ( (i+1) == EDG_WLL_QUERY_ATTR_TIME) {
-                                       if (!attr[0] || !attr[1]) { unexp() break;}
-                                        if (attr[0] && strcmp(attr[0],"state")) { unexp() break;}
-                                       XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position].attr_id.state = edg_wll_StringToStat(attr[1]);
-                               }
-                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr = i+1;
-                       }
-                       break;
-               default: unexp(); break;
-       }
-       XMLCtx->level++;
-}
-
-
-
-static void startPurgeRequest(void *data, const char *el, const char **attr)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_PurgeRequest")) unexp()
-                       break;
-               case 1: if (strcasecmp(el,"jobs") && strcasecmp(el,"timeout")
-                               && strcasecmp(el,"flags")) unexp()
-                       else 
-                               XMLCtx->position = 0;
-                       break;
-               case 2: if (!strcasecmp(el,"jobId")) {
-                               XMLCtx->purgeRequestGlobal.jobs = realloc(XMLCtx->purgeRequestGlobal.jobs,
-                                               (XMLCtx->position+2) * sizeof(XMLCtx->purgeRequestGlobal.jobs));
-
-                                if (!XMLCtx->purgeRequestGlobal.jobs) { 
-                                       edg_wll_SetError(XMLCtx->ctx, ENOMEM, NULL); 
-                                       unexp() return;
-                               }
-                                XMLCtx->purgeRequestGlobal.jobs[XMLCtx->position+1] = NULL;
-                       }
-                       else if (!strcasecmp(el,"time")) {
-                               /* static array, no need to initialize & allocate anything */
-                       }
-                       else 
-                               unexp()
-                       break;
-               default: unexp() 
-                        break;
-       }
-       XMLCtx->level++;
-}
-
-
-static void startDumpRequest(void *data, const char *el, const char **attr)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-
-       
-       strcpy(XMLCtx->element, el);
-
-       switch (XMLCtx->level) {
-               case 0: if (strcasecmp(el,"edg_wll_DumpRequest")) unexp()
-                       break;
-               case 1: if (strcasecmp(el,"from") && strcasecmp(el,"to")) unexp()
-                       break;
-               default: unexp() 
-                        break;
-       }
-       XMLCtx->level++;
-}
-
-#undef unexp
-
-
-static void char_handler(void *data, const char *s, int len)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-        int i, found = -1;
-       char *temp_s;
-
-
-       /* if date are only spaces, t\, \r, \n ... don't bother with them */
-        for (i=0; i<len; i++)  
-                       if (!isspace(s[i])) { found = i; break; }
-        if (found == -1) return;
-
-       temp_s = realloc(XMLCtx->char_buf, XMLCtx->char_buf_len + len + 1);
-       if (temp_s == NULL) {
-          /* XXX propagate ENOMEM somehow */
-          return;
-       }
-       XMLCtx->char_buf = temp_s;
-       memcpy(XMLCtx->char_buf + XMLCtx->char_buf_len, s, len);
-       XMLCtx->char_buf[XMLCtx->char_buf_len + len] = '\0';
-       XMLCtx->char_buf_len += len;
-}
-
-
-
-static void endQueryJobsRequest(void *data, const char *el UNUSED_VAR)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-       char *e, *s;
-
-
-       if (XMLCtx->level == 2) {
-               if (!strcmp(XMLCtx->element,"flags") && XMLCtx->char_buf) {
-                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-// XXX: check if it works
-                       XMLCtx->flags = edg_wll_string_to_stat_flags(s);
-                       free(s);
-               }
-       }
-       else if (XMLCtx->level == 5) {
-               switch (XMLCtx->conditions[XMLCtx->row][XMLCtx->position].attr) {
-                       case EDG_WLL_QUERY_ATTR_JOBID:
-                       case EDG_WLL_QUERY_ATTR_PARENT:
-                               if ( (XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.j = 
-                                       edg_wll_from_string_to_jobid(XMLCtx)) == NULL )
-                               {
-                                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                                       if (XMLCtx->errtxt) {
-                                               asprintf(&e,"%s\n%s: invalid JobId at line %d",
-                                                       XMLCtx->errtxt, s,
-                                                       XML_GetCurrentLineNumber(XMLCtx->p));
-                                               free(XMLCtx->errtxt);
-                                       } else asprintf(&e,"%s: invalid JobId at line %d",
-                                               s,XML_GetCurrentLineNumber(XMLCtx->p));
-                                       XMLCtx->errtxt = e;
-                                       free(s);
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_OWNER:
-                       // XXX - this is way how to pass NULL, user will be extracted from ssl partner later
-                               /* XXX char_buf contains an escaped value, however there's nothing to escape in 'NULL' so we're fine */
-                               if (XMLCtx->char_buf != NULL && !strcmp(XMLCtx->char_buf,"NULL")) {  
-                                       XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.c = NULL; 
-                                       break; 
-                               }
-                               else /* fall through */
-                       case EDG_WLL_QUERY_ATTR_LOCATION:
-                       case EDG_WLL_QUERY_ATTR_DESTINATION:
-                       case EDG_WLL_QUERY_ATTR_USERTAG:
-                               XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.c = 
-                                       edg_wll_from_string_to_string(XMLCtx);
-                               break;
-                       case EDG_WLL_QUERY_ATTR_STATUS:
-                       case EDG_WLL_QUERY_ATTR_DONECODE:
-                       case EDG_WLL_QUERY_ATTR_EXITCODE:
-                       case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-                               if ( !XMLCtx->bound )
-                               {
-                                       XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.i = 
-                                               edg_wll_from_string_to_int(XMLCtx);
-                                       XMLCtx->bound++;
-                               }
-                               else
-                                       XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value2.i = 
-                                               edg_wll_from_string_to_int(XMLCtx);
-
-                               break;
-                       case EDG_WLL_QUERY_ATTR_TIME:
-                               if ( !XMLCtx->bound )
-                               {
-                                       XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec = 
-                                               edg_wll_from_string_to_time_t(XMLCtx);
-                                       XMLCtx->bound++;
-                               }
-                               else
-                                       XMLCtx->conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec =
-                                               edg_wll_from_string_to_time_t(XMLCtx);
-                               break;
-                       default: 
-                               edg_wll_freeBuf(XMLCtx);
-                               XMLCtx->level--;
-                               s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                               if (XMLCtx->errtxt) {
-                                       asprintf(&e,"%s\n%s: invalid attribute type at line %d",
-                                               XMLCtx->errtxt, s,
-                                               XML_GetCurrentLineNumber(XMLCtx->p));
-                                       free(XMLCtx->errtxt);
-                               } else asprintf(&e,"%s: invalid attribute type at line %d",
-                                       s,XML_GetCurrentLineNumber(XMLCtx->p));
-                               XMLCtx->errtxt = e;
-                               free(s);
-                               break;
-               }
-       }
-        XMLCtx->char_buf = NULL;
-        XMLCtx->char_buf_len = 0;
-       XMLCtx->level--;
-}
-
-
-static void endQueryEventsRequest(void *data, const char *el UNUSED_VAR)
-{
-       edg_wll_XML_ctx *XMLCtx = data;
-       char *e, *s;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"orJobConditions")) {
-                        /* make end-of-row */
-                        XMLCtx->job_conditions[XMLCtx->row] = realloc(XMLCtx->job_conditions[XMLCtx->row],
-                                (++XMLCtx->position+1)*sizeof(**XMLCtx->job_conditions));
-                        memset(&XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position],0,sizeof(**XMLCtx->job_conditions));
-                }
-               else if (!strcmp(XMLCtx->element,"orEventConditions")) {
-                        /* make end-of-row */
-                        XMLCtx->event_conditions[XMLCtx->row2] = realloc(XMLCtx->event_conditions[XMLCtx->row2],
-                                (++XMLCtx->position2+1)*sizeof(**XMLCtx->event_conditions));
-                        memset(&XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2],0,sizeof(**XMLCtx->event_conditions));
-                }
-       }
-       else if (XMLCtx->level == 5) {
-               if (XMLCtx->type == EDG_WLL_QUERY_TYPE_JOB_CONDITION) {
-                       switch (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].attr) {
-                               case EDG_WLL_QUERY_ATTR_JOBID:
-                               case EDG_WLL_QUERY_ATTR_PARENT:
-                                       if ( (XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.j = 
-                                               edg_wll_from_string_to_jobid(XMLCtx)) == NULL )
-                                       {
-                                               s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                                               if (XMLCtx->errtxt) {
-                                                       asprintf(&e,"%s\n%s: invalid JobId at line %d",
-                                                               XMLCtx->errtxt, s,
-                                                               XML_GetCurrentLineNumber(XMLCtx->p));
-                                                       free(XMLCtx->errtxt);
-                                               } else asprintf(&e,"%s: invalid JobId at line %d",
-                                                       s,XML_GetCurrentLineNumber(XMLCtx->p));
-                                               XMLCtx->errtxt = e;
-                                               free(s);
-                                       }
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_OWNER:
-                               case EDG_WLL_QUERY_ATTR_LOCATION:
-                               case EDG_WLL_QUERY_ATTR_DESTINATION:
-                               case EDG_WLL_QUERY_ATTR_USERTAG:
-                                       XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.c = 
-                                               edg_wll_from_string_to_string(XMLCtx);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_STATUS:
-                               case EDG_WLL_QUERY_ATTR_DONECODE:
-                               case EDG_WLL_QUERY_ATTR_EXITCODE:
-                               case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-                                       if ( !XMLCtx->bound )
-                                       {
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.i = 
-                                                       edg_wll_from_string_to_int(XMLCtx);
-                                               XMLCtx->bound++;
-                                       }
-                                       else
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.i = 
-                                                       edg_wll_from_string_to_int(XMLCtx);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_TIME:
-                                       if ( !XMLCtx->bound )
-                                       {
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value.t.tv_sec = 
-                                                       edg_wll_from_string_to_time_t(XMLCtx);
-                                               XMLCtx->bound++;
-                                       }
-                                       else
-                                               XMLCtx->job_conditions[XMLCtx->row][XMLCtx->position].value2.t.tv_sec =
-                                                       edg_wll_from_string_to_time_t(XMLCtx);
-                                       break;
-                               default: 
-                                       edg_wll_freeBuf(XMLCtx);
-                                       XMLCtx->level--;
-                                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                                       if (XMLCtx->errtxt) {
-                                               asprintf(&e,"%s\n%s: invalid attribute type at line %d",
-                                                       XMLCtx->errtxt, s,
-                                                       XML_GetCurrentLineNumber(XMLCtx->p));
-                                               free(XMLCtx->errtxt);
-                                       } else asprintf(&e,"%s: invalid attribute type at line %d",
-                                               s,XML_GetCurrentLineNumber(XMLCtx->p));
-                                       XMLCtx->errtxt = e;
-                                       free(s);
-                                       break;
-                       }
-               }
-               else if (XMLCtx->type == EDG_WLL_QUERY_TYPE_EVENT_CONDITION) {
-                       switch (XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].attr) {
-                               case EDG_WLL_QUERY_ATTR_TIME:
-                                       if ( !XMLCtx->bound )
-                                       {
-                                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.t.tv_sec = 
-                                                       edg_wll_from_string_to_time_t(XMLCtx);
-                                               XMLCtx->bound++;
-                                       }
-                                       else
-                                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value2.t.tv_sec =
-                                                       edg_wll_from_string_to_time_t(XMLCtx);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_LEVEL:
-                               case EDG_WLL_QUERY_ATTR_SOURCE:
-                               case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
-                                       if ( !XMLCtx->bound )
-                                       {
-                                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.i =
-                                                       edg_wll_from_string_to_int(XMLCtx);
-                                               XMLCtx->bound++;
-                                       }
-                                       else
-                                               XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value2.i =
-                                                       edg_wll_from_string_to_int(XMLCtx);
-                                       break;
-                               case EDG_WLL_QUERY_ATTR_HOST:
-                               case EDG_WLL_QUERY_ATTR_INSTANCE:
-                               case EDG_WLL_QUERY_ATTR_USERTAG:
-                                       XMLCtx->event_conditions[XMLCtx->row2][XMLCtx->position2].value.c =
-                                               edg_wll_from_string_to_string(XMLCtx);
-                                       break;
-                               default: 
-                                       edg_wll_freeBuf(XMLCtx);
-                                       XMLCtx->level--;
-                                       s = glite_lbu_UnescapeXML((const char *) XMLCtx->char_buf);
-                                       if (XMLCtx->errtxt) {
-                                               asprintf(&e,"%s\n%s: invalid attribute type at line %d",
-                                                       XMLCtx->errtxt, s,
-                                                       XML_GetCurrentLineNumber(XMLCtx->p));
-                                               free(XMLCtx->errtxt);
-                                       } else asprintf(&e,"%s: invalid attribute type at line %d",
-                                               s,XML_GetCurrentLineNumber(XMLCtx->p));
-                                       XMLCtx->errtxt = e;
-                                       free(s);
-                                       break;
-                       }
-               } 
-       
-               XMLCtx->char_buf = NULL;
-               XMLCtx->char_buf_len = 0;
-       }
-       XMLCtx->level--;
-}
-
-
-static void endPurgeRequest(void *data, const char *el UNUSED_VAR)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-        char *e;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"flags")) 
-                       XMLCtx->purgeRequestGlobal.flags = edg_wll_from_string_to_int(XMLCtx);
-       }
-       else if (XMLCtx->level == 3) {
-               if (!strcmp(XMLCtx->element,"jobId")) {
-                       if ( (XMLCtx->purgeRequestGlobal.jobs[XMLCtx->position++] = 
-                               edg_wll_from_string_to_string(XMLCtx)) == NULL )
-                       {
-                               /* XXX char_buf contains an escaped value, unescaping is done within edg_wll_from_string_to_string(), which failed */
-                               if (XMLCtx->errtxt) {
-                                       asprintf(&e,"%s\n%s: invalid JobId at line %d",
-                                               XMLCtx->errtxt, XMLCtx->char_buf,
-                                               XML_GetCurrentLineNumber(XMLCtx->p));
-                                       free(XMLCtx->errtxt);
-                               } else asprintf(&e,"%s: invalid JobId at line %d",
-                                       XMLCtx->char_buf,XML_GetCurrentLineNumber(XMLCtx->p));
-                               XMLCtx->errtxt = e;
-                       }
-               }
-               else if (!strcmp(XMLCtx->element,"time") && XMLCtx->char_buf) {
-                       XMLCtx->purgeRequestGlobal.timeout[XMLCtx->position++] = 
-                               edg_wll_from_string_to_time_t(XMLCtx);
-               }
-       }
-
-       XMLCtx->char_buf = NULL;
-        XMLCtx->char_buf_len = 0;
-       XMLCtx->level--;
-}
-
-
-static void endDumpRequest(void *data, const char *el UNUSED_VAR)
-{
-        edg_wll_XML_ctx *XMLCtx = data;
-
-        if (XMLCtx->level == 2) {
-                if (!strcmp(XMLCtx->element,"from")) 
-                       XMLCtx->dumpRequestGlobal.from = edg_wll_from_string_to_time_t(XMLCtx);
-               else if (!strcmp(XMLCtx->element,"to")) 
-                        XMLCtx->dumpRequestGlobal.to = edg_wll_from_string_to_time_t(XMLCtx);
-       }
-
-       XMLCtx->char_buf = NULL;
-        XMLCtx->char_buf_len = 0;
-       XMLCtx->level--;
-}
-
-/* parse queryJobs request from client */
-int parseQueryJobsRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***conditions, int *flags)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.row = -1;
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startQueryJobsRequest, endQueryJobsRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i,j;
-
-               if (XMLCtx.conditions) {
-                       for (j = 0; XMLCtx.conditions[j]; j++) {
-                               for (i = 0; (XMLCtx.conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.conditions[j][i]);
-                               free(XMLCtx.conditions[j]);
-                       }
-                       free(XMLCtx.conditions);
-               }
-
-               /* empty list terminators */
-               conditions[0] = NULL;
-               *flags = 0;
-       } else {
-               *conditions = XMLCtx.conditions;
-               *flags = XMLCtx.flags;
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-/* parse queryEvents request from client */
-int parseQueryEventsRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***job_conditions, edg_wll_QueryRec ***event_conditions)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.row = -1;
-       XMLCtx.row2 = -1;
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startQueryEventsRequest, endQueryEventsRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i,j;
-
-               if (XMLCtx.job_conditions) {
-                       for (j = 0; XMLCtx.job_conditions[j]; j++) {
-                               for (i = 0 ; (XMLCtx.job_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.job_conditions[j][i]);
-                               free(XMLCtx.job_conditions[j]);
-                       }
-                       free(XMLCtx.job_conditions);
-               }
-               if (XMLCtx.event_conditions) {
-                       for (j = 0; XMLCtx.event_conditions[j]; j++) {
-                               for (i = 0 ; (XMLCtx.event_conditions[j][i].attr != EDG_WLL_QUERY_ATTR_UNDEF); i++ )
-                                       edg_wll_QueryRecFree(&XMLCtx.event_conditions[j][i]);
-                               free(XMLCtx.event_conditions[j]);
-                       }
-                       free(XMLCtx.event_conditions);
-               }
-
-               /* empty list terminators */
-               job_conditions[0] = NULL;
-               event_conditions[0] = NULL;
-       } else {
-               *job_conditions = XMLCtx.job_conditions;
-               *event_conditions = XMLCtx.event_conditions;
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-
-/* parse purge request from client */
-int parsePurgeRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_PurgeRequest *request)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startPurgeRequest, endPurgeRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) {
-               int i;
-
-               if (XMLCtx.purgeRequestGlobal.jobs) {
-                       for (i=0; XMLCtx.purgeRequestGlobal.jobs[i]; i++) 
-                               free(XMLCtx.purgeRequestGlobal.jobs[i]);
-                       free(XMLCtx.purgeRequestGlobal.jobs);
-               }
-               memset(request,0,sizeof(*request));
-               
-       } else {
-               memcpy(request, &XMLCtx.purgeRequestGlobal, sizeof(XMLCtx.purgeRequestGlobal));
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-
-/* parse dump request from client */
-int parseDumpRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_DumpRequest *request)
-{
-       int     ret;
-       edg_wll_XML_ctx         XMLCtx;
-       XML_Char *encoding = "ISO-8859-1";
-
-       errno = 0;
-       edg_wll_initXMLCtx(&XMLCtx);
-       XMLCtx.ctx = ctx;
-       edg_wll_ResetError(ctx);
-
-
-        /* initialize parser */
-        XMLCtx.p = XML_ParserCreate(encoding);
-        XML_SetElementHandler(XMLCtx.p, startDumpRequest, endDumpRequest);
-        XML_SetCharacterDataHandler(XMLCtx.p, char_handler);
-        XML_SetUserData(XMLCtx.p, (void *) &XMLCtx);
-
-
-        if (! XML_Parse(XMLCtx.p, messageBody, strlen(messageBody), 1)) {
-                char *errorMessage;
-
-                asprintf(&errorMessage, "Parse error at line %d:\n%s\n",
-                        XML_GetCurrentLineNumber(XMLCtx.p),
-                        XML_ErrorString(XML_GetErrorCode(XMLCtx.p)));
-
-                edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, errorMessage);
-                free(errorMessage);
-        } else if (XMLCtx.errtxt) edg_wll_SetError(ctx, EDG_WLL_ERROR_XML_PARSE, XMLCtx.errtxt);
-
-
-       if ((ret = edg_wll_Error(ctx,NULL,NULL))) 
-               memset(request,0,sizeof(*request));
-               
-       else {
-               memcpy(request, &XMLCtx.dumpRequestGlobal, sizeof(XMLCtx.dumpRequestGlobal));
-       }
-
-       
-        XML_ParserFree(XMLCtx.p);
-       edg_wll_freeXMLCtx(&XMLCtx);
-       return ret;
-}
-
-
-
-int edg_wll_QueryEventsToXMLV21(edg_wll_Context ctx UNUSED_VAR, edg_wll_Event *eventsOut, char **message)
-{
-        char *pomA, *pomB;
-       char **list = NULL;
-        int i = 0, len, tot_len = 0;
-       int *len_list = NULL;
-
-
-        while (eventsOut && eventsOut[i].any.type != EDG_WLL_EVENT_UNDEF) {
-               pomB = edg_wll_EventToString(eventsOut[i].any.type);
-                trio_asprintf(&pomA,"      <edg_wll_Event name=\"%|Xs\">\r\n", pomB);
-               free(pomB);
-               pomB = pomA;
-
-
-@@@{
-        selectType $event '_common_';
-        for (getFieldsOrdered $event) {
-                my $f = selectField $event $_;
-                my $ft = $f->{type};
-               my $n = $f->{null};
-                gen "\tedg_wll_add_$ft\_to_XMLBody(&pomB, eventsOut[i].any.$_, \"$_\", $n);\n";
-        }
-
-        gen "\tswitch (eventsOut[i].any.type) {\n";
-        for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) {
-                if ($t ne 'any') {
-                        selectType $event $t;
-                        my $u = uc $t;
-                        gen "\t    case EDG_WLL_EVENT_$u :\n";
-                        for (getFieldsOrdered $event) {
-                                my $f = selectField $event $_;
-                                my $ft = $f->{type};
-                               my $n = $f->{null};
-                               $t = lcfirst $t;
-                               if ($t =~ m/^pBS/) { $t = ucfirst $t; }
-                               if ($t =~ m/^condor/) { $t = ucfirst $t; }
-                                gen "\t\tedg_wll_add_$ft\_to_XMLBody(&pomB, eventsOut[i].$t.$_, \"$_\", $n);\n";
-                        }
-                       gen "\t\tbreak;\n";
-               }
-        }
-        gen "\t    default : break;\n";
-        gen "\t}\n";
-@@@}
-
-
-
-                len = asprintf(&pomA,"%s      </edg_wll_Event>\r\n", pomB);
-                free(pomB);
-                i++;
-               tot_len += len;
-
-               list      = (char **) realloc(list, i * sizeof(*list));
-               list[i-1] = pomA;
-               len_list      = (int *) realloc(len_list, i * sizeof(*len_list));
-               len_list[i-1] = len;
-               
-        }
-
-       /* list termination */
-       list = (char **) realloc(list, (i+1) * sizeof(*list));
-        list[i] = NULL;
-
-       /* test errors */
-       if (ctx->errDesc || ctx->errCode)
-               len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc);
-       else
-               len = asprintf(&pomB,">\r\n");
-
-       /* glueing all list fields together & freeing the list */
-       pomA = (char *) malloc(tot_len  * sizeof(char) + 
-                               sizeof(QUERY_EVENTS_BEGIN) + len + sizeof(QUERY_EVENTS_END) - 1);
-       
-       memcpy(pomA, QUERY_EVENTS_BEGIN, sizeof(QUERY_EVENTS_BEGIN));
-       memcpy(pomA + sizeof(QUERY_EVENTS_BEGIN) - 1, pomB, len);
-       free(pomB);
-       pomB = pomA + sizeof(QUERY_EVENTS_BEGIN) + len - 1;     
-
-       i = 0;
-       while (list[i]) {
-                memcpy(pomB, list[i], len_list[i] );
-               pomB += len_list[i];
-
-               /* freeing the list */
-               free(list[i]);
-
-                i++;
-        }
-
-       strcpy(pomB, QUERY_EVENTS_END);
-
-
-       free(list);
-       free(len_list);
-
-
-        *message = pomA;
-
-        return 0;
-}
-
-int edg_wll_QueryJobsToXMLV21(edg_wll_Context ctx, edg_wlc_JobId *jobsIn, edg_wll_JobStat *statesIn, char **message) 
-{
-        char *pomA, *pomB, *pomC;
-        char **list = NULL;
-        int i = 0, len, tot_len = 0, nres = 0;
-        int *len_list = NULL;
-
-       
-       if (jobsIn) for (nres = 0; jobsIn[nres]; nres++);
-       else if (statesIn) for (nres = 0; statesIn[nres].state; nres++);
-
-        while (i < nres) {
-                trio_asprintf(&pomA,"\t<edg_wll_Job>\r\n");
-                pomB = pomA;
-               
-               if (jobsIn) {
-                       trio_asprintf(&pomA,"%s\t\t<jobId>%|Xs</jobId>\r\n",
-                               pomB, pomC=edg_wlc_JobIdUnparse(jobsIn[i]));
-                       free(pomC);
-                       free(pomB);
-                       pomB = pomA;
-               }
-
-               if (statesIn) {
-                       edg_wll_JobStatusToXMLV21(ctx, statesIn[i], &pomC);     
-                       trio_asprintf(&pomA,"%s\t\t%s",pomB,pomC);
-               }
-               else {
-                       pomC = edg_wll_StatToString(EDG_WLL_JOB_UNKNOWN);
-                       trio_asprintf(&pomA,"%s\t\t<jobStat name=\"%|Xs\">\r\n\r\n\t\t</jobStat>\r\n",
-                               pomB, pomC);
-               }
-
-               free(pomB);
-               free(pomC);
-               pomB = pomA;
-       
-
-                len = asprintf(&pomA,"%s\t</edg_wll_Job>\r\n", pomB);
-                free(pomB);
-                i++;
-                tot_len += len;
-
-                list      = (char **) realloc(list, i * sizeof(*list));
-                list[i-1] = pomA;
-                len_list      = (int *) realloc(len_list, i * sizeof(*len_list));
-                len_list[i-1] = len;   
-       }
-       
-       /* list termination */
-       list = (char **) realloc(list, (i+1) * sizeof(*list));
-        list[i] = NULL;
-
-        /* test errors */
-        if (ctx->errDesc || ctx->errCode)
-                len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc);
-        else
-                len = asprintf(&pomB,">\r\n");
-
-       /* glueing all list fields together & freeing the list */
-       pomA = (char *) malloc(tot_len  * sizeof(char) + 
-                               sizeof(QUERY_JOBS_BEGIN) + len + sizeof(QUERY_JOBS_END) - 1);
-       
-       memcpy(pomA, QUERY_JOBS_BEGIN, sizeof(QUERY_JOBS_BEGIN));       
-        memcpy((pomA + sizeof(QUERY_JOBS_BEGIN) - 1), pomB, len);
-        free(pomB);
-       pomB = pomA + sizeof(QUERY_JOBS_BEGIN) + len - 1;       
-
-       i = 0;
-       while (list[i]) {
-                memcpy(pomB, list[i], len_list[i] );
-               pomB += len_list[i];
-
-               /* freeing the list */
-               free(list[i]);
-
-                i++;
-        }
-
-       strcpy(pomB, QUERY_JOBS_END);
-
-
-       free(list);
-       free(len_list);
-
-
-        *message = pomA;
-
-       return 0;
-}
-
-/* construct Message-Body of Response-Line for edg_wll_UserJobs */
-int edg_wll_UserJobsToXMLV21(edg_wll_Context ctx UNUSED_VAR, edg_wlc_JobId *jobsOut, char **message)
-{
-        char *pomA, *pomB;
-        char **list = NULL;
-        int i = 0, len, tot_len = 0;
-        int *len_list = NULL;
-
-
-        while (jobsOut[i]) {
-               len = trio_asprintf(&pomA,"      <jobId>%|Xs</jobId>\r\n",
-                       pomB=edg_wlc_JobIdUnparse(jobsOut[i]));
-
-                free(pomB);
-
-                i++;
-                tot_len += len;
-
-                list      = (char **) realloc(list, i * sizeof(*list));
-                list[i-1] = pomA;
-               pomA = NULL;
-                len_list      = (int *) realloc(len_list, i * sizeof(*len_list));
-                len_list[i-1] = len;
-
-        }
-
-        /* list termination */
-        list = (char **) realloc(list, (i+1) * sizeof(*list));
-        list[i] = NULL;
-
-        /* test errors */
-        if (ctx->errDesc || ctx->errCode)
-                len = trio_asprintf(&pomB," code=\"%d\" desc=\"%|Xs\">\r\n",ctx->errCode,ctx->errDesc);
-        else
-                len = asprintf(&pomB,">\r\n");
-
-        /* glueing all list fields together & freeing the list */
-        pomA = (char *) malloc(tot_len  * sizeof(char) +
-                                sizeof(USERJOBS_BEGIN) + len + sizeof(USERJOBS_END) - 1);
-
-        memcpy(pomA, USERJOBS_BEGIN, sizeof(USERJOBS_BEGIN));
-        memcpy((pomA + sizeof(USERJOBS_BEGIN) - 1), pomB, len);
-        free(pomB);
-        pomB = pomA + sizeof(USERJOBS_BEGIN) + len - 1;
-
-        i = 0;
-        while (list[i]) {
-                memcpy(pomB, list[i], len_list[i] );
-                pomB += len_list[i];
-
-                /* freeing the list */
-                free(list[i]);
-
-                i++;
-        }
-
-        strcpy(pomB, USERJOBS_END);
-
-
-        free(list);
-        free(len_list);
-
-
-        *message = pomA;
-
-        return 0;
-}
-
-static void edg_wll_add_stslist_to_XMLBodyV21(edg_wll_Context ctx, char **body, const edg_wll_JobStat *toAdd, const char *tag, const char *UNUSED_subTag, const int null)
-{
-        char *pomA, *pomB, *newBody;
-        char **list = NULL;
-        int i = 0, len, tot_len = 0;
-        int *len_list = NULL;
-
-
-        while (toAdd[i].state != null) {
-                edg_wll_JobStatusToXMLV21(ctx, toAdd[i], &pomA);
-                len = strlen(pomA);
-
-                i++;
-                tot_len += len;
-
-                list      = (char **) realloc(list, i * sizeof(*list));
-                list[i-1] = pomA;
-                pomA = NULL;
-                len_list      = (int *) realloc(len_list, i * sizeof(*len_list));
-                len_list[i-1] = len;
-        }
-
-        /* list termination */
-        list = (char **) realloc(list, (i+1) * sizeof(*list));
-        list[i] = NULL;
-
-        /* glueing all list fields together & freeing the list */
-        pomA = (char *) malloc(tot_len  * sizeof(char) + 1);
-       pomB = pomA;
-
-        i = 0;
-        while (list[i]) {
-                memcpy(pomB, list[i], len_list[i] );
-                pomB += len_list[i];
-
-                /* freeing the list */
-                free(list[i]);
-
-                i++;
-        }
-       *pomB = '\0';
-        free(list);
-        free(len_list);
-
-        asprintf(&newBody,"%s\t\t\t<%s>\r\n%s\t\t\t</%s>\r\n", *body, tag, pomA, tag);
-        free(*body);
-        free(pomA);
-        *body = newBody;
-}
-
-
-/* construct Message-Body of Response-Line for edg_wll_JobStatus */
-int edg_wll_JobStatusToXMLV21(edg_wll_Context ctx, edg_wll_JobStat stat, char **message)
-{
-        char *pomA, *pomB, *pomC;
-
-       
-       pomB = strdup("");
-
-@@@{
-       selectType $status '_common_';
-        for (getFieldsOrdered $status) {
-                my $f = selectField $status $_;
-               next if defined($f->{special}) && $f->{special} eq 'XMLstructured';
-                my $ft = $f->{type};
-               my $n = $f->{null};
-                gen "edg_wll_add_$ft\_to_XMLBody(&pomB, stat.$_, \"$_\", $n);\n";
-        }
-@@@}
-       if (stat.children) edg_wll_add_strlist_to_XMLBody(&pomB, stat.children, "children", "jobId", "\t\t\t", NULL);
-       if (stat.children_hist) edg_wll_add_intlist_to_XMLBody(&pomB, stat.children_hist, "children_hist", return_string_el, "\t\t\t", 1, stat.children_hist[0]);
-       if (stat.children_states) edg_wll_add_stslist_to_XMLBodyV21(ctx, &pomB, stat.children_states, "children_states", "", EDG_WLL_JOB_UNDEF);
-       if (stat.user_tags) edg_wll_add_taglist_to_XMLBody(&pomB, stat.user_tags, "user_tags", "tag", "name", "\t\t\t", NULL);
-       if (stat.stateEnterTimes) edg_wll_add_intlist_to_XMLBody(&pomB, stat.stateEnterTimes, "stateEnterTimes", return_string_el, "\t\t\t",1, stat.stateEnterTimes[0]);
-
-       pomC = edg_wll_StatToString(stat.state);
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomA,"<jobStat name=\"%|Xs\" code=\"%d\" desc=\"%|Xs\">\r\n%s</jobStat>",
-                       pomC, ctx->errCode,ctx->errDesc, pomB);
-       else
-               trio_asprintf(&pomA,"<jobStat name=\"%|Xs\">\r\n%s</jobStat>",
-                       pomC, pomB);
-
-        free(pomB);
-       free(pomC);
-
-        *message = pomA;
-
-        return 0;
-}
-
-
-
-/* construct Message-Body of Request-Line for edg_wll_Purge */
-int edg_wll_PurgeResultToXMLV21(
-                edg_wll_Context ctx,
-               edg_wll_PurgeResult *result,
-                char **message)
-{
-        char *pomA, *pomB;
-
-
-       if (!result) { *message = NULL; return(-1); }
-
-       pomA = strdup("");
-       edg_wll_add_strlist_to_XMLBody(&pomA, result->jobs, "jobs", "jobId", "\t", NULL);
-       edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL); 
-
-       if (ctx->errDesc || ctx->errCode)
-                trio_asprintf(&pomA,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       PURGE_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, PURGE_RESULT_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", PURGE_RESULT_BEGIN, pomA, PURGE_RESULT_END);
-       free(pomA);
-
-        *message = pomB;
-        return 0;
-}
-
-
-
-/* construct Message-Body of Request-Line for edg_wll_Dump */
-int edg_wll_DumpResultToXMLV21(
-                edg_wll_Context ctx,
-               edg_wll_DumpResult *result,
-                char **message)
-{
-        char *pomA, *pomB;
-
-
-       if (!result) { *message = NULL; return(-1); }
-
-       pomA = strdup("");
-       edg_wll_add_string_to_XMLBody(&pomA, result->server_file, "server_file", NULL);
-       edg_wll_add_time_t_to_XMLBody(&pomA, result->from, "from", 0);
-       edg_wll_add_time_t_to_XMLBody(&pomA, result->to, "to", 0);
-
-       if (ctx->errDesc || ctx->errCode)
-               trio_asprintf(&pomB,"%s code=\"%d\" desc=\"%|Xs\">\r\n%s%s",
-                       DUMP_RESULT_BEGIN, ctx->errCode, ctx->errDesc, pomA, DUMP_RESULT_END);
-       else
-               trio_asprintf(&pomB,"%s>\r\n%s%s", DUMP_RESULT_BEGIN, pomA, DUMP_RESULT_END);
-       free(pomA);
-
-        *message = pomB;
-        return 0;
-}
diff --git a/org.glite.lb.server/src/lb_xml_parse_V21.h b/org.glite.lb.server/src/lb_xml_parse_V21.h
deleted file mode 100644 (file)
index 617ed45..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef GLITE_LB_LB_XML_PARSE_V21_H
-#define GLITE_LB_LB_XML_PARSE_V21_H
-
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-#include "glite/lb/jobstat.h"
-#include "glite/lb/query_rec.h"
-
-/* function for parsing/unparsing XML requests from client */
-
-int parseQueryJobsRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***conditions, int *flags);
-int parseQueryEventsRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_QueryRec ***job_conditions, edg_wll_QueryRec ***event_conditions);
-int parsePurgeRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_PurgeRequest *request);
-int parseDumpRequestV21(edg_wll_Context ctx, char *messageBody, edg_wll_DumpRequest *request);
-int edg_wll_QueryEventsToXMLV21(edg_wll_Context, edg_wll_Event *, char **);
-int edg_wll_QueryJobsToXMLV21(edg_wll_Context, edg_wlc_JobId *, edg_wll_JobStat *, char **);
-int edg_wll_JobStatusToXMLV21(edg_wll_Context, edg_wll_JobStat, char **);
-int edg_wll_UserJobsToXMLV21(edg_wll_Context, edg_wlc_JobId *, char **);
-int edg_wll_PurgeResultToXMLV21(edg_wll_Context ctx, edg_wll_PurgeResult *result, char **message);
-int edg_wll_DumpResultToXMLV21(edg_wll_Context ctx, edg_wll_DumpResult *result, char **message);
-
-#endif /* GLITE_LB_LB_XML_PARSE_V21_H */
diff --git a/org.glite.lb.server/src/lcas_lb.c b/org.glite.lb.server/src/lcas_lb.c
deleted file mode 100644 (file)
index f216755..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-#ident "$Header$"
-
-#include <glite/security/lcas/lcas_modules.h>
-
-static char *modname = "lcas_lb";
-static char *authfile = NULL;
-
-int
-plugin_initialize(int argc, char *argv[])
-{
-   int i;
-
-   lcas_log_debug(1, "%s-plugin_initialize(): passed arguments:\n",modname);
-   for (i=0; i < argc; i++)
-      lcas_log_debug(1, "\targ %d is %s\n", i,argv[i]);
-
-   if (argc > 1)
-      authfile = lcas_findfile(argv[1]);
-
-   if (authfile == NULL) {
-      lcas_log(0,"\t%s-plugin_initialize() error:"
-                 ":access control policy file required!\n",
-               modname);
-      return LCAS_MOD_NOFILE;
-   }
-
-   if (lcas_getfexist(1, authfile) == NULL) {
-      lcas_log(0, "\t%s-plugin_initialize() error:"
-                 "Cannot find access control policy file: %s\n",
-              modname, authfile);
-      return LCAS_MOD_NOFILE;
-   }
-
-   return LCAS_MOD_SUCCESS;
-}
-
-static char *
-get_event_name(lcas_request_t request)
-{
-   char *rsl = (char *) request;
-
-   if (request == NULL)
-      return NULL;
-
-   return strdup(rsl);
-}
-
-static int
-check_db_file(char *event, char *user_dn)
-{
-   FILE *db_file = NULL;
-   char line[1024];
-   int found = 0, inside_block = 0, found_event = 0;
-   char *p, *q;
-   int ret;
-
-   if (event == NULL || user_dn == NULL)
-      return LCAS_MOD_FAIL;
-
-   db_file = fopen(authfile, "r");
-   if (db_file == NULL) {
-      lcas_log_debug(1, "Failed to open policy file %s: %s\n",
-                     authfile, strerror(errno));
-      return LCAS_MOD_FAIL;
-   }
-
-   ret = LCAS_MOD_FAIL;
-   while (fgets(line, sizeof(line), db_file) != NULL) {
-      p = strchr(line, '\n');
-      if (p)
-         *p = '\0';
-      p = line;
-      if (*p == '#')
-         continue;
-
-      while (*p == ' ')
-         p++;
-
-      if (inside_block) {
-        q = strchr(p, '}');
-        if (q)
-           *q = '\0';
-        if (found_event && ((strcmp(p, user_dn) == 0) || *p == '*')) {
-           found = 1;
-           break;
-        }
-        if (q) {
-           inside_block = 0;
-        }
-      } else {
-        q = strchr(p, '=');
-        if (q == NULL)
-           continue;
-        *q = '\0';
-        inside_block = 1;
-        if (strncmp(p, event, strlen(event)) == 0 || *p == '*')
-           found_event = 1;
-      }
-   }
-   fclose(db_file);
-
-   if (found)
-      ret = LCAS_MOD_SUCCESS;
-
-   lcas_log_debug(1, "access %s\n",
-                  (ret == LCAS_MOD_SUCCESS) ? "granted" : "denied");
-
-   return ret;
-}
-
-int
-plugin_confirm_authorization(lcas_request_t request, lcas_cred_id_t lcas_cred)
-{
-   char *user_dn;
-   char *event = NULL;
-   int ret;
-
-   lcas_log_debug(1,"\t%s-plugin: checking LB access policy\n",
-                 modname);
-
-   event = get_event_name(request);
-   if (event == NULL) {
-      lcas_log_debug(1,"\t%s-plugin_confirm_authorization(): no event name specified\n",
-                     modname);
-      return LCAS_MOD_FAIL;
-   }
-
-   user_dn = lcas_get_dn(lcas_cred);
-   if (user_dn == NULL) {
-      lcas_log(0, "lcas.mod-lcas_get_fabric_authorization() error: user DN empty\n");
-      ret = LCAS_MOD_FAIL;
-      goto end;
-   }
-
-   ret = check_db_file(event, user_dn);
-
-end:
-   if (event)
-      free(event);
-
-   return ret; 
-}
-
-int
-plugin_terminate()
-{
-   lcas_log_debug(1, "%s-plugin_terminate(): terminating\n",modname);
-
-   if (authfile) {
-      free(authfile);
-      authfile = NULL;
-   }
-
-   return LCAS_MOD_SUCCESS;
-}
-
-#if 0
-int
-main(int argc, char *argv[])
-{
-   authfile = "lcas_lb.db";
-
-   check_db_file(argv[1], argv[2]);
-
-   return 0;
-}
-#endif
diff --git a/org.glite.lb.server/src/load.c b/org.glite.lb.server/src/load.c
deleted file mode 100644 (file)
index 5774af9..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-#ident "$Header$"
-
-#include <time.h>
-#include <stdio.h>
-#include <string.h>
-#include <syslog.h>
-#include <assert.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <errno.h>
-
-#include "glite/lbu/trio.h"
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/events_parse.h"
-#include "glite/lb/ulm_parse.h"
-#include "glite/lb/events.h"
-
-#include "store.h"
-#include "purge.h"
-#include "query.h"
-#include "get_events.h"
-#include "server_state.h"
-#include "db_supp.h"
-#include "lb_proto.h"
-
-static int read_line(char **buff, size_t *maxsize, int fd);
-
-int edg_wll_LoadEventsServer(edg_wll_Context ctx,const edg_wll_LoadRequest *req,edg_wll_LoadResult *result)
-{
-       int                                     fd,
-                                               reject_fd = -1,
-                                               readret, i, ret;
-       size_t                                  maxsize;
-       char                       *line = NULL, *errdesc,
-                                               buff[30];
-       edg_wll_Event      *event;
-       edg_wlc_JobId           jobid = NULL;
-
-
-       edg_wll_ResetError(ctx);
-       
-       if ( !req->server_file )
-               return edg_wll_SetError(ctx, EINVAL, "Server file is not specified for load");
-
-       if ( (fd = open(req->server_file, O_RDONLY)) == -1 )
-               return edg_wll_SetError(ctx, errno, "Server can not open the file");
-
-       memset(result,0,sizeof(*result));
-       i = 0;
-       while ( 1 )
-       {
-               /*      Read one line
-                */
-               if ( (readret = read_line(&line, &maxsize, fd)) == -1 ) {
-                       return edg_wll_SetError(ctx, errno, "reading dump file");
-               }
-
-               if ( readret == 0 )
-                       break;
-
-               i++;
-               if (   sscanf(line, "DG.ARRIVED=%s %*s", buff) != 1
-                       || edg_wll_ParseEvent(ctx, line, &event) )
-               {
-                       char errs[100];
-                       sprintf(errs, "Error parsing event at line %d", i);
-                       if ( !edg_wll_Error(ctx,NULL,NULL) )
-                               edg_wll_SetError(ctx, EINVAL, errs);
-                       fprintf(stderr, errs);
-                       continue;
-               }
-               edg_wll_ULMDateToTimeval(buff, &(event->any.arrived));
-
-               if ( i == 1 )
-               {
-                       result->from = event->any.arrived.tv_sec;
-                       result->to = event->any.arrived.tv_sec;
-               }
-               ctx->event_load = 1;
-               
-               do {
-                       if (edg_wll_Transaction(ctx)) goto err;
-
-                       edg_wll_StoreEvent(ctx, event, line, NULL); 
-
-               } while (edg_wll_TransNeedRetry(ctx));
-
-               if ((ret = edg_wll_Error(ctx, NULL, &errdesc)) != 0) {
-                       int             len = strlen(line),
-                                       total = 0,
-                                       written;
-
-                       fprintf(stderr, "Can't store event: %s\n", errdesc);
-                       if ( reject_fd == -1 )
-                       {
-                               char   *s, *s1;
-
-                               if ( result->server_file != NULL )
-                                       goto cycle_clean;
-
-                               s1 = strdup(req->server_file);
-                               s = strrchr(s1, '/');
-                               if ( s )
-                               {
-                                       *s = '\0';
-                                       reject_fd = edg_wll_CreateFileStorage(ctx,FILE_TYPE_LOAD,s1,&(result->server_file));
-                               }
-                               else
-                                       reject_fd = edg_wll_CreateFileStorage(ctx,FILE_TYPE_LOAD,NULL,&(result->server_file));
-                               if ( reject_fd == -1 )
-                                       goto cycle_clean;
-                               printf("New reject file %s created\n", result->server_file);
-                               free(s1);
-                       }
-                       /*      Save the line into "reject_file"
-                        */
-                       while (total != len) {
-                               written = write(reject_fd, line+total, len-total);
-                               if (written < 0 && errno != EAGAIN) {
-                                       edg_wll_SetError(ctx, errno, "writing load reject file");
-                                       free(line);
-                                       break;
-                               }
-                               total += written;
-                       }
-                       write(reject_fd,"\n",1);
-               }
-               else {
-                       result->to = event->any.arrived.tv_sec;
-                       if ( jobid )
-                       {
-                               char *md5_jobid = edg_wlc_JobIdGetUnique(jobid);
-                               
-                               if ( strcmp(md5_jobid, edg_wlc_JobIdGetUnique(event->any.jobId)) )
-                               {
-                                       edg_wll_JobStat st;
-
-                                       edg_wll_JobStatusServer(ctx, jobid, 0, &st);
-                                       edg_wll_FreeStatus(&st);
-
-                                       edg_wlc_JobIdFree(jobid);
-                                       edg_wlc_JobIdDup(event->any.jobId, &jobid);
-                               }
-                               free(md5_jobid);
-                       }
-                       else
-                               edg_wlc_JobIdDup(event->any.jobId, &jobid);
-               }
-
-
-cycle_clean:
-               ctx->event_load = 0;
-               edg_wll_FreeEvent(event);
-       }
-
-err:
-       if ( jobid )
-       {
-               edg_wll_JobStat st;
-
-               edg_wll_JobStatusServer(ctx, jobid, 0, &st);
-               edg_wll_FreeStatus(&st);
-               edg_wlc_JobIdFree(jobid);
-       }
-
-       if ( reject_fd != -1 )
-               close(reject_fd);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-#define BUFFSZ                 1024
-
-static int read_line(char **buff, size_t *maxsize, int fd)
-{
-       int             ct, i;
-       void            *tmp;
-
-
-       if ( *buff == NULL )
-       {
-               *buff = malloc(BUFFSZ);
-               if ( *buff == NULL )
-                       return -1;
-               *maxsize = BUFFSZ;
-       }
-
-       i = 0;
-       while ( 1 )
-       {
-               if (i >= *maxsize) {
-                       (*maxsize) *= 2;
-                       if ((tmp = realloc(*buff, *maxsize)) == NULL) return -1;
-                       *buff = (char *)tmp;
-               }
-               if ( (ct = read(fd, (*buff)+i, 1)) == -1 )
-                       return -1;
-
-               if ( ct == 0 )
-                       return 0;
-
-               if ( (*buff)[i] == '\n' )
-               {
-                       (*buff)[i--] = '\0';
-                       while ( (i != -1) && isspace((*buff)[i]) ) i--;
-                       if ( i == -1 )
-                       {
-                               /**     empty line
-                                */
-                               i = 0;
-                               continue;
-                       }
-                       else
-                               return 1;
-               }
-
-               i++;
-       }
-}
diff --git a/org.glite.lb.server/src/mon-db.c b/org.glite.lb.server/src/mon-db.c
deleted file mode 100644 (file)
index 553fc50..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <sysexits.h>
-#include <assert.h>
-
-#include "glite/jobid/strmd5.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/jobstat.h"
-#include "db_supp.h"
-#include "openserver.h"
-
-#ifdef LB_PERF
-#include "glite/lb/lb_perftest.h"
-#include "srv_perf.h"
-
-enum lb_srv_perf_sink sink_mode;
-#endif
-
-/* XXX: referenced global variables, unsed in mon */
-char   *server_key,*server_cert;
-int    enable_lcas;
-
-static struct option opts[] = {
-       { "mysql",1,NULL,'m' },
-       { "debug",0,NULL,'d' },
-       { "verbose",0,NULL,'v' },
-       { NULL, 0, NULL, 0 }
-};
-
-int debug  = 0;
-
-static void usage();
-static void do_exit(edg_wll_Context,int);
-static const char *me;
-
-int main(int argc,char **argv)
-{
-       int     opt, caps;
-       char    *dbstring = getenv("LBDB");
-       int     verbose = 0, rows = 0, fields = 0, njobs = 0, i;
-       edg_wll_Context ctx;
-       char    *stmt = NULL, *status = NULL;
-       char    *str[2];
-       glite_lbu_Statement sh;
-       int     jobs[EDG_WLL_NUMBER_OF_STATCODES];
-
-       me = strdup(argv[0]);
-
-       while ((opt = getopt_long(argc,argv,"m:dv",opts,NULL)) != EOF) switch (opt) {
-               case 'm': dbstring = optarg; break;
-               case 'd': debug++; verbose++; break;
-               case 'v': verbose++; break;
-               case '?': usage(); exit(EX_USAGE);
-       }
-
-       edg_wll_InitContext(&ctx);
-       for (i = 1; i<EDG_WLL_NUMBER_OF_STATCODES; i++) jobs[i] = 0;
-       if (edg_wll_Open(ctx,dbstring)) do_exit(ctx,EX_UNAVAILABLE);
-       if ((caps = glite_lbu_DBQueryCaps(ctx->dbctx)) < 0 || !(caps & GLITE_LBU_DB_CAP_INDEX)) do_exit(ctx,EX_SOFTWARE);
-       if (asprintf(&stmt,"SELECT status,count(status) FROM states GROUP BY status;") < 0) do_exit(ctx,EX_OSERR);
-       if (verbose) fprintf(stderr,"mysql query: %s\n",stmt);
-       if ((rows = edg_wll_ExecSQL(ctx,stmt,&sh)) < 0) do_exit(ctx,EX_SOFTWARE);
-       if (verbose) fprintf(stderr,"number of states returned: %d\n",rows);
-       if (rows > 0) fprintf(stdout,"Number of jobs in each state: \n");
-       for (i = 0; i < rows; i++) {
-               fields = edg_wll_FetchRow(ctx, sh, sizeof(str)/sizeof(str[0]),NULL,str);
-               if (fields != 2) {
-                       glite_lbu_FreeStmt(&sh);
-                       do_exit(ctx,EX_SOFTWARE);
-               }
-               jobs[atoi(str[0])] = atoi(str[1]);
-               if (str[0]) free(str[0]);
-               if (str[1]) free(str[1]);
-       }
-       for (i = 1; i<EDG_WLL_NUMBER_OF_STATCODES; i++) {
-               status = edg_wll_StatToString((edg_wll_JobStatCode) i);
-               fprintf(stdout,"%d \t %s \t %d\n",i,status,jobs[i]);
-               njobs += jobs[i];
-               if (status) free(status);
-       }
-       fprintf(stdout,"Total number of jobs: %d\n",njobs);
-
-       if (stmt) free(stmt);
-       glite_lbu_FreeStmt(&sh);
-       edg_wll_FreeContext(ctx);
-
-       return 0;
-}
-
-static void do_exit(edg_wll_Context ctx,int code)
-{
-       char    *et,*ed;
-
-       edg_wll_Error(ctx,&et,&ed);
-       fprintf(stderr,"%s: %s (%s)\n",me,et,ed);
-       exit(code);
-}
-
-static void usage()
-{
-       fprintf(stderr,"usage: %s <options>\n"
-                       "       -m,--mysql <dbstring>   use non-default database connection\n"
-                       "       -d,--debug              print debug info (if any)\n"
-                       "       -v,--verbose            be verbose\n",
-                       me);
-}
diff --git a/org.glite.lb.server/src/notif_match.c b/org.glite.lb.server/src/notif_match.c
deleted file mode 100644 (file)
index f351605..0000000
+++ /dev/null
@@ -1,232 +0,0 @@
-#ident "$Header$"
-
-#include <string.h>
-#include <time.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <syslog.h>
-#include <errno.h>
-#include <unistd.h>
-#include <assert.h>
-
-#include "glite/lb/context-int.h"
-#include "glite/lbu/trio.h"
-
-#include "lb_authz.h"
-#include "lb_xml_parse.h"
-#include "query.h"
-#include "il_notification.h"
-#include "db_supp.h"
-#include "index.h"
-
-static int notif_match_conditions(edg_wll_Context,const edg_wll_JobStat *,const edg_wll_JobStat *,const char *);
-static int notif_check_acl(edg_wll_Context,const edg_wll_JobStat *,const char *);
-
-extern int debug;
-
-int edg_wll_NotifExpired(edg_wll_Context,const char *);
-
-int edg_wll_NotifMatch(edg_wll_Context ctx, const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat)
-{
-       edg_wll_NotifId         nid = NULL;
-       char    *jobq,*ju = NULL,*jobc[6];
-       glite_lbu_Statement     jobs = NULL;
-       int     ret,i;
-       time_t  expires,now = time(NULL);
-       
-       char *cond_where = NULL;
-       char *cond_and_where = NULL;
-
-       edg_wll_ResetError(ctx);
-
-       if (ctx->notif_index) {
-               edg_wll_IColumnRec *notif_index_cols = ctx->notif_index_cols;
-
-               for (i=0; notif_index_cols[i].qrec.attr; i++) {
-                       char    *val = NULL;
-
-                       if (notif_index_cols[i].qrec.attr != EDG_WLL_QUERY_ATTR_JDL_ATTR) {
-                               val = edg_wll_StatToSQL(stat,notif_index_cols[i].qrec.attr);
-                               assert(val != (char *) -1);
-                       }
-                       else { // Special Treatment for JDL attributes
-                               val = edg_wll_JDLStatToSQL(stat,notif_index_cols[i].qrec);
-                       } 
-
-                       if (val) {
-                               char    *aux;
-                               if (!cond_where) cond_where = strdup("");
-                               trio_asprintf(&aux, "%s or %s = %s",cond_where,
-                                               notif_index_cols[i].colname,val);
-                               free(cond_where);
-                               cond_where = aux;
-                               free(val);
-                       }
-                       else if (notif_index_cols[i].qrec.attr == EDG_WLL_QUERY_ATTR_JDL_ATTR) {
-                               char    *aux;
-                               if (!cond_and_where) cond_and_where = strdup("");
-                               trio_asprintf(&aux, "%s AND %s is NULL",cond_and_where,
-                                               notif_index_cols[i].colname);
-                               free(cond_and_where);
-                               cond_and_where = aux;
-                               free(val);
-                       }
-               }
-       }
-
-       if ( (ret = edg_wll_NotifIdCreate(ctx->srvName, ctx->srvPort, &nid)) )
-       {
-               edg_wll_SetError(ctx, ret, "edg_wll_NotifMatch()");
-               goto err;
-       }
-
-       trio_asprintf(&jobq,
-               "select distinct n.notifid,n.destination,n.valid,u.cert_subj,n.conditions,n.flags "
-               "from notif_jobs j,users u,notif_registrations n "
-               "where j.notifid=n.notifid and n.userid=u.userid "
-               "   and (j.jobid = '%|Ss' or j.jobid = '%|Ss' %s) %s",
-               ju = edg_wlc_JobIdGetUnique(stat->jobId),NOTIF_ALL_JOBS,cond_where ? cond_where : "",cond_and_where ? cond_and_where : "");
-
-       free(ju); ju = NULL;
-
-       if (edg_wll_ExecSQL(ctx,jobq,&jobs) < 0) goto err;
-
-       while ((ret = edg_wll_FetchRow(ctx,jobs,sizeof(jobc)/sizeof(jobc[0]),NULL,jobc)) > 0) {
-               if (now > (expires = glite_lbu_DBToTime(jobc[2]))) {
-                       edg_wll_NotifExpired(ctx,jobc[0]);
-                       if (debug) fprintf(stderr,"[%d] NOTIFY:%s expired at %s UTC\n",
-                                       getpid(),jobc[0],asctime(gmtime(&expires)));
-               }
-               else if (notif_match_conditions(ctx,oldstat,stat,jobc[4]) &&
-                               notif_check_acl(ctx,stat,jobc[3]))
-               {
-                       char                       *dest, *aux;
-                       int                                     port;
-
-                       if (debug) {
-                               fprintf(stderr,"NOTIFY: %s, job %s\n",jobc[0],
-                                       ju = edg_wlc_JobIdGetUnique(stat->jobId));
-                               free(ju); ju = NULL;
-                       }
-
-                       dest = strdup(jobc[1]);
-                       if ( !(aux = strchr(dest, ':')) )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "Can't parse notification destination");
-                               free(dest);
-                               for (i=0; i<sizeof(jobc)/sizeof(jobc[0]); i++) free(jobc[i]);
-                               goto err;
-                       }
-                       *aux = 0;
-                       aux++;
-                       port = atoi(aux);
-                       
-                       if (   edg_wll_NotifIdSetUnique(&nid, jobc[0]) )
-                       {
-                               free(dest);
-                               goto err;
-                       }
-                       /* XXX: only temporary hack!!!
-                        */
-                       ctx->p_instance = strdup("");
-                       if ( edg_wll_NotifJobStatus(ctx, nid, dest, port, jobc[3], atoi(jobc[5]), expires, *stat) )
-                       {
-                               free(dest);
-                               for (i=0; i<sizeof(jobc)/sizeof(jobc[0]); i++) free(jobc[i]);
-                               goto err;
-                       }
-                       free(dest);
-               }
-               
-               for (i=0; i<sizeof(jobc)/sizeof(jobc[0]); i++) free(jobc[i]);
-       }
-       if (ret < 0) goto err;
-       
-err:
-       free(ctx->p_instance); ctx->p_instance = NULL;
-       if ( nid ) edg_wll_NotifIdFree(nid);
-       free(jobq);
-       glite_lbu_FreeStmt(&jobs);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-int edg_wll_NotifExpired(edg_wll_Context ctx,const char *notif)
-{
-       char    *dn = NULL,*dj = NULL;
-
-       trio_asprintf(&dn,"delete from notif_registrations where notifid='%|Ss'",notif);
-       trio_asprintf(&dj,"delete from notif_jobs where notifid='%|Ss'",notif);
-
-       if (edg_wll_ExecSQL(ctx,dn,NULL) < 0 ||
-               edg_wll_ExecSQL(ctx,dj,NULL) < 0)
-       {
-               char    *et,*ed;
-               edg_wll_Error(ctx,&et,&ed);
-
-               syslog(LOG_WARNING,"delete notification %s: %s (%s)",notif,et,ed);
-               free(et); free(ed);
-       }
-
-       free(dn);
-       free(dj);
-       return edg_wll_ResetError(ctx);
-}
-
-
-static int notif_match_conditions(edg_wll_Context ctx,const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat,const char *cond)
-{
-       edg_wll_QueryRec        **c,**p;
-       int                     match,i;
-
-       if (!cond) return 1;
-
-       if (parseJobQueryRec(ctx,cond,strlen(cond),&c)) {
-               fputs("notif_match_conditions(): parseJobQueryRec failed\n",stderr);
-               syslog(LOG_ERR,"notif_match_conditions(): parseJobQueryRec failed");
-               return 1;
-       }
-
-       match = match_status(ctx,oldstat,stat,(const edg_wll_QueryRec **) c);
-       if ( c )
-       {
-               for (p = c; *p; p++) {
-                       for (i=0; (*p)[i].attr; i++)
-                               edg_wll_QueryRecFree((*p)+i);
-                       free(*p);
-               }
-               free(c);
-       }
-       return match;
-}
-
-/* FIXME: does not favour any VOMS information in ACL
- * effective VOMS groups of the recipient are not available here, should be 
- * probably stored along with the registration.
- */
-static int notif_check_acl(edg_wll_Context ctx,const edg_wll_JobStat *stat,const char *recip)
-{
-       edg_wll_Acl     acl = calloc(1,sizeof *acl);
-       int             ret;
-
-       edg_wll_ResetError(ctx);
-       if (strcmp(stat->owner,recip) == 0
-               || edg_wll_amIroot(recip,NULL,ctx->super_users)) return 1;
-
-       if (stat->acl == NULL) return 0;
-
-       ret = edg_wll_DecodeACL(stat->acl,&acl->value);
-       if (ret) {
-               edg_wll_FreeAcl(acl);
-               edg_wll_SetError(ctx,EINVAL,"decoding ACL");
-               return 0;
-       }
-
-       acl->string = stat->acl; 
-
-       ret = edg_wll_CheckACL(ctx, acl, EDG_WLL_CHANGEACL_READ);
-
-       acl->string = NULL;
-       edg_wll_FreeAcl(acl);
-
-       return !ret;
-}
diff --git a/org.glite.lb.server/src/notification.c b/org.glite.lb.server/src/notification.c
deleted file mode 100644 (file)
index 024b932..0000000
+++ /dev/null
@@ -1,842 +0,0 @@
-#ident "$Header$"
-
-#include <string.h>
-#include <time.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <syslog.h>
-#include <unistd.h>
-
-#include "glite/jobid/strmd5.h"
-#include "glite/lbu/trio.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/xml_parse.h"
-
-#include "il_notification.h"
-#include "query.h"
-#include "db_supp.h"
-#include "index.h"
-
-
-static char *get_user(edg_wll_Context ctx, int create);
-static int check_notif_request(edg_wll_Context, const edg_wll_NotifId, char **, char **);
-static int split_cond_list(edg_wll_Context, edg_wll_QueryRec const * const *,
-                                               edg_wll_QueryRec ***, char ***);
-static int update_notif(edg_wll_Context, const edg_wll_NotifId,
-                                               const char *, const char *, const char *);
-
-static int get_indexed_cols(edg_wll_Context,char const *,edg_wll_QueryRec **,char **);
-static void adjust_validity(edg_wll_Context,time_t *);
-static int drop_notif_request(edg_wll_Context, const edg_wll_NotifId);
-static int check_notif_age(edg_wll_Context, const edg_wll_NotifId);
-
-
-int edg_wll_NotifNewServer(
-       edg_wll_Context                                 ctx,
-       edg_wll_QueryRec const * const *conditions,
-       int     flags,
-       char const                                         *address_override,
-       const edg_wll_NotifId                   nid,
-       time_t                                             *valid)
-{
-       int                                     i;
-       char                       *q                   = NULL,
-                                          *nid_s               = NULL,
-                                          *time_s              = NULL,
-                                          *addr_s              = NULL,
-                                          *xml_conds   = NULL,
-                                          *owner               = NULL,
-                                         **jobs                = NULL;
-       edg_wll_QueryRec  **nconds              = NULL;
-       char            *add_index = NULL;
-
-
-       /*      Format notification ID
-        */
-       if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) )
-               goto cleanup;
-
-       /*      Get notification owner
-        */
-       if ( !(owner = get_user(ctx, 1)) )
-               goto cleanup;
-
-       /*      Format conditions
-        *      - separate all jobids
-        *      - format new condition list without jobids
-        */
-       if ( split_cond_list(ctx, conditions, &nconds, &jobs) )
-               goto cleanup;
-
-
-       /*
-        *      encode new cond. list into a XML string
-        */
-       if ( edg_wll_JobQueryRecToXML(ctx, (edg_wll_QueryRec const * const *) nconds, &xml_conds) )
-       {
-               /*      XXX: edg_wll_JobQueryRecToXML() do not set errors in context!
-                *                      can't get propper error number :(
-                */
-               edg_wll_SetError(ctx, errno, "Can't encode data into xml");
-               goto cleanup;
-       }
-
-       /*      Format time of validity
-        */
-
-       if (*valid == 0) 
-               *valid = time(NULL) + ctx->notifDuration;       
-       adjust_validity(ctx,valid);
-
-       glite_lbu_TimeToDB(*valid, &time_s);
-       if ( !time_s )
-       {
-               edg_wll_SetError(ctx, errno, NULL);
-               goto cleanup;
-       }
-
-       /*      Format the address
-        */
-       if ( address_override )
-       {
-               char   *aux;
-
-               if ( !(aux = strchr(address_override, ':')) )
-               {
-                       edg_wll_SetError(ctx, EINVAL, "Addres overrirde not in format host:port");
-                       goto cleanup;
-               }
-               if ( !strncmp(address_override, "0.0.0.0", aux-address_override) )
-                       trio_asprintf(&addr_s, "%s:%s", ctx->connections->serverConnection->peerName, aux+1);
-       }
-
-       do {
-               if (edg_wll_Transaction(ctx) != 0) goto cleanup;
-
-               /*      Format DB insert statement
-                */
-               trio_asprintf(&q,
-                                       "insert into notif_registrations(notifid,destination,valid,userid,conditions,flags) "
-                                       "values ('%|Ss','%|Ss',%s,'%|Ss', '<and>%|Ss</and>', '%d')",
-                                       nid_s, addr_s? addr_s: address_override, time_s, owner, xml_conds, flags);
-
-               if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 )
-                       goto rollback;
-
-               if (get_indexed_cols(ctx,nid_s,nconds,&add_index) ||
-                       (add_index && edg_wll_ExecSQL(ctx,add_index,NULL) < 0)
-               ) goto rollback;
-
-
-               if (jobs) for ( i = 0; jobs[i]; i++ )
-               {
-                       free(q);
-                       trio_asprintf(&q,
-                                       "insert into notif_jobs(notifid,jobid) values ('%|Ss','%|Ss')",
-                                       nid_s, jobs[i]);
-                       if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 )
-                               goto rollback;
-               }
-               else {
-                       trio_asprintf(&q,"insert into notif_jobs(notifid,jobid) values ('%|Ss','%|Ss')",
-                                       nid_s,NOTIF_ALL_JOBS);
-                       if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 ) goto rollback;
-
-               }
-
-rollback:
-               free(q); q= NULL;
-               free(add_index); add_index = NULL;
-
-       } while (edg_wll_TransNeedRetry(ctx));
-
-cleanup:
-       if ( q ) free(q);
-       if ( nid_s ) free(nid_s);
-       if ( time_s ) free(time_s);
-       if ( addr_s ) free(addr_s);
-       if ( xml_conds ) free(xml_conds);
-       if ( owner ) free(owner);
-       if ( jobs )
-       {
-               for ( i = 0; jobs[i]; i++ )
-                       free(jobs[i]);
-               free(jobs);
-       }
-       if ( nconds ) free(nconds);
-       free(add_index);
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-int edg_wll_NotifBindServer(
-       edg_wll_Context                                 ctx,
-       const edg_wll_NotifId                   nid,
-       const char                                         *address_override,
-       time_t                                             *valid)
-{
-       char    *time_s = NULL,
-               *addr_s = NULL;
-
-
-       if ( !address_override )
-       {
-               edg_wll_SetError(ctx, EINVAL, "Address parameter not given");
-               goto err;
-       }
-       
-       do {
-               if (edg_wll_Transaction(ctx) != 0) goto err;
-
-               if ( check_notif_request(ctx, nid, NULL, NULL) )
-                       goto rollback;
-
-               if ( check_notif_age(ctx, nid) ) {
-                       drop_notif_request(ctx, nid);
-                       goto rollback;
-               }
-
-               /*      Format time of validity
-                */
-
-               if (*valid == 0) 
-                       *valid = time(NULL) + ctx->notifDuration;       
-               adjust_validity(ctx,valid);
-
-               glite_lbu_TimeToDB(*valid, &time_s);
-               if ( !time_s )
-               {
-                       edg_wll_SetError(ctx, errno, "Formating validity time");
-                       goto rollback;
-               }
-
-               /*      Format the address
-                */
-               if ( address_override )
-               {
-                       char   *aux;
-
-                       if ( !(aux = strchr(address_override, ':')) )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "Addres overrirde not in format host:port");
-                               goto rollback;
-                       }
-                       if ( !strncmp(address_override, "0.0.0.0", aux-address_override) )
-                               trio_asprintf(&addr_s, "%s:%s", ctx->connections->serverConnection->peerName, aux+1);
-               }
-
-
-               update_notif(ctx, nid, NULL, addr_s? addr_s: address_override, (const char *)(time_s));
-
-rollback:
-       free(time_s); time_s = NULL;
-       free(addr_s); addr_s = NULL;
-
-       } while (edg_wll_TransNeedRetry(ctx));
-
-err:
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-int edg_wll_NotifChangeServer(
-       edg_wll_Context                                 ctx,
-       const edg_wll_NotifId                   nid,
-       edg_wll_QueryRec const * const *conditions,
-       edg_wll_NotifChangeOp                   op)
-{
-       int                                     i;
-       char                       *q                   = NULL,
-                                          *nid_s               = NULL,
-                                          *xml_conds   = NULL,
-                                         **jobs                = NULL;
-       edg_wll_QueryRec  **nconds              = NULL;
-
-
-       /*      Format notification ID
-        */
-       if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) )
-               goto err;
-
-       do {
-               if (edg_wll_Transaction(ctx) != 0) goto err;
-
-               if ( check_notif_request(ctx, nid, NULL, NULL) )
-                       goto rollback;
-
-               if ( check_notif_age(ctx, nid) ) {
-                       drop_notif_request(ctx, nid);
-                       goto rollback;
-               }
-
-               switch ( op )
-               {
-               case EDG_WLL_NOTIF_REPLACE:
-                       /*      Format conditions
-                        *      - separate all jobids
-                        *      - format new condition list without jobids
-                        */
-                       if ( split_cond_list(ctx, conditions, &nconds, &jobs) )
-                               goto rollback;
-
-                       /*
-                        *      encode new cond. list into a XML string
-                        */
-                       if ( edg_wll_JobQueryRecToXML(ctx, (edg_wll_QueryRec const * const *) nconds, &xml_conds) )
-                       {
-                               /*      XXX: edg_wll_JobQueryRecToXML() do not set errors in context!
-                                *                      can't get propper error number :(
-                                */
-                               edg_wll_SetError(ctx, errno, "Can't encode data into xml");
-                               goto rollback;
-                       }
-
-                       /*      Format DB insert statement
-                        */
-                       if ( update_notif(ctx, nid, xml_conds, NULL, NULL) )
-                               goto rollback;
-
-                       if ( jobs )
-                       {
-                               /*      Format DB insert statement
-                                */
-                               trio_asprintf(&q, "delete from  notif_jobs where notifid='%|Ss'", nid_s);
-                               if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 )
-                                       goto rollback;
-
-                               for ( i = 0; jobs[i]; i++ )
-                               {
-                                       free(q);
-                                       trio_asprintf(&q,
-                                                       "insert into notif_jobs(notifid,jobid) values ('%|Ss','%|Ss')",
-                                                       nid_s, jobs[i]);
-                                       if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 )
-                                       {
-                                               /*      XXX: Remove uncoplete registration?
-                                                *               Which error has to be returned?
-                                                */
-                                               free(q);
-                                               trio_asprintf(&q, "delete from notif_jobs where notifid='%|Ss'", nid_s);
-                                               edg_wll_ExecSQL(ctx, q, NULL);
-                                               free(q);
-                                               trio_asprintf(&q,"delete from notif_registrations where notifid='%|Ss'", nid_s);
-                                               edg_wll_ExecSQL(ctx, q, NULL);
-                                               goto rollback;
-                                       }
-                               }
-                       }
-                       break;
-
-               case EDG_WLL_NOTIF_ADD:
-                       break;
-               case EDG_WLL_NOTIF_REMOVE:
-                       break;
-               default:
-                       break;
-               }
-
-rollback:
-               free(q); q = NULL;
-               free(xml_conds); xml_conds = NULL;
-               free(nid_s); nid_s = NULL;
-               if ( jobs ) {
-                       for ( i = 0; jobs[i]; i++ )
-                               free(jobs[i]);
-                       free(jobs); jobs = NULL;
-               }
-               free(nconds); nconds = NULL;
-
-       } while (edg_wll_TransNeedRetry(ctx));
-
-err:
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-int edg_wll_NotifRefreshServer(
-       edg_wll_Context                                 ctx,
-       const edg_wll_NotifId                   nid,
-       time_t                                             *valid)
-{
-       char       *time_s = NULL, *dest = NULL;
-
-       do {
-               if (edg_wll_Transaction(ctx) != 0) goto err;            
-
-               if ( check_notif_request(ctx, nid, NULL, &dest) )
-                       goto rollback;
-
-               if ( check_notif_age(ctx, nid) ) {
-                       drop_notif_request(ctx, nid);
-                       goto rollback;
-               }
-
-               /*      Format time of validity
-                */
-
-               if (*valid == 0) 
-                       *valid = time(NULL) + ctx->notifDuration;       
-               adjust_validity(ctx,valid);
-
-               glite_lbu_TimeToDB(*valid, &time_s);
-               if ( !time_s )
-               {
-                       edg_wll_SetError(ctx, errno, "Formating validity time");
-                       goto rollback;
-               }
-
-               update_notif(ctx, nid, NULL, dest, time_s);
-
-rollback:
-               free(time_s); time_s = NULL;
-               free(dest); dest = NULL;
-
-       } while (edg_wll_TransNeedRetry(ctx));
-
-err:
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-int edg_wll_NotifDropServer(
-       edg_wll_Context                                 ctx,
-       edg_wll_NotifId                            nid)
-{
-       do {
-               if (edg_wll_Transaction(ctx) != 0) goto err;
-
-               if ( check_notif_request(ctx, nid, NULL, NULL) )
-                       goto rollback;
-
-               if ( drop_notif_request(ctx, nid) )
-                       goto rollback;
-
-rollback:
-               ;
-       } while (edg_wll_TransNeedRetry(ctx));
-
-err:
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-static char *get_user(edg_wll_Context ctx, int create)
-{
-       glite_lbu_Statement     stmt    = NULL;
-       char               *userid      = NULL,
-                                  *q           = NULL;
-       int                             ret;
-       char    *can_peername = NULL;
-
-       if ( !ctx->peerName )
-       {
-               edg_wll_SetError(ctx, EPERM, "Annonymous access not allowed");
-               goto cleanup;
-       }
-       can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0);
-       trio_asprintf(&q, "select userid from users where cert_subj='%|Ss'", can_peername);
-               if ( edg_wll_ExecSQL(ctx, q, &stmt) < 0 )
-                       goto cleanup;
-
-       /*      returned value:
-        *      0               no user find - continue only when 'create' parameter is set
-        *      >0              user found - return selected value
-        *      <0              SQL error
-        */
-       if ( ((ret = edg_wll_FetchRow(ctx, stmt, 1, NULL, &userid)) != 0) || !create )
-               goto cleanup;
-
-       if ( !(userid = strdup(strmd5(ctx->peerName, NULL))) )
-       {
-               edg_wll_SetError(ctx, errno, "Creating user ID");
-               goto cleanup;
-       }
-       free(q);
-       trio_asprintf(&q, "insert into users(userid,cert_subj) values ('%|Ss','%|Ss')",
-                       userid, can_peername);
-       if ( edg_wll_ExecSQL(ctx, q, NULL) < 0 )
-       {
-               if ( edg_wll_Error(ctx,NULL,NULL) != EEXIST )
-               {
-                       free(userid);
-                       userid = NULL;
-               }
-               else
-                       edg_wll_ResetError(ctx);
-       }
-
-cleanup:
-       if ( q ) free(q);
-       if ( stmt ) glite_lbu_FreeStmt(&stmt);
-       free(can_peername);
-
-       return userid;
-}
-
-
-static int check_notif_request(
-       edg_wll_Context                         ctx,
-       const edg_wll_NotifId           nid,
-       char                                      **owner,
-       char    **destination)
-{
-       char       *nid_s = NULL,
-                          *stmt, *user, *dest = NULL;
-       int                     ret;
-       glite_lbu_Statement     s = NULL;
-
-
-       /* XXX: rewrite select below in order to handle cert_subj format changes */
-       if ( !(user = get_user(ctx, 0)) )
-       {
-               if ( !edg_wll_Error(ctx, NULL, NULL) )
-                       edg_wll_SetError(ctx, EPERM, "Unknown user");
-
-               return edg_wll_Error(ctx, NULL, NULL);
-       }
-
-       if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) )
-               goto cleanup;
-
-       trio_asprintf(&stmt,
-                               "select destination from notif_registrations "
-                               "where notifid='%|Ss' and userid='%|Ss' FOR UPDATE",
-                               nid_s, user);
-
-       if ( (ret = edg_wll_ExecSQL(ctx, stmt, &s)) < 0 )
-               goto cleanup;
-       if ( ret == 0 )
-       {
-               free(stmt);
-               trio_asprintf(&stmt,
-                                       "select notifid from notif_registrations where notifid='%|Ss'", nid_s);
-               ret = edg_wll_ExecSQL(ctx, stmt, NULL);
-               if ( ret == 0 )
-                       edg_wll_SetError(ctx, ENOENT, "Unknown notification ID");
-               else if ( ret > 0 )
-                       edg_wll_SetError(ctx, EPERM, "Only owner could access the notification");
-               goto cleanup;
-       }
-       else edg_wll_FetchRow(ctx,s,1,NULL,&dest);
-
-cleanup:
-       if ( !edg_wll_Error(ctx, NULL, NULL)) {
-               if (owner) *owner = user; else free(user);
-               if (destination) *destination = dest; else free(dest);
-       }
-
-       if ( nid_s ) free(nid_s);
-       if ( stmt ) free(stmt);
-       glite_lbu_FreeStmt(&s);
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-       /*      Format conditions
-        *      - first of all separate all jobids
-        *      - then format new condition list without jobids and encode it into an XML string
-        */
-static int split_cond_list(
-       edg_wll_Context                                         ctx,
-       edg_wll_QueryRec const * const     *conditions,
-       edg_wll_QueryRec                                 ***nconds_out,
-       char                                                     ***jobs_out)
-{
-       edg_wll_QueryRec  **nconds = NULL;
-       char                      **jobs = NULL;
-       int                                     i, j, jobs_ct, nconds_ct;
-
-
-       if ( !conditions || !conditions[0] ) {
-               if (ctx->noAuth) nconds_ct = jobs_ct = 0;
-               else return edg_wll_SetError(ctx, EINVAL, "Empty condition list");
-       }
-       else for ( nconds_ct = jobs_ct = i = 0; conditions[i]; i++ ) {
-               if ( conditions[i][0].attr && conditions[i][0].attr != EDG_WLL_QUERY_ATTR_JOBID )
-                       nconds_ct++;
-               for ( j = 0; conditions[i][j].attr; j++ )
-                       if ( conditions[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID )
-                               jobs_ct++;
-       }
-
-       if ( jobs_out && jobs_ct )
-               if ( !(jobs = calloc(jobs_ct+1, sizeof(char *))) )
-               {
-                       edg_wll_SetError(ctx, errno, NULL);
-                       goto cleanup;
-               }
-
-       if ( nconds_out && nconds_ct )
-               if ( !(nconds = calloc(nconds_ct+1, sizeof(edg_wll_QueryRec *))) )
-               {
-                       edg_wll_SetError(ctx, errno, NULL);
-                       goto cleanup;
-               }
-
-       if ( jobs ) for ( jobs_ct = i = 0; conditions[i]; i++ )
-               for ( j = 0; conditions[i][j].attr; j++ )
-                       if ( conditions[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID )
-                               if ( !(jobs[jobs_ct++] = edg_wlc_JobIdGetUnique(conditions[i][j].value.j)) )
-                               {
-                                       edg_wll_SetError(ctx, errno, NULL);
-                                       goto cleanup;
-                               }
-
-       if ( nconds ) for ( nconds_ct = i = 0; conditions[i]; i++ )
-               if ( conditions[i][0].attr && conditions[i][0].attr != EDG_WLL_QUERY_ATTR_JOBID )
-                       /*      !!! DO NOT DEALLOCATE this arrays (it is not neccessary to allocate new
-                        *      mem - it's used only once and only for xml parsing
-                        */
-                       nconds[nconds_ct++] = (edg_wll_QueryRec  *) (conditions[i]);
-
-       if ( jobs_out ) { *jobs_out = jobs; jobs = NULL; }
-       if ( nconds_out ) { *nconds_out = nconds; nconds = NULL; }
-
-cleanup:
-       if ( nconds ) free(nconds);
-       if ( jobs )
-       {
-               for ( i = 0; jobs[i]; i++ )
-                       free(jobs[i]);
-               free(jobs);
-       }
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-static int update_notif(
-       edg_wll_Context                                 ctx,
-       const edg_wll_NotifId                   nid,
-       const char                                         *conds,
-       const char                                         *dest,
-       const char                                         *valid)
-{
-       char    *nid_s = NULL, *host = NULL,
-               *stmt = NULL, *aux = NULL;
-       int     ret, port = 0;
-
-
-       if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) )
-       {
-               edg_wll_SetError(ctx, EINVAL, "Malformed notification ID.");
-               goto cleanup;
-       }
-
-       /*      Format SQL update string
-        *      (Only the owner could update the notification registration)
-        */
-       if ( !(stmt = strdup("update notif_registrations set")) )
-       {
-               edg_wll_SetError(ctx, errno, "updating notification records");
-               goto cleanup;
-       }
-       if ( dest )
-       {
-               host = strchr(dest, ':');
-               port = atoi(host+1);
-               if ( !(host = strndup(dest, host-dest)) )
-               {
-                       edg_wll_SetError(ctx, errno, "updating notification records");
-                       goto cleanup;
-               }
-               trio_asprintf(&aux, "%s destination='%|Ss'", stmt, dest);
-               free(stmt);
-               stmt = aux;
-       }
-       if ( valid )
-       {
-               trio_asprintf(&aux, "%s %svalid=%s", stmt, dest? ",": "", valid);
-               free(stmt);
-               stmt = aux;
-       }
-       if ( conds )
-       {
-               trio_asprintf(&aux, "%s %sconditions='<and>%|Ss</and>'",
-                                               stmt, (dest||valid)? ",": "", conds);
-               free(stmt);
-               stmt = aux;
-       }
-       trio_asprintf(&aux, "%s where notifid='%|Ss'", stmt, nid_s);
-       free(stmt);
-       stmt = aux;
-
-       if ( (ret = edg_wll_ExecSQL(ctx, stmt, NULL)) < 0 )
-               goto cleanup;
-       if ( ret == 0 )
-       {
-               free(stmt);
-               trio_asprintf(&stmt,
-                               "select notifid from notif_registrations where notifid='%|Ss'", nid_s);
-               ret = edg_wll_ExecSQL(ctx, stmt, NULL);
-               if ( ret == 0 )
-                       edg_wll_SetError(ctx, ENOENT, "Unknown notification ID");
-               /*
-                *      XXX: Be happy?
-                *      May be: Rows matched: 1  Changed: 0  Warnings: 0 :-)
-               else if ( ret > 0 )
-                       edg_wll_SetError(ctx, EPERM, "Updating notification records");
-                */
-       }
-
-       if ( host || valid) {
-               char    *v = strdup(valid),*v2 = strchr(v+1,'\'');
-               int     expires;
-               
-               *v2 = 0;
-               expires = glite_lbu_DBToTime(v+1);
-/*
-               printf("edg_wll_NotifChangeIL(ctx, %s, %s, %d)\n",
-                               nid_s? nid_s: "nid", host, port);
-*/
-               if ( edg_wll_NotifChangeIL(ctx, nid, host, port, expires) ) {
-                       char *errt, *errd;
-
-                       edg_wll_Error(ctx, &errt, &errd);
-                       fprintf(stderr,"edg_wll_NotifChangeIL(): %s (%s)\n", errt, errd);
-                       free(errt);
-                       free(errd);
-               }
-               free(v);
-       }
-
-
-cleanup:
-       if ( nid_s ) free(nid_s);
-       if ( stmt ) free(stmt);
-       if ( host ) free(host);
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-static int get_indexed_cols(edg_wll_Context ctx,char const *notif,edg_wll_QueryRec **conds,char **update_out)
-{
-       int     i,j;
-       edg_wll_IColumnRec      * notif_cols = ctx->notif_index_cols;
-       char    *cols = NULL,*aux;
-
-       for (i=0; conds && conds[i]; i++) {
-               for (j=0; notif_cols[j].qrec.attr &&
-                       (notif_cols[j].qrec.attr != conds[i]->attr || 
-                               (notif_cols[j].qrec.attr == EDG_WLL_QUERY_ATTR_JDL_ATTR && 
-                                       (!conds[i]->attr_id.tag || strcmp(notif_cols[j].qrec.attr_id.tag,conds[i]->attr_id.tag))
-                               )
-                       ); j++);
-               if (notif_cols[j].qrec.attr) {
-                       if (conds[i][1].attr && conds[i][0].op != EDG_WLL_QUERY_OP_EQUAL) {
-                               char    buf[1000];
-                               sprintf(buf,"%s: indexed, only one and only `equals' condition supported",
-                                               notif_cols[j].colname);
-
-                               return edg_wll_SetError(ctx,EINVAL,buf);
-                       }
-                       trio_asprintf(&aux,"%s%c %s = '%|Ss'",
-                                       cols ? cols : "",
-                                       cols ? ',': ' ',
-                                       notif_cols[j].colname,conds[i]->value.c
-                       );
-                       free(cols);
-                       cols = aux; 
-
-               }
-       }
-       if (cols) trio_asprintf(&aux,"update notif_registrations set %s where notifid = '%s'",
-                                       cols,notif);
-       else aux = NULL;
-
-       free(cols);
-       *update_out = aux;
-       return edg_wll_ResetError(ctx);
-}
-
-static void adjust_validity(edg_wll_Context ctx,time_t *valid)
-{
-       time_t  now;
-
-       time(&now);
-
-       if (*valid <= 0) {
-               *valid = now + ctx->notifDuration;
-       }
-
-       if (ctx->peerProxyValidity && ctx->peerProxyValidity < *valid)
-               *valid = ctx->peerProxyValidity;
-
-       if (*valid - now > ctx->notifDurationMax) 
-               *valid = now + ctx->notifDurationMax;
-}
-
-static int drop_notif_request(edg_wll_Context ctx, const edg_wll_NotifId nid) {
-       char       *nid_s = NULL,
-                  *stmt = NULL,
-                  *errDesc;
-       int         errCode;
-
-       errCode = edg_wll_Error(ctx, NULL, &errDesc);   
-
-       if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) )
-               goto rollback;
-
-       trio_asprintf(&stmt, "delete from notif_registrations where notifid='%|Ss'", nid_s);
-       if ( edg_wll_ExecSQL(ctx, stmt, NULL) < 0 )
-               goto rollback;
-       free(stmt);
-       trio_asprintf(&stmt, "delete from notif_jobs where notifid='%|Ss'", nid_s);
-       if ( edg_wll_ExecSQL(ctx, stmt, NULL) < 0 ) 
-               goto rollback;
-       edg_wll_NotifCancelRegId(ctx, nid);
-       if (edg_wll_Error(ctx, NULL, NULL) == ECONNREFUSED) {
-               /* Let notification erase from DB, 
-                * on notif-IL side it will be autopurged later anyway */
-
-               fprintf(stderr,"[%d] edg_wll_NotifDropServer() - NotifID found and dropped,"\
-                       " however, connection to notif-IL was refused (notif-IL not running?)\n", getpid());
-               syslog(LOG_INFO,"edg_wll_NotifDropServer() - NotifID found and dropped,"\
-                       " however, connection to notif-IL was refused (notif-IL not running?)");
-
-               edg_wll_ResetError(ctx);
-       }
-
-rollback:
-       free(nid_s); nid_s = NULL;
-       free(stmt); stmt = NULL;
-       /* take precedence to previous error */
-       if (errCode || errDesc) {
-               edg_wll_SetError(ctx, errCode, errDesc);
-               free(errDesc);
-       }
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-static int check_notif_age(edg_wll_Context ctx, const edg_wll_NotifId nid) {
-       time_t now = time(NULL);
-       char *time_s = NULL,
-            *nid_s = NULL,
-            *q = NULL;
-       int ret;
-
-       if ( !(nid_s = edg_wll_NotifIdGetUnique(nid)) )
-               goto cleanup;
-
-       glite_lbu_TimeToDB(now, &time_s);
-       if ( !time_s )
-       {
-               edg_wll_SetError(ctx, errno, NULL);
-               goto cleanup;
-       }
-
-       trio_asprintf(&q, "select notifid from notif_registrations WHERE notifid='%|Ss' AND valid < %s", nid_s, time_s);
-       if ( (ret = edg_wll_ExecSQL(ctx, q, NULL)) < 0 )
-               goto cleanup;
-
-       if (ret > 0)
-               edg_wll_SetError(ctx, EINVAL, "Notification expired.");
-
-cleanup:
-       free(q);
-       free(nid_s);
-       free(time_s);
-       return edg_wll_Error(ctx, NULL, NULL);
-}
diff --git a/org.glite.lb.server/src/openserver.c b/org.glite.lb.server/src/openserver.c
deleted file mode 100644 (file)
index 8580ff5..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-#ident "$Header$"
-
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-
-#include "glite/lb/context-int.h"
-#include "openserver.h"
-#include "db_supp.h"
-
-edg_wll_ErrorCode edg_wll_Open(edg_wll_Context ctx, char *cs)
-{
-       int ret, hit = 0, i;
-       char *table[1];
-       char *cols[20];
-       glite_lbu_Statement stmt;
-
-       if (!ctx->dbctx && glite_lbu_InitDBContext((glite_lbu_DBContext*) &ctx->dbctx) != 0) {
-               char *ed;
-
-               glite_lbu_DBError(ctx->dbctx, NULL, &ed);
-               edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_INIT, ed);
-               free(ed);
-               return EDG_WLL_ERROR_DB_INIT;
-       }
-       if (glite_lbu_DBConnect(ctx->dbctx,cs) != 0) return edg_wll_SetErrorDB(ctx);
-
-       hit = 0;
-       // new columns added to jobs
-       if ((ret = glite_lbu_ExecSQL(ctx->dbctx, "DESC jobs", &stmt)) <= 0) goto err;
-       while (hit < 4 && (ret = glite_lbu_FetchRow(stmt, 1, NULL, cols)) > 0) {
-               assert(ret <= (int)(sizeof cols/sizeof cols[0]));
-               if (strcasecmp(cols[0], "proxy") == 0 ||
-                   strcasecmp(cols[0], "server") == 0 ||
-                   strcasecmp(cols[0], "grey") == 0 ||
-                   strcasecmp(cols[0], "nevents") == 0) hit++;
-               for (i = 0; i < ret; i++) free(cols[i]);
-       }
-       if (ret < 0) goto err;
-       glite_lbu_FreeStmt(&stmt);
-       // new columns added to events
-       if (glite_lbu_ExecSQL(ctx->dbctx, "DESC events", &stmt) <= 0) goto err;
-       while (hit < 5 && (ret = glite_lbu_FetchRow(stmt, 1, NULL, cols)) > 0) {
-               assert(ret <= (int)(sizeof cols/sizeof cols[0]));
-               if (strcasecmp(cols[0], "seqcode") == 0) hit++;
-               for (i = 0; i < ret; i++) free(cols[i]);
-       }
-       if (ret < 0) goto err;
-       glite_lbu_FreeStmt(&stmt);
-       // new columns added to notif_registrations
-       if (glite_lbu_ExecSQL(ctx->dbctx, "DESC notif_registrations", &stmt) <= 0) goto err;
-       while (hit < 6 && (ret = glite_lbu_FetchRow(stmt, 1, NULL, cols)) > 0) {
-               assert(ret <= (int)(sizeof cols/sizeof cols[0]));
-               if (strcasecmp(cols[0], "flags") == 0) hit++;
-               for (i = 0; i < ret; i++) free(cols[i]);
-       }
-       if (ret < 0) goto err;
-       glite_lbu_FreeStmt(&stmt);
-
-       if (hit != 6) {
-               ret = edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_INIT, "old DB schema found, migration to new schema needed");
-               goto close_db;
-       }
-
-       // events_flesh table added
-       if (glite_lbu_ExecSQL(ctx->dbctx, "SHOW TABLES", &stmt) <= 0) goto err;
-       hit = 0;
-       while (hit < 3 && (ret = glite_lbu_FetchRow(stmt, 1, NULL, table)) > 0) {
-               if (strcasecmp(table[0], "events_flesh") == 0 ||
-               strcasecmp(table[0], "zombie_jobs") == 0 ||
-               strcasecmp(table[0], "zombie_suffixes") == 0 ||
-               strcasecmp(table[0], "zombie_prefixes") == 0) hit++;
-               free(table[0]);
-       }
-       if (ret < 0) goto err;
-       glite_lbu_FreeStmt(&stmt);
-       if (hit != 3) {
-               ret = edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_INIT, "events_flesh or zombie_jobs or zombie_prefixes or zombie_suffixes table not found, migration to new schema needed");
-               goto close_db;
-       }
-
-       return 0;
-
-err:
-       edg_wll_SetErrorDB(ctx);
-       glite_lbu_FreeStmt(&stmt);
-close_db:
-       glite_lbu_DBClose(ctx->dbctx);
-       return ret;
-}
-
-edg_wll_ErrorCode edg_wll_Close(edg_wll_Context ctx)
-{
-       glite_lbu_DBClose(ctx->dbctx);
-       glite_lbu_FreeDBContext(ctx->dbctx);
-       ctx->dbctx = NULL;
-       return edg_wll_ResetError(ctx);
-}
diff --git a/org.glite.lb.server/src/openserver.h b/org.glite.lb.server/src/openserver.h
deleted file mode 100644 (file)
index 574e403..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-
-edg_wll_ErrorCode edg_wll_Open(edg_wll_Context ctx, char *cs);
-edg_wll_ErrorCode edg_wll_Close(edg_wll_Context ctx);
diff --git a/org.glite.lb.server/src/perftest_proxy.sh b/org.glite.lb.server/src/perftest_proxy.sh
deleted file mode 100755 (executable)
index 96d5094..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-#!/bin/bash
-
-numjobs=10
-
-# XXX - there must be better way to find stage
-STAGEDIR=/home/michal/shared/egee/jra1-head/stage
-. $STAGEDIR/sbin/perftest_common.sh
-
-LOGEVENT=${LOGEVENT:-$STAGEDIR/bin/glite-lb-logevent}
-
-DEBUG=${DEBUG:-0}
-
-SILENT=0
-while getopts "t:n:s" OPTION 
-do
-    case "$OPTION" in 
-    "t") TEST_VARIANT=$OPTARG
-    ;;
-
-    "n") numjobs=$OPTARG
-    ;;
-
-    "s") SILENT=1
-    ;;
-
-    esac
-done
-
-# CONSUMER_ARGS=
-# PERFTEST_COMPONENT=
-# COMPONENT_ARGS=
-#LOGJOBS_ARGS="" 
-
-check_test_files || exit 1
-check_file_executable $LOGEVENT || exit 1
-
-SEQCODE="UI=999990:NS=9999999990:WM=999990:BH=9999999990:JSS=999990:LM=999990:LRMS=999990:APP=999990"
-
-purge_proxy ()
-{
-    for jobid in $@
-    do
-       $LOGEVENT -x -S /tmp/proxy.perfstore.sock -c $SEQCODE -j $jobid -s UserInterface -e Abort --reason Purge > /dev/null 2>&1
-    done
-}
-
-group_a () {
-echo "----------------------------------"
-echo "LB Proxy test"
-echo "----------------------------------"
-echo "Events are consumed:"
-echo "1) before parsing"
-echo "2) after parsing, before storing into database"
-echo "3) after storing into db, before computing state"
-echo "4) after computing state, before sending to IL"
-echo "5) by IL"
-echo ""
-LOGJOBS_ARGS="-s /tmp/proxy.perf"
-}
-
-echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-
-
-group_a_test_n () 
-{
-    PERFTEST_CONSUMER=$STAGEDIR/bin/glite-lb-proxy
-    i=$1
-    CONSUMER_ARGS="-d --perf-sink $i -p /tmp/proxy.perf" 
-    export PERFTEST_NAME="proxy_test_$i"
-    echo -n "${i})"
-    run_test proxy $numjobs
-    print_result
-    # purge jobs from database
-    # we have to start proxy again 
-    $PERFTEST_CONSUMER -d -p /tmp/proxy.perf -s 1 >/dev/null 2>&1  &
-    PID=$!
-    purge_proxy `$LOGJOBS -n $numjobs`
-    sleep 2
-    shutdown $PID
-}
-
-group_a_test_5 ()
-{
-    PERFTEST_COMPONENT="$STAGEDIR/bin/glite-lb-proxy"
-    COMPONENT_ARGS="-d -p /tmp/proxy.perf --proxy-il-sock /tmp/interlogger.perf  --proxy-il-fprefix /tmp/perftest.log"
-
-    PERFTEST_CONSUMER="$STAGEDIR/bin/glite-lb-interlogd-perf-empty"
-    CONSUMER_ARGS="-d -s /tmp/interlogger.perf --file-prefix=/tmp/perftest.log"
-    export PERFTEST_NAME="proxy_test_5"
-    echo -n "5)"
-    run_test proxy $numjobs
-    print_result
-    $PERFTEST_COMPONENT -d -p /tmp/proxy.perf -s 1 >/dev/null 2>&1  &
-    PID=$!
-    purge_proxy `$LOGJOBS -n $numjobs`
-    sleep 2
-    shutdown $PID
-    rm -f /tmp/perftest.log.*
-}
-
-group="a"
-
-group_$group
-
-if [[ $SILENT -eq 0 ]]
-then
-    while [[ -z $TEST_VARIANT ]]
-    do
-       echo -n "Your choice: "
-       read -e TEST_VARIANT
-    done
-    echo -e "\tavg_job \t big_job \t avg_dag \t big_dag"
-fi
-
-if [[ "x$TEST_VARIANT" = "x*" ]]
-then
-   TEST_VARIANT="1 2 3 4 5"
-fi
-
-for variant in $TEST_VARIANT
-do
-    if [[ "$variant" = "5" ]]
-    then
-       group_${group}_test_${variant}
-    else
-       group_${group}_test_n $variant
-    fi
-done
diff --git a/org.glite.lb.server/src/pretty_print_wrapper.cpp b/org.glite.lb.server/src/pretty_print_wrapper.cpp
deleted file mode 100644 (file)
index df7c806..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#include "pretty_print_wrapper.h"
-
-#include <classad_distribution.h>
-#include <string>
-#include <string.h>
-
-int pretty_print(char *jdl, char **formated_print){
-       ClassAd        *classad;
-       ClassAdParser  parser;
-
-       classad = parser.ParseClassAd(std::string(jdl), true);
-       if (! classad){
-               *formated_print = NULL;
-               return -1;      // not ClassAd data
-       }
-
-       PrettyPrint     pp;
-       std::string buf;
-       pp.Unparse(buf, classad);
-       *formated_print = strdup(buf.c_str());
-
-       return 0;
-}
-
diff --git a/org.glite.lb.server/src/purge.h b/org.glite.lb.server/src/purge.h
deleted file mode 100644 (file)
index 4252fdd..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef GLITE_LB_PURGE_H
-#define GLITE_LB_PURGE_H
-
-#ident "$Header"
-
-#include <signal.h>
-#include "glite/lb/context.h"
-
-extern volatile sig_atomic_t purge_quit;
-
-/** Server side implementation
- *  besides output to the SSL stream (in the context) it may produce
- *  the server-side dump files
- */
-int edg_wll_PurgeServer(
-       edg_wll_Context ctx,
-       const edg_wll_PurgeRequest *request,
-       edg_wll_PurgeResult *result
-);
-
-/** LB Proxy purge implementation
- *     it gives no output - purge only one job from LB Proxy DB
- */
-int edg_wll_PurgeServerProxy(
-       edg_wll_Context ctx,
-       glite_jobid_const_t job
-);
-
-#define                FILE_TYPE_ANY           ""
-#define                FILE_TYPE_PURGE         "purge"
-#define                FILE_TYPE_DUMP          "dump"
-#define                FILE_TYPE_LOAD          "load"
-
-extern int edg_wll_CreateTmpFileStorage(
-       edg_wll_Context ctx,
-       char *prefix,
-       char **fname
-);
-
-extern int edg_wll_CreateFileStorageFromTmp(
-       edg_wll_Context ctx,
-       char *tmp_type,
-       char *file_type,
-       char **fname
-);
-
-extern int edg_wll_CreateFileStorage(
-       edg_wll_Context ctx,
-       char *file_type,
-       char *prefix,
-       char **fname
-);
-
-extern int edg_wll_DumpEventsServer(edg_wll_Context ctx,const edg_wll_DumpRequest *req,edg_wll_DumpResult *result);
-
-extern int edg_wll_LoadEventsServer(edg_wll_Context ctx,const edg_wll_LoadRequest *req,edg_wll_LoadResult *result);
-
-#define edg_wll_CreateTmpDumpFile(ctx, f)      edg_wll_CreateTmpFileStorage(ctx,ctx->dumpStorage,f)
-#define edg_wll_CreateTmpPurgeFile(ctx, f)     edg_wll_CreateTmpFileStorage(ctx,ctx->purgeStorage,f)
-
-#define edg_wll_CreateDumpFileFromTmp(ctx, f, f2)      \
-                       edg_wll_CreateFileStorageFromTmp(ctx, f, FILE_TYPE_DUMP, f2)
-#define edg_wll_CreatePurgeFileFromTmp(ctx, f, f2)     \
-                       edg_wll_CreateFileStorageFromTmp(ctx, f, FILE_TYPE_PURGE, f2)
-
-#define edg_wll_CreateDumpFile(ctx, f)         edg_wll_CreateFileStorage(ctx,FILE_TYPE_DUMP,NULL,f)
-#define edg_wll_CreatePurgeFile(ctx, f)                edg_wll_CreateFileStorage(ctx,FILE_TYPE_PURGE,NULL,f)
-
-#endif /* GLITE_LB_PURGE_H */
diff --git a/org.glite.lb.server/src/query.c b/org.glite.lb.server/src/query.c
deleted file mode 100644 (file)
index 737a860..0000000
+++ /dev/null
@@ -1,1757 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <syslog.h>
-#include <errno.h>
-#include <time.h>
-#include <assert.h>
-
-#include <expat.h>
-
-#include <cclassad.h>
-
-#include "glite/jobid/strmd5.h"
-#include "glite/lbu/trio.h"
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/xml_conversions.h"
-
-
-#include "get_events.h"
-#include "index.h"
-#include "query.h"
-#include "store.h"
-#include "lb_authz.h"
-#include "db_supp.h"
-#include "jobstat.h"
-
-#define FL_SEL_STATUS          1
-#define FL_SEL_TAGS                    (1<<1)
-#define FL_SEL_JOB                     (1<<2)
-#define FL_FILTER                      (1<<3)  // DB query result needs further filtering
-#define FL_SEL_JDL                     (1<<4)  // Retrieve classads while filtering
-
-
-static int check_event_query_index(edg_wll_Context,const edg_wll_QueryRec **,const edg_wll_QueryRec **);
-static char *jc_to_head_where(edg_wll_Context, const edg_wll_QueryRec **, int *);
-static char *ec_to_head_where(edg_wll_Context, const edg_wll_QueryRec **);
-static int match_flesh_conditions(const edg_wll_Event *,const edg_wll_QueryRec **);
-static int check_strict_jobid_cond(edg_wll_Context, const edg_wll_QueryRec **);
-
-static int cmp_string(const char *,edg_wll_QueryOp,const char *);
-static int is_all_query(const edg_wll_QueryRec **);
-
-
-
-#define sizofa(a) (sizeof(a)/sizeof((a)[0]))
-
-int edg_wll_QueryEventsServer(
-        edg_wll_Context ctx,
-               int     noAuth,
-        const edg_wll_QueryRec **job_conditions,
-        const edg_wll_QueryRec **event_conditions,
-        edg_wll_Event **events)
-{
-       char               *job_where = NULL,
-                                  *event_where = NULL,
-                                  *qbase = NULL,
-                                  *q = NULL,
-                                  *res[12];
-       edg_wll_Event  *out = NULL;
-       glite_lbu_Statement     sh = NULL;
-       int                             i = 0,
-                                       ret = 0,
-                                       offset = 0, limit = 0,
-                                       limit_loop = 1,
-                                       eperm = 0,
-                                       where_flags = 0;
-       char *peerid = NULL;
-       char *can_peername = NULL, *can_peerid = NULL;
-       char            *j_old = NULL;
-       int             match_status_old = 0;
-       edg_wll_JobStat state_out;
-
-       edg_wll_ResetError(ctx);
-       memset(&state_out, 0, sizeof(edg_wll_JobStat));
-
-       if ( (ctx->p_query_results == EDG_WLL_QUERYRES_ALL) &&
-                       (!job_conditions || !job_conditions[0] || job_conditions[1] ||
-                       (job_conditions[0][0].attr != EDG_WLL_QUERY_ATTR_JOBID) ||
-                       (job_conditions[0][1].attr != EDG_WLL_QUERY_ATTR_UNDEF)) )
-       {
-               edg_wll_SetError(ctx, EINVAL, "Invalid parameter EDG_WLL_PARAM_QUERY_RESULTS");
-               goto cleanup;
-       }
-
-       if ((!ctx->noIndex && check_event_query_index(ctx,job_conditions,event_conditions)) ||
-               check_strict_jobid_cond(ctx,job_conditions) ||
-               check_strict_jobid_cond(ctx,event_conditions))
-               goto cleanup;
-
-       if (event_conditions && *event_conditions && (*event_conditions)->attr &&
-               !(event_where = ec_to_head_where(ctx,event_conditions)) &&
-               edg_wll_Error(ctx,NULL,NULL) != 0)
-               if (!ctx->noIndex) goto cleanup;
-
-       if ( job_conditions && *job_conditions && (*job_conditions)->attr &&
-               !(job_where = jc_to_head_where(ctx, job_conditions, &where_flags)) && 
-               edg_wll_Error(ctx,NULL,NULL) != 0 )
-       /* XXX: covered with error check above:  if (!ctx->noIndex) */
-                goto cleanup;
-
-       if (ctx->peerName) peerid = strdup(strmd5(ctx->peerName,NULL));
-       can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0);
-       if (can_peername) can_peerid = strdup(strmd5(can_peername,NULL));
-
-/* XXX: similar query in srv_purge.c ! They has to match due to common
- * convert_event_head() called on the result
- */
-       trio_asprintf(&qbase,"SELECT e.event,j.userid,j.dg_jobid,e.code,"
-               "e.prog,e.host,u.cert_subj,e.time_stamp,e.usec,e.level,e.arrived,e.seqcode "
-               "FROM events e,users u,jobs j%s "
-               "WHERE %se.jobid=j.jobid AND e.userid=u.userid AND e.code != %d "
-               "%s %s %s %s %s %s",
-               where_flags & FL_SEL_STATUS ? ",states s"       : "",
-               where_flags & FL_SEL_STATUS ? "s.jobid=j.jobid AND " : "",
-               EDG_WLL_EVENT_UNDEF,
-               job_where ? "AND" : "",
-               job_where ? job_where : "",
-               event_where ? "AND" : "",
-               event_where ? event_where : "",
-               (ctx->isProxy) ? "AND j.proxy='1'" : "AND j.server='1'",
-               (where_flags & FL_FILTER) ? "order by j.dg_jobid" : "");
-
-       if ( ctx->softLimit )
-       {
-               if ( ctx->hardEventsLimit )
-                       limit = ctx->softLimit < ctx->hardEventsLimit? ctx->softLimit: ctx->hardEventsLimit;
-               else
-                       limit = ctx->softLimit;
-       }
-       else if ( ctx->hardEventsLimit )
-               limit = ctx->hardEventsLimit;
-       else
-               limit = 0;
-
-       i = 0;
-       out = calloc(1, sizeof(*out));
-       do
-       {
-               if ( limit )
-                       trio_asprintf(&q, "%s LIMIT %d, %d", qbase, offset, limit);
-               else if ( !q )
-                       q = qbase;
-
-//             printf("\nquery: %s\n\n", q);
-               ret = edg_wll_ExecSQL(ctx, q, &sh);
-               if ( limit )
-                       free(q);
-               if ( ret < 0 )
-               {
-                       glite_lbu_FreeStmt(&sh);
-                       goto cleanup;
-               }
-               if ( ret == 0 )
-               {
-                       limit_loop = 0;
-                       goto limit_cycle_cleanup;
-               }
-               if ( !limit || (ret < limit) )
-                       limit_loop = 0;
-
-               offset += ret;
-               while ( (ret = edg_wll_FetchRow(ctx, sh, sizofa(res), NULL, res)) == sizofa(res) )
-               {
-                       int     n = atoi(res[0]);
-                       free(res[0]);
-
-                       /* Check non-indexed event conditions */
-                       if ( convert_event_head(ctx, res+2, out+i) || edg_wll_get_event_flesh(ctx, n, out+i) )
-                       {
-                               char    *et,*ed, *dbjob;
-
-                       /* Most likely sort of internal inconsistency. 
-                        * Must not be fatal -- just complain
-                        */
-                               edg_wll_Error(ctx,&et,&ed);
-
-                               dbjob = res[2];
-                               fprintf(stderr,"%s event %d: %s (%s)\n",dbjob,n,et,ed);
-                               syslog(LOG_WARNING,"%s event %d: %s (%s)",dbjob,n,et,ed);
-                               free(et); free(ed);
-                               edg_wll_ResetError(ctx);
-
-                               goto fetch_cycle_cleanup;
-                       }
-
-                       if ( !match_flesh_conditions(out+i,event_conditions) || check_strict_jobid(ctx,out[i].any.jobId) )
-                       {
-                               edg_wll_FreeEvent(out+i);
-                               edg_wll_ResetError(ctx);        /* check_strict_jobid() sets it */
-                               goto fetch_cycle_cleanup;
-                       }
-
-                       /* Check non-indexed job conditions */
-                       if (where_flags & FL_FILTER) {
-                               if (!j_old || strcmp(res[2], j_old)) { 
-                                       // event of different jobId than last time? 
-                                       // => count jobStatus for this jobId
-                                       
-                                       if (j_old) edg_wll_FreeStatus(&state_out);
-
-                                       if ( edg_wll_JobStatusServer(ctx, out[i].any.jobId, 0, &state_out) )
-                                       {
-                                               edg_wll_FreeEvent(out+i);
-                                               if (edg_wll_Error(ctx,NULL,NULL) == EPERM) eperm = 1;
-                                               goto fetch_cycle_cleanup;
-                                       }
-                               
-                                       if ( !(match_status_old = match_status(ctx, NULL, (&state_out), job_conditions)) )
-                                       {
-                                               edg_wll_FreeEvent(out+i);
-                                               edg_wll_ResetError(ctx);        /* check_strict_jobid() sets it */
-                                               goto fetch_cycle_cleanup;
-                                       }
-                               }
-                               else
-                               // the same jobId => the same jobStatus
-                               // => the same result of match_status()
-                                
-                               if (!match_status_old) {
-                                               edg_wll_FreeEvent(out+i);
-                                               edg_wll_ResetError(ctx);        /* check_strict_jobid() sets it */
-                                               goto fetch_cycle_cleanup;
-                               }
-                       }
-
-                       // Auth checked in edg_wll_JobStatusServer above
-                       if ( !(where_flags & FL_FILTER) && !noAuth )
-                       {
-                               if (!ctx->peerName || (strcmp(res[1],peerid) && strcmp(res[1], can_peerid))) {
-                                       edg_wll_Acl     acl = NULL;
-                                       char            *jobid = NULL;
-
-                                       ret = edg_wll_GetACL(ctx, out[i].any.jobId, &acl);
-                                       free(jobid);
-                                       if (ret || acl == NULL) {
-                                               eperm = 1;
-                                               edg_wll_FreeEvent(out+i);
-                                               edg_wll_ResetError(ctx); /* XXX: should be reported somewhere at least in debug mode */
-                                               goto fetch_cycle_cleanup;
-                                       }
-
-                                       ret = edg_wll_CheckACL(ctx, acl, EDG_WLL_CHANGEACL_READ);
-                                       edg_wll_FreeAcl(acl);
-                                       if (ret) {
-                                               eperm = 1;
-                                               edg_wll_FreeEvent(out+i);
-                                               edg_wll_ResetError(ctx); /* XXX: should be reported somewhere at least in debug mode */
-                                               goto fetch_cycle_cleanup;
-                                       }
-                               }
-                       }
-                       
-                       if ( (ctx->p_query_results != EDG_WLL_QUERYRES_ALL) && limit && (i+1 > limit) )
-                       {
-                               free(res[1]);
-                               memset(out+i, 0, sizeof(*out));
-                               edg_wll_SetError(ctx, E2BIG, "Query result size limit exceeded");
-                               if ( ctx->p_query_results == EDG_WLL_QUERYRES_LIMITED )
-                               {
-                                       limit_loop = 0;
-                                       goto limit_cycle_cleanup;
-                               }
-                               goto cleanup;
-                       }
-
-                       i++;
-                       out = (edg_wll_Event *) realloc(out, (i+1) * sizeof(*out));
-
-fetch_cycle_cleanup:
-                       memset(out+i, 0, sizeof(*out));
-                       free(res[1]);
-                       free(j_old);
-                       j_old=res[2];
-               }
-limit_cycle_cleanup:
-               glite_lbu_FreeStmt(&sh);
-       } while ( limit_loop );
-
-       if ( i == 0 && eperm )
-               edg_wll_SetError(ctx, EPERM, "matching events found but authorization failed");
-       else if ( i == 0 )
-               edg_wll_SetError(ctx, ENOENT, "no matching events found");
-       else
-       {
-               edg_wll_SortEvents(out);
-               *events = out;
-               out = NULL;
-       }
-
-cleanup:
-       if ( out )
-       {
-               for ( i = 0; out[i].type; i++ )
-                       edg_wll_FreeEvent(out+i);
-               free(out);
-       }
-       free(qbase);
-       free(job_where);
-       free(event_where);
-       free(j_old);
-       if (state_out.jobId) edg_wll_FreeStatus(&state_out);
-       free(peerid);
-       free(can_peername); free(can_peerid);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-int jobid_only_query(const edg_wll_QueryRec **conditions) {
-       int i = 0, j;
-       int jobid_in_this_or;
-       int not_jobid_only = 0;
-
-       while(conditions[i]) {
-               jobid_in_this_or = 0;
-               j = 0;
-               while(conditions[i][j].attr) {
-                       if(conditions[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID) jobid_in_this_or++;
-                       j++;
-               }
-               if (!jobid_in_this_or) not_jobid_only++;
-               i++;
-       }
-
-       return not_jobid_only;
-}
-
-int edg_wll_QueryJobsServer(
-               edg_wll_Context ctx,
-               const edg_wll_QueryRec **conditions,
-               int     flags,
-               edg_wlc_JobId **jobs,
-               edg_wll_JobStat **states)
-{
-       char                       *job_where = NULL,
-                                          *state_where = NULL,
-                                          *tags_where = NULL,
-                                          *q = NULL,
-                                          *qbase = NULL,
-                                          *zquery = NULL,
-                                          *res[3],
-                                          *dbjob,
-                                          *zomb_where = NULL,
-                                          *zomb_where_temp = NULL;
-       edg_wlc_JobId      *jobs_out = NULL;
-       edg_wll_JobStat    *states_out = NULL;
-       glite_lbu_Statement             sh;
-       int                                     i = 0,
-                                               j = 0,
-                                               ret = 0,
-                                               eperm = 0,
-                                               limit = 0, offset = 0,
-                                               limit_loop = 1,
-                                               where_flags = 0,
-                                               first_or;
-
-       memset(res,0,sizeof res);
-       edg_wll_ResetError(ctx);
-
-       if ( !conditions )
-       {
-               edg_wll_SetError(ctx, EINVAL, "empty condition list");
-               goto cleanup;
-       }
-
-
-
-       if ( (ctx->p_query_results == EDG_WLL_QUERYRES_ALL) &&
-                       (!conditions[0] || conditions[1] ||
-                       (conditions[0][0].attr != EDG_WLL_QUERY_ATTR_OWNER) ||
-                       (conditions[0][1].attr != EDG_WLL_QUERY_ATTR_UNDEF)) )
-       {
-               edg_wll_SetError(ctx, EINVAL, "Invalid parameter EDG_WLL_PARAM_QUERY_RESULTS");
-               goto cleanup;
-       }
-
-       if ( (!ctx->noIndex && check_job_query_index(ctx, conditions)) || check_strict_jobid_cond(ctx,conditions))
-               goto cleanup;
-
-       if ( !(job_where = jc_to_head_where(ctx, conditions, &where_flags)) && edg_wll_Error(ctx,NULL,NULL) != 0)
-               /* XXX: covered with error check above:  if (!ctx->noIndex) */
-               goto cleanup;
-
-       if ( (where_flags & FL_SEL_STATUS) )
-               trio_asprintf(&qbase,"SELECT DISTINCT j.dg_jobid,j.userid "
-                                                "FROM jobs j, states s WHERE j.jobid=s.jobid %s %s AND %s ORDER BY j.jobid", 
-                                               (job_where) ? "AND" : "",
-                                               (job_where) ? job_where : "",
-                                               (ctx->isProxy) ? "j.proxy='1'" : "j.server='1'");
-       else
-               trio_asprintf(&qbase,"SELECT DISTINCT j.dg_jobid,j.userid "
-                                                "FROM jobs j WHERE %s %s %s "
-                                                "ORDER BY j.jobid", 
-                                               (job_where) ? job_where : "",
-                                               (job_where) ? "AND" : "",
-                                               (ctx->isProxy) ? "j.proxy='1'" : "j.server='1'");
-
-       if ( ctx->softLimit )
-       {
-               if ( ctx->hardJobsLimit )
-                       limit = ctx->softLimit < ctx->hardJobsLimit? ctx->softLimit: ctx->hardJobsLimit;
-               else
-                       limit = ctx->softLimit;
-       }
-       else if ( ctx->hardJobsLimit )
-               limit = ctx->hardJobsLimit;
-       else
-               limit = 0;
-
-       jobs_out        = calloc(1, sizeof(*jobs_out));
-       states_out      = calloc(1, sizeof(*states_out));
-       i = 0;
-       do
-       {
-               if ( limit )
-                       trio_asprintf(&q, "%s LIMIT %d, %d", qbase, offset, limit);
-               else if ( !q )
-                       q = qbase;
-
-//             printf("\nquery: %s\n\n", q);
-               ret = edg_wll_ExecSQL(ctx, q, &sh);
-               if ( limit )
-                       free(q);
-               if ( ret < 0 )
-               {
-                       glite_lbu_FreeStmt(&sh);
-                       goto cleanup;
-               }
-               if ( ret == 0 )
-               {
-                       limit_loop = 0;
-                       goto limit_cycle_cleanup;
-               }
-               if ( !limit || (ret < limit) )
-                       limit_loop = 0;
-
-               offset += ret;
-               while ( (ret=edg_wll_FetchRow(ctx,sh,sizofa(res),NULL,res)) > 0 )
-               {
-                       if ( (ret = edg_wlc_JobIdParse(res[0], jobs_out+i)) )
-                       {       /* unlikely to happen, internal inconsistency */
-                               char    buf[200];
-                               snprintf(buf,sizeof buf,"JobIdParse(%s)",res[0]);
-                               edg_wll_SetError(ctx,ret,buf);
-                               free(res[0]); free(res[1]); free(res[2]);
-                               jobs_out[i]     = NULL;
-                               goto cleanup;
-                       }
-
-                       if ( check_strict_jobid(ctx, jobs_out[i]) )
-                       {
-                               edg_wlc_JobIdFree(jobs_out[i]);
-                               goto fetch_cycle_cleanup;
-                       }
-                       
-                       // if some condition hits unindexed column or states of matching jobs wanted
-
-                       if ((where_flags & FL_FILTER) || !(flags & EDG_WLL_STAT_NO_STATES)) {
-                               if ( edg_wll_JobStatusServer(ctx, jobs_out[i], (where_flags & FL_SEL_JDL)?(flags|EDG_WLL_STAT_CLASSADS):flags, &states_out[i]) )
-                               {
-                                       edg_wlc_JobIdFree(jobs_out[i]);
-                                       if (edg_wll_Error(ctx,NULL,NULL) == EPERM) eperm = 1;
-                                       goto fetch_cycle_cleanup;
-                               }
-
-                       }
-                       if (where_flags & FL_FILTER) {
-                               if ( !match_status(ctx, NULL, states_out+i, conditions) )
-                               {
-                                       edg_wlc_JobIdFree(jobs_out[i]);
-                                       edg_wll_FreeStatus(states_out+i);
-                                       edg_wll_ResetError(ctx);        /* check_strict_jobid() sets it */
-                                       goto fetch_cycle_cleanup;
-                               }
-                       }
-
-#if 0
-                       if ( !ctx->noAuth && (!ctx->peerName || strcmp(res[1], strmd5(ctx->peerName, NULL))) )
-                       {
-                               eperm = 1;
-                               edg_wlc_JobIdFree(jobs_out[i]);
-                               edg_wll_FreeStatus(states_out+i);
-                               goto fetch_cycle_cleanup;
-                       }
-#endif
-
-                       if ( (ctx->p_query_results != EDG_WLL_QUERYRES_ALL) && limit && (i+1 > limit) )
-                       {
-                               edg_wll_SetError(ctx, E2BIG, "Query result size limit exceeded");
-                               free(res[0]); free(res[1]); free(res[2]);
-                               memset(states_out+i, 0, sizeof(*states_out));
-                               jobs_out[i]     = NULL;
-                               if ( ctx->p_query_results == EDG_WLL_QUERYRES_LIMITED )
-                               {
-                                       limit_loop = 0;
-                                       goto limit_cycle_cleanup;
-                               }
-                               goto cleanup;
-                       }
-
-                       i++;
-                       jobs_out        = (edg_wlc_JobId *) realloc(jobs_out, (i+1) * sizeof(*jobs_out));
-                       states_out      = (edg_wll_JobStat *) realloc(states_out, (i+1) * sizeof(*states_out));
-
-fetch_cycle_cleanup:
-                       free(res[0]); free(res[1]); free(res[2]);
-                       memset(states_out+i, 0, sizeof(*states_out));
-                       jobs_out[i]     = NULL;
-               }
-limit_cycle_cleanup:
-               glite_lbu_FreeStmt(&sh);
-       } while ( limit_loop );
-
-       if ( !*jobs_out ) {
-               if(!jobid_only_query(conditions)) {
-                       i = 0;
-                       while(conditions[i]) {
-                               asprintf(&zomb_where_temp,"%s%s", zomb_where ? zomb_where : "(", zomb_where ? " AND (" : "");
-                               free(zomb_where); 
-                               zomb_where = zomb_where_temp; zomb_where_temp = NULL;
-
-                               first_or = 0;
-                               j = 0;
-                               while(conditions[i][j].attr) {
-                               
-                                       if(conditions[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID) {
-                                               dbjob = glite_jobid_unparse(conditions[i][j].value.j);
-                                               trio_asprintf(&zomb_where_temp,"%s%s(result.dg_jobid='%|Ss')",
-                                                       zomb_where,
-                                                       first_or ? " OR " : "", 
-                                                       dbjob);
-                                               free(dbjob); 
-                                               free(zquery);
-                                               free(zomb_where);
-                                               zomb_where = zomb_where_temp; zomb_where_temp = NULL;
-                                               first_or++;
-                                       }
-                                       j++;
-                               }
-                               asprintf(&zomb_where_temp,"%s)", zomb_where ? zomb_where : "");
-                               free(zomb_where); 
-                               zomb_where = zomb_where_temp; zomb_where_temp = NULL;
-                               i++;
-                       }
-
-                       trio_asprintf(&zquery,"SELECT * FROM "
-                                               "(SELECT  concat('https://',p.prefix,j.jobid,s.suffix) AS dg_jobid FROM "
-                                               "zombie_suffixes AS s, zombie_jobs AS j, zombie_prefixes AS p WHERE "
-                                               "(s.suffix_id = j.suffix_id) AND (p.prefix_id = j.prefix_id)) AS result "
-                                               "WHERE %s", zomb_where);        
-
-
-                       j = edg_wll_ExecSQL(ctx,zquery,&sh);
-
-                       if (j > 0) {
-                               jobs_out        = (edg_wlc_JobId *) calloc(j+1, sizeof(*jobs_out));
-                               states_out      = (edg_wll_JobStat *) calloc(j+1, sizeof(*states_out));
-
-                               i = 0; 
-                               while ( (ret=edg_wll_FetchRow(ctx,sh,sizofa(res),NULL,res)) > 0 ) {
-                                       edg_wlc_JobIdParse(res[0], jobs_out+i);
-                                       edg_wlc_JobIdParse(res[0], &(states_out[i].jobId));
-                                       states_out[i].state = EDG_WLL_JOB_PURGED;
-                                       free(res[0]); free(res[1]); free(res[2]);
-
-                                       i++;
-                               }
-                       }
-                       glite_lbu_FreeStmt(&sh);
-               }
-       }
-
-       if ( !*jobs_out ) {
-               if (eperm) edg_wll_SetError(ctx, EPERM, "matching jobs found but authorization failed");
-               else edg_wll_SetError(ctx, ENOENT, "no matching jobs found");
-       }
-
-       if ( i && (ret == 0) )
-       {
-               if ( states )
-               {
-                       *states = states_out;
-                       states_out = NULL;
-               }
-               if ( jobs )
-               {
-                       *jobs = jobs_out;
-                       jobs_out = NULL;
-               }
-       }
-
-
-cleanup:
-       free(qbase);
-       free(state_where);
-       free(tags_where);
-       free(job_where);
-
-       if (jobs_out)
-       {
-               for ( i = 0; jobs_out[i]; i++ )
-                       edg_wlc_JobIdFree(jobs_out[i]);
-               free(jobs_out);
-       }
-
-       if (states_out)
-       {
-               for (i=0; states_out[i].state; i++) edg_wll_FreeStatus(states_out+i);
-               free(states_out);
-       }
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-static int check_event_query_index(edg_wll_Context ctx,const edg_wll_QueryRec **jc,const edg_wll_QueryRec **ec)
-{
-       int     i, j;
-
-       if (check_job_query_index(ctx,jc) == 0) return 0;
-       edg_wll_ResetError(ctx);
-
-       if (ec && *ec) for (i=0; ec[i]; i++) for (j=0; ec[i][j].attr; j++) switch (ec[i][j].attr) {
-               case EDG_WLL_QUERY_ATTR_TIME:
-                       return 0;
-               default: break;
-       }
-       return edg_wll_SetError(ctx,EDG_WLL_ERROR_NOINDEX,
-                       is_all_query(jc) ? "\"-all\" queries denied by server configuration" : NULL);
-}
-
-int check_job_query_index(edg_wll_Context ctx, const edg_wll_QueryRec **jc)
-{
-       int             i, j, jj;
-
-
-       edg_wll_ResetError(ctx);
-
-       if ( !jc || !*jc )
-               return edg_wll_SetError(ctx,EDG_WLL_ERROR_NOINDEX,"unrestricted queries unsupported");
-
-       /*
-        *      First check presense of jobid - Primary key
-        */
-       for ( i = 0; jc[i]; i++ ) for ( j = 0; jc[i][j].attr; j++ )
-               if ( jc[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID ) return 0;
-
-       if ( !ctx->job_index )
-               return edg_wll_SetError(ctx, EDG_WLL_ERROR_NOINDEX, "no indices configured: jobid required in query");
-
-       for ( j = 0; ctx->job_index[j]; j++ )
-       {
-               if ( !ctx->job_index[j][0].attr )
-                       continue;
-
-               if ( ctx->job_index[j][1].attr )
-               {
-                       /*
-                        * check multi comlumn indexes
-                        */
-                       for ( jj = 0; ctx->job_index[j][jj].attr; jj++ )
-                       {
-                               for ( i = 0; jc[i]; i++ )
-                                       if ( !edg_wll_CmpColumn(&ctx->job_index[j][jj], &jc[i][0]) ) break;
-                               if ( !jc[i] )
-                                       break;
-                       }
-                       if ( !ctx->job_index[j][jj].attr )
-                               return 0;
-               }
-               else
-                       for ( i = 0; jc[i]; i++ )
-                               if ( !edg_wll_CmpColumn(&ctx->job_index[j][0], &jc[i][0]) ) return 0;
-       }
-
-       return edg_wll_SetError(ctx,EDG_WLL_ERROR_NOINDEX,
-                       is_all_query(jc) ? "\"-all\" queries denied by server configuration" : NULL);
-}
-
-#define opToString(op)                                                                         \
-       ((op) == EDG_WLL_QUERY_OP_EQUAL ? "=" :                                 \
-               ((op) == EDG_WLL_QUERY_OP_UNEQUAL ? "!=" :                      \
-                       ((op) == EDG_WLL_QUERY_OP_LESS ? "<" : ">" )))
-
-static char *ec_to_head_where(edg_wll_Context ctx,const edg_wll_QueryRec **ec)
-{
-       int                                     n, ct, m;
-       char                            msg[100],
-                                          *out,
-                                          *aux,
-                                          *conds, *retconds,
-                                          *dbt;
-                       
-
-       /*
-        * check correctness only
-        */
-       for ( ct = m = 0; ec[m]; m++ )
-       {
-               for ( n = 0; ec[m][n].attr; n++ ) switch ( ec[m][n].attr )
-               {
-               case EDG_WLL_QUERY_ATTR_HOST:
-                       if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with host attr");
-                               return NULL;
-                       }
-                       ct++;
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_SOURCE:
-                       if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with host attr");
-                               return NULL;
-                       }
-                       ct++;
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_USERTAG:
-                       if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with usertag attr");
-                               return NULL;
-                       }
-                       ct++;
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                       if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with jdl_attr");
-                               return NULL;
-                       }
-                       ct++;
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_INSTANCE:
-                       if ( ec[m][n].op != EDG_WLL_QUERY_OP_EQUAL && ec[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with instance attr");
-                               return NULL;
-                       }
-                       ct++;
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
-               case EDG_WLL_QUERY_ATTR_LEVEL:
-                       /*
-                        *      Any op allowed - but be careful
-                        */
-               case EDG_WLL_QUERY_ATTR_TIME:
-               case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-               case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                       /* any operator allowed */
-                       ct++;
-                       break;
-
-               default:
-                       sprintf(msg, "ec_to_head_where(): attr=%d unsupported", ec[m][n].attr);
-                       edg_wll_SetError(ctx, EINVAL, msg);
-                       return NULL;
-               }
-       }
-
-       if ( ct == 0 )
-       {
-               edg_wll_SetError(ctx,EINVAL,"ec_to_head_where(): empty conditions");
-               return NULL;
-       }
-
-       conds = retconds = NULL;
-       for ( m = 0; ec[m]; m++ )
-       {
-               /* 
-                * conditions captured by match_flesh_conditions() have to be skipped here.
-                * with all conditions in same "or clause"
-                */
-               for ( n = 0; ec[m][n].attr; n++ )
-                       if (    /* (ec[m][n].attr == EDG_WLL_QUERY_ATTR_USERTAG) || */
-                               (ec[m][n].attr == EDG_WLL_QUERY_ATTR_INSTANCE) )
-                               break;
-               if ( ec[m][n].attr )
-                       continue;
-
-               for ( n = 0; ec[m][n].attr; n++ ) switch ( ec[m][n].attr )
-               {
-               case EDG_WLL_QUERY_ATTR_TIME:
-               case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-               case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                       glite_lbu_TimeToDB(ec[m][n].value.t.tv_sec, &dbt);
-                       if ( conds )
-                       {
-                               if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                               {
-                                       trio_asprintf(&aux, "%s", dbt);
-                                       free(dbt);
-                                       glite_lbu_TimeToDB(ec[m][n].value2.t.tv_sec, &dbt);
-                                       trio_asprintf(&out, "%s OR (e.time_stamp >= %s AND e.time_stamp <= %s)", conds, aux, dbt);
-                                       free(aux);
-                               }
-                               else if (ec[m][n].op == EDG_WLL_QUERY_OP_EQUAL) {
-                                       trio_asprintf(&out, "%s OR (e.time_stamp = %s AND e.usec = %d)",
-                                                       conds, dbt, ec[m][n].value.t.tv_usec);
-                               }
-                               else
-                                       trio_asprintf(&out, "%s OR e.time_stamp %s %s", conds, opToString(ec[m][n].op), dbt);
-                               free(conds);
-                               conds = out;
-                       }
-                       else if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                       {
-                               trio_asprintf(&aux, "%s", dbt);
-                               free(dbt);
-                               glite_lbu_TimeToDB(ec[m][n].value2.t.tv_sec, &dbt);
-                               trio_asprintf(&conds, "(e.time_stamp >= %s AND e.time_stamp <= %s)", aux, dbt);
-                               free(aux);
-                       }
-                       else if (ec[m][n].op == EDG_WLL_QUERY_OP_EQUAL) {
-                               trio_asprintf(&conds, "(e.time_stamp = %s AND e.usec = %d)",
-                                               dbt, ec[m][n].value.t.tv_usec);
-                       }
-                       else {
-                               trio_asprintf(&conds, "e.time_stamp %s %s", opToString(ec[m][n].op), dbt);
-                       }
-                       free(dbt);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_LEVEL:
-                       if ( conds )
-                       {
-                               if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                                       trio_asprintf(&out, "%s OR (e.level >= %d AND e.level <= %d)", conds, ec[m][n].value.i, ec[m][n].value2.i);
-                               else
-                                       trio_asprintf(&out, "%s OR e.level %s %d", conds, opToString(ec[m][n].op), ec[m][n].value.i);
-                               free(conds); conds = out;
-                       }
-                       else
-                               if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                                       trio_asprintf(&conds, "(e.level >= %d AND e.level <= %d)", ec[m][n].value.i, ec[m][n].value2.i);
-                               else
-                                       trio_asprintf(&conds, "e.level %s %d", opToString(ec[m][n].op), ec[m][n].value.i);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_SOURCE:
-                       aux = edg_wll_SourceToString(ec[m][n].value.i);
-                       if ( conds )
-                       {
-                               trio_asprintf(&out, "%s OR e.prog %s '%|Ss'", conds, opToString(ec[m][n].op), aux);
-                               free(conds); conds = out;
-                       }
-                       else
-                               trio_asprintf(&conds, "e.prog %s '%|Ss'", opToString(ec[m][n].op), aux);
-                       free(aux);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_HOST:
-                       if ( conds )
-                       {
-                               trio_asprintf(&out, "%s OR e.host %s '%|Ss'", conds, opToString(ec[m][n].op), ec[m][n].value.c);
-                               free(conds); conds = out;
-                       }
-                       else
-                               trio_asprintf(&conds, "e.host %s '%|Ss'", opToString(ec[m][n].op), ec[m][n].value.c);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_USERTAG:
-                       if ( conds )
-                       {
-                               trio_asprintf(&out, "%s OR e.code = %d", conds, EDG_WLL_EVENT_USERTAG);
-                               free(conds); conds = out;
-                       }
-                       else
-                               trio_asprintf(&conds, "e.code = %d", EDG_WLL_EVENT_USERTAG);
-                       break;
-               case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
-                       if ( conds )
-                       {
-                               if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                                       trio_asprintf(&out, "%s OR (e.code >= %d AND e.code <= %d)", conds, ec[m][n].value.i, ec[m][n].value2.i);
-                               else
-                                       trio_asprintf(&out, "%s OR e.code %s %d", conds, opToString(ec[m][n].op), ec[m][n].value.i);
-                               free(conds); conds = out;
-                       }
-                       else
-                               if ( ec[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                                       trio_asprintf(&conds, "(e.code >= %d AND e.code <= %d)", ec[m][n].value.i, ec[m][n].value2.i);
-                               else
-                                       trio_asprintf(&conds, "e.code %s %d", opToString(ec[m][n].op), ec[m][n].value.i);
-                       break;
-
-               default:
-                       return NULL;
-               }
-
-               if ( !conds )
-                       continue;       
-
-               if ( retconds )
-               {
-                       trio_asprintf(&out, "%s AND (%s)", retconds, conds);
-                       free(retconds); retconds = out;
-                       free(conds); conds = NULL;
-               }
-               else
-               {
-                       trio_asprintf(&retconds, "(%s)", conds);
-                       free(conds); conds = NULL;
-               }
-       }
-
-       return retconds;
-}
-
-static int is_indexed(const edg_wll_QueryRec *cond, const edg_wll_Context ctx)
-{
-       int             i, j;
-
-
-       if ( !(ctx->job_index) )
-               return 0;
-
-       for ( i = 0; ctx->job_index[i]; i++ ) for ( j = 0; ctx->job_index[i][j].attr; j++ )
-               if ( !edg_wll_CmpColumn(&ctx->job_index[i][j], cond) ) return 1;
-       
-       return 0;
-}
-
-/*
- *     use where_flags to recognize which table to jois in SQL select
- *     
- */
-static char *jc_to_head_where(
-                               edg_wll_Context ctx,
-                               const edg_wll_QueryRec **jc,
-                               int *where_flags)
-{
-       int             ct, n, m;
-       char   *aux,
-                  *tmps,
-                  *tmps2,
-                  *dbt,
-                  *cname = NULL,
-                       msg[100];
-       char   *conds, *retconds;
-       char    *can_peername = NULL;
-
-       retconds = conds = NULL;
-
-       /*
-        * check correctness only
-        */
-       for ( ct = m = 0; jc[m]; m++ ) for ( n = 0; jc[m][n].attr; n++ )
-       {
-               if (   (jc[m][0].attr != jc[m][n].attr)
-                       || (   (jc[m][n].attr == EDG_WLL_QUERY_ATTR_USERTAG)
-                               && strcmp(jc[m][0].attr_id.tag, jc[m][n].attr_id.tag)) )
-               {
-                       edg_wll_SetError(ctx, EINVAL, "only same attribute types supported in 'or' expressions");
-                       return NULL;
-               }
-
-               switch ( jc[m][n].attr )
-               {
-               case EDG_WLL_QUERY_ATTR_JOBID:
-                       ct++;
-                       if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_GREATER)
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=', '>' and '!=' supported with jobid");
-                               return NULL;
-                       }
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_OWNER:
-                       ct++;
-                       if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with job owner");
-                               return NULL;
-                       }
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_LOCATION:
-                       ct++;
-                       if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with job location");
-                               return NULL;
-                       }
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_DESTINATION:
-                       ct++;
-                       if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with job destinations");
-                               return NULL;
-                       }
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_PARENT:
-                       ct++;
-                       if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with job parent");
-                               return NULL;
-                       }
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-                       ct++;
-                       if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with resubmitted attr");
-                               return NULL;
-                       }
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_TIME:
-                       if ( jc[m][n].attr_id.state == EDG_WLL_JOB_UNDEF )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "Time attribut have to be associated with status specification");
-                               return NULL;
-                       }
-                       ct++;
-                       break;
-               case EDG_WLL_QUERY_ATTR_DONECODE:
-               case EDG_WLL_QUERY_ATTR_EXITCODE:
-               case EDG_WLL_QUERY_ATTR_STATUS:
-               case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-               case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                       ct++;
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_USERTAG:
-                       ct++;
-                       break;
-               case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                       ct++;
-                       if ( jc[m][n].op != EDG_WLL_QUERY_OP_EQUAL && jc[m][n].op != EDG_WLL_QUERY_OP_UNEQUAL )
-                       {
-                               edg_wll_SetError(ctx, EINVAL, "only `=' and '!=' supported with JDL attributes");
-                               return NULL;
-                       }
-                       break;
-
-               default:
-                       sprintf(msg, "jc_to_head_where(): attr=%d unsupported", jc[m][n].attr);
-                       edg_wll_SetError(ctx, EINVAL, msg);
-                       return NULL;
-               }
-       }
-
-       if ( ct == 0 )
-       {
-               edg_wll_SetError(ctx, EINVAL, "jc_to_head_where(): empty conditions");
-               return NULL;
-       }
-
-       /*
-        * Now process conversion
-        */
-       for ( m = 0; jc[m]; m++ )
-       {
-               for ( n = 0; jc[m][n].attr; n++ ) switch (jc[m][n].attr)
-               {
-               case EDG_WLL_QUERY_ATTR_TIME:
-               case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-               case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                       if (   !is_indexed(&(jc[m][n]), ctx)
-                               || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
-                       {
-                               *where_flags |= FL_FILTER;
-                               break;
-                       }
-
-                       *where_flags |= FL_SEL_STATUS;
-
-                       glite_lbu_TimeToDB(jc[m][n].value.t.tv_sec, &dbt);
-                       if ( conds )
-                       {
-                               if ( jc[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                               {
-                                       trio_asprintf(&aux, "%s", dbt);
-                                       free(dbt);
-                                       glite_lbu_TimeToDB(jc[m][n].value2.t.tv_sec, &dbt);
-                                       trio_asprintf(&tmps, "%s OR (s.%s >= %s AND s.%s <= %s)", conds, cname, aux, cname, dbt);
-                                       free(dbt);
-                                       free(aux);
-                               }
-                               else
-                                       trio_asprintf(&tmps, "%s OR s.%s %s %s", conds, cname, opToString(jc[m][n].op), dbt);
-
-                               free(conds);
-                               conds = tmps;
-                       }
-                       else if ( jc[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                       {
-                               trio_asprintf(&aux, "%s", dbt);
-                               free(dbt);
-                               glite_lbu_TimeToDB(jc[m][n].value2.t.tv_sec, &dbt);
-                               trio_asprintf(&conds, "(s.%s >= %s AND s.%s <= %s)", cname, aux, cname, dbt);
-                               free(dbt);
-                               free(aux);
-                       }
-                       else
-                               trio_asprintf(&conds, "s.%s %s %s", cname, opToString(jc[m][n].op), dbt);
-
-                       free(cname);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_JOBID:
-                       *where_flags |= FL_SEL_JOB;
-                       aux = edg_wlc_JobIdGetUnique(jc[m][n].value.j);
-                       if ( conds )
-                       {
-                               trio_asprintf(&tmps, "%s OR j.jobid%s'%|Ss'", conds, opToString(jc[m][n].op), aux);
-                               free(conds); conds = tmps;
-                       }
-                       else
-                               trio_asprintf(&conds, "j.jobid%s'%|Ss'", opToString(jc[m][n].op), aux);
-                       free(aux);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_PARENT:
-                       if (   !is_indexed(&(jc[m][n]), ctx)
-                               || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
-                       {
-                               *where_flags |= FL_FILTER;
-                               break;
-                       }
-
-                       *where_flags |= FL_SEL_STATUS;
-                       aux = edg_wlc_JobIdGetUnique(jc[m][n].value.j);
-                       if ( conds )
-                       {
-                               trio_asprintf(&tmps, "%s OR s.%s%s'%|Ss'", conds, cname, opToString(jc[m][n].op), aux);
-                               free(conds); conds = tmps;
-                       }
-                       else
-                               trio_asprintf(&conds, "s.%s%s'%|Ss'", cname, opToString(jc[m][n].op), aux);
-                       free(aux);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_OWNER:
-                       if (   !is_indexed(&(jc[m][n]), ctx)
-                               || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
-                       {
-                               *where_flags |= FL_FILTER;
-                               break;
-                       }
-
-                       if ( !jc[m][n].value.c && !ctx->peerName ) 
-                       { 
-                               edg_wll_SetError(ctx, EPERM, "jc_to_head_where(): ctx->peerName empty");
-                               free(cname); free(conds); free(retconds);
-                               return NULL;
-                       }       
-
-                       tmps2 = edg_wll_gss_normalize_subj(jc[m][n].value.c, 0);
-                       if (!jc[m][n].value.c && !can_peername) {
-                               can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0);
-                       }
-
-                       *where_flags |= FL_SEL_STATUS;
-                       if ( conds )
-                       {
-                               if ( jc[m][n].value.c ) 
-                                       trio_asprintf(&tmps, "%s OR s.%s%s'%|Ss'", conds, cname, opToString(jc[m][n].op), tmps2);
-                               else
-                                       trio_asprintf(&tmps, "%s OR s.%s%s'%|Ss'", conds, cname, opToString(jc[m][n].op), can_peername);
-                               free(conds); conds = tmps;
-                       }
-                       else
-                       {
-                               if ( jc[m][n].value.c ) 
-                                       trio_asprintf(&conds, "s.%s%s'%|Ss'", cname, opToString(jc[m][n].op), tmps2);
-                               else
-                                       trio_asprintf(&conds, "s.%s%s'%|Ss'", cname, opToString(jc[m][n].op), can_peername);
-                       }
-                       free(tmps2);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_DONECODE:
-               case EDG_WLL_QUERY_ATTR_EXITCODE:
-               case EDG_WLL_QUERY_ATTR_STATUS:
-                       if (   !is_indexed(&(jc[m][n]), ctx)
-                               || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
-                       {
-                               *where_flags |= FL_FILTER;
-                               break;
-                       }
-
-                       *where_flags |= FL_SEL_STATUS;
-                       if ( conds )
-                       {
-                               if ( jc[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                                       trio_asprintf(&tmps, "%s OR (s.%s >= %d AND s.%s <= %d)", conds, cname, jc[m][n].value.i, cname, jc[m][n].value2.i);
-                               else
-                                       trio_asprintf(&tmps, "%s OR s.%s %s %d", conds, cname, opToString(jc[m][n].op), jc[m][n].value.i);
-                               free(conds); conds = tmps;
-                       }
-                       else
-                               if ( jc[m][n].op == EDG_WLL_QUERY_OP_WITHIN )
-                                       trio_asprintf(&conds, "(s.%s >= %d AND s.%s <= %d)", cname, jc[m][n].value.i, cname, jc[m][n].value2.i);
-                               else
-                                       trio_asprintf(&conds, "s.%s %s %d", cname, opToString(jc[m][n].op),jc[m][n].value.i);
-
-                       free(cname);
-                       break;
-
-               case EDG_WLL_QUERY_ATTR_DESTINATION:
-               case EDG_WLL_QUERY_ATTR_LOCATION:
-               case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-               case EDG_WLL_QUERY_ATTR_USERTAG:
-               case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                       if (   !is_indexed(&(jc[m][n]), ctx)
-                               || !(cname = edg_wll_QueryRecToColumn(&(jc[m][n]))) )
-                       {
-                               *where_flags |= FL_FILTER | FL_SEL_JDL;
-                               break;
-                       }
-
-                       *where_flags |= FL_SEL_STATUS;
-                       if ( conds )
-                       {
-                               trio_asprintf(&tmps, "%s OR s.%s%s'%s'", conds, cname, opToString(jc[m][n].op), jc[m][n].value.c);
-                               free(conds); conds = tmps;
-                       }
-                       else
-                               trio_asprintf(&conds, "s.%s%s'%s'", cname, opToString(jc[m][n].op), jc[m][n].value.c);
-
-                       free(cname);
-                       break;
-
-               default:
-                       /* this may never occure, but keep compiler happy */
-                       *where_flags |= FL_FILTER;      // just to be sure
-                       break;
-               }
-
-               if ( !conds ) continue;
-
-               if ( retconds )
-               {
-                       trio_asprintf(&tmps, "%s AND (%s)", retconds, conds);
-                       free(retconds); retconds = tmps;
-                       free(conds); conds = NULL;
-               }
-               else
-               {
-                       trio_asprintf(&retconds, "(%s)", conds);
-                       free(conds); conds = NULL;
-               }
-       }
-
-       free(can_peername);
-       return retconds;
-}
-
-
-static int match_flesh_conditions(const edg_wll_Event *e,const edg_wll_QueryRec **ec)
-{
-       int                     i, j;
-
-
-       if ( !ec )
-               return 1;
-
-       for ( i = 0; ec[i]; i++ )
-       {
-               j = 0;
-               while (    (ec[i][j].attr)
-                               && (ec[i][j].attr != EDG_WLL_QUERY_ATTR_USERTAG)
-                               && (ec[i][j].attr != EDG_WLL_QUERY_ATTR_INSTANCE) ) j++;
-               if ( !ec[i][j].attr )
-                       continue;
-
-               for ( j = 0; ec[i][j].attr; j++ )
-               {
-                       if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_TIME )
-                       {
-                               if (   ((ec[i][j].op == EDG_WLL_QUERY_OP_EQUAL) && (e->any.timestamp.tv_sec == ec[i][j].value.t.tv_sec))
-                                       || ((ec[i][j].op == EDG_WLL_QUERY_OP_LESS) && (e->any.timestamp.tv_sec < ec[i][j].value.t.tv_sec))
-                                       || ((ec[i][j].op == EDG_WLL_QUERY_OP_GREATER) && (e->any.timestamp.tv_sec < ec[i][j].value.t.tv_sec))
-                                       || (    (ec[i][j].op == EDG_WLL_QUERY_OP_WITHIN)
-                                               && (e->any.timestamp.tv_sec >= ec[i][j].value.t.tv_sec)
-                                               && (e->any.timestamp.tv_sec <= ec[i][j].value2.t.tv_sec)) )
-                                       break;
-                       }
-                       else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_SOURCE )
-                       {
-                               if ( e->any.source == EDG_WLL_SOURCE_NONE )
-                                       continue;
-                               if (   ((ec[i][j].op == EDG_WLL_QUERY_OP_EQUAL) && (e->any.source == ec[i][j].value.i))
-                                       || ((ec[i][j].op == EDG_WLL_QUERY_OP_LESS) && (e->any.source < ec[i][j].value.i))
-                                       || ((ec[i][j].op == EDG_WLL_QUERY_OP_GREATER) && (e->any.source < ec[i][j].value.i))
-                                       || (   (ec[i][j].op == EDG_WLL_QUERY_OP_WITHIN)
-                                               && (e->any.source >= ec[i][j].value.i)
-                                               && (e->any.source <= ec[i][j].value2.i)) )
-                                       break;
-                       }
-                       else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_LEVEL )
-                       {
-                               if (   ((ec[i][j].op == EDG_WLL_QUERY_OP_EQUAL) && (e->any.level == ec[i][j].value.i))
-                                       || ((ec[i][j].op == EDG_WLL_QUERY_OP_LESS) && (e->any.level < ec[i][j].value.i))
-                                       || ((ec[i][j].op == EDG_WLL_QUERY_OP_GREATER) && (e->any.level < ec[i][j].value.i))
-                                       || (   (ec[i][j].op == EDG_WLL_QUERY_OP_WITHIN)
-                                               && (e->any.level >= ec[i][j].value.i)
-                                               && (e->any.level <= ec[i][j].value2.i)) )
-                                       break;
-                       }
-                       else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_HOST )
-                       {
-                               if ( !strcmp(ec[i][j].value.c, e->any.host) )
-                                       break;
-                       }
-                       else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_EVENT_TYPE )
-                       {
-                               if ( e->any.type == ec[i][j].value.i )
-                                       break;
-                       }
-                       else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_USERTAG )
-                       {
-                               if ( e->any.type == EDG_WLL_EVENT_USERTAG && 
-                                       !strcmp(ec[i][j].attr_id.tag,e->userTag.name) 
-                                        && cmp_string(e->userTag.value,ec[i][j].op,ec[i][j].value.c))
-                                       break;
-                       }
-                       else if ( ec[i][j].attr == EDG_WLL_QUERY_ATTR_INSTANCE )
-                       {
-                               if (    e->any.src_instance
-                                        && cmp_string(ec[i][j].value.c, ec[i][j].op,  e->any.src_instance) )
-                                       break;
-                       }
-               }
-               if ( !ec[i][j].attr )
-                       /*
-                        *      No condition in "or" clause is valid
-                        */
-                       return 0;
-       }
-
-       return 1;
-}
-
-/* XXX: has to match exactly the main query in edg_wll_QueryEvents 
- *      and similar one in srv_purge.c 
- */
-int convert_event_head(edg_wll_Context ctx,char **f,edg_wll_Event *e)
-{
-       int     ret,i;
-
-       memset(e,0,sizeof *e);
-       edg_wll_ResetError(ctx);
-
-
-       if ((ret=edg_wlc_JobIdParse(f[0],&e->any.jobId))) {
-               edg_wll_SetError(ctx,-ret,"edg_wlc_JobIdParse()");
-               goto err;
-       }
-
-       e->type = atoi(f[1]);
-       free(f[1]); f[1] = NULL;
-       
-       e->any.source = edg_wll_StringToSource(f[2]); 
-       free(f[2]); f[2] = NULL;
-       
-       e->any.host = f[3];
-       f[3] = NULL;
-       
-       e->any.user = f[4];
-       f[4] = NULL;
-       
-       e->any.timestamp.tv_sec = glite_lbu_DBToTime(f[5]);
-       free(f[5]); f[5] = NULL;
-       
-       e->any.timestamp.tv_usec = atoi(f[6]);
-       free(f[6]); f[6] = NULL;
-
-       e->any.level = atoi(f[7]); 
-       free(f[7]); f[7] = NULL;
-
-       e->any.arrived.tv_sec = glite_lbu_DBToTime(f[8]); 
-       e->any.arrived.tv_usec = 0;
-       free(f[8]); f[8] = NULL;
-
-       e->any.seqcode = f[9];
-       f[9] = NULL;
-
-       return 0;
-
-err:
-       edg_wll_FreeEvent(e);
-       memset(e,0,sizeof *e);
-       for (i=0; i<9; i++) free(f[i]);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-
-/* FIXME: other op's, ORed conditions */
-int match_status(edg_wll_Context ctx, const edg_wll_JobStat *oldstat, const edg_wll_JobStat *stat, const edg_wll_QueryRec **conds)
-{
-       int             i, j, n;
-       char   *s, *s1;
-
-
-       if ( !conds ) return 1;
-
-       for ( i = 0; conds[i]; i++ )
-       {
-               for ( j = 0; conds[i][j].attr; j++ )
-               {
-                       // ignore operator CHANGED for non-notification matches
-                       if ( (conds[i][j].op == EDG_WLL_QUERY_OP_CHANGED) && !oldstat) continue;
-
-                       switch ( conds[i][j].attr )
-                       {
-                       case EDG_WLL_QUERY_ATTR_STATUS: 
-                               switch ( conds[i][j].op )
-                               {
-                               case EDG_WLL_QUERY_OP_EQUAL:
-                                       if ( conds[i][j].value.i == stat->state ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_UNEQUAL:
-                                       if ( conds[i][j].value.i != stat->state ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_LESS:
-                                       if ( conds[i][j].value.i > stat->state ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_GREATER:
-                                       if ( conds[i][j].value.i < stat->state ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_WITHIN:
-                                       if (   conds[i][j].value.i <= stat->state
-                                               && conds[i][j].value2.i >= stat->state ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_CHANGED:
-                                       if ( oldstat->state != stat->state ) goto or_satisfied;
-                                       break;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-                               if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) {
-                                       if ( conds[i][j].value.i == stat->resubmitted ) goto or_satisfied;
-                               } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) {
-                                       if ( conds[i][j].value.i != stat->resubmitted ) goto or_satisfied;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_DONECODE:
-                               switch ( conds[i][j].op )
-                               {
-                               case EDG_WLL_QUERY_OP_EQUAL:
-                                       if ( conds[i][j].value.i == stat->done_code ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_UNEQUAL:
-                                       if ( conds[i][j].value.i != stat->done_code ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_LESS:
-                                       if ( conds[i][j].value.i > stat->done_code ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_GREATER:
-                                       if ( conds[i][j].value.i < stat->done_code ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_WITHIN:
-                                       if (   conds[i][j].value.i <= stat->done_code
-                                               && conds[i][j].value2.i >= stat->done_code ) goto or_satisfied;
-                                       break;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_EXITCODE:
-                               switch ( conds[i][j].op )
-                               {
-                               case EDG_WLL_QUERY_OP_EQUAL:
-                                       if ( conds[i][j].value.i == stat->exit_code ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_UNEQUAL:
-                                       if ( conds[i][j].value.i != stat->exit_code ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_LESS:
-                                       if ( conds[i][j].value.i > stat->exit_code ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_GREATER:
-                                       if ( conds[i][j].value.i < stat->exit_code ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_WITHIN:
-                                       if (   conds[i][j].value.i <= stat->exit_code
-                                               && conds[i][j].value2.i >= stat->exit_code ) goto or_satisfied;
-                                       break;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_OWNER:
-                               if (stat->owner) {
-                                       if (conds[i][j].value.c) {
-                                               if (edg_wll_gss_equal_subj(conds[i][j].value.c, stat->owner) ) {
-                                                       if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                               } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-                                       } else if (ctx->peerName) {
-                                               if (edg_wll_gss_equal_subj(ctx->peerName, stat->owner) ) {
-                                                       if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                               } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-                                       }
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_LOCATION:
-                               if ( stat->location )
-                               {
-                                       if ( !strcmp(conds[i][j].value.c, stat->location) ) {
-                                               if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                       } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_DESTINATION:
-                               if ( stat->destination )
-                               {
-                                       if ( !strcmp(conds[i][j].value.c, stat->destination) ) {
-                                               if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                       } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-                               }
-                       case EDG_WLL_QUERY_ATTR_NETWORK_SERVER:
-                               if ( stat->network_server )
-                               {
-                                       if ( !strcmp(conds[i][j].value.c, stat->network_server) ) {
-                                               if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                       } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_JOBID:
-                               if ( !stat->jobId )
-                                       break;
-                               s = edg_wlc_JobIdUnparse(stat->jobId);
-                               s1 = edg_wlc_JobIdUnparse(conds[i][j].value.j);
-                               if ( s && s1 )
-                               {
-                                       int r = strcmp(s1, s);
-                                       free(s); free(s1);
-                                       if ( !r ) {
-                                               if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                       } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_PARENT:
-                               if ( !stat->parent_job )
-                                       break;
-                               s = edg_wlc_JobIdUnparse(stat->parent_job);
-                               s1 = edg_wlc_JobIdUnparse(conds[i][j].value.j);
-                               if ( s && s1 )
-                               {
-                                       int r = strcmp(s1, s);
-                                       free(s); free(s1);
-                                       if ( !r ) {
-                                               if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                       } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_USERTAG:
-                               if ( !stat->user_tags )
-                               {
-                                       if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL )
-                                               goto or_satisfied;
-
-                                       break;
-                               }
-                               for ( n = 0; stat->user_tags[n].tag; n++ )
-                                       if ( !strcasecmp(conds[i][j].attr_id.tag, stat->user_tags[n].tag) )
-                                       {
-                                               if ( !strcmp(conds[i][j].value.c, stat->user_tags[n].value) ) {
-                                                       if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                               } else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-
-                                               break;
-                                       }
-                               if ( !stat->user_tags[n].tag && conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL )
-                                       goto or_satisfied;
-                               break;
-                       case EDG_WLL_QUERY_ATTR_TIME:
-                               if ( !stat->stateEnterTimes || !stat->stateEnterTimes[1+conds[i][j].attr_id.state] )
-                                       break;
-                               switch ( conds[i][j].op )
-                               {
-                               case EDG_WLL_QUERY_OP_EQUAL:
-                                       if ( conds[i][j].value.t.tv_sec == stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_UNEQUAL:
-                                       if ( conds[i][j].value.t.tv_sec != stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_LESS:
-                                       if ( conds[i][j].value.t.tv_sec > stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_GREATER:
-                                       if ( conds[i][j].value.t.tv_sec < stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_WITHIN:
-                                       if (   conds[i][j].value.t.tv_sec <= stat->stateEnterTimes[1+conds[i][j].attr_id.state]
-                                               && conds[i][j].value2.t.tv_sec >= stat->stateEnterTimes[1+conds[i][j].attr_id.state] ) goto or_satisfied;
-                                       break;
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-                               if (conds[i][j].op == EDG_WLL_QUERY_OP_CHANGED && 
-                                       conds[i][j].attr_id.tag == NULL &&
-                                       oldstat && 
-                                       (oldstat->jdl == NULL || 
-                                               (stat->jdl && strcmp(oldstat->jdl,stat->jdl))
-                                       )
-                               ) goto or_satisfied;
-
-                               if (stat->jdl != NULL && conds[i][j].attr_id.tag) {
-                                       struct cclassad *ad = NULL;
-                                       char *extr_val = NULL;
-
-                                       // Jobs that do not have a JDL come with blabla:
-                                       if (!strcmp(stat->jdl,"blabla")) break;
-
-                                       ad = cclassad_create(stat->jdl);
-                                       if (ad) {
-                                               if (!cclassad_evaluate_to_string(ad, conds[i][j].attr_id.tag, &extr_val)) // Extract attribute value
-                                                       extr_val = NULL;
-                                               cclassad_delete(ad);
-                                       }
-                                       if (extr_val) {
-
-                                               if ( !strcmp(conds[i][j].value.c, extr_val) ) {
-                                                       if ( conds[i][j].op == EDG_WLL_QUERY_OP_EQUAL ) goto or_satisfied;
-                                                       else if ( conds[i][j].op == EDG_WLL_QUERY_OP_UNEQUAL ) goto or_satisfied;
-                                               }
-                                       }
-                               }
-                               break;
-                       case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-                               if ( !stat->stateEnterTime.tv_sec )
-                                       break;
-                               switch ( conds[i][j].op )
-                               {
-                               case EDG_WLL_QUERY_OP_EQUAL:
-                                       if ( conds[i][j].value.t.tv_sec == stat->stateEnterTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_UNEQUAL:
-                                       if ( conds[i][j].value.t.tv_sec != stat->stateEnterTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_LESS:
-                                       if ( conds[i][j].value.t.tv_sec > stat->stateEnterTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_GREATER:
-                                       if ( conds[i][j].value.t.tv_sec < stat->stateEnterTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_WITHIN:
-                                       if (   conds[i][j].value.t.tv_sec <= stat->stateEnterTime.tv_sec
-                                               && conds[i][j].value2.t.tv_sec >= stat->stateEnterTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               }
-                       case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-                               if ( !stat->lastUpdateTime.tv_sec )
-                                       break;
-                               switch ( conds[i][j].op )
-                               {
-                               case EDG_WLL_QUERY_OP_EQUAL:
-                                       if ( conds[i][j].value.t.tv_sec == stat->lastUpdateTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_UNEQUAL:
-                                       if ( conds[i][j].value.t.tv_sec != stat->lastUpdateTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_LESS:
-                                       if ( conds[i][j].value.t.tv_sec > stat->lastUpdateTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_GREATER:
-                                       if ( conds[i][j].value.t.tv_sec < stat->lastUpdateTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               case EDG_WLL_QUERY_OP_WITHIN:
-                                       if (   conds[i][j].value.t.tv_sec <= stat->lastUpdateTime.tv_sec
-                                               && conds[i][j].value2.t.tv_sec >= stat->lastUpdateTime.tv_sec ) goto or_satisfied;
-                                       break;
-                               }
-                       default:
-                               break;
-                       }
-               }
-
-                       /*
-                        *      No one condition in "or clause satisfied
-                        */
-               return 0;
-
-or_satisfied:
-
-                // just for escaping from nested cycles
-               ;       /* prevent compiler to complain */
-       }
-
-       return 1;
-}
-
-static int cmp_string(const char *s1,edg_wll_QueryOp op,const char *s2)
-{
-       switch (op) {
-               case EDG_WLL_QUERY_OP_EQUAL:    return !strcmp(s1,s2);
-               case EDG_WLL_QUERY_OP_LESS:     return strcmp(s1,s2)<0;
-               case EDG_WLL_QUERY_OP_GREATER:  return strcmp(s1,s2)>0;
-               default: return 0;
-       }
-       return 0;
-}
-
-
-int check_strict_jobid(edg_wll_Context ctx, glite_jobid_const_t job)
-{
-       char    *job_host;
-       unsigned int    job_port;
-
-       edg_wll_ResetError(ctx);
-
-       /* Allow all jobids when server name is not set. */
-       if ( (ctx->srvName == NULL) || (ctx->isProxy)) return edg_wll_Error(ctx,NULL,NULL);
-
-       edg_wlc_JobIdGetServerParts(job,&job_host,&job_port);
-
-       if (strcasecmp(job_host,ctx->srvName) || job_port != ctx->srvPort)
-       {
-               char    *jobid,msg[300];
-
-               jobid = edg_wlc_JobIdUnparse(job);
-               snprintf(msg,sizeof msg,"%s: does not match server address (%s:%d)",jobid,ctx->srvName,ctx->srvPort);
-               msg[sizeof msg - 1] = 0;
-               edg_wll_SetError(ctx,EINVAL,msg);
-               free(jobid);
-       }
-
-       free(job_host);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-static int check_strict_jobid_cond(edg_wll_Context ctx, const edg_wll_QueryRec **cond)
-{
-       int     i,j,ret;
-
-       if (!cond) return edg_wll_ResetError(ctx);
-       for (i=0; cond[i]; i++) for (j=0; cond[i][j].attr; j++) 
-               if (cond[i][j].attr == EDG_WLL_QUERY_ATTR_JOBID &&
-                       (ret = check_strict_jobid(ctx,cond[i][j].value.j)))
-                               return ret;
-
-       return 0;
-}
-
-static int is_all_query(const edg_wll_QueryRec **jc)
-{
-       if (!jc || !*jc) return 1;
-
-       if (jc[0][0].attr == EDG_WLL_QUERY_ATTR_OWNER && 
-           jc[0][0].op == EDG_WLL_QUERY_OP_EQUAL &&
-           !jc[0][1].attr && !jc[1]) return 1;
-
-       return 0;
-}
diff --git a/org.glite.lb.server/src/request.c b/org.glite.lb.server/src/request.c
deleted file mode 100644 (file)
index 99c54e8..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "glite/lb/il_string.h"
-#include "glite/lb/il_msg.h"
-#include "glite/lb/context-int.h"
-
-#include "store.h"
-#include "db_supp.h"
-
-#ifdef __GNUC__
-#define UNUSED_VAR __attribute__((unused))
-#else
-#define UNUSED_VAR
-#endif
-
-
-int 
-handle_il_message(edg_wll_Context ctx,char *buf)
-{
-       il_octet_string_t event;
-  int ret;
-
-  edg_wll_ResetError(ctx);
-
-  ret = decode_il_msg(&event, buf);
-  if(ret < 0) {
-    edg_wll_SetError(ctx,EDG_WLL_IL_PROTO,"decoding event string failed");
-    return EDG_WLL_IL_PROTO;
-  }
-
-  ret = db_store(ctx, event.data);
-
-  if(event.data)
-    free(event.data);
-
-  return(ret);
-}
-
-
-int 
-create_reply(const edg_wll_Context ctx, char **buf)
-{
-  int len, err_code, err_code_min;
-  char *err_msg;
-
-  err_code_min = 0;
-
-  switch(edg_wll_Error(ctx,NULL,&err_msg)) {
-
-  case 0:
-    err_code = LB_OK;
-    break;
-
-  case ENOMEM:
-    err_code = LB_NOMEM;
-    break;
-
-  case EDG_WLL_IL_PROTO:
-    err_code = LB_PROTO;
-    break;
-    
-  default:
-    err_code = LB_DBERR;
-    err_code_min = edg_wll_Error(ctx,NULL,NULL);
-    break;
-
-  } 
-
-  if (!err_msg) err_msg=strdup("OK");
-  
-  len = encode_il_reply(buf, err_code, err_code_min, err_msg);
-  free(err_msg);
-  return(len);
-}
-
-
diff --git a/org.glite.lb.server/src/seqcode.c b/org.glite.lb.server/src/seqcode.c
deleted file mode 100644 (file)
index a9f18f3..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#ident "$Header$"
-
-#include <errno.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/lb/context-int.h"
-
-#include "get_events.h"
-#include "store.h"
-#include "jobstat.h"
-/*
-#include "lb_authz.h"
-*/
-#include "db_supp.h"
-#include "lb_proto.h"
-
-
-int edg_wll_QuerySequenceCodeServer(edg_wll_Context ctx, edg_wlc_JobId jobid, const char *source, char **seqcode)
-{
-       glite_lbu_Statement     sh;
-       intJobStat         *istat = NULL;
-       char               *jobid_md5 = NULL,
-                                  *stmt = NULL,
-                                  *res = NULL,
-                                  *res_rest = NULL;
-       int                             nstates;
-
-
-       edg_wll_ResetError(ctx);
-       jobid_md5 = edg_wlc_JobIdGetUnique(jobid);
-
-       trio_asprintf(&stmt,
-                               "select int_status from states "
-                               "where jobid='%|Ss' and version='%|Ss'",
-                               jobid_md5, INTSTAT_VERSION);
-
-       if ( stmt == NULL ) return edg_wll_SetError(ctx, ENOMEM, NULL);
-
-       if ( (nstates = edg_wll_ExecSQL(ctx, stmt, &sh)) < 0 ) goto cleanup;
-       if ( nstates == 0 ) {
-               edg_wll_SetError(ctx, ENOENT, "no state in DB");
-               goto cleanup;
-       }
-       if ( edg_wll_FetchRow(ctx, sh, 1, NULL, &res) < 0 ) goto cleanup;
-
-       istat = dec_intJobStat(res, &res_rest);
-       if ( res_rest  && istat ) {
-               *seqcode = istat->last_seqcode;
-               istat->last_seqcode = NULL;
-       }
-       else edg_wll_SetError(ctx, EDG_WLL_ERROR_DB_CALL,
-                                               "error decoding DB intJobStatus");
-
-cleanup:
-       free(res);
-       free(jobid_md5);
-       free(stmt);
-       glite_lbu_FreeStmt(&sh);
-       if ( istat ) {
-               destroy_intJobStat(istat);
-               free(istat);
-       }
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
diff --git a/org.glite.lb.server/src/server_state.c b/org.glite.lb.server/src/server_state.c
deleted file mode 100644 (file)
index c2bd7bf..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#ident "$Header$"
-
-#include <errno.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/lb/context-int.h"
-
-#include "server_state.h"
-#include "db_supp.h"
-
-int edg_wll_GetServerState(edg_wll_Context ctx,const char *name,char **val)
-{
-       char    *stmt = NULL;
-       glite_lbu_Statement     q = NULL;
-
-
-       trio_asprintf(&stmt,"select value from server_state "
-                       "where prefix = 'https://%|Ss:%d' and name = '%|Ss'",
-                       ctx->srvName,ctx->srvPort,name);
-
-       switch (edg_wll_ExecSQL(ctx,stmt,&q)) {
-               case 0: edg_wll_SetError(ctx,ENOENT,name); break;
-               case -1: break;
-               default: edg_wll_FetchRow(ctx,q,sizeof(val)/sizeof(val[0]),NULL,val); break;
-       }
-
-       glite_lbu_FreeStmt(&q);
-       free(stmt);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-int edg_wll_SetServerState(edg_wll_Context ctx,const char *name,const char *val)
-{
-       char    *stmt = NULL;
-
-       trio_asprintf(&stmt,"insert into server_state (prefix,name,value) "
-                       "values ('https://%|Ss:%d','%|Ss','%|Ss')",
-                       ctx->srvName,ctx->srvPort,name,val);
-
-       switch(edg_wll_ExecSQL(ctx,stmt,NULL)) {
-               case 1: break;
-               case -1: if (edg_wll_Error(ctx,NULL,NULL) == EEXIST) {
-                                free(stmt);
-                                trio_asprintf(&stmt,"update server_state set value = '%|Ss' "
-                                                "where prefix = 'https://%|Ss:%d' "
-                                                "and name = '%|Ss'",
-                                                val,ctx->srvName,ctx->srvPort,name);
-                                edg_wll_ExecSQL(ctx,stmt,NULL);
-                        }
-                        break;
-
-               default: abort();
-       }
-       free(stmt);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
diff --git a/org.glite.lb.server/src/server_state.h b/org.glite.lb.server/src/server_state.h
deleted file mode 100644 (file)
index c3ded6d..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef GLITE_LB_SERVER_STATE_H
-#define GLITE_LB_SERVER_STATE_H
-
-#ident "$Header$"
-
-#define EDG_WLL_STATE_DUMP_START       "StartDump"
-#define EDG_WLL_STATE_DUMP_END         "EndDump"
-
-int edg_wll_GetServerState(edg_wll_Context,const char *,char **);
-int edg_wll_SetServerState(edg_wll_Context,const char *,const char *);
-
-#endif /* GLITE_LB_SERVER_STATE_H */
diff --git a/org.glite.lb.server/src/srv_purge.c b/org.glite.lb.server/src/srv_purge.c
deleted file mode 100644 (file)
index b09e62a..0000000
+++ /dev/null
@@ -1,900 +0,0 @@
-#ident "$Header$"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <syslog.h>
-#include <assert.h>
-#include <string.h>
-#include <time.h>
-#include <errno.h>
-#include <signal.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/lbu/trio.h"
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/events_parse.h"
-#include "glite/lb/mini_http.h"
-#include "glite/lb/ulm_parse.h"
-
-#include "lb_html.h"
-#include "lb_proto.h"
-#include "store.h"
-#include "query.h"
-#include "get_events.h"
-#include "purge.h"
-#include "lb_xml_parse.h"
-#include "db_calls.h"
-#include "db_supp.h"
-#include "jobstat.h"
-
-
-#define DUMP_FILE_STORAGE                                      "/tmp/"
-
-#define sizofa(a) (sizeof(a)/sizeof((a)[0]))
-
-extern volatile sig_atomic_t purge_quit;
-
-static const char* const resp_headers[] = {
-       "Cache-Control: no-cache",
-       "Server: edg_wll_Server/" PROTO_VERSION "/" COMP_PROTO,
-       "Content-Type: application/x-dglb",
-       NULL
-};
-
-static int purge_one(edg_wll_Context ctx,glite_jobid_const_t,int,int,int);
-int unset_proxy_flag(edg_wll_Context ctx, glite_jobid_const_t job);
-static int unset_server_flag(edg_wll_Context ctx, glite_jobid_const_t job);
-static void purge_throttle(int jobs_to_exa, double purge_end, double *time_per_job, time_t *target_runtime);
-
-
-int edg_wll_CreateTmpFileStorage(edg_wll_Context ctx, char *prefix, char **fname)
-{
-       char                    fname_buf[1024];
-       struct timeval  tv;
-       int                             retfd;
-
-
-       while ( 1 )
-       {
-               gettimeofday(&tv, NULL);
-               snprintf(fname_buf, 1024, "%s/%ld_%ld", prefix, tv.tv_sec, tv.tv_usec);
-
-               if ( (retfd = open(fname_buf, O_WRONLY|O_CREAT|O_EXCL|O_APPEND,0600)) == -1 )
-               {
-                       if ( errno != EEXIST )
-                       {
-                               char buff[100];
-
-                               sprintf(buff, "couldn't create temporary server file");
-                               edg_wll_SetError(ctx, errno, buff);
-                               return -1;
-                       }
-               }
-               else
-                       break;
-       }
-
-       *fname = strdup(fname_buf);
-
-       return retfd;
-}
-
-int edg_wll_CreateFileStorageFromTmp(edg_wll_Context ctx, char *old_file, char *file_type, char **fname)
-{
-       char                    fname_buf[1024],
-                                       fname_prefix[1024],
-                                       stimebuf[100];
-       char               *stmp;
-       struct timeval  tv;
-       int                             retfd;
-
-
-       if ( (stmp = strrchr(old_file, '/')) )
-       {
-               strncpy(fname_prefix, old_file, stmp - old_file);
-               fname_prefix[stmp - old_file] = '\0';
-       }
-
-       while ( 1 )
-       {
-               gettimeofday(&tv, NULL);
-               edg_wll_ULMTimevalToDate(tv.tv_sec, tv.tv_usec, stimebuf);
-               snprintf(fname_buf, 1024, "%s/%s_%s", fname_prefix, file_type, stimebuf);
-
-               if ( !link(old_file, fname_buf) )
-                       break;
-
-               if ( errno != EEXIST )
-               {
-                       char buff[100];
-
-                       sprintf(buff, "couldn't create server %s file", file_type);
-                       return edg_wll_SetError(ctx, errno, buff);
-               }
-       }
-
-       *fname = strdup(fname_buf);
-
-       return retfd;
-}
-
-int edg_wll_CreateFileStorage(edg_wll_Context ctx, char *file_type, char *prefix, char **fname)
-{
-       char                    fname_buf[1024],
-                                       stimebuf[100];
-       struct timeval  tv;
-       int                             retfd;
-
-       if ( *fname )
-       {
-               snprintf(fname_buf, 1024, "%s/%s", prefix? prefix: "", *fname);
-               if ( (retfd = open(*fname, O_WRONLY|O_CREAT|O_EXCL|O_APPEND,0600)) == -1 )
-               {
-                       char buff[100];
-                       if ( errno == EEXIST )
-                               sprintf(buff, "Server file %s exist", fname_buf);
-                       else
-                               sprintf(buff, "Server couldn't create file %s", fname_buf);
-                       edg_wll_SetError(ctx, errno, buff);
-
-                       return -1;
-               }
-               if ( prefix )
-               {
-                       free(*fname);
-                       *fname = strdup(fname_buf);
-               }
-
-               return retfd;
-       }
-
-       while ( 1 )
-       {
-               gettimeofday(&tv, NULL);
-               edg_wll_ULMTimevalToDate(tv.tv_sec, tv.tv_usec, stimebuf);
-               if ( !prefix )
-               {
-                       if ( strcmp(file_type,FILE_TYPE_PURGE) == 0 )
-                               prefix = ctx->purgeStorage;
-                       else if ( strcmp(file_type,FILE_TYPE_DUMP) == 0 )
-                               prefix = ctx->dumpStorage;
-                       else
-                               prefix = "";
-               }
-               snprintf(fname_buf, 1024, "%s/%s_%s", prefix, file_type, stimebuf);
-
-               if ( (retfd = open(fname_buf, O_WRONLY|O_CREAT|O_EXCL|O_APPEND,0600)) == -1 )
-               {
-                       if ( errno != EEXIST )
-                       {
-                               char buff[100];
-
-                               sprintf(buff, "couldn't create server %s file", file_type);
-                               edg_wll_SetError(ctx, errno, buff);
-
-                               return -1;
-                       }
-               }
-               else
-                       break;
-       }
-
-       *fname = strdup(fname_buf);
-
-       return retfd;
-}
-
-int edg_wll_PurgeServerProxy(edg_wll_Context ctx, glite_jobid_const_t job)
-{
-       switch ( purge_one(ctx, job, -1, 1, 1) ) {
-               case 0:
-               case ENOENT:
-                       return(edg_wll_ResetError(ctx));
-                       break;
-               default:
-                       return(edg_wll_Error(ctx,NULL,NULL));
-                       break;
-       }
-}
-
-int edg_wll_PurgeServer(edg_wll_Context ctx,const edg_wll_PurgeRequest *request, edg_wll_PurgeResult *result)
-{
-       int     i,parse = 0,dumpfile = -1;
-       edg_wlc_JobId   job;
-       char    *tmpfname = NULL;
-       int     naffected_jobs = 0, ret;
-       double          now, time_per_job, purge_end;
-       struct timeval  tp;
-       int             jobs_to_exa;
-       time_t  target_runtime;
-
-
-       if (!ctx->noAuth) {
-               edg_wll_SetError(ctx,EPERM,"only superusers may purge");
-               goto abort;
-       }
-
-       edg_wll_ResetError(ctx);
-       memset(result, 0, sizeof(*result));
-
-
-       if ( (request->flags & EDG_WLL_PURGE_SERVER_DUMP) && 
-                ((dumpfile = edg_wll_CreateTmpPurgeFile(ctx, &tmpfname)) == -1 ) )
-               goto abort;
-
-       /* 
-       should be changed so that only purged events are sent to whole-server dumps
-       (with this commented out, severely delayed events (>purge interval) can miss
-       whole-server dumps, but it is more acceptable than invoking whole-server dump
-       on each purge request (whole-server dumps are used rarely if at all)
-       if (request->flags&EDG_WLL_PURGE_REALLY_PURGE) {
-               edg_wll_DumpRequest     req = {
-                       EDG_WLL_DUMP_LAST_END, EDG_WLL_DUMP_NOW
-               };
-               edg_wll_DumpResult      res;
-
-               if (edg_wll_DumpEventsServer(ctx,&req,&res)) 
-               {
-                       if ( request->flags & EDG_WLL_PURGE_SERVER_DUMP )
-                               unlink(tmpfname);
-                       goto abort;
-               }
-       }
-       */
-
-       /* throttle parameters */
-       gettimeofday(&tp, NULL);
-       now = tp.tv_sec + (double)tp.tv_usec / 1000000.0;
-       purge_end = now + request->target_runtime;
-       target_runtime = request->target_runtime;
-       time_per_job = -1.0;
-
-       if (request->jobs) {
-
-       for (jobs_to_exa=0; request->jobs[jobs_to_exa]; jobs_to_exa++);
-       for (i=0; request->jobs[i] && !purge_quit; i++) {
-               if (edg_wlc_JobIdParse(request->jobs[i],&job)) {
-                       fprintf(stderr,"%s: parse error\n",request->jobs[i]);
-                       parse = 1;
-               }
-               else {
-                       if (check_strict_jobid(ctx,job)) {
-                               fprintf(stderr,"%s: not my job\n",request->jobs[i]);
-                               parse = 1;
-                       }
-                       else {
-                               purge_throttle(jobs_to_exa, purge_end, &time_per_job, &target_runtime);
-                               if (purge_quit) break;
-
-                               switch (purge_one(ctx,job,dumpfile,request->flags&EDG_WLL_PURGE_REALLY_PURGE,ctx->isProxy)) {
-                                       case 0: if (request->flags & EDG_WLL_PURGE_LIST_JOBS) {
-                                                       result->jobs = realloc(result->jobs,(naffected_jobs+2) * sizeof(*(result->jobs)));
-                                                       result->jobs[naffected_jobs] = strdup(request->jobs[i]);
-                                                       result->jobs[naffected_jobs+1] = NULL;
-                                               }
-                                               naffected_jobs++;
-                                               break;
-                                       case ENOENT: /* job does not exist, consider purged and ignore */
-                                                    edg_wll_ResetError(ctx);
-                                                    break;
-                                       default: goto abort;
-                               }
-
-                       }
-                       edg_wlc_JobIdFree(job);
-               }
-               jobs_to_exa--;
-       }
-       }
-       else {
-               glite_lbu_Statement     s;
-               char            *job_s;
-               time_t          timeout[EDG_WLL_NUMBER_OF_STATCODES],
-                               start = time(NULL);
-
-               for (i=0; i<EDG_WLL_NUMBER_OF_STATCODES; i++)
-                       if (request->timeout[i] < 0) { // no specific timeout
-                               if (request->timeout[i] == -2) //no purge
-                                       timeout[i] = request->timeout[i];
-                               else {// use server default
-                                       timeout[i] = ctx->purge_timeout[i];
-                               }
-                       }
-                       else timeout[i] = request->timeout[i]; //specific given
-
-               if ((jobs_to_exa = edg_wll_ExecSQL(ctx, (ctx->isProxy) ? "select dg_jobid from jobs where proxy='1'" :
-                       "select dg_jobid from jobs where server='1'", &s)) < 0) goto abort;
-
-               while (edg_wll_FetchRow(ctx,s,1,NULL,&job_s) > 0 && !purge_quit) {
-                       if (edg_wlc_JobIdParse(job_s,&job)) {
-                               fprintf(stderr,"%s: parse error (internal inconsistency !)\n",job_s);
-                               parse = 1;
-                       }
-                       else {
-                               edg_wll_JobStat stat;
-
-                               if (check_strict_jobid(ctx,job)) {
-                                       edg_wlc_JobIdFree(job);
-                                       free(job_s);
-                                       parse = 1;
-                                       continue;
-                               }
-
-                               purge_throttle(jobs_to_exa, purge_end, &time_per_job, &target_runtime);
-                               if (purge_quit) break;
-
-                               memset(&stat,0,sizeof stat);
-                               if (edg_wll_JobStatusServer(ctx,job,0,&stat)) {  /* FIXME: replace by intJobStatus ?? */
-                                       if (edg_wll_Error(ctx, NULL, NULL) == ENOENT) {
-                                               /* job purged meanwhile, ignore */
-                                               edg_wll_ResetError(ctx);
-                                               continue;
-                                       }
-                                       edg_wll_FreeStatus(&stat);
-                                       goto abort; 
-                               }
-
-                               if (timeout[stat.state] >=0 && stat.lastUpdateTime.tv_sec && start-stat.lastUpdateTime.tv_sec > timeout[stat.state] && !check_strict_jobid(ctx,job))
-                               {
-                                       if (purge_one(ctx,job,dumpfile,request->flags&EDG_WLL_PURGE_REALLY_PURGE,ctx->isProxy)) {
-                                               edg_wll_FreeStatus(&stat);
-                                               if (edg_wll_Error(ctx, NULL, NULL) == ENOENT) {
-                                                       /* job purged meanwhile, ignore */
-                                                       edg_wll_ResetError(ctx);
-                                                       continue;
-                                               }
-                                               goto abort;
-                                       }
-
-                               /* XXX: change with the streaming interface */
-                                       if (request->flags & EDG_WLL_PURGE_LIST_JOBS) {
-                                               result->jobs = realloc(result->jobs,(naffected_jobs+2) * sizeof(*(result->jobs)));
-                                               result->jobs[naffected_jobs] = job_s;
-                                               result->jobs[naffected_jobs+1] = NULL;
-                                               job_s = NULL;
-                                       }
-                                       naffected_jobs++;
-                               }
-
-                               edg_wlc_JobIdFree(job);
-                               edg_wll_FreeStatus(&stat);
-                               free(job_s);
-                       }
-                       jobs_to_exa--;
-               }
-               glite_lbu_FreeStmt(&s);
-       }
-
-abort:
-       if (parse && !edg_wll_Error(ctx,NULL,NULL))
-       {
-               if ( naffected_jobs ) {
-                       fprintf(stderr,"[%d] Found some jobs not matching server address/port;"\
-                               " these were not purged but other jobs purged.\n", getpid());
-                       syslog(LOG_INFO,"Found some jobs not matching server address/port;"\
-                               " these were not purged but other jobs purged");
-               }
-               else {
-                       fprintf(stderr,"[%d] Found only jobs not matching server address/port;"\
-                               " these were not purged.\n", getpid());
-                       syslog(LOG_INFO,"Found only jobs not matching server address/port;"\
-                               " these were not purged.");
-               }
-       }
-
-       ret = edg_wll_Error(ctx,NULL,NULL);
-       if (ret == 0 || ret == ENOENT || ret == EPERM || ret == EINVAL) {
-               if ( request->flags & EDG_WLL_PURGE_SERVER_DUMP && tmpfname )
-               {
-                       edg_wll_CreatePurgeFileFromTmp(ctx, tmpfname, &(result->server_file));
-                       unlink(tmpfname);
-               }
-       }
-       
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-/* FIXME: defined but not used */
-#if 0
-static void unlock_and_check(edg_wll_Context ctx,edg_wlc_JobId job)
-{
-       char    *job_s,*et,*ed;
-
-       if (edg_wll_UnlockJob(ctx,job)) {
-               job_s = edg_wlc_JobIdUnparse(job);
-
-               edg_wll_Error(ctx,&et,&ed);
-               fprintf(stderr,"%s: edg_wll_UnlockJob(): %s (%s) -- expect bogus things\n",
-                               job_s,et,ed);
-               syslog(LOG_CRIT,"%s: edg_wll_UnlockJob(): %s (%s) -- expect bogus things",
-                               job_s,et,ed);
-               free(et); free(ed); free(job_s);
-       }
-}
-#endif
-
-static int dump_events(edg_wll_Context ctx, glite_jobid_const_t job, int dump, char **res)
-{
-       edg_wll_Event   e;
-       int             event;
-
-
-       event = atoi(res[0]);
-       free(res[0]); res[0] = NULL;
-
-       res[0] = edg_wlc_JobIdUnparse(job);
-       if (convert_event_head(ctx,res,&e) || edg_wll_get_event_flesh(ctx,event,&e))
-       {
-               char    *et,*ed, *dbjob;
-
-
-       /* Most likely sort of internal inconsistency. 
-        * Must not be fatal -- just complain
-        */
-               edg_wll_Error(ctx,&et,&ed);
-               dbjob = edg_wlc_JobIdGetUnique(job);
-               fprintf(stderr,"%s event %d: %s (%s)\n",dbjob,event,et,ed);
-               syslog(LOG_WARNING,"%s event %d: %s (%s)",dbjob,event,et,ed);
-               free(et); free(ed); free(dbjob);
-               edg_wll_ResetError(ctx);
-       }
-       else {
-               char    *event_s = edg_wll_UnparseEvent(ctx,&e);
-               char    arr_s[100];
-               int     len, written, total;
-
-               strcpy(arr_s, "DG.ARRIVED=");
-               edg_wll_ULMTimevalToDate(e.any.arrived.tv_sec,
-                                               e.any.arrived.tv_usec,
-                                               arr_s+strlen("DG.ARRIVED="));
-
-               len = strlen(arr_s);
-               total = 0;
-               while (total != len) {
-                       written = write(dump,arr_s+total,len-total);
-                       if (written < 0 && errno != EAGAIN) {
-                               edg_wll_SetError(ctx,errno,"writing dump file");
-                               free(event_s);
-                               return edg_wll_Error(ctx,NULL,NULL);
-                       }
-                       total += written;
-               }
-               write(dump, " ", 1);
-               
-               len = strlen(event_s);
-               total = 0;
-               while (total != len) {
-                       written = write(dump,event_s+total,len-total);
-                       if (written < 0 && errno != EAGAIN) {
-                               perror("dump to file");
-                               syslog(LOG_ERR,"dump to file: %m");
-                               dump = -1; /* XXX: likely to be a permanent error
-                                           * give up writing but do purge */
-                               break;
-                       }
-                       total += written;
-               }
-               /* write(dump,"\n",1); edg_wll_UnparseEvent does so */
-               free(event_s);
-       }
-       edg_wll_FreeEvent(&e);
-
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-static enum edg_wll_StatJobtype get_job_type(edg_wll_Context ctx, glite_jobid_const_t job)
-{
-       edg_wll_JobStat                 stat;
-       enum edg_wll_StatJobtype        type;
-
-       memset(&stat, 0, sizeof(stat));
-       if (edg_wll_JobStatusServer(ctx, job, 0 /*no flags*/, &stat)) {
-               edg_wll_FreeStatus(&stat);
-                return(EDG_WLL_NUMBER_OF_JOBTYPES);
-        }
-
-       type = stat.jobtype;
-       edg_wll_FreeStatus(&stat);
-
-       return(type);   
-}
-
-static int get_jobid_suffix(edg_wll_Context ctx, glite_jobid_const_t job, enum edg_wll_StatJobtype jobtype, char **unique, char **suffix)
-{
-       char            *ptr = NULL, *dbjob = NULL;
-       
-
-       dbjob = glite_jobid_getUnique(job);
-
-       switch (jobtype) {
-               case EDG_WLL_STAT_SIMPLE:
-               case EDG_WLL_STAT_DAG:
-               case EDG_WLL_STAT__PARTITIONABLE_UNUSED:
-               case EDG_WLL_STAT__PARTITIONED_UNUSED:
-               case EDG_WLL_STAT_COLLECTION:
-                       // glite jobs, no suffix
-                       *suffix = strdup("");
-                       *unique = strdup(dbjob);
-                       break;
-
-               case EDG_WLL_STAT_PBS:
-                       // PBS jobs; suffix is everything starting from first '.'
-                       ptr = strchr(dbjob,'.');
-                       if (ptr) {
-                               *suffix = strdup(ptr);
-                               ptr[0] = '\0';
-                               *unique = strdup(dbjob);
-                               ptr[0] = '.';
-                       }
-                       else {
-                               edg_wll_SetError(ctx,EINVAL,"Uknown PBS job format");
-                               goto err;
-                       }
-                       break;
-
-               case EDG_WLL_STAT_CONDOR:
-                       // condor jobs
-                       assert(0); // XXX: todo
-                       break;
-               default:
-                       edg_wll_SetError(ctx,EINVAL,"Uknown job type");
-                       goto err;
-                       break;
-       }
-
-err:   
-       free(dbjob);
-
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-static int get_jobid_prefix(edg_wll_Context ctx, glite_jobid_const_t job, enum edg_wll_StatJobtype jobtype, char **prefix)
-{
-       char    *ser = NULL;
-       
-
-       switch (jobtype) {
-               case EDG_WLL_STAT_SIMPLE:
-               case EDG_WLL_STAT_DAG:
-               case EDG_WLL_STAT__PARTITIONABLE_UNUSED:
-               case EDG_WLL_STAT__PARTITIONED_UNUSED:
-               case EDG_WLL_STAT_COLLECTION:
-                       // glite job prefix
-                       ser = glite_jobid_getServer(job);
-                       asprintf(prefix,"%s/",ser);
-                       free(ser);
-                       break;
-
-               case EDG_WLL_STAT_PBS:
-                       // PBS jobs; prefix same as glite job prefix
-                       ser = glite_jobid_getServer(job);
-                       asprintf(prefix,"%s/",ser);
-                       free(ser);
-                       break;
-
-               case EDG_WLL_STAT_CONDOR:
-                       // condor jobs
-                       assert(0); // XXX: todo
-                       break;
-               default:
-                       edg_wll_SetError(ctx,EINVAL,"Uknown job type");
-                       goto err;
-                       break;
-       }
-
-err:   
-       return edg_wll_Error(ctx, NULL, NULL);
-}
-
-
-int purge_one(edg_wll_Context ctx,glite_jobid_const_t job,int dump, int purge, int purge_from_proxy_only)
-{
-       char    *dbjob = NULL;
-       char    *stmt = NULL;
-       glite_lbu_Statement     q = NULL;
-       int             ret,dumped = 0;
-       char    *res[10];
-       char    *prefix = NULL, *suffix = NULL, *root = NULL;
-       char    *prefix_id = NULL, *suffix_id = NULL;
-       int     sql_retval;
-
-       edg_wll_ResetError(ctx);
-       if ( !purge && dump < 0 ) return 0;
-
-       do {
-               if (edg_wll_Transaction(ctx)) goto err;
-
-               switch (edg_wll_jobMembership(ctx, job)) {
-                       case DB_PROXY_JOB:
-                               if (!ctx->isProxy) {
-                                       /* should not happen */
-                                       goto commit;
-                               }
-                               /* continue */
-                               break;
-                       case DB_SERVER_JOB:
-                               if (purge_from_proxy_only) {
-                                       /* no action needed */
-                                       goto commit;
-                               }
-                               if (ctx->isProxy) {
-                                       /* should not happen */
-                                       goto commit;
-                               }
-                               /* continue */
-                               break;
-                       case DB_PROXY_JOB+DB_SERVER_JOB:
-                               if (ctx->isProxy) {
-                                       purge = 0;
-                                       if (unset_proxy_flag(ctx, job) < 0) {
-                                               goto rollback;
-                                       }
-                               }
-                               else {
-                                       purge = 0;
-                                       /* if server&proxy DB is shared ... */
-                                       if (is_job_local(ctx,job) && purge_from_proxy_only) {
-                                               if (unset_proxy_flag(ctx, job) < 0) {
-                                                       goto rollback;
-                                               }
-                                       }
-                                       else {
-                                               if (unset_server_flag(ctx, job) < 0) {
-                                                       goto rollback;
-                                               }
-                                       }
-                               }
-                               break;
-                       case 0:
-                               // Zombie job (server=0, proxy=0)? should not happen;
-                               // clear it to keep DB healthy
-                               break;
-                       default:
-                               goto rollback;
-                               break;
-               }
-
-               dbjob = edg_wlc_JobIdGetUnique(job);    /* XXX: strict jobid already checked */
-
-               if ( purge )
-               {
-                       enum edg_wll_StatJobtype jobtype = get_job_type(ctx, job);
-
-                       // get job prefix/suffix before its state is deleted
-                       if ( jobtype == EDG_WLL_NUMBER_OF_JOBTYPES) goto rollback;
-                       if ( get_jobid_suffix(ctx, job, jobtype, &root, &suffix) ) goto rollback;
-                       if ( get_jobid_prefix(ctx, job, jobtype, &prefix) ) goto rollback;
-                       
-               
-               }
-
-               if ( purge )
-               {
-                       trio_asprintf(&stmt,"delete from jobs where jobid = '%|Ss'",dbjob);
-                       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto rollback;
-                       free(stmt); stmt = NULL;
-
-                       trio_asprintf(&stmt,"delete from states where jobid = '%|Ss'",dbjob);
-                       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto rollback; 
-                       free(stmt); stmt = NULL;
-               }
-
-               if ( purge )
-               {
-                       trio_asprintf(&stmt,"delete from status_tags where jobid = '%|Ss'",dbjob);
-                       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto rollback;
-                       free(stmt); stmt = NULL;
-               }
-
-               if ( purge )
-               {
-                       /* Store zombie prefix */
-               
-                       // See if that prefix is already stored in the database 
-                       trio_asprintf(&stmt,"select prefix_id from zombie_prefixes where prefix = '%|Ss'", prefix);
-
-                       sql_retval = edg_wll_ExecSQL(ctx,stmt,&q);
-                       free(stmt); stmt = NULL;
-
-                       if (sql_retval < 0) goto rollback;
-
-                       if (sql_retval == 0) { //prefix does not exist yet
-                               glite_lbu_FreeStmt(&q);
-
-                               trio_asprintf(&stmt,"insert into zombie_prefixes (prefix) VALUES ('%|Ss')", prefix);
-
-                               if (edg_wll_ExecSQL(ctx,stmt,&q) <= 0) goto rollback;
-
-                               free(stmt); stmt = NULL;
-                               glite_lbu_FreeStmt(&q);
-
-                               // The record should exist now, however we need to look up the prefix_id 
-                               trio_asprintf(&stmt,"select prefix_id from zombie_prefixes where prefix = '%|Ss'", prefix);
-
-                               if (edg_wll_ExecSQL(ctx,stmt,&q) <= 0) goto rollback;
-                               free(stmt); stmt = NULL;
-                       }
-                       ret = edg_wll_FetchRow(ctx,q, 1, NULL, &prefix_id);
-                       glite_lbu_FreeStmt(&q);
-
-
-                       /* Store zombie suffix */
-
-                       // See if that suffix is already stored in the database 
-                       trio_asprintf(&stmt,"select suffix_id from zombie_suffixes where suffix = '%|Ss'", suffix);
-
-                       sql_retval = edg_wll_ExecSQL(ctx,stmt,&q);
-                       free(stmt); stmt = NULL;
-
-                       if (sql_retval < 0) goto rollback;
-
-                       if (sql_retval == 0) { //suffix does not exist yet
-                               glite_lbu_FreeStmt(&q);
-
-                               trio_asprintf(&stmt,"insert into zombie_suffixes (suffix) VALUES ('%|Ss')", suffix);
-
-                               if (edg_wll_ExecSQL(ctx,stmt,&q) <= 0) goto rollback;
-
-                               free(stmt); stmt = NULL;
-                               glite_lbu_FreeStmt(&q);
-
-                               // The record should exist now, however we need to look up the suffix_id 
-                               trio_asprintf(&stmt,"select suffix_id from zombie_suffixes where suffix = '%|Ss'", suffix);
-
-                               if (edg_wll_ExecSQL(ctx,stmt,&q) <= 0) goto rollback;
-                               free(stmt); stmt = NULL;
-                       }
-                       ret = edg_wll_FetchRow(ctx,q, 1, NULL, &suffix_id);
-                       glite_lbu_FreeStmt(&q);
-
-
-                       /* Store zombie job */
-
-                       trio_asprintf(&stmt,"insert into zombie_jobs (jobid, prefix_id, suffix_id)"
-                                       " VALUES ('%|Ss', '%|Ss', '%|Ss')", root, prefix_id, suffix_id);
-
-                       if (edg_wll_ExecSQL(ctx,stmt,&q) < 0) {
-                               if (edg_wll_Error(ctx, NULL, NULL) == EEXIST) {
-                                       /* job already among zombies */
-                                       /* print warning but continue */
-                                       /* erasing other jobs */
-                                       char *et, *ed, *msg, *job_s;
-
-                                       edg_wll_Error(ctx, &et, &ed);
-                                       job_s = glite_jobid_unparse(job);
-                                       
-                                       asprintf(&msg,"Warning: erasing job %s that already existed in this LB "
-                                               "(reused jobid or corruped DB) (%s: %s)",job_s,et,ed);
-                                       fprintf(stderr,"[%d] %s\n", getpid(), msg);
-                                       syslog(LOG_INFO,msg);
-                                       free(et); free(ed); free(msg); free(job_s);
-                                       edg_wll_ResetError(ctx);
-                               }
-                               else goto rollback;
-                       }
-                       glite_lbu_FreeStmt(&q);
-                       free(stmt); stmt = NULL;
-               }
-
-               if (dump >= 0) 
-                       trio_asprintf(&stmt,
-                               "select event,code,prog,host,u.cert_subj,time_stamp,usec,level,arrived,seqcode "
-                               "from events e,users u "
-                               "where e.jobid='%|Ss' "
-                               "and u.userid=e.userid "
-                               "order by event", dbjob);
-               else
-                       trio_asprintf(&stmt,"select event from events "
-                               "where jobid='%|Ss' "
-                               "order by event", dbjob);
-
-               if (edg_wll_ExecSQL(ctx,stmt,&q) < 0) goto rollback;
-               free(stmt); stmt = NULL;
-
-               dumped = 1;
-               while ((ret = edg_wll_FetchRow(ctx,q,sizofa(res),NULL,res)) > 0) {
-                       int     event;
-
-                       
-                       event = atoi(res[0]);
-
-                       if (dump >= 0) {
-                               int ret_dump, i;
-
-                               assert(ret == 10);
-                               ret_dump = dump_events( ctx, job, dump, (char **) &res);
-                               for (i=0; i<sizofa(res); i++) free(res[i]);
-                               if (ret_dump) goto rollback;
-                       }
-
-                       if ( purge ) 
-                               if (edg_wll_delete_event(ctx,dbjob,event)) goto rollback;
-               }
-               glite_lbu_FreeStmt(&q);
-               if (ret < 0) goto rollback;
-
-commit:
-rollback:;
-       } while (edg_wll_TransNeedRetry(ctx));
-
-
-err:
-       free(root);
-       free(suffix);
-       free(prefix);
-       free(prefix_id);
-       free(suffix_id);
-       free(dbjob);
-       free(stmt);
-       glite_lbu_FreeStmt(&q);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-int unset_proxy_flag(edg_wll_Context ctx, glite_jobid_const_t job)
-{
-       char    *stmt = NULL;
-       char            *dbjob;
-
-       edg_wll_ResetError(ctx);
-
-       dbjob = edg_wlc_JobIdGetUnique(job);
-
-       trio_asprintf(&stmt,"update jobs set proxy='0' where jobid='%|Ss'", dbjob);
-
-       return(edg_wll_ExecSQL(ctx,stmt,NULL));
-}
-
-
-int unset_server_flag(edg_wll_Context ctx, glite_jobid_const_t job)
-{
-       char    *stmt = NULL;
-       char            *dbjob;
-
-       edg_wll_ResetError(ctx);
-
-       dbjob = edg_wlc_JobIdGetUnique(job);
-
-       trio_asprintf(&stmt,"update jobs set server='0' where jobid='%|Ss'", dbjob);
-
-       return(edg_wll_ExecSQL(ctx,stmt,NULL));
-}
-
-
-/* throttle purging according to the required target_runtime */
-static void purge_throttle(int jobs_to_exa, double purge_end, double *time_per_job, time_t *target_runtime) {
-       struct timeval  tp;
-       double target_this, now;
-
-
-       if (*time_per_job < 0.0) {
-               *time_per_job = jobs_to_exa ? (double)*target_runtime / jobs_to_exa : 0.0;
-               //fprintf(stderr, "[%d] target runtime: %ld, end: %lf, jobs: %d, tpj: %lf\n",
-               //    getpid(), *target_runtime, purge_end, jobs_to_exa, *time_per_job);
-       }
-
-       if (*target_runtime) {
-               target_this = purge_end - *time_per_job * jobs_to_exa;
-               gettimeofday(&tp, NULL);
-               now = tp.tv_sec + (double)tp.tv_usec / 1000000.0;
-               if (target_this > now) {  /* enough time */
-                       //fprintf(stderr, "[%d] sleeping for %lf second...\n", getpid(), target_this - now);
-                       usleep(1e6*(target_this - now));
-               }
-               if (target_this < now) {   /* speed up */
-                       *time_per_job = (purge_end-now)/jobs_to_exa;
-                       /* limit not catched, maximal speed */
-                       if (*time_per_job <= 0) {
-                               *time_per_job = 0.0;
-                               *target_runtime = 0;
-                       }
-               }
-               //fprintf(stderr, "[%d] tpj: %lf\n", getpid(), *time_per_job);
-       }
-
-}
diff --git a/org.glite.lb.server/src/stats.c b/org.glite.lb.server/src/stats.c
deleted file mode 100644 (file)
index 187672a..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-#ident "$Header$"
-
-#include <unistd.h>
-#include <sys/file.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <assert.h>
-#include <stdio.h>
-#include <errno.h>
-#include <time.h>
-
-#include "glite/lb/events.h"
-#include "glite/lb/jobstat.h"
-#include "glite/lb/context-int.h"
-
-#include "glite/jobid/strmd5.h"
-
-#include "stats.h"
-static int stats_inc_counter(edg_wll_Context,const edg_wll_JobStat *,edg_wll_Stats *);
-static int stats_record_duration(edg_wll_Context,const edg_wll_JobStat *,const edg_wll_JobStat *,edg_wll_Stats *);
-
-#define dprintf(x) { printf("[%d] ",getpid()); printf x; }
-
-/* XXX: should be configurable at run time */
-static struct _edg_wll_StatsArchive default_archives[] = { 
-       { 10, 60 },
-       { 60, 30 },
-       { 900, 12 },
-       { 0, 0 }
-};
-
-static edg_wll_QueryRec default_group[2] = { 
-       { EDG_WLL_QUERY_ATTR_DESTINATION, },
-       { EDG_WLL_QUERY_ATTR_UNDEF, }
-};
-
-static edg_wll_Stats default_stats[] = {
-       { STATS_COUNT, default_group, EDG_WLL_JOB_READY, 0, default_archives },
-       { STATS_COUNT, default_group, EDG_WLL_JOB_SCHEDULED, 0, default_archives },
-       { STATS_COUNT, default_group, EDG_WLL_JOB_RUNNING, 0, default_archives },
-       { STATS_COUNT, default_group, EDG_WLL_JOB_DONE, EDG_WLL_STAT_OK, default_archives },
-       { STATS_COUNT, default_group, EDG_WLL_JOB_DONE, EDG_WLL_STAT_FAILED, default_archives },
-       { STATS_DURATION, default_group, EDG_WLL_JOB_SCHEDULED, 0, default_archives },
-       { STATS_DURATION, default_group, EDG_WLL_JOB_RUNNING, 0, default_archives },
-       { STATS_UNDEF, }
-       
-};
-
-extern int debug;
-
-int edg_wll_InitStatistics(edg_wll_Context ctx)
-{
-       edg_wll_Stats *stats = default_stats;   /* XXX: hardcoded */
-       int     i,j;
-
-       for (i=0; stats[i].type; i++) {
-               char    fname[50],*zero;
-
-               strcpy(fname,"/tmp/lb_stats.XXXXXX");
-               stats[i].fd = mkstemp(fname);
-               if (stats[i].fd < 0) return edg_wll_SetError(ctx,errno,fname);
-               /* XXX: should be initialized from LB data */
-               stats[i].grpno = 0;
-
-               stats[i].grpsize = sizeof(struct edg_wll_stats_group)-sizeof(struct edg_wll_stats_archive);
-
-               for (j=0; stats[i].archives[j].interval; j++) {
-                       stats[i].grpsize += sizeof(struct edg_wll_stats_archive)-sizeof(struct edg_wll_stats_cell);
-                       stats[i].grpsize += stats[i].archives[j].length * sizeof(struct edg_wll_stats_cell);
-               }
-               zero = calloc(1,stats[i].grpsize);
-               write(stats[i].fd,zero,stats[i].grpsize);
-               stats[i].map = mmap(NULL,stats[i].grpsize,PROT_READ|PROT_WRITE,MAP_SHARED,stats[i].fd,0);
-               if (stats[i].map == MAP_FAILED) return edg_wll_SetError(ctx,errno,"mmap()");
-
-               dprintf(("stats: using %s\n",fname));
-               unlink(fname);
-       }
-       return 0;
-}
-
-int edg_wll_UpdateStatistics(
-       edg_wll_Context ctx,
-       const edg_wll_JobStat *from,
-       const edg_wll_Event *e,
-       const edg_wll_JobStat *to)
-{
-       int     i;
-
-       /* XXX: should be propagated somhow via context, not hardcoded */
-       edg_wll_Stats   *stats = default_stats;
-
-       if (!ctx->count_statistics) return 0;
-
-       for (i=0; stats[i].type; i++) switch (stats[i].type) {
-               case STATS_COUNT:
-                       if (!to) continue;
-                       if (to->state == stats[i].major && (!from || from->state != to->state)) {
-                               switch (to->state) {
-                                       case EDG_WLL_JOB_DONE:
-                                               if (to->done_code != stats[i].minor) continue;
-                                               break;
-                                       default: break;
-                               }
-                               stats_inc_counter(ctx,to,stats+i);
-                       }
-                       break;
-               case STATS_DURATION:
-                       if (!to || !from) continue;
-                       if (from->state == stats[i].major && from->state != to->state) 
-                               stats_record_duration(ctx,from,to,stats+i);
-               default: break;
-       }
-       return 0;
-}
-
-static struct edg_wll_stats_archive *archive_skip(
-               const struct edg_wll_stats_archive *a,
-               int     len)
-{
-       return (struct edg_wll_stats_archive *) 
-                       (((char *) a) + sizeof(struct edg_wll_stats_archive)
-                               - sizeof(struct edg_wll_stats_cell)
-                               + len * sizeof(struct edg_wll_stats_cell)
-                       );
-}
-
-static int stats_remap(edg_wll_Stats *stats)
-{
-       int newgrpno = stats->map->grpno;
-       dprintf(("stats_remap: size changed (%d != %d), remap",stats->grpno,newgrpno));
-       munmap(stats->map,(stats->grpno ? stats->grpno : 1) * stats->grpsize);
-       stats->map = mmap(NULL,newgrpno * stats->grpsize,
-                       PROT_READ|PROT_WRITE,MAP_SHARED,stats->fd,0);
-       if (stats->map == MAP_FAILED) {
-               if (debug) abort();
-               return -1;
-       }
-       assert(stats->map->grpno == newgrpno);
-       stats->grpno = newgrpno;
-       return 0;
-}
-
-
-static int stats_inc_counter(edg_wll_Context ctx,const edg_wll_JobStat *jobstat,edg_wll_Stats *stats)
-{
-       int     i,j;
-       char    *sig = NULL;
-       struct edg_wll_stats_group      *g;
-       struct edg_wll_stats_archive    *a;
-       time_t  now = jobstat->stateEnterTime.tv_sec;
-
-       /* XXX: we support destination grouping only */
-       if (!jobstat->destination) return 0;
-       edg_wll_ResetError(ctx);
-
-       dprintf(("inc_counter: destination %s, stats %d\n",jobstat->destination,
-                       (int) (stats - (edg_wll_Stats *) default_stats)));
-
-       if (flock(stats->fd,LOCK_EX)) return edg_wll_SetError(ctx,errno,"flock()");
-
-       /* remap the file if someone changed its size */
-       if (stats->map->grpno != stats->grpno && stats_remap(stats)) {
-               edg_wll_SetError(ctx,errno,"shmem remap failed");
-               goto cleanup;
-       }
-
-       sig = str2md5base64(jobstat->destination);
-
-       for (i=0; i<stats->grpno; i++) {
-               g = (struct edg_wll_stats_group *) (
-                               ((char *) stats->map) + stats->grpsize * i
-                       );
-               if (!strcmp(sig,g->sig)) break;
-       }
-
-       /* not found, initialize new */
-       if (i == stats->grpno) {
-               dprintf(("group %s not found\n",sig));
-               if (stats->grpno) {
-                       char    *zero = calloc(1,stats->grpsize);
-                       munmap(stats->map,stats->grpno * stats->grpsize);
-                       lseek(stats->fd,0,SEEK_END);
-                       write(stats->fd,zero,stats->grpsize);
-                       free(zero);
-                       stats->map = mmap(NULL,(stats->grpno+1) * stats->grpsize,
-                                       PROT_READ|PROT_WRITE,MAP_SHARED,stats->fd,0);
-
-                       if (stats->map == MAP_FAILED) {
-                               edg_wll_SetError(ctx,errno,"mmap()");
-                               goto cleanup;
-                       }
-               }
-               stats->grpno++;
-               stats->map->grpno++;
-               dprintf(("allocated\n"));
-
-               g = (struct edg_wll_stats_group *) (
-                               ((char *) stats->map) + stats->grpsize * i);
-
-               /* invalidate all cells in all archives */
-               a = g->archive;
-               for (i=0; stats->archives[i].interval; i++) {
-                       for (j=0; j<stats->archives[i].length; j++) a->cells[j].cnt = -1;
-                       a = archive_skip(a,stats->archives[i].length);
-               }
-
-               strcpy(g->sig,sig);
-               g->last_update = now;
-       }
-       else dprintf(("group %s found at %d\n",sig,i));
-
-       a = g->archive;
-       for (i=0; stats->archives[i].interval; i++) {
-               time_t  pt = g->last_update;
-
-               pt -= pt % stats->archives[i].interval;
-
-               /* nothing happened longer than is history of this archive */
-               if (now-pt > stats->archives[i].interval * stats->archives[i].length) {
-                       for (j=0; j<stats->archives[i].length; j++) a->cells[j].cnt = 0;
-                       a->ptr = 0;
-               }
-               /* catch up eventually, cleaning not touched cells */
-               else for (pt += stats->archives[i].interval; pt < now;
-                               pt += stats->archives[i].interval)
-               {
-                       if (++(a->ptr) == stats->archives[i].length) a->ptr = 0;
-                       a->cells[a->ptr].cnt = 0;
-               }
-
-               /* validate an unused cell */
-               if (a->cells[a->ptr].cnt < 0) a->cells[a->ptr].cnt = 0;
-
-               /* now we can do IT */
-               a->cells[a->ptr].cnt++;
-               dprintf(("update archive %d, cell %d to %d\n",i,a->ptr,a->cells[a->ptr].cnt));
-
-               /* go to next archive */
-               a = archive_skip(a,stats->archives[i].length);
-       }
-
-       g->last_update = now;
-
-
-cleanup:
-       free(sig);
-       flock(stats->fd,LOCK_UN);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-static int stats_record_duration(
-               edg_wll_Context ctx,
-               const edg_wll_JobStat *from,
-               const edg_wll_JobStat *to,
-               edg_wll_Stats *stats)
-{
-       return 0;
-}
-
-int edg_wll_StateRateServer(
-       edg_wll_Context ctx,
-       const edg_wll_QueryRec  *group,
-       edg_wll_JobStatCode     major,
-       int                     minor,
-       time_t  *from, 
-       time_t  *to,
-       float   *rate,
-       int     *res_from,
-       int     *res_to
-)
-{
-       edg_wll_Stats *stats = default_stats;   /* XXX: hardcoded */
-       struct edg_wll_stats_group      *g;
-       struct edg_wll_stats_archive    *a;
-       int     i,j,matchi;
-       char    *sig = NULL;
-       time_t  afrom,ato;
-       long    match;
-
-       edg_wll_ResetError(ctx);
-
-       switch (ctx->count_statistics) {
-               case 0: return edg_wll_SetError(ctx,ENOSYS,NULL);
-               case 1: if (!ctx->noAuth) return edg_wll_SetError(ctx,EPERM,NULL);
-                       break;
-               case 2: break;
-               default: abort();
-       }
-
-       if (group[0].attr != EDG_WLL_QUERY_ATTR_DESTINATION
-               || group[1].attr != EDG_WLL_QUERY_ATTR_UNDEF)
-                       return edg_wll_SetError(ctx,ENOSYS,
-                               "the only supported grouping is by destination");
-
-       if (*from >= *to) return edg_wll_SetError(ctx,EINVAL,"from >= to");
-
-       for (;stats->type; stats++) {
-               if (stats->type != STATS_COUNT || stats->major != major) continue;
-               switch (major) {
-                       case EDG_WLL_JOB_DONE:
-                               if (stats->minor != minor) continue;
-                               break;
-                       default: break;
-               }
-               break;
-       }
-
-       if (!stats->type) return edg_wll_SetError(ctx,ENOENT,"no matching state counter");
-
-       /* remap the file if someone changed its size */
-       if (stats->map->grpno != stats->grpno)
-       {       
-               if (flock(stats->fd,LOCK_EX)) return edg_wll_SetError(ctx,errno,"flock()");
-               if (stats_remap(stats)) {
-                       edg_wll_SetError(ctx,errno,"shmem remap failed");
-                       goto cleanup;
-               }
-       }
-
-       if (flock(stats->fd,LOCK_SH)) return edg_wll_SetError(ctx,errno,"flock()");
-
-       /* XXX */
-       sig = str2md5base64(group->value.c);
-
-
-       for (i=0, g=stats->map; i<stats->grpno; i++) {
-               if (!strcmp(sig,g->sig)) break;
-               g = (struct edg_wll_stats_group *) (((char *) g) + stats->grpsize);
-       }
-
-       if (i == stats->grpno) {
-               dprintf(("no match: %s\n",sig));
-               edg_wll_SetError(ctx,ENOENT,"no matching group");
-               goto cleanup;
-       }
-
-       match = 0;
-       matchi = -1;
-       /* XXX: assumes decreasing resolution of archives */ 
-       for (j=0; stats->archives[j].interval; j++) {
-               afrom = ato = g->last_update;
-
-               ato += stats->archives[j].interval - ato % stats->archives[j].interval;
-               afrom -= afrom % stats->archives[j].interval;
-               afrom -= stats->archives[j].interval * (stats->archives[j].length-1);
-
-               /* intersection of [from,to] and [afrom,ato] */
-               if (afrom < *from) afrom = *from;
-               if (ato > *to) ato = *to;
-
-               /* find the best match */
-               if (ato-afrom > match) {
-                       match = ato - afrom;
-                       matchi = j;
-               }
-       }
-
-       dprintf(("best match: archive %d, interval %ld\n",matchi,match));
-
-       if (matchi < 0) {
-               if (*from > g->last_update) {
-                       /* special case -- we are sure that nothing arrived */
-                       *rate = 0;
-                       *res_from = *res_to = stats->archives[0].interval;
-                       goto cleanup;
-               }
-               edg_wll_SetError(ctx,ENOENT,"no data available");
-               goto cleanup;
-       }
-
-       *res_from = *res_to = stats->archives[matchi].interval;
-
-       a = g->archive;
-       for (j=0; j<matchi; j++) a = archive_skip(a,stats->archives[j].length);
-
-       i = stats->archives[matchi].interval;
-       afrom = g->last_update - g->last_update % i
-                       - (stats->archives[matchi].length-1)*i;
-
-       dprintf(("archive from %ld = %s",afrom,ctime(&afrom)));
-
-       if (afrom > *from) *from = afrom;
-       if (afrom + stats->archives[matchi].length * i < *to) *to = afrom + stats->archives[matchi].length * i;
-
-       *rate = 0;
-       match = 0;
-
-
-       for (j=0; j<stats->archives[matchi].length; j++,afrom += i) {
-               struct edg_wll_stats_cell       *c = a->cells + ((a->ptr+j+1) % stats->archives[matchi].length);
-
-               dprintf(("cell %d (abs %d): ",j,(a->ptr+j+1) % stats->archives[matchi].length));
-               if (c->cnt < 0) {
-                       dprintf(("invalid\n"));
-                       continue; /* invalid cell */
-               }
-
-               dprintf(("search %ld in %ld, %ld\n",*from,afrom,afrom+i));
-
-               if (*from >= afrom && *from < afrom+i) {
-                       match += *from - afrom;
-                       *rate += c->cnt * (1.0 - ((float) *from-afrom)/i);
-                       dprintf(("matched from: match %ld, rate %f\n",match,*rate));
-               }
-               else if (*from < afrom && *to >= afrom) {
-                       match += i;
-                       *rate += c->cnt;
-                       dprintf(("matched in: match %ld, rate %f\n",match,*rate));
-               }
-
-               if (*to >= afrom && *to < afrom+i) {
-                       match -= i-(*to-afrom);
-                       *rate -= c->cnt * (((float) i)-(*to - afrom))/i;
-
-                       dprintf(("matched to: match %ld, rate %f\n",match,*rate));
-
-               /* asi blbost 
-                       if (j == stats->archives[matchi].length - 1
-                               && *to > g->last_update)
-                       {
-                               match -= *to - g->last_update;
-                               *rate -= c->cnt * (((float) *to) - g->last_update)/i;
-                               dprintf(("corrected wrt. last_update: match %ld, rate %f\n",match,*rate));
-                       }
-               */
-
-                       break;
-               }
-       }
-       *rate /= match;
-
-cleanup:
-       free(sig);
-       flock(stats->fd,LOCK_UN);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-int edg_wll_StateDurationServer(
-       edg_wll_Context ctx,
-       const edg_wll_QueryRec  *group,
-       edg_wll_JobStatCode     major,
-       int                     minor,
-       time_t  *from, 
-       time_t  *to,
-       float   *duration,
-       int     *res_from,
-       int     *res_to
-)
-{
-       return edg_wll_SetError(ctx,ENOSYS,NULL);
-}
-
diff --git a/org.glite.lb.server/src/stats.h b/org.glite.lb.server/src/stats.h
deleted file mode 100644 (file)
index 05d79e7..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#ifndef GLITE_LB_STATS_H
-#define GLITE_LB_STATS_H
-
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-#include "glite/lb/events.h"
-#include "glite/lb/jobstat.h"
-#include "glite/lb/query_rec.h"
-
-int edg_wll_InitStatistics(edg_wll_Context);
-
-int edg_wll_UpdateStatistics(
-       edg_wll_Context,
-       const edg_wll_JobStat *,
-       const edg_wll_Event *,
-       const edg_wll_JobStat *);
-
-
-struct edg_wll_stats_cell {
-       int     cnt;
-       float   value;
-};
-
-struct edg_wll_stats_archive {
-       int     ptr;
-       struct edg_wll_stats_cell       cells[1];
-};
-
-struct edg_wll_stats_group {
-       int     grpno;
-       char    sig[33];
-       time_t  last_update;
-       struct edg_wll_stats_archive    archive[1];
-};
-
-
-typedef struct {
-       enum { STATS_UNDEF = 0, STATS_COUNT, STATS_DURATION }   type;
-       edg_wll_QueryRec        *group;
-       edg_wll_JobStatCode     major;
-       int                     minor;
-       struct _edg_wll_StatsArchive {
-               int     interval,length;
-       } *archives;
-
-       int     fd;
-       struct edg_wll_stats_group      *map;
-       int     grpno,grpsize;
-} edg_wll_Stats;
-
-int edg_wll_StateRateServer(
-       edg_wll_Context context,
-       const edg_wll_QueryRec  *group,
-       edg_wll_JobStatCode     major,
-       int                     minor,
-       time_t  *from, 
-       time_t  *to,
-       float   *rate,
-       int     *res_from,
-       int     *res_to
-);
-
-
-int edg_wll_StateDurationServer(
-       edg_wll_Context context,
-       const edg_wll_QueryRec  *group,
-       edg_wll_JobStatCode     major,
-       int                     minor,
-       time_t  *from, 
-       time_t  *to,
-       float   *duration,
-       int     *res_from,
-       int     *res_to
-);
-
-#endif /* GLITE_LB_STATS_H */
diff --git a/org.glite.lb.server/src/store.c.T b/org.glite.lb.server/src/store.c.T
deleted file mode 100644 (file)
index 365268f..0000000
+++ /dev/null
@@ -1,795 +0,0 @@
-#ident "$Header$"
-
-/*
-
-@@@AUTO
-
- * XXX: still lots of hardcoded stuff
- *     there's mapping db.column <-> event struct field
- */
-
-@@@LANG: C
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-#include <errno.h>
-#include <syslog.h>
-#include <ctype.h>
-
-#include "glite/jobid/strmd5.h"
-#include "glite/lbu/trio.h"
-
-#include "glite/lb/events_parse.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/log_proto.h"        /* for EDG_WLL_LOG_USER_DEFAULT */
-
-#include "store.h"
-#include "get_events.h"
-#include "lb_authz.h"
-#include "jobstat.h"
-#include "db_calls.h"
-#include "db_supp.h"
-#include "index.h"
-
-static int store_user(edg_wll_Context,const char *,const char *); 
-static int store_job(edg_wll_Context,glite_jobid_const_t,const char *, int, int, int, int);
-/* FIXME: 'set_job_grey' defined but not used */
-static int set_job_grey(edg_wll_Context ctx, char *jobid);
-static int store_flesh(edg_wll_Context,edg_wll_Event *,const char *ulm, char *,int);
-/* FIXME: 'check_dup' defined but not used */
-static int check_dup(edg_wll_Context,edg_wll_Event *);
-static int check_auth(edg_wll_Context,edg_wll_Event *e); 
-static void lowercase_usertag(edg_wll_Event *ev);
-
-void edg_wll_StoreAnonymous(edg_wll_Context ctx,int anon) {
-       ctx->allowAnonymous = anon;
-}
-
-
-/* !!! to be called from OPEN TRANSACTION only !!! 
- */
-int edg_wll_StoreEvent(edg_wll_Context ctx,edg_wll_Event *e,const char *ulm,int *seq)
-{
-       char                    *userid, *jobid, *stmt, *ssrc, *now_s, *stamp, *dummy, *max;
-       glite_lbu_Statement     sh = NULL;
-       int                     next = 0xDEAD, nr;
-
-
-       userid = ssrc = jobid = stmt = now_s = stamp = dummy = max = NULL;
-
-       lowercase_usertag(e);
-       jobid = edg_wlc_JobIdGetUnique(e->any.jobId);
-       glite_lbu_TimeToDB(e->any.timestamp.tv_sec, &stamp);
-       ssrc = edg_wll_SourceToString(e->any.source);
-
-       if ( ctx->event_load )
-               glite_lbu_TimeToDB(e->any.arrived.tv_sec, &now_s);
-       else
-               glite_lbu_TimeToDB(time(NULL), &now_s);
-
-       edg_wll_ResetError(ctx);
-       switch (check_auth(ctx,e)) {
-               case 0: break;
-               case ENOENT: 
-                       /* job not registered */
-                       // should not happen, store_job_server_proxy() miscoded or going thu load?
-                       goto clean;
-                       break;
-               case EPERM:
-                       if (!ctx->noAuth) goto clean;
-                       edg_wll_ResetError(ctx);
-                       break;
-               default: goto clean;
-       }
-
-       trio_asprintf(&stmt,"select userid from jobs where jobid='%|Ss'", jobid);
-       
-       if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0 || edg_wll_FetchRow(ctx,sh,1,NULL,&userid) < 0) goto clean;
-       if (sh) glite_lbu_FreeStmt(&sh);
-       free(stmt); stmt = NULL;
-
-
-/* check duplicity */
-       trio_asprintf(&stmt,
-               "select arrived from events where jobid='%|Ss' and code='%d'"
-               " and prog='%|Ss' and host='%|Ss' and time_stamp=%s and usec='%d'"
-               " and level='%d' and userid='%|Ss' and seqcode='%|Ss'",
-               jobid, (int) e->any.type,
-               ssrc,e->any.host,
-               stamp,e->any.timestamp.tv_usec,
-               e->any.level,userid, e->any.seqcode);
-
-       if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0) goto clean;
-       nr = edg_wll_FetchRow(ctx,sh,1,NULL,&dummy);
-       if (sh) glite_lbu_FreeStmt(&sh);
-       free(stmt); stmt = NULL;
-       free(dummy);
-
-       if (nr < 0) goto clean;
-       if (nr > 0) {
-               /* possible duplicity (99%) */
-               // XXX: check event flesh to be 100% sure
-               edg_wll_SetError(ctx,EEXIST,"duplicate event");
-               goto clean;
-       }
-       /* else (nr == 0) -> unique event, continue */
-       
-
-/* obtain number of stored events */
-       trio_asprintf(&stmt,
-               "select nevents from jobs "
-               "where jobid = '%|Ss'",jobid);
-
-       if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0 ||
-           edg_wll_FetchRow(ctx,sh,1,NULL,&max) < 0) goto clean;
-       glite_lbu_FreeStmt(&sh); 
-       
-       next = (max && *max) ? atoi(max) : 0;
-       free(max);
-
-
-/* store event */              
-       trio_asprintf(&stmt,
-               "insert into events(jobid,event,code,prog,host,time_stamp,usec,arrived,level,userid,seqcode) "
-               "values ('%|Ss',%d,%d,'%|Ss','%|Ss',%s,%d,%s,%d,'%|Ss','%|Ss')",
-               jobid,next,
-               (int) e->any.type,
-               ssrc,e->any.host,
-               stamp,e->any.timestamp.tv_usec,
-               now_s, e->any.level,userid, e->any.seqcode);
-
-       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto clean;
-       free(stmt); stmt = NULL;
-
-/* increase number of stored events */
-       trio_asprintf(&stmt,
-               "update jobs set nevents='%d'"
-               "where jobid = '%|Ss'", next+1, jobid);
-
-       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) goto clean;
-       free(stmt); stmt = NULL;
-       
-
-/* store event record */
-       if (store_flesh(ctx,e,ulm,jobid,next)) goto clean;
-
-clean:
-       free(now_s);
-       free(userid);
-       free(jobid);
-       free(stmt);
-       free(ssrc);
-       if (sh) glite_lbu_FreeStmt(&sh);
-       if (!edg_wll_Error(ctx,NULL,NULL) && seq) *seq = next;
-       free(stamp);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-static int store_user(edg_wll_Context ctx,const char *userid,const char *subj)
-{
-       char    *stmt;
-
-       trio_asprintf(&stmt,"insert into users(userid,cert_subj) "
-               "values ('%|Ss','%|Ss')",userid,subj);
-
-       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) {
-               if (edg_wll_Error(ctx,NULL,NULL) == EEXIST)
-                       edg_wll_ResetError(ctx);
-       }
-
-       free(stmt);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-static int store_job(edg_wll_Context ctx,glite_jobid_const_t job,const char *userid, int proxy, int server,int grey, int update)
-{
-       char *jobstr = edg_wlc_JobIdUnparse(job);
-       char *jobid = edg_wlc_JobIdGetUnique(job);
-       char *stmt;
-       char *srvName;
-       unsigned int    srvPort;
-
-/* debug Duplicate key on index: Duplicate entry '(nil)' for key 1
- */
-       if (jobid == NULL || jobstr == NULL) 
-               return edg_wll_SetError(ctx,EINVAL,"store_job()");
-
-       edg_wll_ResetError(ctx);
-
-       if (ctx->isProxy) {
-               proxy = 1;
-
-               /* If host&port in jobId match bkserver hostname and port and bkserver
-                * runs server service, mark the proxy job to belong to bkserver too    
-                */
-               edg_wlc_JobIdGetServerParts(job, &srvName, &srvPort);
-               if ( (ctx->serverRunning) && (ctx->srvPort == srvPort) && 
-                               !strcmp(ctx->srvName, srvName)) {
-                       server=1;
-               }
-       }
-       else {
-               server = 1;
-       }
-
-       if (update) {
-               trio_asprintf(&stmt,"update jobs set userid='%|Ss', proxy='%|Sd', server='%|Sd', grey='%|Sd' where jobid='%|Ss'", 
-                       userid,proxy,server,grey,jobid);
-       }
-       else {
-               trio_asprintf(&stmt,"insert into jobs(jobid,dg_jobid,userid,proxy,server,grey) "
-                       "values ('%|Ss','%|Ss','%|Ss', '%|Sd', '%|Sd', '%|Sd')",jobid,jobstr,userid,proxy,server,grey);
-       }
-
-       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) {
-               if (edg_wll_Error(ctx,NULL,NULL) == EEXIST && !update) 
-                       edg_wll_ResetError(ctx);
-               else
-                       goto err;
-       }
-       free(stmt); stmt = NULL;
-
-err:
-       free(stmt);
-       free(jobstr);
-       free(jobid);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-static int set_job_grey(edg_wll_Context ctx, char *jobid)
-{
-       char *stmt;
-
-       trio_asprintf(&stmt,"update jobs set grey='1' where jobid='%|Ss'", jobid);
-       edg_wll_ExecSQL(ctx,stmt,NULL); 
-
-       free(stmt);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-/* test whether job shares LB proxy and server DB or not */
-int is_job_local(edg_wll_Context ctx, glite_jobid_const_t jobId) 
-{
-       char            *srvName = NULL;
-       unsigned int    srvPort; 
-       int             ret;    
-
-       if (!ctx->serverRunning) return 0;      /* XXX */
-
-       edg_wlc_JobIdGetServerParts(jobId, &srvName, &srvPort);
-       ret = ((ctx->srvPort == srvPort) && ctx->srvName && !strcmp(srvName,ctx->srvName));
-       free(srvName);
-
-       return(ret);
-}
-
-int store_job_server_proxy(edg_wll_Context ctx, edg_wll_Event *event, int *register_to_JP)
-{
-       char            *unique = edg_wlc_JobIdGetUnique(event->any.jobId);
-       char            *q = NULL, *userid = NULL, *subj = NULL, *owner = NULL;
-       glite_lbu_Statement    stmt = NULL;
-       int             nar, grey = 0;
-       char            *can_peername = NULL;
-       int             local_job = is_job_local(ctx, event->any.jobId);
-       char            *res[3] = {NULL, NULL, NULL};
-       
-
-       /* check auth */
-       if (!ctx->isProxy && !ctx->peerName)
-               return edg_wll_SetError(ctx,EPERM,"LB server can't store using unauthenticated connection");
-       if (ctx->isProxy && (!event->any.user || !strcmp(event->any.user,EDG_WLL_LOG_USER_DEFAULT)) )
-               return edg_wll_SetError(ctx,EPERM,"LB proxy can't store using unauthenticated connection");
-
-
-       trio_asprintf(&q,"select proxy,server,grey from jobs where jobid='%|Ss' for update", unique);
-
-       nar = edg_wll_ExecSQL(ctx,q,&stmt);
-       free(q); q = NULL;
-
-/* XXX: greyjobs semantics is overloaded here:
- * we trust the registration event content to specify job owner unconditionally.
- * It's fine for the time being but should be solved with new authz.
- * */
-
-       if (nar < 0) goto err;
-       else if (nar == 0) {
-               /* Job not stored yet */
-
-               if (event->any.type == EDG_WLL_EVENT_REGJOB) {
-
-               /* XXX: directness is checked by any.user == peerName. Not perfect but better than event flags. */
-
-                       if (!ctx->isProxy && !edg_wll_gss_equal_subj(event->any.user, ctx->peerName) && !ctx->greyjobs) {
-                               edg_wll_SetError(ctx,EPERM,"job registration must go directly");
-                               goto err;
-
-                       }
-                       /* else OK */
-               }
-               else {
-                       if (ctx->greyjobs) grey = 1;
-                       else {
-                               edg_wll_SetError(ctx, ENOENT, "job not registered");
-                               goto err;
-                       }
-               }
-
-               can_peername = grey ?  strdup("GREY JOB") : edg_wll_gss_normalize_subj(event->any.user, 0);
-               userid = strdup(strmd5(can_peername, NULL));
-               if (store_user(ctx,userid,can_peername)) goto err;
-               if (store_job(ctx,(glite_jobid_const_t) event->any.jobId,
-                       userid, ctx->isProxy, local_job, grey, 0 )) goto err;
-               *register_to_JP = (local_job) ? REG_JOB_TO_JP : 0;
-       }
-       else {
-               /* Job already stored */
-
-               if (edg_wll_FetchRow(ctx,stmt,sizeof(res)/sizeof(res[0]),NULL,res) < 0) goto err;
-               if (stmt) { glite_lbu_FreeStmt(&stmt); stmt = NULL; }
-
-
-               if (ctx->greyjobs && !strcmp(res[2],"1") && 
-                       (event->any.type == EDG_WLL_EVENT_REGJOB)) 
-               {
-                       can_peername = edg_wll_gss_normalize_subj(event->any.user, 0);
-                       userid = strdup(strmd5(can_peername, NULL));
-                       if (store_user(ctx,userid,can_peername)) goto err;
-                       if (store_job(ctx,(glite_jobid_const_t) event->any.jobId,
-                               userid, (ctx->isProxy || !strcmp(res[0],"1")), 
-                               !strcmp(res[1],"1") || (local_job ? ctx->serverRunning : 0), 0, 1)) goto err;
-               }
-               else {
-                       /* check possible server vs. proxy registration ownership clash */
-                       if (event->any.type == EDG_WLL_EVENT_REGJOB) 
-                       {
-                               trio_asprintf(&q,"select u.cert_subj from jobs j, users u "
-                                                       "where j.jobid='%|Ss' and u.userid=j.userid",unique);
-
-                               if (edg_wll_ExecSQL(ctx,q,&stmt) < 0
-                                       || edg_wll_FetchRow(ctx,stmt,1,NULL,&owner) < 0
-                               ) goto err;
-
-                               if (!edg_wll_gss_equal_subj(event->any.user, owner)) {
-                                       edg_wll_SetError(ctx,EPERM,"Job already registered with different owner. Rejecting event.");
-                                       goto err;
-                               }
-                       }
-
-                       /* update job membership if needed */
-                       // if (!strcmp(res[0],"1") && !strcmp(res[1],"1") ) /*nothing to do */;
-                       if ( (!strcmp(res[0],"0") && ctx->isProxy) || (!strcmp(res[1],"0") && !ctx->isProxy) ) {
-                               trio_asprintf(&q,"update jobs set server='1', proxy='1' where jobid='%|Ss'",
-                                       unique);
-                               if (edg_wll_ExecSQL(ctx,q,NULL) < 0) goto err;
-                               free(q); q = NULL;
-                       }
-               }
-       }
-
-err:
-       free(res[0]); free(res[1]); free(res[2]);
-       if (stmt) glite_lbu_FreeStmt(&stmt);
-       free(subj);
-       free(userid);
-       if (q) free(q);
-       if (owner) free(owner);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-
-}
-
-
-
-#define SHORT_LEN      255     /* short_fiels.value db column lenght */
-
-static int store_flesh(edg_wll_Context ctx,edg_wll_Event *e,const char *ulm,char *jobid,int no)
-{
-#ifndef LB_EVENTS_BLOB
-       struct {
-               char    *key;
-               char    *val;
-       } f[20];
-       unsigned int    i;
-#endif
-
-       char    *stmt;
-       int     err = 0;
-
-       assert(ulm || e);
-       edg_wll_ResetError(ctx);
-       if (!ulm) ulm = edg_wll_UnparseEvent(ctx, e);
-       if (!ulm) return edg_wll_Error(ctx, NULL, NULL);
-
-#ifndef LB_EVENTS_BLOB
-       // in both ways if some preparsed flesh fields in events too
-       if (!e) {
-               if (edg_wll_ParseEvent(ctx, (char *)ulm, &e) != 0) return edg_wll_Error(ctx, NULL, NULL);
-       }
-
-       memset(f,0,sizeof(f)); assert(f[0].key == NULL);
-
-       switch (e->type) {
-@@@{
-       for my $type (getTypesOrdered $event) {
-               next if $type eq '_common_';
-               selectType $event $type;
-               my $uctype = uc $type;
-               my $flctype = lcfirst $type;
-               if ($flctype =~ m/^pBS/) { $flctype = ucfirst $flctype; }
-               if ($flctype =~ m/^condor/) { $flctype = ucfirst $flctype; }
-               gen qq{
-!              case EDG_WLL_EVENT_$uctype:
-};
-               my $idx = 0;
-               for (getFieldsOrdered $event) {
-                       my $f = selectField $event $_;
-                       my $name = getName $f;
-                       my $ucname = uc $name;
-                       my $fucname = ucfirst $name;
-                       my $tos = $f->{codes} ?
-                               "f[$idx].val = edg_wll\_$type${fucname}ToString(e->$flctype.$name);" :
-                               toString $f "e->$flctype.$name","f[$idx].val";
-                       gen qq{
-!                      f[$idx].key = "$ucname";
-!                      $tos
-};
-                       $idx++;
-               }
-               gen qq{
-!                      assert($idx<sizeof f/sizeof f[0]);
-!                      break;
-};
-       }
-@@@}
-               default:
-                       break;
-       }
-
-       for (i=0; i<sizeof(f)/sizeof(f[0]) && !err; i++) if (f[i].key && f[i].val) {
-               trio_asprintf(&stmt,"insert into %s(jobid,event,name,value) "
-                       "values ('%|Ss',%d,'%|Ss','%|Ss')",
-                       strlen(f[i].val) <= SHORT_LEN ? "short_fields" : "long_fields",
-                       jobid,no,f[i].key,f[i].val);
-
-               if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) err = edg_wll_Error(ctx,NULL,NULL);
-               free(stmt);
-       }
-       for (i=0; i<sizeof(f)/sizeof(f[0]); i++) free(f[i].val);
-
-/* XXX: hardcoded, no other suitable place to store it */
-       if (!err) {
-               trio_asprintf(&stmt,"insert into short_fields(jobid,event,name,value) "
-                       "values ('%|Ss',%d,'SRC_INSTANCE','%|Ss')",
-                       jobid,no,e->any.src_instance);
-               if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) err = edg_wll_Error(ctx,NULL,NULL);
-               free(stmt);
-       }
-#else
-       if (!ulm) ulm = edg_wll_UnparseEvent(ctx, e);
-       trio_asprintf(&stmt, "insert into events_flesh (jobid, event, ulm) values ('%|Ss', %d, '%|Ss')", jobid, no, ulm);
-       if (edg_wll_ExecSQL(ctx,stmt,NULL) < 0) err = edg_wll_Error(ctx,NULL,NULL);
-#endif
-
-       return err;
-}
-
-static int check_dup(edg_wll_Context ctx,edg_wll_Event *e)
-{
-       int             i,dup_detected = 0;
-       int             err;
-       char            *es,*es2;
-       edg_wll_QueryRec        jc[2],ec[2];
-       edg_wll_QueryRec        **jca, **eca;
-       edg_wll_Event   *e2;
-
-       edg_wll_ResetError(ctx);
-
-       jc[0].attr = EDG_WLL_QUERY_ATTR_JOBID;
-       jc[0].value.j = e->any.jobId;
-       jc[0].op = EDG_WLL_QUERY_OP_EQUAL;
-       jc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-
-       ec[0].attr = EDG_WLL_QUERY_ATTR_TIME;
-       memcpy(&ec[0].value.t,&e->any.timestamp,sizeof(struct timeval));
-       ec[0].op = EDG_WLL_QUERY_OP_EQUAL;
-       ec[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-
-        jca = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **));
-        eca = (edg_wll_QueryRec **) malloc (2 * sizeof(edg_wll_QueryRec **));
-        jca[0] = jc;
-        jca[1] = NULL;
-        eca[0] = ec;
-        eca[1] = NULL;
-
-       err = edg_wll_QueryEventsServer(ctx,1,(const edg_wll_QueryRec **)jca, 
-                                       (const edg_wll_QueryRec **)eca,&e2);
-       switch (err) {
-               case 0: /* continue normally */
-                       break;
-               case ENOENT:
-                       free(jca);
-                       free(eca);
-                       return edg_wll_ResetError(ctx);
-                       break;
-               default:
-                       free(jca);
-                       free(eca);
-                       return edg_wll_Error(ctx,NULL,NULL);
-                       break;
-       }
-
-       es = edg_wll_UnparseEvent(ctx,e);
-       assert(es);
-
-       for (i=0;e2[i].type && !dup_detected;i++) {
-               /* Ignore priority */
-               e2[i].any.priority = e->any.priority;
-               es2 = edg_wll_UnparseEvent(ctx,e2+i);
-               assert(es2);
-               if (!strcmp(es,es2)) {
-                       dup_detected = 1;
-                       edg_wll_SetError(ctx,EEXIST,"duplicate event");
-               }
-               free(es2);
-       }
-
-       free(jca);
-       free(eca);
-       free(es);
-       for (i=0; e2[i].type; i++) edg_wll_FreeEvent(e2+i);
-       free(e2);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-static int check_auth(edg_wll_Context ctx,edg_wll_Event *e)
-{
-       char    *jobid = edg_wlc_JobIdGetUnique(e->any.jobId);
-       char    *q = NULL,*owner = NULL;
-       glite_lbu_Statement     stmt = NULL;
-
-       edg_wll_ResetError(ctx);
-
-       if (!ctx->isProxy && !ctx->peerName) 
-               return edg_wll_SetError(ctx,EPERM,"can't store using unauthenticated connection");
-
-       trio_asprintf(&q,"select u.cert_subj from jobs j, users u "
-                               "where j.jobid='%|Ss' and u.userid=j.userid",jobid);
-
-       if (edg_wll_ExecSQL(ctx,q,&stmt) < 0
-               || edg_wll_FetchRow(ctx,stmt,1,NULL,&owner) < 0
-       ) goto clean;
-
-       if (!owner) {
-               edg_wll_SetError(ctx, ENOENT, "job not registered");
-               goto clean;
-       }
-
-       switch (e->any.source) {
-               case EDG_WLL_SOURCE_USER_INTERFACE:
-               case EDG_WLL_SOURCE_LRMS:
-               case EDG_WLL_SOURCE_APPLICATION:
-                       if (!edg_wll_gss_equal_subj(owner,e->any.user)) 
-                               edg_wll_SetError(ctx,EPERM,"check_auth()");
-                       break;
-               default:
-                       /* XXX: just don't allow anonymous */
-                       if (!strcmp(e->any.user,EDG_WLL_LOG_USER_DEFAULT))
-                               edg_wll_SetError(ctx,EPERM,"check_auth()");
-                       break;
-       }
-
-
-clean:
-       if (stmt) glite_lbu_FreeStmt(&stmt);
-       free(q);
-       free(owner);
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-edg_wll_ErrorCode intJobStat_embryonic(
-       edg_wll_Context ctx,
-       glite_jobid_const_t jobid,
-       const edg_wll_RegJobEvent *e,
-       intJobStat *stat)
-{
-       if (edg_wlc_JobIdDup(jobid, &stat->pub.jobId) ||
-               edg_wlc_JobIdDup(e->jobId, &stat->pub.parent_job)) goto err;
-       stat->pub.state = EDG_WLL_JOB_SUBMITTED;
-       stat->pub.owner = strdup(e->user);
-       stat->pub.jobtype = EDG_WLL_STAT_SIMPLE;
-       stat->pub.stateEnterTimes[1 + EDG_WLL_JOB_SUBMITTED] = (int)e->timestamp.tv_sec;
-       stat->pub.lastUpdateTime = e->timestamp;
-
-err:
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-/*
- * Returns encoded SQL table states record for embryonic DAG subjob
- */
-
-static edg_wll_ErrorCode states_values_embryonic(
-       edg_wll_Context ctx,
-       glite_jobid_const_t jobid,
-       const edg_wll_RegJobEvent *e,
-       char **icnames,
-       char **values)
-{
-       char *jobid_md5, *stat_enc, *parent_md5;
-       char *stmt = NULL;
-       char *icvalues;
-       intJobStat stat_rec;
-       intJobStat *stat = &stat_rec;
-
-       init_intJobStat(stat);
-
-       if (intJobStat_embryonic(ctx, jobid, e, stat)) goto err;
-       
-       jobid_md5 = edg_wlc_JobIdGetUnique(jobid);
-       parent_md5 = edg_wlc_JobIdGetUnique(e->jobId);
-       stat_enc = enc_intJobStat(strdup(""), stat);
-       if (jobid_md5 == NULL || parent_md5 == NULL || stat_enc == NULL) goto err;
-
-
-       if (edg_wll_IColumnsSQLPart(ctx, ctx->job_index_cols, &stat->pub, 1, icnames, &icvalues)) goto err;
-       trio_asprintf(&stmt,
-               "'%|Ss',%d,%d,'%|Ss','%|Ss','%|Ss'%s",
-               jobid_md5, stat->pub.state, 1, stat_enc,
-               INTSTAT_VERSION, parent_md5, icvalues);
-       free(icvalues);
-
-err:
-       destroy_intJobStat(stat);
-       free(jobid_md5);
-       free(stat_enc);
-       free(parent_md5);
-       *values = stmt;
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-int register_subjobs_embryonic(edg_wll_Context ctx,const edg_wll_RegJobEvent *e)
-{
-       int                     i, j,  err = 0;
-       edg_wlc_JobId           *subjobs = NULL;
-       char                    *jobid = NULL, *jobid_md5 = NULL, *jobid_md5_old = NULL;
-       size_t                  jobid_len;
-       char                    *icnames = NULL, *values = NULL, *userid = NULL, *stmt = NULL;
-       int                     server, proxy, membership = 0;
-       glite_lbu_Statement     sh = NULL;
-
-
-       edg_wll_ResetError(ctx);
-
-       if (e->nsubjobs == 0) return 0;
-       if (e->nsubjobs < 0) return edg_wll_SetError(ctx,EINVAL,"negative number of subjobs");
-       if ((err = edg_wll_GenerateSubjobIds(ctx,e->jobId,e->nsubjobs,e->seed,&subjobs)))
-               return err;
-
-       /* find out icnames and values once, then only change jobids */ 
-       if (states_values_embryonic(ctx, subjobs[0], e, &icnames, &values))
-               edg_wll_Error(ctx, NULL, NULL);
-       jobid_md5_old = edg_wlc_JobIdGetUnique(subjobs[0]);
-       jobid_len = strlen(jobid_md5_old);
-               
-
-       /* increase the overall request timeout. */
-       ctx->p_tmp_timeout.tv_sec += e->nsubjobs/10;
-       if (ctx->p_tmp_timeout.tv_sec > 86400) ctx->p_tmp_timeout.tv_sec = 86400;
-
-       if ((membership = edg_wll_jobMembership(ctx, e->jobId)) < 0) goto err;
-
-       proxy = membership & DB_PROXY_JOB;
-       server = membership & DB_SERVER_JOB;
-
-       /* get userid of parent job */
-       jobid = edg_wlc_JobIdGetUnique(e->jobId);
-       trio_asprintf(&stmt,"select userid from jobs where jobid='%|Ss'", jobid);
-       if (edg_wll_ExecSQL(ctx,stmt,&sh) < 0 || edg_wll_FetchRow(ctx,sh,1,NULL,&userid) < 0) goto err;
-
-       for (i=0; i<e->nsubjobs; i++) {
-               char            *et,*ed,*job_s,*p,*p1;
-
-               /* save jobid-userid relation into jobs table */
-               if ((err = store_job(ctx, subjobs[i], userid, proxy, server, 0, 0)))
-                       if (edg_wll_Error(ctx,&et,&ed) == EDEADLOCK) goto err;
-
-               /* interchange variable parts (jobids) in values */
-               /* there are only two occurences of subjob jobid */
-               jobid_md5 = edg_wlc_JobIdGetUnique(subjobs[i]);
-               if (i) {
-                       p = strstr(values, jobid_md5_old);              
-                       assert(p);
-                       memcpy(p, jobid_md5, jobid_len);
-
-                       p1 = strstr(p + jobid_len, jobid_md5_old);
-                       assert(p1);
-                       memcpy(p1, jobid_md5, jobid_len);
-               }
-               free(jobid_md5_old);
-               jobid_md5_old = jobid_md5;
-
-               if (!err && (err = edg_wll_StoreIntStateEmbryonic(ctx, icnames, values)))
-                       edg_wll_Error(ctx,&et,&ed);
-
-               if (err) {
-                       job_s = edg_wlc_JobIdUnparse(subjobs[i]);
-                       fprintf(stderr,"%s: %s (%s)\n",job_s,et,ed);
-                       syslog(LOG_ERR,"%s: %s (%s)",job_s,et,ed);
-                       free(job_s); free(et); free(ed);
-                       edg_wll_ResetError(ctx);
-               }
-               edg_wlc_JobIdFree(subjobs[i]);
-       }
-
-err:
-       free(jobid_md5_old);    //free the last one
-       free(icnames);
-       free(values);
-       /* free the rest of subjobs if DEADLOCK occurs */
-       for (j=i; j<e->nsubjobs; j++) edg_wlc_JobIdFree(subjobs[j]);
-       free(subjobs);
-       if (sh) glite_lbu_FreeStmt(&sh);
-       free(stmt);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-int edg_wll_delete_event(edg_wll_Context ctx,const char *jobid,int event)
-{
-       char    *stmt;
-
-/* The order of tables is important to prevent another process calling
- * StoreEvent() to get our event number and mess up the fields together.
- *
- * XXX: best effort: more or less ignore errors
- *
- */
-
-       trio_asprintf(&stmt,
-               "delete from short_fields where jobid='%|Ss' and event=%d",
-               jobid,event);
-       edg_wll_ExecSQL(ctx,stmt,NULL);
-       free(stmt);
-
-       trio_asprintf(&stmt,
-               "delete from long_fields where jobid='%|Ss' and event=%d",
-               jobid,event);
-       edg_wll_ExecSQL(ctx,stmt,NULL);
-       free(stmt);
-
-       trio_asprintf(&stmt,
-               "delete from events_flesh where jobid='%|Ss' and event=%d",
-               jobid,event);
-       edg_wll_ExecSQL(ctx,stmt,NULL);
-       free(stmt);
-
-       trio_asprintf(&stmt,
-               "delete from events where jobid='%|Ss' and event=%d",
-               jobid,event);
-       edg_wll_ExecSQL(ctx,stmt,NULL);
-       free (stmt);
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-/* XXX: if event type is user tag, convert the tag name to lowercase!
- *       (not sure whether to convert a value too is reasonable
- *       or keep it 'case sensitive')
- */
-static void lowercase_usertag(edg_wll_Event *ev)
-{
-       int i;
-
-       if ( ev->any.type == EDG_WLL_EVENT_USERTAG ) {
-
-               for ( i = 0; ev->userTag.name[i] != '\0'; i++ )
-               ev->userTag.name[i] = tolower(ev->userTag.name[i]);
-       }
-}
diff --git a/org.glite.lb.server/src/stored_master.c b/org.glite.lb.server/src/stored_master.c
deleted file mode 100644 (file)
index f039a5e..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-#ident "$Header$"
-
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <assert.h>
-
-#include "glite/security/glite_gss.h"
-#include "glite/lb/il_msg.h"
-#include "glite/lb/lb_plain_io.h"
-#include "glite/lb/context-int.h"
-
-#include "store.h"
-
-#ifdef LB_PERF
-#include "srv_perf.h"
-#endif
-
-
-static
-int
-gss_reader(void *user_data, char *buffer, int max_len)
-{
-  edg_wll_Context tmp_ctx = (edg_wll_Context)user_data;
-  int ret; 
-  size_t len;
-  edg_wll_GssStatus gss_code;
-
-  ret = edg_wll_gss_read_full(&tmp_ctx->connections->serverConnection->gss,
-                             buffer, max_len,
-                             &tmp_ctx->p_tmp_timeout,
-                             &len, &gss_code);
-  if(ret < 0) {
-         switch(ret) {
-
-         case EDG_WLL_GSS_ERROR_GSS:
-                 edg_wll_SetErrorGss(tmp_ctx,"gss_reader",&gss_code);
-                 break;
-
-         case EDG_WLL_GSS_ERROR_TIMEOUT: 
-                 edg_wll_SetError(tmp_ctx, ETIMEDOUT, "gss_reader");
-                 break;
-                 
-         case EDG_WLL_GSS_ERROR_EOF:
-                 edg_wll_SetError(tmp_ctx, ENOTCONN, NULL);
-                 break;
-
-         case EDG_WLL_GSS_ERROR_ERRNO:
-                 edg_wll_SetError(tmp_ctx, errno, "gss_reader");
-                 break;
-
-         default:
-                 edg_wll_SetError(tmp_ctx, EDG_WLL_ERROR_GSS, "gss_reader");
-                 break;
-         }
-  ret = -2; /* -1 is used by read_il_data internals */
-  }
-
-  return(ret);
-}
-
-
-// XXX: for easier merge from RC31_3
-//     after merge, it would be possible to glue
-//     edg_wll_StoreProtoProxy and edg_wll_StoreProtoServer together
-int edg_wll_StoreProto(edg_wll_Context ctx) 
-{
-       if (ctx->isProxy) return(edg_wll_StoreProtoProxy(ctx));
-       else return(edg_wll_StoreProtoServer(ctx));
-}
-
-
-int edg_wll_StoreProtoServer(edg_wll_Context ctx)
-{
-       char    *buf;
-       size_t  len;
-       int     ret;
-       size_t  total;
-       edg_wll_GssStatus       gss_code;
-
-       edg_wll_ResetError(ctx);
-       ret = read_il_data(ctx, &buf, gss_reader);
-       if (ret == -1) 
-         return edg_wll_SetError(ctx,EIO,"interlogger protocol error");
-       if (ret < 0)
-         return edg_wll_Error(ctx,NULL,NULL);
-#ifdef LB_PERF
-       if (sink_mode == GLITE_LB_SINK_PARSE) glite_wll_perftest_consumeEventIlMsg(buf);
-       else
-#endif
-
-       handle_il_message(ctx,buf);
-       free(buf);
-
-       if ((len = create_reply(ctx,&buf)) > 0) {
-               if ((ret = edg_wll_gss_write_full(&ctx->connections->serverConnection->gss,buf,len,&ctx->p_tmp_timeout,&total,&gss_code)) < 0)
-                       edg_wll_SetError(ctx,
-                               ret == EDG_WLL_GSS_ERROR_TIMEOUT ? 
-                                       ETIMEDOUT : EDG_WLL_ERROR_GSS,
-                               "write reply");
-               free(buf);
-       }
-       else edg_wll_SetError(ctx,E2BIG,"create_reply()");
-
-       return edg_wll_Error(ctx,NULL,NULL);
-}
-
-
-static
-int
-gss_plain_reader(void *user_data, char *buffer, int max_len)
-{
-  edg_wll_Context tmp_ctx = (edg_wll_Context)user_data;
-  int ret;
-
-  ret = edg_wll_plain_read_full(&tmp_ctx->connProxy->conn, buffer, max_len,
-                               &tmp_ctx->p_tmp_timeout);
-  if(ret < 0) {
-       edg_wll_SetError(tmp_ctx, errno, "gss_plain_reader");
-       return -2;
-  }
-
-  return(ret);
-}
-
-
-int edg_wll_StoreProtoProxy(edg_wll_Context ctx)
-{
-       char    *buf,
-                       *errd = NULL;
-       int             len, ret,
-                       err = 0;
-
-
-       edg_wll_ResetError(ctx);
-       ret = read_il_data(ctx, &buf, gss_plain_reader);
-       if (ret == -1) 
-         return edg_wll_SetError(ctx,EIO,"interlogger protocol error");
-       if (ret < 0)
-         return edg_wll_Error(ctx,NULL,NULL);
-#ifdef LB_PERF
-       if (sink_mode == GLITE_LB_SINK_PARSE) glite_wll_perftest_consumeEventIlMsg(buf);
-       else
-#endif
-       if ( !(ret = handle_il_message(ctx, buf)) ) {
-               if ( (err = edg_wll_Error(ctx, NULL, &errd)) ) edg_wll_ResetError(ctx);
-       }
-       free(buf);
-
-       
-       if ( (len = create_reply(ctx, &buf)) > 0 ) {
-               if ( edg_wll_plain_write_full(&ctx->connProxy->conn, buf, len, &ctx->p_tmp_timeout) < 0 ) {
-                       if ( errd ) free(errd);
-                       return edg_wll_SetError(ctx, errno, "StoreProtoProxy() - sending reply");
-               }
-               free(buf);
-       }
-       else ret = edg_wll_SetError(ctx, E2BIG, "create_reply()");
-
-       if ( err ) {
-               edg_wll_SetError(ctx, err, errd);
-               free(errd);
-       }
-       return ret? edg_wll_Error(ctx, NULL, NULL): 0;
-}
diff --git a/org.glite.lb.server/src/userjobs.c b/org.glite.lb.server/src/userjobs.c
deleted file mode 100644 (file)
index fe91812..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-#ident "$Header$"
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#include "glite/jobid/cjobid.h"
-#include "glite/jobid/strmd5.h"
-#include "glite/lbu/trio.h"
-#include "glite/lb/context-int.h"
-
-#include "jobstat.h"
-#include "db_supp.h"
-#include "query.h"
-#include "lb_proto.h"
-
-int edg_wll_UserJobsServer(
-       edg_wll_Context ctx,
-       edg_wlc_JobId   **jobs,
-       edg_wll_JobStat **states)
-{
-       char    *userid, *stmt = NULL,
-               *res = NULL;
-       char    *can_peername;
-       int     njobs = 0,ret,i,idx;
-       edg_wlc_JobId   *out = NULL;
-       glite_lbu_Statement     sth = NULL;
-       edg_wll_ErrorCode       err = 0;
-
-       edg_wll_ResetError(ctx);
-       
-       if (!ctx->peerName) {
-               return edg_wll_SetError(ctx,EPERM, "user not authenticated (edg_wll_UserJobs)");
-       }
-       can_peername = edg_wll_gss_normalize_subj(ctx->peerName, 0);
-       userid = strmd5(can_peername,NULL);
-       free(can_peername);
-
-       trio_asprintf(&stmt,"select cert_subj from users where userid = '%|Ss'",userid);
-
-       switch (edg_wll_ExecSQL(ctx,stmt,&sth)) {
-               case 0: edg_wll_SetError(ctx,ENOENT,ctx->peerName);
-               case -1: goto err;
-               default:
-                       if (edg_wll_FetchRow(ctx,sth,1,NULL,&res) < 0) goto err;
-                       if (!edg_wll_gss_equal_subj(ctx->peerName,res)) {
-                               edg_wll_SetError(ctx,EDG_WLL_ERROR_MD5_CLASH,ctx->peerName);
-                               goto err;
-                       }
-       }
-
-       glite_lbu_FreeStmt(&sth);
-       free(stmt); stmt = NULL;
-       free(res); res = NULL;
-
-       trio_asprintf(&stmt,"select dg_jobid from jobs where userid = '%|Ss' and grey='0'",userid);
-       switch (njobs = edg_wll_ExecSQL(ctx,stmt,&sth)) {
-               case 0: edg_wll_SetError(ctx,ENOENT,ctx->peerName);
-               case -1: goto err;
-       }
-
-       out = malloc(sizeof(*out)*(njobs+1));
-       memset(out,0,sizeof(*out)*(njobs+1));
-       
-       for (i=0; (ret = edg_wll_FetchRow(ctx,sth,1,NULL,&res)); i++) {
-               if (ret < 0) goto err;
-               if ((ret = edg_wlc_JobIdParse(res,out+i))) {
-                       edg_wll_SetError(ctx,errno,res);
-                       goto err;
-               }
-               free(res); res = NULL;
-       }
-
-       if (states) {
-               edg_wll_QueryRec        oc[2],*ocp[2] = { oc, NULL };
-
-               oc[0].attr = EDG_WLL_QUERY_ATTR_OWNER;
-               oc[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-
-               if (check_job_query_index(ctx,ocp)) {
-                       edg_wll_ResetError(ctx);
-                       *states = NULL;
-                       goto err;
-               }
-
-               *states = calloc(njobs+1, sizeof(**states));
-               idx = 0;
-               for (i = 0; i < njobs; i++) {
-                       if (edg_wll_JobStatusServer(ctx, out[idx], -1, &(*states)[idx]) != 0)
-                               edg_wll_ResetError(ctx);
-                       idx++;
-               }
-       }
-err:
-       free(res);
-       free(stmt);
-       glite_lbu_FreeStmt(&sth);
-       if ((err = edg_wll_Error(ctx,NULL,NULL))) {
-               if (out) {
-                   for (i=0; i<njobs; i++)
-                       edg_wlc_JobIdFree(out[i]);
-                   free(out);
-               }
-       } else *jobs = out;
-
-       return err;
-}
diff --git a/org.glite.lb.server/src/write2rgma.c b/org.glite.lb.server/src/write2rgma.c
deleted file mode 100755 (executable)
index fe9075a..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-#ident "$Header$"
-
-#include <assert.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/file.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/un.h>
-#include <sys/uio.h>
-#include <errno.h>
-
-
-#include <cclassad.h>
-
-#include "glite/lbu/trio.h"
-#include "glite/lb/context-int.h"
-#include "glite/lb/jobstat.h"
-
-#include "get_events.h"
-#include "store.h"
-#include "index.h"
-#include "jobstat.h"
-
-static int     rgma_fd = -1;
-
-static void write2rgma_line(char *line, int old_style)
-{
-       
-       int slen;
-       int sysret;
-       struct iovec iov[2];
-
-       static int      rgma_sock = -1;
-       static char    *rgma_fname = NULL;
-       static struct sockaddr_un rgma_saddr;
-
-       static int      rgma_fd_locked = 0;
-        struct stat    stat_buf,stat_fbuf;
-        struct flock   filelock;
-        int            filelock_status;
-
-       assert(line != NULL);
-
-       if (rgma_fd < -1) return;
-       if (rgma_fd == -1) {
-               rgma_fname = getenv("GLITE_WMS_LCGMON_FILE");
-               if (rgma_fname == NULL) {
-                       rgma_fname = getenv("EDG_WL_RGMA_FILE");
-                       if (rgma_fname == NULL) {
-                               rgma_fd = -2; 
-                               return;
-                       }
-               }
-
-               rgma_fd = open(rgma_fname, O_WRONLY|O_CREAT|O_APPEND, 0777);
-               if (rgma_fd == -1) return;
-       }
-
-
-       slen = strlen(line);
-       if (old_style) {
-               iov[0].iov_base = &slen;
-               iov[0].iov_len = sizeof(slen);
-               iov[1].iov_base = line;
-               iov[1].iov_len = slen + 1;
-       } else {
-               iov[0].iov_base = line;
-               iov[0].iov_len = slen;
-       }
-       
-       if (old_style) {
-
-               if ((sysret = flock(rgma_fd, LOCK_SH)) != -1) {
-                       sysret = writev(rgma_fd, iov, 2);
-                       flock(rgma_fd, LOCK_UN);
-               }
-               if (sysret == -1) return;
-       } else {
-               if (!rgma_fd_locked) {
-                   do {
-                     filelock.l_type = F_WRLCK;
-                     filelock.l_whence = SEEK_SET;
-                     filelock.l_start = 0;
-                     filelock.l_len = 0;
-                   } while((filelock_status = fcntl(rgma_fd,F_SETLKW,&filelock))<0 && errno==EINTR);
-                   if (filelock_status<0) goto leave;
-               }
-               rgma_fd_locked = 1;
-               if (fstat(rgma_fd, &stat_fbuf)<0 || stat(rgma_fname, &stat_buf)<0)
-                       goto leave;
-               if (stat_fbuf.st_dev != stat_buf.st_dev || stat_fbuf.st_ino != stat_buf.st_ino)
-                       goto leave;
-                if (writev(rgma_fd, iov, 1) < 0) 
-                       goto leave;
-               fsync(rgma_fd);
-               do {
-                       filelock.l_type = F_UNLCK;
-                       filelock.l_whence = SEEK_SET;
-                       filelock.l_start = 0;
-                       filelock.l_len = 0;
-               } while((filelock_status = fcntl(rgma_fd,F_SETLKW,&filelock))<0 && errno==EINTR);
-               if (filelock_status < 0) goto leave;
-               rgma_fd_locked = 0;
-       leave:  
-               /* add explicit unlock, incase the later close should fail for some reason */
-               if (rgma_fd_locked) {
-                               do {
-                               filelock.l_type = F_UNLCK;
-                               filelock.l_whence = SEEK_SET;
-                               filelock.l_start = 0;
-                               filelock.l_len = 0;
-                       } while((filelock_status = fcntl(rgma_fd,F_SETLKW,&filelock))<0 && errno==EINTR);
-                       if (filelock_status == 0) {
-                               rgma_fd_locked = 0;
-                       }
-               }
-               /* close the statefile */
-               if (close(rgma_fd)==0) {
-                       rgma_fd = -1;
-                       rgma_fd_locked = 0;
-               }
-
-       }
-
-       if (rgma_sock < -1) return;
-
-       if (rgma_sock == -1) {
-               rgma_fname = getenv("EDG_WL_RGMA_SOCK");
-               if (rgma_fname == NULL 
-                   || (strlen(rgma_fname) + 1) > sizeof(rgma_saddr.sun_path) ) {
-                       rgma_sock = -2;
-                       return;
-               }
-
-               rgma_sock = socket(PF_UNIX, SOCK_DGRAM,0);
-               if (rgma_sock == -1) return;
-               
-               memset(&rgma_saddr, sizeof(rgma_saddr), 0);
-               rgma_saddr.sun_family = PF_UNIX;
-               strcpy(rgma_saddr.sun_path, rgma_fname);
-       }
-
-       sendto(rgma_sock, &slen, 1, MSG_DONTWAIT,
-               (struct sockaddr*) &rgma_saddr, SUN_LEN(&rgma_saddr));
-
-       return;
-}
-
-static char* format_strlist(char **list, char sep)
-{
-       char *a, *b;
-       int i;
-       
-       if (list && list[0]) {
-               a = strdup(list[0]);
-               for (i = 1; list[i]; i++) {
-                       b = NULL;
-                       trio_asprintf(&b,"%s%c%s",a,sep,list[i]);
-                       free(a);
-                       if (!b) { return strdup(""); }
-                       a = b;
-               }
-               return a;
-       } else {
-               return strdup("");
-       }
-}
-
-char* write2rgma_statline(intJobStat *intstat)
-{
-       edg_wll_JobStat *stat = &intstat->pub;
-       char *stmt = NULL;
-       char *string_jobid, *string_stat, *string_server;
-       char *string_vo = NULL;
-       char *string_fqans = NULL;
-
-       string_jobid = edg_wlc_JobIdUnparse(stat->jobId);
-       string_stat = edg_wll_StatToString(stat->state);
-       string_server = edg_wlc_JobIdGetServer(stat->jobId);
-       string_fqans = format_strlist(intstat->pub.user_fqans, '|');
-
-       if (stat->jdl != NULL) {
-               struct cclassad *ad;
-       
-               ad = cclassad_create(stat->jdl);
-               if (ad) {
-                       if (!cclassad_evaluate_to_string(ad, "VirtualOrganisation", &string_vo))
-                               string_vo = NULL;
-                       cclassad_delete(ad);
-               } 
-       }
-
-       trio_asprintf(&stmt,
-               "JOBID=%|Ss "
-               "OWNER=%|Ss "
-               "BKSERVER=%|Ss "
-               "NETWORKSERVER=%|Ss "
-               "VO=%|Ss "
-               "LASTUPDATETIME=%d "
-               "STATENAME=%s "
-               "STATEENTERTIME=%d "
-               "CONDORID=%|Ss "
-               "DESTINATION=%|Ss "
-               "EXITCODE=%d "
-               "DONECODE=%d "
-               "UIHOST=%s "
-               "VOMS=%s "
-               "STATUSREASON=%|Ss"
-               "\n",
-               string_jobid,
-               stat->owner,
-               string_server,
-               (stat->network_server) ? (stat->network_server) : "",
-               (string_vo) ? string_vo : "",
-               stat->lastUpdateTime.tv_sec,
-               string_stat,
-               stat->stateEnterTime.tv_sec,
-               (stat->condorId) ? (stat->condorId) : "",
-               (stat->destination) ? (stat->destination) : "",
-               stat->exit_code,
-               stat->done_code,
-               (stat->ui_host) ? (stat->ui_host) : "",
-               string_fqans ? string_fqans : "",
-               (stat->reason) ? (stat->reason) : ""
-       );
-                               
-       free(string_vo);
-       free(string_jobid);
-       free(string_stat);
-       free(string_server);
-       free(string_fqans);
-       
-       return stmt;
-}
-
-void write2rgma_status(intJobStat *intstat)
-{
-       char *line;
-       int lcgmon = 0;
-       
-       if (rgma_fd < -1) return;
-
-       line = write2rgma_statline(intstat);
-       if (line) {
-               if (getenv("GLITE_WMS_LCGMON_FILE")) lcgmon = 1;
-               write2rgma_line(line, !lcgmon);
-       }
-       free(line);
-}
-
-/* Export status record only if new status line is different from
-   previous one. free() prev_statline parameter. */
-
-void write2rgma_chgstatus(intJobStat *intstat, char *prev_statline)
-{
-       char *line;
-       int lcgmon = 0;
-       
-       if (rgma_fd < -1) return;
-
-       line = write2rgma_statline(intstat);
-       if (line && (!prev_statline || strcmp(line, prev_statline))) {
-               if (getenv("GLITE_WMS_LCGMON_FILE")) lcgmon = 1;
-               write2rgma_line(line, !lcgmon);
-       }
-       free(line);
-       free(prev_statline);
-}
-
-#ifdef TEST
-int main(int argc, char* argv[])
-{
-       setenv("EDG_WL_RGMA_FILE", "/tmp/rgma_statefile", 1);
-       setenv("EDG_WL_RGMA_SOCK", "/tmp/rgma_statesock", 1);
-       write2rgma_line("123---789\n", 0);
-       return 0;
-}
-#endif
diff --git a/org.glite.lb.server/src/ws_fault.c b/org.glite.lb.server/src/ws_fault.c
deleted file mode 100644 (file)
index 72107ac..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-#include <string.h>
-
-#include "glite/lb/context-int.h"
-#include "soap_version.h"
-#include "glite/security/glite_gscompat.h"
-
-#include "bk_ws_H.h"
-#include "bk_ws_Stub.h"
-
-
-#if GSOAP_VERSION >= 20709
-  #define GFNUM SOAP_TYPE_lbt__genericFault
-#else
-  #define GFNUM SOAP_TYPE__genericFault
-#endif
-
-
-void edg_wll_ErrToFault(const edg_wll_Context ctx,struct soap *soap)
-{
-       char    *et,*ed;
-       struct SOAP_ENV__Detail *detail;
-#if GSOAP_VERSION >= 20709
-       struct lbt__genericFault *f = soap_malloc(soap,sizeof *f);
-       struct lbt__genericFault *item = f;
-#else
-       struct _genericFault *f = soap_malloc(soap,sizeof *f);
-       struct lbt__genericFault *item = f->lbe__genericFault = soap_malloc(soap, sizeof *item);
-#endif
-
-       memset(item, 0, sizeof(*item));
-
-       item->code = edg_wll_Error(ctx,&et,&ed);
-       item->text = soap_malloc(soap,strlen(et)+1);
-       strcpy(item->text, et); 
-       free(et);
-       if (ed) {
-               item->description = soap_malloc(soap,strlen(ed)+1);
-               strcpy(item->description,ed); 
-               free(ed);
-       }
-
-/* FIXME: assignment from incompatible pointer type */
-       detail = soap_faultdetail(soap);
-       detail->__type = GFNUM;
-#if GSOAP_VERSION >= 20700
-       detail->fault = f;
-#else
-       detail->value = f;
-#endif
-       detail->__any = NULL;
-
-       soap_receiver_fault(soap,"An error occurred, see detail",NULL);
-       if (soap->version == 2) soap->fault->SOAP_ENV__Detail = detail;
-       else soap->fault->detail = detail;
-}
-
-
-void edg_wll_FaultToErr(const struct soap *soap,edg_wll_Context ctx)
-{
-       struct SOAP_ENV__Detail *detail;
-       struct lbt__genericFault        *f;
-
-       if (!soap->fault) {
-               edg_wll_SetError(ctx,EINVAL,"SOAP: (no error info)");
-               return;
-       }
-
-       detail = soap->version == 2 ? soap->fault->SOAP_ENV__Detail : soap->fault->detail;
-       if (detail->__type == GFNUM) {
-#if GSOAP_VERSION >= 20709
-               f = (struct lbt__genericFault *)detail->fault;
-#elif GSOAP_VERSION >= 20700
-               f = ((struct _genericFault *) detail->fault)
-                       ->lbe__genericFault;
-#else
-               f = ((struct _genericFault *) detail->value)
-                       ->lbe__genericFault;
-#endif
-               if (f) edg_wll_SetError(ctx,f->code,f->description);
-               else edg_wll_SetError(ctx, EIO, "no or not parsable error from SOAP");
-       }
-       else {
-               char    *s;
-
-               if (detail->__any) asprintf(&s, "SOAP: %s", detail->__any);
-               else asprintf(&s,"SOAP: %s", soap->version == 2 ?
-                       GLITE_SECURITY_GSOAP_REASON(soap) : soap->fault->faultstring);
-               edg_wll_SetError(ctx,EINVAL,s);
-               free(s);
-       }
-}
diff --git a/org.glite.lb.server/src/ws_fault.h b/org.glite.lb.server/src/ws_fault.h
deleted file mode 100644 (file)
index e6988e8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef GLITE_LB_WS_FAULT_H
-#define GLITE_LB_WS_FAULT_H
-
-#ident "$Header$"
-
-#include "glite/lb/context.h"
-
-extern void edg_wll_ErrToFault(const edg_wll_Context, struct soap *);
-extern void edg_wll_FaultToErr(const struct soap *, edg_wll_Context);
-
-#endif /* GLITE_LB_WS_FAULT_H */
diff --git a/org.glite.lb.server/src/ws_query.c b/org.glite.lb.server/src/ws_query.c
deleted file mode 100644 (file)
index cc8812b..0000000
+++ /dev/null
@@ -1,449 +0,0 @@
-#include <stdsoap2.h>
-#include <expat.h>
-
-#include "glite/lb/context-int.h"
-#include "glite/lb/xml_parse.h"
-#include "glite/lb/xml_conversions.h"
-
-
-#include "soap_version.h"
-#include "glite/security/glite_gsplugin.h"
-#include "glite/security/glite_gscompat.h"
-
-#include "jobstat.h"
-#include "query.h"
-#include "bk_ws_H.h"
-#include "get_events.h"
-#include "ws_fault.h"
-#include "ws_typeref.h"
-#include "lb_proto.h"
-
-#if GSOAP_VERSION <= 20602
-#define __lb__GetVersion __ns1__GetVersion
-#define __lb__JobStatus __ns1__JobStatus
-#define __lb__UserJobs __ns1__UserJobs
-#define __lb__QueryJobs __ns1__QueryJobs
-#define __lb__QueryEvents __ns1__QueryEvents
-#endif
-
-extern int debug;
-#define dprintf(x) if (debug) printf x
-
-static void freeQueryRecsExt(edg_wll_QueryRec **qr);
-static void freeJobIds(edg_wlc_JobId *jobs);
-static void freeJobStats(edg_wll_JobStat *stats);
-static void freeEvents(edg_wll_Event *events);
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__GetVersion(
-       struct soap* soap,
-       struct _lbe__GetVersion *in,
-       struct _lbe__GetVersionResponse *out)
-{
-       dprintf(("[%d] WS call %s\n",getpid(),__FUNCTION__));
-
-       out->version = soap_strdup(soap, VERSION);
-
-       return out->version ? SOAP_OK : SOAP_FAULT;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__JobStatus(
-       struct soap     *soap,
-       struct _lbe__JobStatus *in,
-       struct _lbe__JobStatusResponse *out)
-{
-       edg_wll_Context         ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-       edg_wlc_JobId           j;
-       edg_wll_JobStat         s;
-       int     flags;
-
-
-       dprintf(("[%d] WS call %s\n",getpid(),__FUNCTION__));
-
-       if ( edg_wlc_JobIdParse(in->jobid, &j) )
-       {
-               edg_wll_SetError(ctx, EINVAL, in->jobid);
-               edg_wll_ErrToFault(ctx, soap);
-               return SOAP_FAULT;
-       }
-
-       edg_wll_SoapToJobStatFlags(in->flags, &flags);
-       
-       if (debug) {
-               char *cjobid = NULL, *cflags = NULL;
-
-               cjobid = edg_wlc_JobIdUnparse(j);
-               cflags = edg_wll_stat_flags_to_string(flags);
-               dprintf(("[%d] \n\t<flags>%s</flags>\n\t<jobId>%s</jobId>\n\n",getpid(),cflags,cjobid));
-               free(cjobid);
-               free(cflags);
-       }
-
-       if ( edg_wll_JobStatusServer(ctx, j, flags, &s) )
-       {
-               edg_wll_ErrToFault(ctx, soap);
-               return SOAP_FAULT;
-       }
-
-       out->stat = soap_malloc(soap, sizeof(*out->stat));
-       edg_wll_StatusToSoap(soap, &s, out->stat);
-
-       return SOAP_OK;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__QueryJobs(
-       struct soap *soap,
-       struct _lbe__QueryJobs *in,
-       struct _lbe__QueryJobsResponse *out)
-{
-       edg_wll_Context    ctx;
-       edg_wll_QueryRec **conditions;
-       int                flags;
-       edg_wlc_JobId     *jobs;
-       edg_wll_JobStat   *states;
-       int                ret = SOAP_FAULT;
-
-
-       dprintf(("[%d] WS call %s\n",getpid(),__FUNCTION__));
-
-       out->states = soap_malloc(soap, sizeof(*out->states));
-       out->jobs = soap_malloc(soap, sizeof(*out->jobs));
-       if ( !out->states || !out->jobs ) goto cleanup;
-
-       ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-       jobs = NULL;
-       states = NULL;
-
-       edg_wll_ResetError(ctx);
-       if ( edg_wll_SoapToQueryCondsExt(in->conditions, in->__sizeconditions, &conditions) ) {
-               edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures");
-               goto err;
-       }
-       edg_wll_SoapToJobStatFlags(in->flags, &flags);
-
-       if (debug) {
-               char *message = NULL;
-
-               if (edg_wll_QueryJobsRequestToXML(ctx, 
-                               (const edg_wll_QueryRec **) conditions, 
-                               flags, &message)) {
-                       dprintf(("[%d] %s\n",getpid(),"edg_wll_QueryJobsRequestToXML() returned error"));
-               }
-               else {
-                       dprintf(("[%d] \n%s\n\n",getpid(),message));
-               }
-               free(message);
-       }
-
-       if (edg_wll_QueryJobsServer(ctx, (const edg_wll_QueryRec **)conditions, flags, &jobs, &states) != 0) goto err;
-
-       if (edg_wll_JobsQueryResToSoap(soap, jobs, states, out) != SOAP_OK) goto err;
-       ret = SOAP_OK;
-
-err:
-       if ( ret == SOAP_FAULT ) edg_wll_ErrToFault(ctx, soap);
-cleanup:
-       freeQueryRecsExt(conditions);
-       freeJobIds(jobs);
-       freeJobStats(states);
-
-       return ret;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__UserJobs(
-       struct soap *soap,
-       struct _lbe__UserJobs *in,
-       struct _lbe__UserJobsResponse *out)
-{
-       edg_wll_Context ctx;
-       edg_wlc_JobId   *jobs;
-       edg_wll_JobStat *states;
-
-
-       dprintf(("[%d] WS call %s\n",getpid(),__FUNCTION__));
-
-       ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-       memset(out, 0, sizeof *out);
-       if (edg_wll_UserJobsServer(ctx, &jobs, &states) != 0) goto fault;
-       if (edg_wll_UserJobsResToSoap(soap, jobs, states, out) != SOAP_OK) {
-               edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures");
-               goto freefault;
-       }
-       freeJobIds(jobs);
-       freeJobStats(states);
-       return SOAP_OK;
-freefault:
-       freeJobIds(jobs);
-       freeJobStats(states);
-fault:
-       edg_wll_ErrToFault(ctx, soap);
-       return SOAP_FAULT;
-}
-
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__QueryEvents(
-       struct soap *soap,
-       struct _lbe__QueryEvents *in,
-       struct _lbe__QueryEventsResponse *out)
-{
-       edg_wll_Context         ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-       edg_wll_QueryRec        **job_conditions;
-       edg_wll_QueryRec        **event_conditions;
-       edg_wll_Event           *events = NULL;
-       int                     ret = SOAP_OK;
-
-
-       dprintf(("[%d] WS call %s\n",getpid(),__FUNCTION__));
-
-       edg_wll_ResetError(ctx);
-       if ( edg_wll_SoapToQueryCondsExt(in->jobConditions, in->__sizejobConditions, 
-               &job_conditions) )
-       {
-               edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures");
-               edg_wll_ErrToFault(ctx, soap);
-               ret = SOAP_FAULT;
-               goto cleanup;
-       }
-
-       if ( edg_wll_SoapToQueryCondsExt(in->eventConditions, in->__sizeeventConditions, 
-               &event_conditions) )
-       {
-               edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures");
-               edg_wll_ErrToFault(ctx, soap);
-               ret = SOAP_FAULT;
-               goto cleanup;
-       }
-
-       if (debug) {
-               char *message = NULL;
-
-               if (edg_wll_QueryEventsRequestToXML(ctx, 
-                               (const edg_wll_QueryRec **) job_conditions, 
-                               (const edg_wll_QueryRec **) event_conditions,
-                               &message)) {
-                       dprintf(("[%d] %s\n",getpid(),"edg_wll_QueryEventsRequestToXML() returned error"));
-               }
-               else {
-                       dprintf(("[%d] \n%s\n\n",getpid(),message));
-               }
-               free(message);
-       }
-
-       if (edg_wll_QueryEventsServer(ctx, ctx->noAuth, 
-               (const edg_wll_QueryRec **)job_conditions,
-               (const edg_wll_QueryRec **)event_conditions,
-               &events))
-       {
-               edg_wll_ErrToFault(ctx, soap);
-               ret = SOAP_FAULT;
-               goto cleanup;
-       }
-
-       if (edg_wll_EventsQueryResToSoap(soap, events, out) != SOAP_OK) 
-       {
-               ret = SOAP_FAULT;
-               goto cleanup;
-       }
-
-cleanup:
-       freeQueryRecsExt(job_conditions);
-       freeQueryRecsExt(event_conditions);
-       freeEvents(events);
-
-       return ret;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__GetServerLimit(
-       struct soap *soap,
-       struct _lbe__GetServerLimit     *in,
-       struct _lbe__GetServerLimitResponse     *out
-)
-{
-       edg_wll_Context         ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-
-       out->limit = ctx->hardJobsLimit;
-       return SOAP_OK;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__GetIndexedAttrs(
-       struct soap *soap,
-       struct _lbe__GetIndexedAttrs    *in,
-       struct _lbe__GetIndexedAttrsResponse    *out
-)
-{
-       edg_wll_Context         ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-
-       if (ctx->job_index)
-               return edg_wll_QueryCondsExtToSoap(soap,
-                       (const edg_wll_QueryRec **) ctx->job_index,
-                       &out->__sizeattrs,&out->attrs);
-       else {
-               edg_wll_SetError(ctx,ENOENT,"no indexed attributes");
-               edg_wll_ErrToFault(ctx, soap);
-               return SOAP_FAULT;
-       }
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__NotifNew(
-       struct soap *soap,
-       struct _lbe__NotifNew *in,
-       struct _lbe__NotifNewResponse *out
-) {
-       edg_wll_Context         ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-       edg_wll_QueryRec        **conditions = NULL;
-       int                     flags;
-       edg_wll_NotifId         nid = NULL;
-       int                     ret = SOAP_OK;
-
-       dprintf(("[%d] WS call %s\n",getpid(),__FUNCTION__));
-
-       edg_wll_ResetError(ctx);
-       if ( edg_wll_SoapToQueryCondsExt(in->conditions, in->__sizeconditions, &conditions) )
-       {
-               edg_wll_SetError(ctx, ENOMEM, "Couldn't create internal structures");
-               edg_wll_ErrToFault(ctx, soap);
-               ret = SOAP_FAULT;
-               goto cleanup;
-       }
-       edg_wll_SoapToJobStatFlags(in->flags, &flags);
-
-       if (edg_wll_NotifIdParse(in->notifId,&nid)) {
-               edg_wll_SetError(ctx,EINVAL,"Parse notifid");
-               edg_wll_ErrToFault(ctx, soap);
-               ret = SOAP_FAULT;
-               goto cleanup;
-       }
-
-       out->valid = in->valid ? *in->valid : 0;
-       if (edg_wll_NotifNewServer(ctx,conditions,flags,in->destination,nid,&out->valid)) {
-               edg_wll_ErrToFault(ctx, soap);
-               ret = SOAP_FAULT;
-               goto cleanup;
-       }
-
-
-cleanup:
-       edg_wll_NotifIdFree(nid);
-       freeQueryRecsExt(conditions);
-       return ret;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__NotifBind(
-       struct soap *soap,
-       struct _lbe__NotifBind *in,
-       struct _lbe__NotifBindResponse *out
-) {
-       edg_wll_Context         ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-       edg_wll_NotifId         nid = NULL;
-
-       if (edg_wll_NotifIdParse(in->notifId,&nid)) {
-               edg_wll_SetError(ctx,EINVAL,"Parse notifid");
-               edg_wll_ErrToFault(ctx, soap);
-               return SOAP_FAULT;
-       }
-       out->valid = in->valid ? *in->valid : 0;
-
-       if (edg_wll_NotifBindServer(ctx,nid,in->destination,&out->valid)) {
-               edg_wll_ErrToFault(ctx, soap);
-               edg_wll_NotifIdFree(nid);
-               return SOAP_FAULT;
-       }
-       return SOAP_OK;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__NotifRefresh(
-       struct soap *soap,
-       struct _lbe__NotifRefresh *in,
-       struct _lbe__NotifRefreshResponse *out
-) {
-       edg_wll_Context         ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-       edg_wll_NotifId         nid = NULL;
-
-       if (edg_wll_NotifIdParse(in->notifId,&nid)) {
-               edg_wll_SetError(ctx,EINVAL,"Parse notifid");
-               edg_wll_ErrToFault(ctx, soap);
-               return SOAP_FAULT;
-       }
-       out->valid = in->valid ? *in->valid : 0;
-
-       if (edg_wll_NotifRefreshServer(ctx,nid,&out->valid)) {
-               edg_wll_ErrToFault(ctx, soap);
-               edg_wll_NotifIdFree(nid);
-               return SOAP_FAULT;
-       }
-       return SOAP_OK;
-}
-
-SOAP_FMAC5 int SOAP_FMAC6 __lb__NotifDrop(
-       struct soap *soap,
-       struct _lbe__NotifDrop *in,
-       struct _lbe__NotifDropResponse *out
-) {
-       edg_wll_Context         ctx = (edg_wll_Context) glite_gsplugin_get_udata(soap);
-       edg_wll_NotifId         nid = NULL;
-
-       if (edg_wll_NotifIdParse(in->notifId,&nid)) {
-               edg_wll_SetError(ctx,EINVAL,"Parse notifid");
-               edg_wll_ErrToFault(ctx, soap);
-               return SOAP_FAULT;
-       }
-
-       if (edg_wll_NotifDropServer(ctx,nid)) {
-               edg_wll_ErrToFault(ctx, soap);
-               edg_wll_NotifIdFree(nid);
-               return SOAP_FAULT;
-       }
-       return SOAP_OK;
-}
-
-static void freeQueryRecsExt(edg_wll_QueryRec **qr) {
-       int i, j;
-
-       if ( qr ) {
-               for ( i = 0; qr[i]; i++ ) {
-                       if (qr[i]) {
-                               for ( j = 0; qr[i][j].attr; j++ ) edg_wll_QueryRecFree(&qr[i][j]);
-                               free(qr[i]);
-                       }
-               }
-               free(qr);
-       }
-}
-
-
-static void freeJobIds(edg_wlc_JobId *jobs) {
-       int i;
-
-       if ( jobs ) {
-               for ( i = 0; jobs[i]; i++ )
-                       edg_wlc_JobIdFree(jobs[i]);
-               free(jobs);
-       }
-}
-
-
-static void freeJobStats(edg_wll_JobStat *stats) {
-       int i;
-
-       if ( stats ) {
-               for ( i = 0; stats[i].state; i++ )
-                       edg_wll_FreeStatus(&stats[i]);
-               free(stats);
-       }
-}
-
-
-static void freeEvents(edg_wll_Event *events)
-{
-       int i;
-
-       if (events != NULL) {
-               for (i=0; events[i].type != EDG_WLL_EVENT_UNDEF; i++)
-                       edg_wll_FreeEvent(&(events[i]));
-               edg_wll_FreeEvent(&(events[i])); /* free last line */
-               free(events);
-       }
-}
diff --git a/org.glite.lb.server/src/ws_typemap.dat b/org.glite.lb.server/src/ws_typemap.dat
deleted file mode 100644 (file)
index 0c3e085..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-lb = http://glite.org/wsdl/services/lb
-lbt = http://glite.org/wsdl/types/lb
-lbe = http://glite.org/wsdl/elements/lb
diff --git a/org.glite.lb.server/src/ws_typemap.h b/org.glite.lb.server/src/ws_typemap.h
deleted file mode 100644 (file)
index 44d9c39..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef GLITE_LB_WS_TYPEMAP_H
-#define GLITE_LB_WS_TYPEMAP_H
-
-#ident "$Header"
-
-#if GSOAP_VERSION >= 20700
-
-#define JOBID          lbt__queryAttr__JOBID
-#define OWNER          lbt__queryAttr__OWNER
-#define STATUS         lbt__queryAttr__STATUS
-#define LOCATION       lbt__queryAttr__LOCATION
-#define DESTINATION    lbt__queryAttr__DESTINATION
-#define DONECODE       lbt__queryAttr__DONECODE
-#define USERTAG                lbt__queryAttr__USERTAG
-#define TIME           lbt__queryAttr__TIME
-#define LEVEL          lbt__queryAttr__LEVEL
-#define HOST           lbt__queryAttr__HOST
-#define SOURCE         lbt__queryAttr__SOURCE
-#define INSTANCE       lbt__queryAttr__INSTANCE
-#define EVENTTYPE      lbt__queryAttr__EVENTTYPE
-#define CHKPTTAG       lbt__queryAttr__CHKPTTAG
-#define RESUBMITTED    lbt__queryAttr__RESUBMITTED
-#define PARENT         lbt__queryAttr__PARENT
-#define EXITCODE       lbt__queryAttr__EXITCODE
-#define JDLATTR                lbt__queryAttr__JDLATTR
-#define STATEENTERTIME lbt__queryAttr__STATEENTERTIME
-#define LASTUPDATETIME lbt__queryAttr__LASTUPDATETIME
-#define NETWORKSERVER  lbt__queryAttr__NETWORKSERVER
-
-#define EQUAL          lbt__queryOp__EQUAL
-#define UNEQUAL                lbt__queryOp__UNEQUAL
-#define LESS           lbt__queryOp__LESS
-#define GREATER                lbt__queryOp__GREATER
-#define WITHIN         lbt__queryOp__WITHIN
-#define CHANGED                lbt__queryOp__CHANGED
-
-#define SUBMITTED      lbt__statName__SUBMITTED
-#define WAITING                lbt__statName__WAITING
-#define READY          lbt__statName__READY
-#define SCHEDULED      lbt__statName__SCHEDULED
-#define RUNNING                lbt__statName__RUNNING
-#define DONE           lbt__statName__DONE
-#define CLEARED                lbt__statName__CLEARED
-#define ABORTED                lbt__statName__ABORTED
-#define CANCELLED      lbt__statName__CANCELLED
-#define UNKNOWN                lbt__statName__UNKNOWN
-#define PURGED         lbt__statName__PURGED
-
-#define SIMPLE         lbt__jobtype__SIMPLE
-#define DAG            lbt__jobtype__DAG
-
-#define OK             lbt__doneCode__OK
-#define FAILED         lbt__doneCode__FAILED
-#define CANCELLED_     lbt__doneCode__CANCELLED
-
-#define CLASSADS       lbt__jobFlagsValue__CLASSADS
-#define CHILDREN       lbt__jobFlagsValue__CHILDREN
-#define CHILDSTAT      lbt__jobFlagsValue__CHILDSTAT
-#define CHILDHIST_FAST lbt__jobFlagsValue__CHILDHIST_USCOREFAST
-#define CHILDHIST_THOROUGH lbt__jobFlagsValue__CHILDHIST_USCORETHOROUGH
-
-#define UserInterface  lbt__eventSource__UserInterface
-#define NetworkServer  lbt__eventSource__NetworkServer
-#define WorkloadManager        lbt__eventSource__WorkloadManager
-#define BigHelper      lbt__eventSource__BigHelper
-#define JobSubmission  lbt__eventSource__JobSubmission
-#define LogMonitor     lbt__eventSource__LogMonitor
-#define LRMS           lbt__eventSource__LRMS
-#define Application    lbt__eventSource__Application
-#define LBServer       lbt__eventSource__LBServer
-
-#endif
-
-#endif /* GLITE_LB_WS_TYPEMAP_H */
diff --git a/org.glite.lb.server/src/ws_typeref.c.T b/org.glite.lb.server/src/ws_typeref.c.T
deleted file mode 100644 (file)
index b07cbb5..0000000
+++ /dev/null
@@ -1,1198 +0,0 @@
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdsoap2.h>
-
-#include "soap_version.h"
-#include "bk_ws_H.h"
-#include "ws_typemap.h"
-
-#include "glite/lb/events.h"
-#include "glite/lb/query_rec.h"
-/* XXX: references only, src and dest share pointers */
-
-#include "glite/security/glite_gscompat.h"
-
-#define VALUEEV_GET(X, V) GLITE_SECURITY_GSOAP_CHOICE_GET((X), V, event, 1)
-#define VALUEEV_SET(X, V, VALUE) GLITE_SECURITY_GSOAP_CHOICE_SET((X), V, lbt, event, 1, VALUE)
-#define VALUEEV_ISTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_ISTYPE((X), V, lbt, event, 1)
-#define VALUEQR_GET(X, V) GLITE_SECURITY_GSOAP_CHOICE_GET((X), V, queryRecValue, 2)
-#define VALUEQR_SETTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_SETTYPE((X), V, lbt, queryRecValue, 2)
-#define VALUEQR_SET(X, V, VALUE) GLITE_SECURITY_GSOAP_CHOICE_SET((X), V, lbt, queryRecValue, 2, VALUE)
-#define VALUEQR_ISTYPE(X, V) GLITE_SECURITY_GSOAP_CHOICE_ISTYPE((X), V, lbt, queryRecValue, 2)
-
-@@@{
-#
-# generate the command for move native data to soap web services structures
-#
-# if the field is optional, is ALWAYS assigned!
-#
-sub eventFieldAssign {
-       my ($indent, $src, $dst, $e, $f, $is_common) = @_;
-       my ($tn, $soap_en, $soap_fn, $native_en, $native_fn, $func_name, $source, $dest);
-
-       $tn = $f->{type};
-       $native_en = lcfirst $e;
-       if ($native_en =~ m/^pBS/) { $native_en = ucfirst $native_en; }
-       if ($native_en =~ m/^condor/) { $native_en = ucfirst $native_en; }
-       $native_fn = $f->{name};
-       $soap_en = $e;
-       while ($soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) {
-               $soap_en = $1.ucfirst($2);
-       };
-       $soap_fn = $native_fn;
-       while ($soap_fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) {
-               $soap_fn = $1.ucfirst($2);
-       };
-       $source = "$src->$native_en.$native_fn";
-       $dest = "VALUEEV_GET($dst, $soap_en)->$soap_fn";
-#      print STDERR "$src, $dst, $soap_en, $soap_fn, $native_fn, $tn, $usuc\n";
-
-       if ($tn eq 'int') {
-               if ($f->{codes}) {
-                       $soap_En = ucfirst $soap_en;
-                       $soap_Fn = ucfirst $soap_fn;
-                       $func_name = $is_common ? "edg_wll_${soap_Fn}ToSoap" : "edg_wll_${soap_En}${soap_Fn}ToSoap";
-                       gen $indent."$func_name(soap, $source, &$dest);\n";
-               } elsif ($f->{optional}) {
-                       gen $indent."$dest = soap_malloc(soap, sizeof(*$dest));\n";
-                       gen $indent."*$dest = $source;\n";
-               } else {
-                       gen $indent."$dest = $source;\n";
-               }
-       } elsif ($tn eq 'port' || $tn eq 'bool' || $tn eq 'float' || $tn eq 'double') {
-               if ($f->{optional}) {
-                       gen $indent."$dest = soap_malloc(soap, sizeof(*$dest));\n";
-                       gen $indent."*$dest = $source;\n";
-               } else {
-                       gen $indent."$dest = $source;\n";
-               }
-       } elsif ($tn eq 'logsrc') {
-                       gen $indent."edg_wll_SourceToSoap($source, &$dest);\n";
-       } elsif ($tn eq 'string' || $tn eq 'notifid') {
-                       gen $indent."$dest = soap_strdup(soap, $source);\n";
-       } elsif ($tn eq 'jobstat') {
-                       gen $indent."$dest = soap_malloc(soap, sizeof(struct lbt__jobStatus))";
-                       gen $indent."edg_wll_StatusToSoap(soap, $source, $dest);\n";
-       } elsif ($tn eq 'timeval') {
-                       gen $indent."$dest = soap_malloc(soap, sizeof(struct lbt__timeval));\n";
-                       gen $indent."$dest->tvSec = $source.tv_sec;\n";
-                       gen $indent."$dest->tvUsec = $source.tv_usec;\n";
-       } elsif ($tn eq 'jobid') {
-                       gen $indent."s = edg_wlc_JobIdUnparse($source);\n";
-                       gen $indent."$dest = soap_strdup(soap, s);\n";
-       } elsif ($tn eq 'usertag') {
-                       gen $indent."$dest = soap_malloc(soap, sizeof(*$dst->$soap_fn));\n";
-                       gen $indent."$dest->tag = soap_strdup(soap, $source.tag);\n";
-                       gen $indent."$dest->value = soap_strdup(soap, $source.value);\n";
-       } else {
-               die "Unknown type $tn";
-       }
-}
-
-
-sub eventFieldFree {
-       my ($indent, $dst, $e, $f) = @_;
-       my ($tn, $soap_fn, $dest);
-
-       $tn = $f->{type};
-       $soap_en = $e;
-       while ($soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) {
-               $soap_en = $1.ucfirst($2);
-       };
-       $soap_fn = $f->{name};
-       while ($soap_fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) {
-               $soap_fn = $1.ucfirst($2);
-       };
-       $dest = "VALUEEV_GET($dst, $soap_en)->$soap_fn";
-
-       if ($tn eq 'int' || $tn eq 'port' || $tn eq 'bool' || $tn eq 'float' || $tn eq 'double' || $tn eq 'logsrc') {
-               if ($f->{optional}) {
-                       gen $indent."if ($dest) soap_dealloc(soap, $dest);\n";
-               }
-       } elsif ($tn eq 'string' || $tn eq 'notifid' || $tn eq 'jobid' || $tn eq 'timeval') {
-               gen $indent."if ($dest) soap_dealloc(soap, $dest);\n";
-       } elsif ($tn eq 'usertag') {
-               gen $indent."if ($dest) {\n";
-               gen $indent."   if ($dest->tag) soap_dealloc(soap, $dest->tag);\n";
-               gen $indent."   if ($dest->value) soap_dealloc(soap, $dest->value);\n";
-               gen $indent."   soap_dealloc(soap, $dest);\n";
-               gen $indent."}\n";
-       } else {
-               die "Unknown type $tn";
-       }
-}
-@@@}
-
-void edg_wll_JobStatCodeToSoap(edg_wll_JobStatCode in, enum lbt__statName *out)
-{
-       switch ( in )
-       {
-/* XXX: these two should never occur */
-       case EDG_WLL_NUMBER_OF_STATCODES:
-       case EDG_WLL_JOB_UNDEF: *out = -1; break;
-@@@{
-       for my $stat ($status->getTypesOrdered) {
-               my $u = uc $stat;
-               my $c = getTypeComment $status $stat;
-               gen qq{
-!      case EDG_WLL_JOB_$u: *out = $u; break; /**< $c */
-};
-       }
-@@@}
-       }
-}
-
-void edg_wll_SoapToJobStatCode(enum lbt__statName in, edg_wll_JobStatCode *out)
-{
-       switch ( in )
-       {
-//     case UNDEF: *out = EDG_WLL_JOB_UNDEF; break;
-@@@{
-       for my $stat ($status->getTypesOrdered) {
-               my $u = uc $stat;
-               my $c = getTypeComment $status $stat;
-               gen qq{
-!      case $u: *out = EDG_WLL_JOB_$u; break; /**< $c */
-};
-       }
-@@@}
-       }
-}
-
-int edg_wll_StatusToSoap(struct soap *soap,edg_wll_JobStat const *src,struct lbt__jobStatus *js)
-{
-       int     i,j;
-       char    *s;
-
-       memset(js, 0, sizeof(*js));
-       edg_wll_JobStatCodeToSoap(src->state, &(js->state));
-@@@{
-       selectType $status '_common_';
-       for (getFieldsOrdered $status) {
-               my $f = selectField $status $_;
-               my $ft = $f->{type};
-               my $usuc = $_;
-               $usuc = $1.uc($2).$3 while ($usuc =~ /([^_]*)_([a-z])(.*)/);
-               if ($ft eq 'jobid') {
-                       gen "\ts = edg_wlc_JobIdUnparse(src->$_);\n";
-                       gen "\tjs->$usuc = soap_strdup(soap,s); free(s);\n";
-               }
-               elsif ($ft eq 'strlist') {
-                       gen qq{
-!      for (i=0; src->$_ && src->$_\[i]; i++);
-!      js->__size$usuc = i;
-!      js->$usuc = soap_malloc(soap,sizeof(char *) * i);
-!      for (j=0; j<i; j++) js->$usuc\[j] = soap_strdup(soap,src->$_\[j]);
-};
-               } elsif ($ft eq 'intlist') {
-                       my %fmap = ( children_hist=>'count', stateEnterTimes=>'time');
-                       gen qq{
-!      /* XXX: don't count UNDEF */
-!      if (src->$_) {
-!              GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, ${usuc}Item) h;
-!
-!              GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, ${usuc}, struct lbt__${usuc}Item, EDG_WLL_NUMBER_OF_STATCODES-1);
-!              h = js->${usuc};
-!              for (i=1; i<EDG_WLL_NUMBER_OF_STATCODES; i++) {
-!                      edg_wll_JobStatCodeToSoap(i,&GLITE_SECURITY_GSOAP_LIST_GET(h, i-1)->state);
-!                      GLITE_SECURITY_GSOAP_LIST_GET(h, i-1)->$fmap{$_} = src->$_\[i+1];
-!              }
-!      }
-!      else {
-!              js->__size$usuc = 0;
-!              js->$usuc = NULL;
-!      }
-};
-               } elsif ($ft eq 'taglist') {
-                       gen qq{
-!      {
-!              struct lbt__tagValue    *t;
-!
-!              for (i=0; src->$_ && src->$_\[i].tag; i++);
-!              GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, $usuc, struct lbt__tagValue, i);
-!              for (i=0; src->$_ && src->$_\[i].tag; i++) {
-!                      t = GLITE_SECURITY_GSOAP_LIST_GET(js->$usuc, i);
-!                      t->tag = soap_strdup(soap,src->$_\[i].tag);
-!                      t->value = soap_strdup(soap,src->$_\[i].value);
-!              }
-!      }
-};
-               } elsif ($ft eq 'stslist') {
-                       gen qq{
-!      for (i=0; src->$_ && src->$_\[i].state; i++);
-!      GLITE_SECURITY_GSOAP_LIST_CREATE(soap, js, $usuc, struct lbt__jobStatus, i);
-!      for (j=0; j<i; j++) edg_wll_StatusToSoap(soap,src->$_+j,GLITE_SECURITY_GSOAP_LIST_GET(js->$usuc, j));
-};
-               } elsif ($ft eq 'timeval') {
-                       gen "\tjs->$usuc = soap_malloc(soap,sizeof *js->$usuc);\n";
-                       gen "\tjs->$usuc->tvSec = src->$_.tv_sec;\n";
-                       gen "\tjs->$usuc->tvUsec = src->$_.tv_usec;\n";
-               } elsif ($ft eq 'string') {
-                       gen "\tjs->$usuc = soap_strdup(soap,src->$_);\n";
-               } else { gen "\tjs->$usuc = src->$_;\n"; }
-       }
-@@@}
-
-       return SOAP_OK;
-}
-
-void edg_wll_SoapToStatus(struct soap *soap,struct lbt__jobStatus const *src,edg_wll_JobStat *dest)
-{
-       int     i;
-
-       memset(dest,0,sizeof *dest);
-       edg_wll_SoapToJobStatCode(src->state, &(dest->state));
-
-@@@{
-       selectType $status '_common_';
-       for (getFieldsOrdered $status) {
-               my $f = selectField $status $_;
-               my $ft = $f->{type};
-               my $usuc = $_;
-               $usuc = $1.uc($2).$3 while ($usuc =~ /([^_]*)_([a-z])(.*)/);
-
-               if ($ft eq 'jobid') {
-                       gen "\tif (src->$usuc) edg_wlc_JobIdParse(src->$usuc,&dest->$_);\n";
-               } elsif ($ft eq 'strlist') {
-                       gen "\tfor (i=0; i<src->__size$usuc; i++) soap_unlink(soap,src->$usuc\[i]);\n";
-                       gen "\tsoap_unlink(soap,src->$usuc);\n";
-                       gen "\tdest->$_ = realloc(src->$usuc,sizeof(*dest->$_) * (src->__size$usuc + 1));\n";
-                       gen "\tdest->$_\[src->__size$usuc] = NULL;\n";
-               } elsif ($ft eq 'intlist') {
-# XXX: only EDG_WLL_NUMBER_OF_STATCODES long lists work
-                       my %fmap = ( children_hist=>'count', stateEnterTimes=>'time');
-                       gen qq {
-!      if (src->__size$usuc) {
-!              dest->$_ = calloc(src->__size$usuc + 1, sizeof *dest->$_);
-!              dest->$_\[0] = src->__size$usuc + 2;
-!              for (i=0; i<src->__size$usuc; i++) {
-!                      edg_wll_JobStatCode     s;
-!                      edg_wll_SoapToJobStatCode(GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->state,&s);
-!                      assert(s>=0); assert(s<EDG_WLL_NUMBER_OF_STATCODES);
-!                      dest->$_\[s+1] = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->$fmap{$_};
-!              }
-!      }
-!      else dest->$_ = NULL;
-};
-               } elsif ($ft eq 'stslist') {
-                       gen qq{
-!      if (src->__size$usuc) {
-!              dest->$_ = calloc(src->__size$usuc + 1,sizeof *dest->$_);
-!              for (i=0; i<src->__size$usuc; i++) edg_wll_SoapToStatus(soap,GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i),dest->$_ + i);
-!      }
-!      else dest->$_ = NULL;
-};
-               } elsif ($ft eq 'taglist') {
-                       gen qq{
-       if (src->__size$usuc) {
-               dest->$_ = calloc(src->__size$usuc + 1,sizeof *dest->$_);
-               for (i=0; i<src->__size$usuc; i++) {
-                       soap_unlink(soap,dest->$_\[i].tag = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->tag);
-                       soap_unlink(soap,dest->$_\[i].tag = GLITE_SECURITY_GSOAP_LIST_GET(src->$usuc, i)->tag);
-               }
-       }
-       else dest->$_ = NULL;
-};
-               } elsif ($ft eq 'timeval') {
-                       gen "\tdest->$_.tv_sec = src->$usuc->tvSec;\n";
-                       gen "\tdest->$_.tv_usec = src->$usuc->tvUsec;\n";
-               } elsif ($ft eq 'string') {
-                       gen "\tdest->$_ = src->$usuc;\n";
-                       gen "\tsoap_unlink(soap,src->$usuc);\n";
-               } else {
-                       gen "\tdest->$_ = src->$usuc;\n";
-}
-}
-@@@}
-}
-
-void edg_wll_SoapToJobStatFlags(const struct lbt__jobFlags *in, int *out)
-{
-       int             i;
-
-       assert(out);
-       *out = 0;
-       if (in) for ( i = 0; i < in->__sizeflag; i++ ) switch ( in->flag[i] )
-       {
-       case CLASSADS: *out |= EDG_WLL_STAT_CLASSADS; break;
-       case CHILDREN: *out |= EDG_WLL_STAT_CHILDREN; break;
-       case CHILDSTAT: *out |= EDG_WLL_STAT_CHILDSTAT; break;
-       case CHILDHIST_FAST: *out |= EDG_WLL_STAT_CHILDHIST_FAST; break;
-       case CHILDHIST_THOROUGH: *out |= EDG_WLL_STAT_CHILDHIST_THOROUGH; break;
-       }
-}
-
-int edg_wll_JobStatFlagsToSoap(struct soap *soap, const int in, struct lbt__jobFlags *out)
-{
-       int             i = 0;
-
-       assert(out);
-       memset(out, 0, sizeof(*out));
-       if ( in & EDG_WLL_STAT_CLASSADS ) out->__sizeflag++;
-       if ( in & EDG_WLL_STAT_CHILDREN ) out->__sizeflag++;
-       if ( in & EDG_WLL_STAT_CHILDSTAT ) out->__sizeflag++;
-       if ( in & EDG_WLL_STAT_CHILDHIST_FAST ) out->__sizeflag++;
-       if ( in & EDG_WLL_STAT_CHILDHIST_THOROUGH ) out->__sizeflag++;
-       if ( !out->__sizeflag ) return SOAP_OK;
-       out->flag = soap_malloc(soap, sizeof(*(out->flag))*out->__sizeflag);
-       if ( !out->flag ) return SOAP_FAULT;
-
-       if ( in & EDG_WLL_STAT_CLASSADS ) out->flag[i++] = CLASSADS;
-       if ( in & EDG_WLL_STAT_CHILDREN ) out->flag[i++] = CHILDREN;
-       if ( in & EDG_WLL_STAT_CHILDSTAT ) out->flag[i++] = CHILDSTAT;
-       if ( in & EDG_WLL_STAT_CHILDHIST_FAST ) out->flag[i++] = CHILDHIST_FAST;
-       if ( in & EDG_WLL_STAT_CHILDHIST_THOROUGH ) out->flag[i++] = CHILDHIST_THOROUGH;
-
-       return SOAP_OK;
-}
-
-int edg_wll_SoapToAttr(const enum lbt__queryAttr in, edg_wll_QueryAttr *out)
-{
-       assert(EDG_WLL_QUERY_ATTR_NETWORK_SERVER + 1 == EDG_WLL_QUERY_ATTR__LAST);
-
-       switch ( in )
-       {
-       case JOBID: *out = EDG_WLL_QUERY_ATTR_JOBID; break;
-       case OWNER: *out = EDG_WLL_QUERY_ATTR_OWNER; break;
-       case STATUS: *out = EDG_WLL_QUERY_ATTR_STATUS; break;
-       case LOCATION: *out = EDG_WLL_QUERY_ATTR_LOCATION; break;
-       case DESTINATION: *out = EDG_WLL_QUERY_ATTR_DESTINATION; break;
-       case DONECODE: *out = EDG_WLL_QUERY_ATTR_DONECODE; break;
-       case USERTAG: *out = EDG_WLL_QUERY_ATTR_USERTAG; break;
-       case TIME: *out = EDG_WLL_QUERY_ATTR_TIME; break;
-       case LEVEL: *out = EDG_WLL_QUERY_ATTR_LEVEL; break;
-       case HOST: *out = EDG_WLL_QUERY_ATTR_HOST; break;
-       case SOURCE: *out = EDG_WLL_QUERY_ATTR_SOURCE; break;
-       case INSTANCE: *out = EDG_WLL_QUERY_ATTR_INSTANCE; break;
-       case EVENTTYPE: *out = EDG_WLL_QUERY_ATTR_EVENT_TYPE; break;
-       case CHKPTTAG: *out = EDG_WLL_QUERY_ATTR_CHKPT_TAG; break;
-       case RESUBMITTED: *out = EDG_WLL_QUERY_ATTR_RESUBMITTED; break;
-       case PARENT: *out = EDG_WLL_QUERY_ATTR_PARENT; break;
-       case EXITCODE: *out = EDG_WLL_QUERY_ATTR_EXITCODE; break;
-       case JDLATTR: *out = EDG_WLL_QUERY_ATTR_JDL_ATTR; break;
-       case STATEENTERTIME: *out = EDG_WLL_QUERY_ATTR_STATEENTERTIME; break;
-       case LASTUPDATETIME: *out = EDG_WLL_QUERY_ATTR_LASTUPDATETIME; break;
-       case NETWORKSERVER: *out = EDG_WLL_QUERY_ATTR_NETWORK_SERVER; break;
-       default: return 0;
-       }
-
-       return 1;
-}
-
-int edg_wll_AttrToSoap(const edg_wll_QueryAttr in, enum lbt__queryAttr *out)
-{
-       assert(EDG_WLL_QUERY_ATTR_NETWORK_SERVER + 1 == EDG_WLL_QUERY_ATTR__LAST);
-
-       switch ( in )
-       {
-       case EDG_WLL_QUERY_ATTR_JOBID: *out = JOBID; break;
-       case EDG_WLL_QUERY_ATTR_OWNER: *out = OWNER; break;
-       case EDG_WLL_QUERY_ATTR_STATUS: *out = STATUS; break;
-       case EDG_WLL_QUERY_ATTR_LOCATION: *out = LOCATION; break;
-       case EDG_WLL_QUERY_ATTR_DESTINATION: *out = DESTINATION; break;
-       case EDG_WLL_QUERY_ATTR_DONECODE: *out = DONECODE; break;
-       case EDG_WLL_QUERY_ATTR_USERTAG: *out = USERTAG; break;
-       case EDG_WLL_QUERY_ATTR_TIME: *out = TIME; break;
-       case EDG_WLL_QUERY_ATTR_LEVEL: *out = LEVEL; break;
-       case EDG_WLL_QUERY_ATTR_HOST: *out = HOST; break;
-       case EDG_WLL_QUERY_ATTR_SOURCE: *out = SOURCE; break;
-       case EDG_WLL_QUERY_ATTR_INSTANCE: *out = INSTANCE; break;
-       case EDG_WLL_QUERY_ATTR_EVENT_TYPE: *out = EVENTTYPE; break;
-       case EDG_WLL_QUERY_ATTR_CHKPT_TAG: *out = CHKPTTAG; break;
-       case EDG_WLL_QUERY_ATTR_RESUBMITTED: *out = RESUBMITTED; break;
-       case EDG_WLL_QUERY_ATTR_PARENT: *out = PARENT; break;
-       case EDG_WLL_QUERY_ATTR_EXITCODE: *out = EXITCODE; break;
-       case EDG_WLL_QUERY_ATTR_JDL_ATTR: *out = JDLATTR; break;
-       case EDG_WLL_QUERY_ATTR_STATEENTERTIME: *out = STATEENTERTIME; break;
-       case EDG_WLL_QUERY_ATTR_LASTUPDATETIME: *out = LASTUPDATETIME; break;
-       case EDG_WLL_QUERY_ATTR_NETWORK_SERVER: *out = NETWORKSERVER; break;
-       default: return 0;
-       }
-
-       return 1;
-}
-
-void edg_wll_SoapToQueryOp(const enum lbt__queryOp in, edg_wll_QueryOp *out)
-{
-       switch ( in )
-       {
-       case EQUAL: *out = EDG_WLL_QUERY_OP_EQUAL; break;
-       case UNEQUAL: *out = EDG_WLL_QUERY_OP_UNEQUAL; break;
-       case LESS: *out = EDG_WLL_QUERY_OP_LESS; break;
-       case GREATER: *out = EDG_WLL_QUERY_OP_GREATER; break;
-       case WITHIN: *out = EDG_WLL_QUERY_OP_WITHIN; break;
-       case CHANGED: *out = EDG_WLL_QUERY_OP_CHANGED; break;
-       }
-}
-
-void edg_wll_QueryOpToSoap(const edg_wll_QueryOp in, enum lbt__queryOp *out)
-{
-       switch ( in )
-       {
-       case EDG_WLL_QUERY_OP_EQUAL: *out = EQUAL; break;
-       case EDG_WLL_QUERY_OP_UNEQUAL: *out = UNEQUAL; break;
-       case EDG_WLL_QUERY_OP_LESS: *out = LESS; break;
-       case EDG_WLL_QUERY_OP_GREATER: *out = GREATER; break;
-       case EDG_WLL_QUERY_OP_WITHIN: *out = WITHIN; break;
-       case EDG_WLL_QUERY_OP_CHANGED: *out = CHANGED; break;
-       default: assert(0);
-       }
-}
-
-int edg_wll_SoapToQueryVal(
-       const edg_wll_QueryAttr                         attr,
-       const struct lbt__queryRecValue *in,
-       union edg_wll_QueryVal                     *out)
-{
-       assert(in); assert(out);
-       if ( VALUEQR_ISTYPE(in, c) ) {
-               if ( attr == EDG_WLL_QUERY_ATTR_JOBID || attr == EDG_WLL_QUERY_ATTR_PARENT ) {
-                       if ( glite_jobid_parse(VALUEQR_GET(in, c), (glite_jobid_t *)&(out->j)) ) return -1;
-               } else {
-                       if ( !(out->c = strdup(VALUEQR_GET(in, c))) ) return -1;
-               }
-       }
-       else if ( VALUEQR_ISTYPE(in, t) ) {
-               out->t.tv_sec = VALUEQR_GET(in, t)->tvSec;
-               out->t.tv_usec = VALUEQR_GET(in, t)->tvUsec;
-       }
-       else if ( VALUEQR_ISTYPE(in, i) ) out->i = *(VALUEQR_GET(in, i));
-
-       return 0;
-}
-
-int edg_wll_QueryValToSoap(
-       struct soap                                        *soap,
-       const edg_wll_QueryAttr                 attr,
-       const union edg_wll_QueryVal   *in,
-       struct lbt__queryRecValue   *out)
-{
-       assert(in); assert(out);
-       memset(out, 0, sizeof(*out));
-       switch ( attr ) {
-       case EDG_WLL_QUERY_ATTR_USERTAG:
-       case EDG_WLL_QUERY_ATTR_OWNER: 
-       case EDG_WLL_QUERY_ATTR_LOCATION:
-       case EDG_WLL_QUERY_ATTR_DESTINATION:
-       case EDG_WLL_QUERY_ATTR_HOST:
-       case EDG_WLL_QUERY_ATTR_INSTANCE:
-       case EDG_WLL_QUERY_ATTR_CHKPT_TAG:
-       case EDG_WLL_QUERY_ATTR_JDL_ATTR:
-               VALUEQR_SET(out, c, in->c ? soap_strdup(soap, in->c) : NULL);
-               if (in->c && !VALUEQR_GET(out, c) ) return SOAP_FAULT;
-               break;
-       case EDG_WLL_QUERY_ATTR_JOBID:
-       case EDG_WLL_QUERY_ATTR_PARENT: {
-                       char *s = edg_wlc_JobIdUnparse(in->j);
-                       VALUEQR_SET(out, c, soap_strdup(soap, s));
-                       free(s);
-                       if ( !VALUEQR_GET(out, c) ) return SOAP_FAULT;
-               }
-               break;
-       case EDG_WLL_QUERY_ATTR_TIME:
-       case EDG_WLL_QUERY_ATTR_STATEENTERTIME:
-       case EDG_WLL_QUERY_ATTR_LASTUPDATETIME:
-               VALUEQR_SET(out, t, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, t)))));
-               if ( !VALUEQR_GET(out, t) ) return SOAP_FAULT;
-               VALUEQR_SETTYPE(out, t);
-               VALUEQR_GET(out, t)->tvSec = in->t.tv_sec;
-               VALUEQR_GET(out, t)->tvUsec = in->t.tv_usec;
-               break;
-       case EDG_WLL_QUERY_ATTR_STATUS:
-       case EDG_WLL_QUERY_ATTR_DONECODE:
-       case EDG_WLL_QUERY_ATTR_LEVEL:
-       case EDG_WLL_QUERY_ATTR_SOURCE:
-       case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
-       case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-       case EDG_WLL_QUERY_ATTR_EXITCODE:
-               VALUEQR_SET(out, i, soap_malloc(soap, sizeof(*(VALUEQR_GET(out, i)))));
-               if ( !VALUEQR_GET(out, i) ) return SOAP_FAULT;
-               *(VALUEQR_GET(out, i)) = in->i;
-               break;
-       default:
-               return SOAP_FAULT;
-       }
-
-       return SOAP_OK;
-}
-
-int edg_wll_SoapToQueryRec(
-       const struct lbt__queryConditions *collection,
-       const struct lbt__queryRecord  *in,
-       edg_wll_QueryRec                           *out)
-{
-       assert(collection); assert(in); assert(out);
-       memset(out, 0, sizeof(*out));
-       if (!edg_wll_SoapToAttr(collection->attr, &out->attr)) return -1;
-       switch ( out->attr )
-       {
-       case EDG_WLL_QUERY_ATTR_TIME:
-               edg_wll_SoapToJobStatCode(*(collection->statName), &(out->attr_id.state));
-               break;
-       case EDG_WLL_QUERY_ATTR_USERTAG:
-               out->attr_id.tag = strdup(collection->tagName);
-               break;
-       default:
-               break;
-       }
-       edg_wll_SoapToQueryOp(in->op, &(out->op));
-       switch ( out->op )
-       {
-       case EDG_WLL_QUERY_OP_WITHIN:
-               if ( edg_wll_SoapToQueryVal(out->attr, in->value2, &(out->value2)) ) goto err;
-       default:
-               if ( edg_wll_SoapToQueryVal(out->attr, in->value1, &(out->value)) ) goto err;
-               break;
-       }
-
-       return 0;
-err:
-       edg_wll_QueryRecFree(out);
-       return -1;
-}
-
-int edg_wll_QueryRecToSoap(
-       struct soap                     *soap,
-       const edg_wll_QueryRec          *in,
-       struct lbt__queryRecord *qr)
-{
-       assert(in); assert(qr);
-       memset(qr, 0, sizeof(*qr));
-       if ( !in ) goto ret;
-       edg_wll_QueryOpToSoap(in->op, &(qr->op));
-
-#ifdef GLITE_SECURITY_GSOAP_CHOICE_SETNULL
-       if ((qr->value2 = soap_malloc(soap, sizeof(*(qr->value2)))) == NULL) return SOAP_FAULT;
-       GLITE_SECURITY_GSOAP_CHOICE_SETNULL(qr->value2,  queryRecValue);
-#endif
-       switch ( in->op ) {
-       case EDG_WLL_QUERY_OP_WITHIN:
-#ifndef GLITE_SECURITY_GSOAP_CHOICE_SETNULL
-               if ( !(qr->value2 = soap_malloc(soap, sizeof(*(qr->value2)))) ) return SOAP_FAULT;
-#endif
-               if ( edg_wll_QueryValToSoap(soap, in->attr, &(in->value2), qr->value2) ) return SOAP_FAULT;
-       default:
-               if ( !(qr->value1 = soap_malloc(soap, sizeof(*(qr->value1)))) ) return SOAP_FAULT;
-               if ( edg_wll_QueryValToSoap(soap, in->attr, &(in->value), qr->value1) ) return SOAP_FAULT;
-               break;
-       }
-
-ret:
-       return SOAP_OK;
-}
-
-/**
- * Translate query conditions from Soap form to query rec structure
- *
- * \param IN in pointer to soap query condition
- * \param OUT out target array of queryRec
- */
-int edg_wll_SoapToQueryConds(const struct lbt__queryConditions *in, edg_wll_QueryRec **out)
-{
-       int                                     i;
-       edg_wll_QueryRec   *qr;
-
-       assert(in); assert(out);
-       if ( !(qr = calloc(in->__sizerecord+1, sizeof(*qr))) ) goto err;
-       for ( i = 0; i < in->__sizerecord; i++ )
-               if ( edg_wll_SoapToQueryRec(in, GLITE_SECURITY_GSOAP_LIST_GET(in->record, i), qr+i) ) goto err;
-       *out = qr;
-       return 0;
-
-err:
-       if ( qr ) {
-               for ( i = 0; qr[i].attr; i++ ) edg_wll_QueryRecFree(qr+i);
-               free(qr);
-       }
-       return -1;
-}
-
-int edg_wll_QueryCondsToSoap(
-       struct soap                     *soap,
-       const edg_wll_QueryRec          *in,
-       struct lbt__queryConditions             *qc)
-{
-       int                             i;
-
-
-       assert(qc);
-       memset(qc, 0, sizeof(*qc));
-       if ( !in )
-               goto ret;
-
-       if (!edg_wll_AttrToSoap(in[0].attr, &(qc->attr))) return SOAP_FAULT;
-
-       if ( in->attr == EDG_WLL_QUERY_ATTR_TIME ) {
-               qc->statName = soap_malloc(soap, sizeof(*(qc->statName)));
-               if ( !qc->statName ) return SOAP_FAULT;
-               edg_wll_JobStatCodeToSoap(in->attr_id.state, qc->statName);
-       }
-       else if ( in->attr == EDG_WLL_QUERY_ATTR_USERTAG) {
-               qc->tagName = soap_strdup(soap, in->attr_id.tag);
-               if ( !qc->tagName ) return SOAP_FAULT;
-       }
-
-       i = 0;
-       while ( in[i].attr ) i++;
-
-       if ( !i )
-               goto ret;
-
-       GLITE_SECURITY_GSOAP_LIST_CREATE(soap, qc, record, struct lbt__queryRecord, i);
-       if ( !qc->record )
-               return SOAP_FAULT;
-
-       for ( i = 0; in[i].attr; i++ )
-               if ( edg_wll_QueryRecToSoap(soap, &in[i], GLITE_SECURITY_GSOAP_LIST_GET(qc->record, i)) )
-                       return SOAP_FAULT;
-
-ret:
-       return SOAP_OK;
-}
-
-/**
- * Translate extended query conditions from Soap form to query rec structure
- *
- * \param IN in array of soap query condition
- * \param OUT out target array of queryRec
- */
-int edg_wll_SoapToQueryCondsExt(GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) in, int __sizecondition, edg_wll_QueryRec ***out)
-{
-       int                                     i;
-       edg_wll_QueryRec  **qr;
-
-       assert(out);
-       if ( !(qr = calloc(__sizecondition + 1, sizeof(*qr))) ) return -1;
-       for ( i = 0; i < __sizecondition && GLITE_SECURITY_GSOAP_LIST_GET(in, i); i++ )
-               if ( edg_wll_SoapToQueryConds(GLITE_SECURITY_GSOAP_LIST_GET(in, i), qr+i) ) goto err;
-
-       *out = qr;
-       return 0;
-
-err:
-       if ( qr ) {
-               int             j;
-               for ( i = 0; qr[i]; i++ )
-               {
-                       for ( j = 0; qr[i][j].attr; j++ ) edg_wll_QueryRecFree(qr[i]);
-                       free(qr[i]);
-               }
-               free(qr);
-       }
-       return -1;
-}
-
-
-/**
- * Translate extended query conditions from Soap form to query rec structure
- *
- * \param IN in target array of queryRec 
- * \param OUT out_size number of array elements
- * \param OUT out array of soap query condition
- */
-int edg_wll_QueryCondsExtToSoap(
-       struct soap                     *soap,
-       const edg_wll_QueryRec          **in,
-       int                             *out_size,
-       GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) *out)
-{
-       int                             i, size;
-       GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) qc;
-       assert(in); assert(out);
-
-       size = 0;
-       while ( in[size] ) size++;
-
-       if ( !size ) 
-               goto ret;
-       GLITE_SECURITY_GSOAP_LIST_CREATE0(soap, qc, size, struct lbt__queryConditions, size);
-       if ( !qc ) return SOAP_FAULT;
-
-       for ( i = 0; in[i]; i++ )
-               if ( edg_wll_QueryCondsToSoap(soap, in[i], GLITE_SECURITY_GSOAP_LIST_GET(qc, i)) )
-                       return SOAP_FAULT;
-
-ret:
-       *out = qc;
-       *out_size = size;
-       return SOAP_OK;
-}
-
-
-#define edg_wll_CommonJobsResponseToSoap do { \
-       int     count, i; \
-\
-       assert(out); \
-       out->__sizejobs = 0; \
-       out->jobs = NULL; \
-       out->__sizestates = 0; \
-       out->states = NULL; \
-\
-       count = 0; \
-       if ( jobs ) { \
-               for ( i = 0; jobs[i]; i++ ) ; \
-               count = i; \
-               out->jobs = soap_malloc(soap, sizeof(*(out->jobs))*count); \
-               if ( !out->jobs ) return SOAP_FAULT; \
-               out->__sizejobs = count; \
-               for ( i = 0; jobs[i]; i++ ) { \
-                       char       *s; \
-                       if ( !(s = edg_wlc_JobIdUnparse(jobs[i])) ) return SOAP_FAULT; \
-                       if ( !(out->jobs[i] = soap_strdup(soap, s)) ) return SOAP_FAULT; \
-                       free(s); \
-               } \
-       } \
-       if ( states ) { \
-               GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, states, struct lbt__jobStatus, count); \
-               if ( !out->states ) return SOAP_FAULT; \
-\
-               for ( i = 0; i < count; i++ ) \
-                       if ( edg_wll_StatusToSoap(soap, states+i, GLITE_SECURITY_GSOAP_LIST_GET(out->states, i)) ) \
-                               return SOAP_FAULT; \
-       } \
-\
-} while(0)
-
-
-int edg_wll_JobsQueryResToSoap(
-       struct soap           *soap,
-       const edg_wlc_JobId   *jobs,
-       const edg_wll_JobStat *states,
-       struct _lbe__QueryJobsResponse *out)
-{
-       edg_wll_CommonJobsResponseToSoap;
-       return SOAP_OK;
-}
-
-
-int edg_wll_UserJobsResToSoap(
-       struct soap           *soap,
-       const edg_wlc_JobId   *jobs,
-       const edg_wll_JobStat *states,
-       struct _lbe__UserJobsResponse *out)
-{
-       edg_wll_CommonJobsResponseToSoap;
-       return SOAP_OK;
-}
-
-
-static void edg_wll_SoapToSource(enum lbt__eventSource in, edg_wll_Source *out)
-{
-       assert(EDG_WLL_SOURCE_LB_SERVER + 1 == EDG_WLL_SOURCE__LAST);
-
-       switch ( in ) {
-        case UserInterface: *out = EDG_WLL_SOURCE_USER_INTERFACE; break;
-        case NetworkServer: *out = EDG_WLL_SOURCE_NETWORK_SERVER; break;
-        case WorkloadManager: *out = EDG_WLL_SOURCE_WORKLOAD_MANAGER; break;
-        case BigHelper: *out = EDG_WLL_SOURCE_BIG_HELPER; break;
-        case JobSubmission: *out = EDG_WLL_SOURCE_JOB_SUBMISSION; break;  
-        case LogMonitor: *out = EDG_WLL_SOURCE_LOG_MONITOR; break;
-        case LRMS: *out = EDG_WLL_SOURCE_LRMS; break;
-        case Application: *out = EDG_WLL_SOURCE_APPLICATION; break;
-        case LBServer: *out = EDG_WLL_SOURCE_LB_SERVER; break;
-        default: assert(0); break;
-        }
-}
-
-
-/*
- * Soap to C and C to Soap enumeration translate functions.
- */
-
-@@@{
-foreach ('_common_', sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) {
-       my ($e, $upper_en, $soap_en, $en);
-
-       $e = $_;
-       if ($e eq '_common_') {
-               $en = '';
-               $upper_en = '';
-               $soap_en = '';
-       } else {
-               $en = ucfirst $e;
-               $upper_en = uc $e;
-               $soap_en = $en;
-               $soap_en = $1.ucfirst $2 while $soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/;
-       }
-
-       selectType $event $_;
-       foreach ($event->getFieldsOrdered) {
-               my $f = selectField $event $_;
-
-               if ($f->{codes}) {
-                       my ($fn, $enum_name, $enum_value_prefix, $func2C_name, $func2S_name);
-
-                       $fn = ucfirst $f->{name};
-                       $upper_fn = uc $f->{name};
-                       $soap_fn = $fn;
-                       $soap_fn = $1.ucfirst $2 while $soap_fn =~ /([[:alpha:]]*)_([[:alpha:]_]*)/;
-
-                       $enum_name = $e eq '_common_' && $fn eq 'Level' ? "int": "enum edg_wll_${en}${fn}";
-                       $enum_value_prefix = $e eq '_common_' ? "EDG_WLL_${upper_fn}_" : "EDG_WLL_${upper_en}_";
-                       $soap_enum_name = "enum lbt__$soap_en$soap_fn ";
-                       if ($f->{optional}) {$soap_enum_name .= "*";}
-
-                       # Soap to C function
-                       $func2C_name = "edg_wll_SoapTo$soap_en$soap_fn";
-                       gen "\n";
-                       gen "static void $func2C_name(const ${soap_enum_name}in, $enum_name *out) {\n";
-                       if ($f->{optional}) {
-                               gen "\tif (in == NULL) {\n";
-                               gen "\t\t*out = ${enum_value_prefix}UNDEFINED;\n";
-                               gen "\t\treturn;\n";
-                               gen "\t}\n";
-                               gen "\n";
-                               gen "\tswitch(*in) {\n";
-                       } else {
-                               gen "\tswitch(in) {\n";
-                       }
-                       foreach $code (@{$f->{codes}}) {
-                               my ($enum_value, $soap_enum_value);
-
-                               $upper_cn = $code->{name};
-                               $enum_value = "${enum_value_prefix}${upper_cn}";
-                               $soap_enum_value = "lbt__${soap_en}${soap_fn}__${upper_cn}";
-                               gen "\tcase $soap_enum_value: *out = $enum_value; break;\n"
-                       }
-                       gen "\tdefault: assert(0);\n";
-                       gen "\t};\n";
-                       gen "}\n";
-                       gen "\n";
-
-                       # C to Soap function
-                       my $target;
-
-                       $func2S_name = "edg_wll_${soap_en}${soap_fn}ToSoap";
-                       gen "\n";
-                       gen "static void $func2S_name(struct soap *soap, const $enum_name in, ${soap_enum_name}*out) {\n";
-                       if ($f->{optional}) {
-                               gen "\tif (in == ${enum_value_prefix}UNDEFINED) {\n";
-                               gen "\t\t*out = NULL;\n";
-                               gen "\t\treturn;\n";
-                               gen "\t}\n";
-                               gen "\n";
-                               gen "\t*out = soap_malloc(soap, sizeof(**out));\n";
-                               $target = "**out";
-                       } else {
-                               $target = "*out";
-                       }
-                       gen "\tswitch(in) {\n";
-                       foreach $code (@{$f->{codes}}) {
-                               my ($enum_value, $soap_enum_value);
-
-                               $upper_cn = $code->{name};
-                               $enum_value = "${enum_value_prefix}${upper_cn}";
-                               $soap_enum_value = "lbt__${soap_en}${soap_fn}__${upper_cn}";
-                               gen "\tcase $enum_value: $target = $soap_enum_value; break;\n"
-                       }
-                       if (not $e eq '_common_') {
-                               gen "\tcase EDG_WLL_${upper_en}_UNDEFINED: assert(0);\n";
-                       }
-                       gen "\tdefault: assert(0);\n";
-                       gen "\t};\n";
-                       gen "}\n";
-                       gen "\n";
-
-               } # if code
-       } # fields
-} # _common_, types
-@@@}
-
-static void edg_wll_SourceToSoap(edg_wll_Source in, enum lbt__eventSource *out)
-{
-       assert(EDG_WLL_SOURCE_LB_SERVER + 1 == EDG_WLL_SOURCE__LAST);
-
-       switch ( in ) {
-               case EDG_WLL_SOURCE_USER_INTERFACE: *out = UserInterface; break;
-               case EDG_WLL_SOURCE_NETWORK_SERVER: *out = NetworkServer; break;
-               case EDG_WLL_SOURCE_WORKLOAD_MANAGER: *out = WorkloadManager; break;
-               case EDG_WLL_SOURCE_BIG_HELPER: *out = BigHelper; break;
-               case EDG_WLL_SOURCE_JOB_SUBMISSION: *out = JobSubmission; break;  
-               case EDG_WLL_SOURCE_LOG_MONITOR: *out = LogMonitor; break;
-               case EDG_WLL_SOURCE_LRMS: *out = LRMS; break;
-               case EDG_WLL_SOURCE_APPLICATION: *out = Application; break;
-               case EDG_WLL_SOURCE_LB_SERVER: *out = LBServer; break;
-               case EDG_WLL_SOURCE_NONE:
-               case EDG_WLL_SOURCE__LAST:
-               default:
-                       assert(0);
-        }
-}
-
-
-/**
- * TODO: not tested
- * Translate event structure to Soap event.
- *
- * \param INOUT soap instance to work with
- * \param IN event source event
- * \param OUT sevent target Soap event
- */
-int edg_wll_EventToSoap(struct soap* soap, const edg_wll_Event *event, struct lbt__event *sevent) {
-       char *s;
-
-       switch (event->any.type) {
-@@@{
-       my ($soap_en);
-
-       for my $e (sort { $event->{order}->{$a} <=> $event->{order}->{$b} }
-                       $event->getTypes) {
-               my ($u);
-
-               $u = uc $e;
-               $soap_en = $e;
-               while ($soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/) {
-                       $soap_en = $1.ucfirst($2);
-               };
-gen qq {
-!              case EDG_WLL_EVENT_$u:
-!                      VALUEEV_SET(sevent, $soap_en, soap_malloc(soap, sizeof(struct lbt__event$soap_en)));
-};
-               selectType $event '_common_';
-               for (getFieldsOrdered $event) {
-                       my ($f);
-
-                       $f = selectField $event $_;
-                       eventFieldAssign("\t\t\t", "event", "sevent", $e, $f, 1);
-               }
-
-               gen "\n";
-
-               selectType $event $e;
-               for (getFieldsOrdered $event) {
-                       my ($f);
-
-                       $f = selectField $event $_;
-                       eventFieldAssign("\t\t\t", "event", "sevent", $e, $f, 0);
-               }
-gen qq {
-!                      break;
-!
-};
-       }
-@@@}
-               default:
-                       return 0;
-       }
-
-       return 1;
-}
-
-
-/** 
- * TODO: not tested
- * Free Soap event.
- *
- * \param INOUT soap instance to work with
- * \param INOUT sevent released Soap event
- */
-void edg_wll_FreeSoapEvent(struct soap *soap, struct lbt__event *sevent) {
-@@@{
-       my ($soap_en);
-
-       for my $e (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event) {
-               $soap_en = $e;
-               $soap_en = $1.ucfirst $2 while $soap_en =~ /([[:alpha:]]*)_([[:alpha:]_]*)/;
-
-               gen "\tif (VALUEEV_ISTYPE(sevent, $soap_en)) {\n";
-
-               selectType $event '_common_';
-               for (getFieldsOrdered $event) {
-                       my ($f);
-
-                       $f = selectField $event $_;
-                       eventFieldFree("\t\t", "sevent", $e, $f);
-               }
-
-               selectType $event $e;
-               for (getFieldsOrdered $event) {
-                       my ($f);
-
-                       $f = selectField $event $_;
-                       eventFieldFree("\t\t", "sevent", $e, $f);
-               }
-               gen qq "\t\tsoap_dealloc(soap, VALUEEV_GET(sevent, $soap_en));\n";
-               gen qq "\t}\n";
-}
-@@@}
-       // XXX: element dealocation belongs to higher layer
-#if GSOAP_VERSION <= 20706
-       soap_dealloc(soap, sevent);
-#endif
-}
-
-
-static void free_events(edg_wll_Event *events)
-{
-        int     i;
-
-        if (events) {
-                for (i=0; events[i].type != EDG_WLL_EVENT_UNDEF; i++)
-                        edg_wll_FreeEvent(&(events[i]));
-                edg_wll_FreeEvent(&(events[i])); /* free last line */
-                free(events);
-                events = NULL;
-        }
-}
-
-
-/**
- * Translate event array to Soap event array for eventsQueryResponse.
- *
- * \param INOUT soap instance to work with
- * \param IN events source array of the events
- * \param OUT out result Soap structure
- */
-int edg_wll_EventsQueryResToSoap(
-       struct soap *soap,
-       const edg_wll_Event *events,
-        struct _lbe__QueryEventsResponse *out)
-{
-       int i;
-       struct lbt__event *event;
-
-       /* alloc the events array */
-       assert(out != NULL);
-       memset(out, 0, sizeof(*out));
-       for (out->__sizeevents = 0; events[out->__sizeevents].any.type != EDG_WLL_EVENT_UNDEF; out->__sizeevents++);
-       if (!out->__sizeevents) return SOAP_OK;
-       GLITE_SECURITY_GSOAP_LIST_CREATE(soap, out, events, struct lbt__event, out->__sizeevents);
-       for (i = 0; i < out->__sizeevents; i++)
-               memset(GLITE_SECURITY_GSOAP_LIST_GET(out->events, i), 0, sizeof(struct lbt__event));
-       if (!out->events) return SOAP_FAULT;
-
-       for (i = 0; i < out->__sizeevents; i++) {
-               if (!edg_wll_EventToSoap(soap, &events[i], GLITE_SECURITY_GSOAP_LIST_GET(out->events, i))) goto err;
-       }
-
-       return SOAP_OK;
-
-err:
-       event = GLITE_SECURITY_GSOAP_LIST_GET(out->events, 0);
-       while (event) {
-               edg_wll_FreeSoapEvent(soap, event);
-               event++;
-       }
-       /*
-        * XXX: better list destroy here w/o deallocstion in
-        * edg_wll_FreeSoapEvent
-        */
-       soap_dealloc(soap, out->events);
-
-       return SOAP_FAULT;
-}
-
-
-static int edg_wll_SoapToEvent(
-       struct soap *soap,
-       struct lbt__event *in,
-       edg_wll_Event *out)
-{
-       //XXX: needs flash
-
-@@@{
-        for my $name (sort { $event->{order}->{$a} <=> $event->{order}->{$b} } getTypes $event)
-       {
-                my $comment = getTypeComment $event $name;
-                $name = $1.ucfirst $2 while $name =~ /([[:alpha:]]*)_([[:alpha:]_]*)/;
-               gen "\t\tif (VALUEEV_ISTYPE(in, $name)) {\n";
-               my $event_type = uc $name;
-               gen "\t\t\tout->type = EDG_WLL_EVENT_$event_type;\n";
-
-               for ('_common_',$name) {
-                       my $type = $_;
-                       selectType $event $type;
-                       for ($event->getFieldsOrdered) {
-                               my $f = selectField $event $_;
-                               my $fn = $f->{name};
-                               my $ft = $f->{type};
-                               my $tn = $f->getType;
-                               my $act;
-                               if ($type eq '_common_') {
-                                       $act = 'any';
-                               } else {
-                                       $act = lcfirst $name;
-                                       if ($act =~ m/^pBS/) { $act = ucfirst $act; }
-                                       if ($act =~ m/^condor/) { $act = ucfirst $act; }
-                               }
-                               my $usuc = $fn;
-                               $usuc = $1.uc($2).$3 while ($usuc =~ /([^_]*)_([a-z])(.*)/);
-                               my $fuc = ucfirst($usuc);
-
-                               my $src = "VALUEEV_GET(in, $name)->$usuc";
-                               if ($ft eq 'jobid') {
-
-                                       gen "\t\t\tif ($src)\n";
-                                       gen "\t\t\t\tedg_wlc_JobIdParse($src,&out->$act.$fn);\n";
-                               } elsif ($ft eq 'timeval') {
-                                       gen "\t\t\tout->$act.$fn.tv_sec = $src->tvSec;\n";
-                                       gen "\t\t\tout->$act.$fn.tv_usec = $src->tvUsec;\n";
-                               } elsif ($ft eq 'string') {
-                                       gen "\t\t\tout->$act.$fn = $src;\n";
-                                       gen "\t\t\tsoap_unlink(soap,$src);\n";
-                               } elsif ($ft eq 'int') {
-                                       if ($f->{codes}) {
-                                               if ($type eq '_common_') {
-                                                       gen "\t\t\tedg_wll_SoapTo$fuc($src,&(out->$act.$fn));\n";
-                                               }
-                                               else {
-                                                       gen "\t\t\tedg_wll_SoapTo$name$fuc($src,&(out->$act.$fn));\n";
-                                               }
-                                       }
-                                       elsif ($f->{optional}) {
-                                               gen "\t\t\tout->$act.$fn = *$src;\n";
-                                       } else {
-                                               gen "\t\t\tout->$act.$fn = $src;\n";
-                                       }
-                               } elsif ($tn eq 'port' || $tn eq 'bool' || $tn eq 'float' || $ft eq 'double') {
-                                       if ($f->{optional}) {
-                                               gen "\t\t\tout->$act.$fn = *$src;\n";
-                                       } else {
-                                               gen "\t\t\tout->$act.$fn = $src;\n";
-                                       }
-                               } elsif ($ft eq 'logsrc') {
-                                       gen "\t\t\tedg_wll_SoapToSource($src, &(out->$act.$fn));\n";
-                               } else {
-                                       gen "\t\t\tout->$act.$fn = $src;\n";
-                               }
-                       }       
-               }
-               gen "\n\t\t\treturn SOAP_OK;\n";
-               gen "\t\t}\n";
-       }
-@@@}
-
-       return 0;
-}
-
-
-/**
- * Translate Soap event array of eventsQueryResponse to event array.
- *
- * \param INOUT soap instance to work with
- * \param IN in result Soap structure
- * \param OUT out source array of the events
- */ 
-int edg_wll_SoapToEventsQueryRes(
-        struct soap *soap,
-        struct _lbe__QueryEventsResponse in,
-        edg_wll_Event **out)
-{
-       edg_wll_Event   *events;
-       int             i;
-
-
-       events = calloc(in.__sizeevents + 1, sizeof(*events));
-       if (!events) return SOAP_FAULT;
-
-       for (i=0; i < in.__sizeevents; i++) {
-               if (edg_wll_SoapToEvent(soap, GLITE_SECURITY_GSOAP_LIST_GET(in.events, i), &events[i]) != SOAP_OK) {
-                       free_events(events);
-                       return SOAP_FAULT;
-               }
-       }
-
-       *out = events;
-       return SOAP_OK;
-}
diff --git a/org.glite.lb.server/src/ws_typeref.h b/org.glite.lb.server/src/ws_typeref.h
deleted file mode 100644 (file)
index 61d55f5..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef GLITE_LB_WS_TYPEREF_H
-#define GLITE_LB_WS_TYPEREF_H
-
-#ident "$Header"
-
-#include "glite/lb/jobstat.h"
-#include "glite/lb/query_rec.h"
-#include "glite/lb/events.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern void edg_wll_JobStatCodeToSoap(edg_wll_JobStatCode, enum lbt__statName *);
-extern void edg_wll_SoapToJobStatCode(enum lbt__statName, edg_wll_JobStatCode *);
-
-extern void edg_wll_StatusToSoap(struct soap *, edg_wll_JobStat const *, struct lbt__jobStatus *);
-extern void edg_wll_SoapToStatus(struct soap *, struct lbt__jobStatus const *, edg_wll_JobStat *);
-
-extern void edg_wll_SoapToJobStatFlags(struct lbt__jobFlags const *, int *);
-extern int edg_wll_JobStatFlagsToSoap(struct soap *, const int, struct lbt__jobFlags *);
-
-extern void edg_wll_SoapToAttr(const enum lbt__queryAttr, edg_wll_QueryAttr *);
-extern void edg_wll_AttrToSoap(const edg_wll_QueryAttr, enum lbt__queryAttr *);
-
-extern void edg_wll_SoapToQueryOp(
-                       const enum lbt__queryOp,
-                       edg_wll_QueryOp *);
-extern void edg_wll_QueryOpToSoap(
-                       const edg_wll_QueryOp,
-                       enum lbt__queryOp *);
-
-extern int edg_wll_SoapToQueryVal(
-                       const edg_wll_QueryAttr,
-                       const struct lbt__queryRecValue *,
-                       union edg_wll_QueryVal *);
-extern int edg_wll_QueryValToSoap(struct soap *,
-                       const edg_wll_QueryAttr,
-                       const union edg_wll_QueryVal *,
-                       struct lbt__queryRecValue *);
-
-extern int edg_wll_SoapToQueryRec(
-                       const struct lbt__queryConditions *collection,
-                       const struct lbt__queryRecord *in,
-                       edg_wll_QueryRec *out);
-extern int edg_wll_QueryRecToSoap(struct soap *,
-                       const edg_wll_QueryRec *,
-                       struct lbt__queryRecord *);
-
-
-extern int edg_wll_SoapToQueryConds(
-                       const struct lbt__queryConditions *,
-                       edg_wll_QueryRec **);
-extern int edg_wll_QueryCondsToSoap(struct soap *,
-                       const edg_wll_QueryRec *,
-                       struct lbt__queryConditions *);
-
-extern int edg_wll_SoapToQueryCondsExt(
-                       GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) in,
-                       int __sizecondition,
-                       edg_wll_QueryRec ***);
-extern int edg_wll_QueryCondsExtToSoap(struct soap *,
-                       const edg_wll_QueryRec **,
-                       int *,
-                       GLITE_SECURITY_GSOAP_LIST_TYPE(lbt, queryConditions) *);
-
-extern int edg_wll_JobsQueryResToSoap(struct soap *,
-                       edg_wlc_JobId *,
-                       edg_wll_JobStat *,
-                       struct _lbe__QueryJobsResponse *);
-
-extern int edg_wll_UserJobsResToSoap(
-       struct soap *,
-       glite_jobid_const_t *,
-       const edg_wll_JobStat *,
-       struct _lbe__UserJobsResponse *);
-
-extern int edg_wll_EventsQueryResToSoap(struct soap *,
-                       const edg_wll_Event *,
-                       struct _lbe__QueryEventsResponse *);
-extern int edg_wll_SoapToEventsQueryRes(
-                       struct soap *,
-                       struct _lbe__QueryEventsResponse,
-                       edg_wll_Event **);
-
-
-extern int edg_wll_EventToSoap(struct soap*, const edg_wll_Event *, struct lbt__event *);
-extern void edg_wll_FreeSoapEvent(struct soap *, struct lbt__event *);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* GLITE_LB_WS_TYPEREF_H */
diff --git a/org.glite.lb.server/test/oneJob.qry b/org.glite.lb.server/test/oneJob.qry
deleted file mode 100644 (file)
index b46289d..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-SELECT e.event,j.userid,j.dg_jobid,e.code,e.prog,e.host,u.cert_subj,e.time_stamp,e.usec,e.level,e.arrived FROM events e,users u,jobs j WHERE e.jobid=j.jobid AND e.userid=u.userid AND e.code != 0 AND (j.jobid='WrCEKje9QTXFiSOZuPMLtw')
-0      294de3557d9d00b3d2d8a1e6aab028cf        https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw    17      UserInterface   lhun.ics.muni.cz        anonymous       2003-08-07 11:08:40     432100  8       2003-08-07 11:08:40
-1      294de3557d9d00b3d2d8a1e6aab028cf        https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw    2       NetworkServer   lhun.ics.muni.cz        anonymous       2003-08-07 11:09:05     664600  8       2003-08-07 11:09:05
-
-select name,value from short_fields where jobid = 'WrCEKje9QTXFiSOZuPMLtw' and event = 0
-JDL    x
-JOBTYPE        SIMPLE
-NS     NNNSSSS
-NSUBJOBS       0
-PARENT https://lhun.ics.muni.cz:4850/Qt7utj80miXexi7bkxyhnA
-SEQCODE        (nil)
-SRC_INSTANCE   (nil)
-
-select name,value from long_fields where jobid = 'WrCEKje9QTXFiSOZuPMLtw' and event = 0
-
-select name,value from short_fields where jobid = 'WrCEKje9QTXFiSOZuPMLtw' and event = 1
-FROM   UserInterface
-FROM_HOST      sending component hostname
-FROM_INSTANCE  sending component instance
-LOCAL_JOBID    new jobId (Condor  Globus ...)
-SEQCODE        UI=000002:NS=0000000001:WM=000000:BH=0000000000:JSS=000000:LM=000000:LRMS=000000:APP=000000:LBS=000000
-SRC_INSTANCE   (nil)
-
-select name,value from long_fields where jobid = 'WrCEKje9QTXFiSOZuPMLtw' and event = 1
-
-SELECT DISTINCT j.dg_jobid,j.userid FROM jobs j WHERE (j.jobid='WrCEKje9QTXFiSOZuPMLtw')
-https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw   294de3557d9d00b3d2d8a1e6aab028cf
-
-SELECT e.event,j.userid,j.dg_jobid,e.code,e.prog,e.host,u.cert_subj,e.time_stamp,e.usec,e.level,e.arrived FROM events e,users u,jobs j WHERE j.dg_jobid = 'https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw' AND e.jobid=j.jobid AND e.userid=u.userid AND e.code != 0
-0      294de3557d9d00b3d2d8a1e6aab028cf        https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw    17      UserInterface   lhun.ics.muni.cz        anonymous       2003-08-07 11:08:40     432100  8       2003-08-07 11:08:40
-1      294de3557d9d00b3d2d8a1e6aab028cf        https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw    2       NetworkServer   lhun.ics.muni.cz        anonymous       2003-08-07 11:09:05     664600  8       2003-08-07 11:09:05
-
diff --git a/org.glite.lb.server/test/test_query_events.cpp b/org.glite.lb.server/test/test_query_events.cpp
deleted file mode 100644 (file)
index 5224281..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-#include <fstream>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-
-#include <glite/lbu/db.h>
-#include <glite/lb/query_rec.h>
-#include <glite/lb/context-int.h>
-
-#define NO_GACL
-#include "lb_authz.h"
-#include "get_events.h"
-
-using namespace std;
-
-static const char *test_dir;
-
-class QueryEventsTest: public CppUnit::TestFixture
-{
-       CPPUNIT_TEST_SUITE(QueryEventsTest);
-       CPPUNIT_TEST(oneJob);
-       CPPUNIT_TEST_SUITE_END();
-
-private:
-       edg_wll_Context ctx;
-       
-       ifstream        qry_file;
-
-       vector<pair<string,vector<string> > >   queries;
-
-public:
-       void oneJob();
-       int ExecStmt(const char *, glite_lbu_Statement *);
-
-       void setUp() {
-               edg_wll_InitContext(&ctx);
-               ctx->dbctx = (glite_lbu_DBContext) this; /* XXX */
-               ctx->dbcaps = 0;
-       }
-
-       void tearDown() {
-               edg_wll_FreeContext(ctx);
-       }
-};
-
-void QueryEventsTest::oneJob()
-{
-       edg_wll_QueryRec        job[2];
-       const edg_wll_QueryRec  *jobs[2] = { job,NULL} ;
-       edg_wll_Event           *events;
-       int                     i;
-
-       job[0].attr = EDG_WLL_QUERY_ATTR_JOBID;
-       job[0].op = EDG_WLL_QUERY_OP_EQUAL ;
-       glite_jobid_parse("https://lhun.ics.muni.cz:4850/WrCEKje9QTXFiSOZuPMLtw",
-               (glite_jobid_t *) &job[0].value.j);
-       job[1].attr = EDG_WLL_QUERY_ATTR_UNDEF;
-       
-       string file(test_dir);
-       file += "/oneJob.qry";
-       qry_file.open(file.c_str());
-       
-       while (!qry_file.eof()) {
-               string  query,line;
-               vector<string>  rows;
-
-               getline(qry_file,query);
-               cout << "read: " << query <<endl;
-               rows.clear();
-
-               while (!qry_file.eof()) {
-                       getline(qry_file,line);
-                       if (line == "") break;
-       
-                       rows.push_back(line);
-               }
-               rows.push_back("END");
-               queries.push_back(pair<string,vector<string> >(query,rows));
-       }
-
-       qry_file.close();
-
-       CPPUNIT_ASSERT(!edg_wll_QueryEventsServer(ctx,1,jobs,NULL,&events));
-       glite_jobid_free((glite_jobid_t) job[0].value.j);
-       for (i = 0; events[i].type; i++) edg_wll_FreeEvent(&events[i]);
-       free(events);
-}
-
-int QueryEventsTest::ExecStmt(const char *qry, glite_lbu_Statement *stmt_out)
-{
-       vector<pair<string,vector<string> > >::iterator stmt = queries.begin();
-
-       for (; stmt != queries.end(); stmt++) {
-               const char      *q = stmt->first.c_str();
-
-               /* XXX: there some spaces at the end of qry */
-               if (!strncmp(q,qry,strlen(q))) break;
-       }
-
-       if (stmt == queries.end()) {
-               cerr << "query not found" << endl;
-               CPPUNIT_ASSERT(0);
-       }
-       vector<string>::iterator        *rows = new vector<string>::iterator(stmt->second.begin());
-
-       *stmt_out = (glite_lbu_Statement) rows;
-//cerr << (*rows)->c_str() << endl;
-//cerr << stmt->second.size()-1 << endl;
-       return stmt->second.size()-1;
-}
-
-extern "C" {
-int glite_lbu_InitDBContext(glite_lbu_DBContext *ctx) { return 0; }
-void glite_lbu_FreeDBContext(glite_lbu_DBContext ctx) { }
-int glite_lbu_DBConnect(glite_lbu_DBContext ctx, const char*str) { return 0; }
-void glite_lbu_DBClose(glite_lbu_DBContext ctx) { }
-
-int glite_lbu_ExecSQL(glite_lbu_DBContext ctx,const char *qry,glite_lbu_Statement *stmt)
-{
-       cout << "glite_lbu_ExecSQL: " << qry << endl;
-
-       class QueryEventsTest *tst = (class QueryEventsTest *)ctx;
-       return tst->ExecStmt(qry, stmt);
-}
-
-int glite_lbu_FetchRow(glite_lbu_Statement stmt, unsigned int n, unsigned long int *lengths, char **cols)
-{
-       vector<string>::iterator        *rows = (vector<string>::iterator *) stmt;
-       char    *row,*p,i=0;
-
-       if (**rows == "END") return 0;
-       row = strdup((*rows)->c_str());
-       (*rows)++;
-       for (p = strtok(row,"\t"); p; p = strtok(NULL,"\t"))
-               cols[i++] = strdup(p);
-       free(row);
-
-       return i;
-}
-
-void glite_lbu_FreeStmt(glite_lbu_Statement *) {}
-
-int debug;
-
-int glite_lbu_QueryColumns(glite_lbu_Statement stmt, char**cols) { return 0; }
-void glite_lbu_TimeToDB(long t, char **s) { *s = NULL; }
-time_t glite_lbu_DBToTime(const char *c) { return (time_t)-1; }
-
-int glite_lbu_Transaction(glite_lbu_DBContext ctx) { return 0; }
-int glite_lbu_Commit(glite_lbu_DBContext ctx) { return 0; }
-int glite_lbu_Rollback(glite_lbu_DBContext ctx) { return 0; }
-
-int glite_lbu_bufferedInsertInit(glite_lbu_DBContext ctx, glite_lbu_bufInsert *bi, const char *table_name, long size_limit, long record_limit, const char * columns) { return 0; }
-int glite_lbu_bufferedInsert(glite_lbu_bufInsert bi, const char *row)  { return 0; }
-int glite_lbu_bufferedInsertClose(glite_lbu_bufInsert bi) { return 0; }
-int glite_lbu_QueryIndices(glite_lbu_DBContext ctx, const char *table, char ***key_names, char ****column_names) { return 0; }
-int glite_lbu_DBError(glite_lbu_DBContext ctx, char **s1, char **s2) { return 0; }
-
-int edg_wll_JobStatusServer(
-       edg_wll_Context ctx,
-       glite_jobid_const_t             job,
-       int             flags,
-       edg_wll_JobStat *stat)
-{
-       edg_wlc_JobIdDup(job,&stat->jobId);
-       return 0;
-}
-
-int edg_wll_GetACL(edg_wll_Context ctx, glite_jobid_const_t jobid, edg_wll_Acl *acl) { return 0; }
-int edg_wll_CheckACL(edg_wll_Context ctx, edg_wll_Acl acl, int requested_perm) { return 0; }
-void edg_wll_FreeAcl(edg_wll_Acl acl) { return; }
-}
-
-CPPUNIT_TEST_SUITE_REGISTRATION(QueryEventsTest);
-
-int main (int ac,const char *av[])
-{
-       CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-       CppUnit::TextUi::TestRunner runner;
-
-       test_dir = ac >= 2 ? av[1] : "../test";
-
-       runner.addTest(suite);
-       return runner.run() ? 0 : 1;
-}
diff --git a/org.glite.lb.server/test/test_soap_conv.cpp b/org.glite.lb.server/test/test_soap_conv.cpp
deleted file mode 100644 (file)
index c5f4337..0000000
+++ /dev/null
@@ -1,321 +0,0 @@
-#include <iostream>
-#include <stdsoap2.h>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-
-#include <glite/lb/query_rec.h>
-
-#include "bk_ws_H.h"
-#include "ws_typeref.h"
-
-using namespace std;
-
-class SoapConvTest: public CppUnit::TestFixture
-{
-       CPPUNIT_TEST_SUITE(SoapConvTest);
-       CPPUNIT_TEST(Conditions);
-       CPPUNIT_TEST(States);
-       CPPUNIT_TEST_SUITE_END();
-
-private:
-       struct soap                                                *soap;
-       edg_wll_QueryRec                                  **stdConds;
-       edg_wll_JobStat                                         stdStat;
-
-       int stdRecCmp(edg_wll_QueryRec &, edg_wll_QueryRec &);
-       int stdCondsCmp(edg_wll_QueryRec **, edg_wll_QueryRec **);
-       int soapRecCmp(struct edgwll__QueryRec &, struct edgwll__QueryRec &);
-       int soapCondsCmp(struct edgwll__QueryConditions &, struct edgwll__QueryConditions &);
-
-public:
-       void setUp();
-
-       void Conditions();
-       void States();
-};
-
-void SoapConvTest::setUp()
-{
-       soap = soap_new();
-
-       stdConds = (edg_wll_QueryRec **)calloc(17, sizeof(edg_wll_QueryRec *));
-
-       stdConds[0] = (edg_wll_QueryRec *)calloc(4, sizeof(edg_wll_QueryRec));
-       stdConds[0][0].attr = EDG_WLL_QUERY_ATTR_STATUS;
-       stdConds[0][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[0][0].value.i = EDG_WLL_JOB_DONE;
-       stdConds[0][1].attr = EDG_WLL_QUERY_ATTR_STATUS;
-       stdConds[0][1].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[0][1].value.i = EDG_WLL_JOB_RUNNING;
-       stdConds[0][2].attr = EDG_WLL_QUERY_ATTR_STATUS;
-       stdConds[0][2].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[0][2].value.i = EDG_WLL_JOB_CANCELLED;
-
-       stdConds[1] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[1][0].attr = EDG_WLL_QUERY_ATTR_OWNER;
-       stdConds[1][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[1][0].value.c = NULL;
-
-       stdConds[2] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[2][0].attr = EDG_WLL_QUERY_ATTR_JOBID;
-       stdConds[2][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       edg_wlc_JobIdCreate("my.server.org", 9000, &(stdConds[2][0].value.j));
-
-       stdConds[3] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[3][0].attr = EDG_WLL_QUERY_ATTR_LOCATION;
-       stdConds[3][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[3][0].value.c = strdup("my_location");
-
-       stdConds[4] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[4][0].attr = EDG_WLL_QUERY_ATTR_DESTINATION;
-       stdConds[4][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[4][0].value.c = strdup("my_destination");
-
-       stdConds[5] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[5][0].attr = EDG_WLL_QUERY_ATTR_DONECODE;
-       stdConds[5][0].op = EDG_WLL_QUERY_OP_GREATER;
-       stdConds[5][0].value.i = 1;
-
-       stdConds[6] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[6][0].attr = EDG_WLL_QUERY_ATTR_USERTAG;
-       stdConds[6][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[6][0].attr_id.tag = strdup("color");
-       stdConds[6][0].value.c = strdup("red");
-
-       stdConds[7] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[7][0].attr = EDG_WLL_QUERY_ATTR_TIME;
-       stdConds[7][0].op = EDG_WLL_QUERY_OP_WITHIN;
-       stdConds[7][0].value.t = (struct timeval){10, 1};
-       stdConds[7][0].value2.t = (struct timeval){20, 1};
-
-       stdConds[8] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[8][0].attr = EDG_WLL_QUERY_ATTR_LEVEL;
-       stdConds[8][0].op = EDG_WLL_QUERY_OP_WITHIN;
-       stdConds[8][0].value.i = 10;
-       stdConds[8][0].value2.i = 20;
-
-       stdConds[9] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[9][0].attr = EDG_WLL_QUERY_ATTR_HOST;
-       stdConds[9][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[9][0].value.c = strdup("any.host");
-
-       stdConds[10] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[10][0].attr = EDG_WLL_QUERY_ATTR_SOURCE;
-       stdConds[10][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[10][0].value.i = 2;
-
-       stdConds[11] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[11][0].attr = EDG_WLL_QUERY_ATTR_INSTANCE;
-       stdConds[11][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[11][0].value.c = strdup("any.instance");
-
-       stdConds[12] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[12][0].attr = EDG_WLL_QUERY_ATTR_EVENT_TYPE;
-       stdConds[12][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[12][0].value.i = 1;
-
-       stdConds[13] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[13][0].attr = EDG_WLL_QUERY_ATTR_RESUBMITTED;
-       stdConds[13][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[13][0].value.c = strdup("where");
-
-       stdConds[14] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[14][0].attr = EDG_WLL_QUERY_ATTR_PARENT;
-       stdConds[14][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       edg_wlc_JobIdCreate("my.server.org", 8000, &(stdConds[14][0].value.j));
-
-       stdConds[15] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[15][0].attr = EDG_WLL_QUERY_ATTR_EXITCODE;
-       stdConds[15][0].op = EDG_WLL_QUERY_OP_LESS;
-       stdConds[15][0].value.i = 255;
-/*
- * XXX: what is that for?
-       stdConds[13] = (edg_wll_QueryRec *)calloc(2, sizeof(edg_wll_QueryRec));
-       stdConds[13][0].attr = EDG_WLL_QUERY_ATTR_CHKPT_TAG;
-       stdConds[13][0].op = EDG_WLL_QUERY_OP_EQUAL;
-       stdConds[13][0].value.i = 1;
-*/
-}
-
-int SoapConvTest::stdCondsCmp(edg_wll_QueryRec **c1, edg_wll_QueryRec **c2)
-{
-       int             i, j;
-
-
-       if ( (c1 && !c2) || (!c1 && c2) ) return 1;
-       if ( c1 ) for ( i = 0; c1[i]; i++ ) {
-               if ( !c2[i] ) return 2;
-               for ( j = 0; c1[i][j].attr; j++ ) {
-                       if ( !c2[i][j].attr ) return 3;
-                       if ( stdRecCmp(c1[i][j], c2[i][j]) ) return 4;
-               }
-               if ( c2[i][j].attr ) return 3;
-       }
-       if ( c2[i] ) return 2;
-
-       return 0;
-}
-
-int SoapConvTest::stdRecCmp(edg_wll_QueryRec &qr1, edg_wll_QueryRec &qr2)
-{
-       if ( qr1.attr != qr2.attr ) return 1;
-       if ( qr1.op != qr2.op ) return 1;
-       switch ( qr1.attr) {
-       case EDG_WLL_QUERY_ATTR_USERTAG:
-               if ( strcmp(qr1.attr_id.tag, qr2.attr_id.tag) ) return 1;
-       case EDG_WLL_QUERY_ATTR_OWNER:
-       case EDG_WLL_QUERY_ATTR_LOCATION:
-       case EDG_WLL_QUERY_ATTR_DESTINATION:
-       case EDG_WLL_QUERY_ATTR_HOST:
-       case EDG_WLL_QUERY_ATTR_INSTANCE:
-               if ( (qr1.value.c && !qr2.value.c) || (!qr1.value.c && qr2.value.c) ) return 1;
-               if ( qr1.value.c && qr2.value.c && strcmp(qr1.value.c, qr2.value.c) ) return 1;
-               break;
-       case EDG_WLL_QUERY_ATTR_JOBID:
-       case EDG_WLL_QUERY_ATTR_PARENT: {
-               char *s1, *s2;
-               int     rv;
-
-               s1 = edg_wlc_JobIdUnparse(qr1.value.j);
-               s2 = edg_wlc_JobIdUnparse(qr2.value.j);
-               if ( !s1 || !s2 ) rv = 1;
-               else rv = strcmp(s1, s2);
-               free(s1); free(s2);
-               return rv;
-               }
-               break;
-       case EDG_WLL_QUERY_ATTR_STATUS:
-       case EDG_WLL_QUERY_ATTR_DONECODE:
-       case EDG_WLL_QUERY_ATTR_LEVEL:
-       case EDG_WLL_QUERY_ATTR_SOURCE:
-       case EDG_WLL_QUERY_ATTR_EVENT_TYPE:
-       case EDG_WLL_QUERY_ATTR_RESUBMITTED:
-       case EDG_WLL_QUERY_ATTR_EXITCODE:
-               if (   (qr1.value.i != qr2.value.i)
-                       || (qr1.op == EDG_WLL_QUERY_OP_WITHIN && qr1.value2.i != qr2.value2.i) )
-                       return 1;
-               break;
-       case EDG_WLL_QUERY_ATTR_TIME:
-               if (   (qr1.value.t.tv_sec != qr2.value.t.tv_sec
-                               || qr1.value.t.tv_usec != qr2.value.t.tv_usec)
-                       || (qr1.op == EDG_WLL_QUERY_OP_WITHIN
-                               && (qr1.value2.t.tv_sec != qr2.value2.t.tv_sec
-                                       || qr1.value2.t.tv_usec != qr2.value2.t.tv_usec)) )
-                       return 1;
-               break;
-       /*
-        *      XXX: what about EDG_WLL_QUERY_ATTR_CHKPT_TAG   ???
-        */
-       default:
-               return 1;
-       }
-
-       return 0;
-}
-
-int SoapConvTest::soapCondsCmp(struct edgwll__QueryConditions &qc1, struct edgwll__QueryConditions &qc2)
-{
-       int             i, j;
-
-
-       if ( qc1.__sizecondition != qc2.__sizecondition ) return 1;
-       if ( (qc1.condition && !qc2.condition) || (!qc1.condition && qc2.condition) )
-       for ( i = 0; i < qc1.__sizecondition; i++ ) {
-               if ( qc1.condition[i]->attr != qc2.condition[i]->attr ) return 2;
-               if ( qc1.condition[i]->__sizerecords != qc2.condition[i]->__sizerecords ) return 3;
-               for ( j = 0; j < qc1.condition[i]->__sizerecords; j++ )
-                       if ( soapRecCmp(*(qc1.condition[i]->records[j]),
-                                                       *(qc2.condition[i]->records[j])) ) return 4;
-       }
-
-       return 0;
-}
-
-int SoapConvTest::soapRecCmp(struct edgwll__QueryRec &qr1, struct edgwll__QueryRec &qr2)
-{
-       if ( qr1.op != qr2.op ) return 1;
-       if (   (qr1.attrid->tag && !qr2.attrid->tag)
-               || (!qr1.attrid->tag && qr2.attrid->tag)
-               || (qr1.attrid->tag && strcmp(qr1.attrid->tag, qr2.attrid->tag)) ) return 2;
-       if (   (qr1.attrid->state && !qr2.attrid->state)
-               || (!qr1.attrid->state && qr2.attrid->state)
-               || (qr1.attrid->state && (qr1.attrid->state != qr2.attrid->state)) ) return 3;
-
-       if (   (qr1.value1 && !qr2.value1)
-               || (!qr1.value1 && qr2.value1) ) return 3;
-       if ( qr1.value1 ) {
-               if (   (qr1.value1->i && !qr2.value1->i)
-                       || (!qr1.value1->i && qr2.value1->i)
-                       || (qr1.value1->i && qr1.value1->i != qr2.value1->i) )
-                       return 4;
-               if (   (qr1.value1->c && !qr2.value1->c)
-                       || (!qr1.value1->c && qr2.value1->c)
-                       || (qr1.value1->c && strcmp(qr1.value1->c,qr2.value1->c)) )
-                       return 4;
-               if (   (qr1.value1->t && !qr2.value1->t)
-                       || (!qr1.value1->t && qr2.value1->t)
-                       || (qr1.value1->t && memcmp(qr1.value1->t,qr2.value1->t,sizeof(*qr2.value1->t))) )
-                       return 4;
-       }
-
-       if (   (qr1.value2 && !qr2.value2)
-               || (!qr1.value2 && qr2.value2) ) return 3;
-       if ( qr1.value2 ) {
-               if (   (qr1.value2->i && !qr2.value2->i)
-                       || (!qr1.value2->i && qr2.value2->i)
-                       || (qr1.value2->i && qr1.value2->i != qr2.value2->i) )
-                       return 4;
-               if (   (qr1.value2->c && !qr2.value2->c)
-                       || (!qr1.value2->c && qr2.value2->c)
-                       || (qr1.value2->c && strcmp(qr1.value2->c,qr2.value2->c)) )
-                       return 4;
-               if (   (qr1.value2->t && !qr2.value2->t)
-                       || (!qr1.value2->t && qr2.value2->t)
-                       || (qr1.value2->t && memcmp(qr1.value2->t,qr2.value2->t,sizeof(*qr2.value2->t))) )
-                       return 4;
-       }
-
-
-       return 0;
-}
-
-void SoapConvTest::Conditions()
-{
-       struct edgwll__QueryConditions     *soapConds, *soapConds2;
-       edg_wll_QueryRec                                  **stdConds2;
-       int                                                                     ret;
-       int size;
-       void *tmp1;
-
-       ret = edg_wll_QueryCondsExtToSoap(soap, (const edg_wll_QueryRec**)stdConds, &soapConds);
-       CPPUNIT_ASSERT_MESSAGE("edg_wll_QueryCondsExtToSoap()", ret == SOAP_OK);
-       ret = edg_wll_SoapToQueryCondsExt(soapConds, &stdConds2, &size, &tmp);
-       CPPUNIT_ASSERT_MESSAGE("edg_wll_SoapToQueryCondsExt()", !ret);
-
-       CPPUNIT_ASSERT_MESSAGE("Converted std results differs", !stdCondsCmp(stdConds, stdConds2));
-
-       ret = edg_wll_QueryCondsExtToSoap(soap, (const edg_wll_QueryRec**)stdConds2, &soapConds2);
-       CPPUNIT_ASSERT_MESSAGE("edg_wll_QueryCondsExtToSoap()", ret == SOAP_OK);
-
-       CPPUNIT_ASSERT_MESSAGE("Converted soap results differs", !soapCondsCmp(*soapConds, *soapConds2));
-}
-
-void SoapConvTest::States()
-{
-       struct edgwll__JobStat     *soapStat;
-       edg_wll_JobStat                         stdStat2;
-}
-
-CPPUNIT_TEST_SUITE_REGISTRATION(SoapConvTest);
-
-int main (int ac,const char *av[])
-{
-       CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-       CppUnit::TextUi::TestRunner runner;
-
-       runner.addTest(suite);
-       return runner.run() ? 0 : 1;
-}
diff --git a/org.glite.lb.server/test/test_trans.sh b/org.glite.lb.server/test/test_trans.sh
deleted file mode 100644 (file)
index 22608a8..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-# Simple script to test United Server Proxy behaviour
-# - for internal purposes only
-# - test should correspond to tests described at 
-#   http://egee.cesnet.cz/mediawiki/index.php/LB_and_JP_cleanup#unify_lb.proxy_.2B_server
-
-#!/bin/bash
-
-QUERY_SOCK=/tmp/lb_proxy_serve.sock
-
-
-cisti() {
-       echo "DB cleanup..."
-
-       mysql -u lbserver -e "delete from users;" lbserver20trans
-       mysql -u lbserver -e "delete from status_tags;" lbserver20trans
-       mysql -u lbserver -e "delete from states;" lbserver20trans
-       mysql -u lbserver -e "delete from short_fields;" lbserver20trans
-       mysql -u lbserver -e "delete from jobs;" lbserver20trans
-       mysql -u lbserver -e "delete from events;" lbserver20trans
-       mysql -u lbserver -e "delete from server_state;" lbserver20trans
-       mysql -u lbserver -e "delete from notif_registrations;" lbserver20trans
-       mysql -u lbserver -e "delete from notif_jobs;" lbserver20trans
-       mysql -u lbserver -e "delete from long_fields;" lbserver20trans
-       mysql -u lbserver -e "delete from acls;" lbserver20trans
-
-       echo "done."
-}
-
-registruj() {
-
-       echo "Registering...."
-       OUT=`org.glite.lb.client/build/job_reg -x -m scientific.civ.zcu.cz:7846 -s application|grep JOBID`
-       eval $OUT
-       ID1=$EDG_JOBID
-       OUT=`org.glite.lb.client/build/job_reg -m scientific.civ.zcu.cz:7846 -s application|grep JOBID`
-       eval $OUT
-       ID2=$EDG_JOBID
-       OUT=`org.glite.lb.client/build/job_reg -x -m skurut68-2.cesnet.cz:9000 -s application|grep JOBID`
-       eval $OUT
-       ID3=$EDG_JOBID
-       echo "done."
-}
-
-registruj_kolekce() {
-
-       echo "Registering...."
-       OUT=`org.glite.lb.client/build/job_reg -x -C -n 1 -m scientific.civ.zcu.cz:7846 -s application|grep JOBID`
-       eval $OUT
-       ID1=$EDG_WL_COLLECTION_JOBID
-       ID1_SUB=$EDG_WL_SUB_JOBID
-       OUT=`org.glite.lb.client/build/job_reg -C -n 1 -m scientific.civ.zcu.cz:7846 -s application|grep JOBID`
-       eval $OUT
-       ID2=$EDG_WL_COLLECTION_JOBID
-       ID2_SUB=$EDG_WL_SUB_JOBID
-       OUT=`org.glite.lb.client/build/job_reg -x -C -n 1 -m skurut68-2.cesnet.cz:9000 -s application|grep JOBID`
-       eval $OUT
-       ID3=$EDG_WL_COLLECTION_JOBID
-       ID3_SUB=$EDG_WL_SUB_JOBID
-       OUT=`org.glite.lb.client/build/job_reg -x -C -S -n 1 -m scientific.civ.zcu.cz:7846 -s application|grep JOBID`
-       eval $OUT
-       ID4=$EDG_WL_COLLECTION_JOBID
-       ID4_SUB=$EDG_WL_SUB_JOBID
-       OUT=`org.glite.lb.client/build/job_reg -C -S -n 1 -m scientific.civ.zcu.cz:7846 -s application|grep JOBID`
-       eval $OUT
-       ID5=$EDG_WL_COLLECTION_JOBID
-       ID5_SUB=$EDG_WL_SUB_JOBID
-       OUT=`org.glite.lb.client/build/job_reg -x -C -S -n 1 -m skurut68-2.cesnet.cz:9000 -s application|grep JOBID`
-       eval $OUT
-       ID6=$EDG_WL_COLLECTION_JOBID
-       ID6_SUB=$EDG_WL_SUB_JOBID
-       echo "done."
-
-}
-
-vypis() {
-       mysql -u lbserver -e "select dg_jobid,proxy,server from jobs" lbserver20trans
-}
-
-vypis_kolekci() {
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$1'" lbserver20trans
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$2'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$3'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$4'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$5'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$6'" lbserver20trans|grep http
-       shift 6
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$1'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$2'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$3'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$4'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$5'" lbserver20trans|grep http
-       mysql -u lbserver -e "select dg_jobid, proxy,server from jobs where dg_jobid='$6'" lbserver20trans|grep http
-}
-
-do_stavu_cleared() {
-       echo "Transfering jobs to cleared state..."
-       stage/examples/glite-lb-cleared.sh -x -j $1 2>/dev/null
-       stage/examples/glite-lb-cleared.sh -j $2 2>/dev/null  
-       stage/examples/glite-lb-cleared.sh -x -j $3 2>/dev/null
-       echo "done."
-}
-
-check_states() {
-       echo
-       echo "State of job $1"
-       stage/examples/glite-lb-job_status  -x $QUERY_SOCK  $1 | grep "state : "
-       stage/examples/glite-lb-job_status $1 |grep "state : "
-       echo "State of job $2"
-       stage/examples/glite-lb-job_status  -x $QUERY_SOCK  $2 | grep "state : "
-       stage/examples/glite-lb-job_status $2 |grep "state : "
-       echo "State of job $3"
-       stage/examples/glite-lb-job_status  -x $QUERY_SOCK  $3 | grep "state : "
-       stage/examples/glite-lb-job_status $3 |grep "state : "
-}
-
-test1() {
-       echo
-       echo "==================== test 1 ============================="
-
-       cisti;
-       registruj;
-       vypis;
-       echo job1=$ID1
-       echo job2=$ID2
-       echo job3=$ID3
-}
-
-test2() {
-       echo
-       echo "==================== test 2 ============================="
-
-        cisti;
-        registruj;
-        vypis;
-        echo job1=$ID1
-        echo job2=$ID2
-        echo job3=$ID3
-
-       do_stavu_cleared $ID1 $ID2 $ID3
-       vypis;
-}
-
-test3() {
-       echo
-       echo "==================== test 3 ============================="
-
-       cisti;
-       registruj;
-       vypis;
-       echo job1=$ID1
-       echo job2=$ID2
-       echo job3=$ID3
-
-       sleep 2;
-       stage/bin/glite-lb-purge --cleared 1s --aborted 1s --cancelled 1s --other 1s -l -m scientific.civ.zcu.cz:7846
-       vypis;
-}
-
-test4() {
-       echo
-       echo "==================== test 4 ============================="
-
-       cisti;
-       registruj;
-       vypis;
-       echo job1=$ID1
-       echo job2=$ID2
-       echo job3=$ID3
-       
-       check_states $ID1 $ID2 $ID3
-}
-
-test5() {
-       echo
-       echo "==================== test 5 ============================="
-
-       cisti;
-       registruj_kolekce;
-       vypis_kolekci  $ID1 $ID1_SUB $ID2 $ID2_SUB  $ID3 $ID3_SUB $ID4 $ID4_SUB $ID5 $ID5_SUB $ID6 $ID6_SUB 
-}
-
-
-
-####################################################
-
-test1;
-test2;
-test3;
-test4;
-test5;
diff --git a/org.glite.lb.server/test/test_xml.cpp.T b/org.glite.lb.server/test/test_xml.cpp.T
deleted file mode 100644 (file)
index b4c5d00..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-#include <iostream>
-
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/CompilerOutputter.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-
-
-#include "lb_xml_parse.h"
-#include <glite/lb/xml_parse.h>
-
-class XMLParseTest: public  CppUnit::TestFixture
-{
-       CPPUNIT_TEST_SUITE(XMLParseTest);
-       CPPUNIT_TEST(protoEventTest);
-       CPPUNIT_TEST(protoStatusTest);
-       CPPUNIT_TEST_SUITE_END();
-
-public:
-       void protoEventTest();
-       void protoStatusTest();
-
-
-};
-
-static char * compare_events(const edg_wll_Event *e1, const edg_wll_Event *e2)
-{
-       char *tmp1, *tmp2;
-       int tmp3;
-
-       if (e1->any.type != e2->any.type) return "type";
-@@@{
-       selectType $event '_common_';
-       for ($event->getFieldsOrdered) {
-               my $f = selectField $event $_;
-               my $fn = getName $f;
-               my $ft = $f->{type};
-
-               my $a = "e1->any.$fn";
-               my $b = "e2->any.$fn";
-
-               gen "\tif (!(".eval($main::compare{C}->{$ft}).")) return \"$fn\";\n";
-       }
-       
-       gen "\tswitch(e1->any.type) {\n";
-       for my $t (sort { $event->{order}->{$a} <=> $event->{order}->{$b} }
-               $event->getTypes)
-       {
-               my $tu = uc $t;
-               my $tl = lcfirst $t;
-               if ($tl =~ m/^pBS/) { $tl = ucfirst $tl; }
-               if ($tl =~ m/^condor/) { $tl = ucfirst $tl; }
-
-               selectType $event $t;
-               gen "\t\tcase EDG_WLL_EVENT\_$tu :\n";
-               for ($event->getFieldsOrdered) {
-                       my $f = selectField $event $_;
-                       my $fn = $f->{name};
-                       my $ft = $f->{type};
-
-                       my $a = "e1->$tl.$fn";
-                       my $b = "e2->$tl.$fn";
-
-                       gen "\t\t\tif (!(".eval($main::compare{C}->{$ft}).")) return \"$fn\";\n";
-               }
-               gen "\t\tbreak;\n";
-       }
-@@@}
-               default: return "default";
-       } /* switch */
-       return NULL;
-}
-
-static char * compare_states(const edg_wll_JobStat s1, const edg_wll_JobStat s2)
-{
-       char *tmp1, *tmp2;
-       int tmp3;
-@@@{
-       selectType $status '_common_';
-        for (getFieldsOrdered $status) {
-                my $f = selectField $status $_;
-               my $fn = getName $f;
-               my $ft = $f->{type};
-
-               my $a = "s1.$fn";
-               my $b = "s2.$fn";
-
-                if ($ft eq 'intlist') {
-                        gen "\tif ( (s1.$_ != NULL) && (s2.$_ == NULL) || (s1.$_ == NULL) && (s2.$_ != NULL) )  return \"$fn\";\n";
-                }
-                elsif ($ft eq 'strlist') {
-                }
-                elsif ($ft eq 'taglist') {
-                }
-                elsif ($ft eq 'stslist') {
-                }
-               else {
-                       gen "\tif (!(".eval($main::compare{C}->{$ft}).")) return \"$fn\";\n";
-               }
-        }
-@@@}
-       return NULL;
-}
-
-void XMLParseTest::protoEventTest()
-{
-       edg_wll_Context ctx;
-       edg_wll_Event   *e1, *e2;
-       char            *message, *et, *ed;
-
-       edg_wll_InitContext(&ctx);
-       e1 = (edg_wll_Event *) calloc(2,sizeof *e1);
-       e1->any.type = EDG_WLL_EVENT_REGJOB;
-
-       e1->regJob.jdl = strdup("very long job = \"blabla\" \\\\ \n hugh\t;");
-       e1->regJob.ns = strdup("ns address");
-       e1->regJob.jobtype = EDG_WLL_REGJOB_SIMPLE;
-       e1->regJob.seed = strdup("1234");
-
-       gettimeofday(&e1->any.timestamp,NULL);
-       
-       e1->any.host = strdup("some.host");
-       e1->any.level = 7;
-       e1->any.priority = 0;
-       edg_wlc_JobIdParse("https://some.host:1234/x67qr549qc",&e1->any.jobId);
-       e1->any.seqcode = EDG_WLL_SEQ_BIGHELPER_INITIAL;
-       e1->any.user = strdup("/O=Grid/CN=This User");
-       e1->any.source = EDG_WLL_SOURCE_USER_INTERFACE;
-       e1->any.src_instance = strdup("UI");
-
-       if (edg_wll_QueryEventsToXML(ctx, e1, &message)) {
-               edg_wll_Error(ctx,&et,&ed);
-               CPPUNIT_ASSERT_MESSAGE(std::string("QueryEventsToXML():") + et + " " + ed, 0);
-       }
-       
-       CPPUNIT_ASSERT_MESSAGE("message: ", message);
-
-       if (edg_wll_ParseQueryEvents(ctx, message, &e2)) {
-               edg_wll_Error(ctx,&et,&ed);
-               CPPUNIT_ASSERT_MESSAGE(std::string("ParseQueryEvents():") + et + " " + ed, 0);
-       }
-
-       if ((et = compare_events(e1,e2))) {
-               CPPUNIT_ASSERT_MESSAGE(std::string("compare_events():") + et, 0);
-       }
-}
-
-void XMLParseTest::protoStatusTest()
-{      
-       edg_wll_Context ctx;
-       edg_wll_JobStat s1, s2;
-       char            *message, *et, *ed;
-       const struct timeval some_timeval = {14,12};
-
-
-       edg_wll_InitContext(&ctx);
-       edg_wll_InitStatus(&s1);
-
-       s1.state = EDG_WLL_JOB_SUBMITTED;
-       edg_wlc_JobIdParse("https://some.host:1234/x67qr549qc",&s1.jobId);
-       s1.owner = strdup("/O=Grid/CN=This User");
-       s1.jobtype = EDG_WLL_STAT_SIMPLE;
-       s1.seed = strdup("4321");
-       s1.condorId = strdup("condorId");
-       s1.globusId = strdup("globusId");
-       s1.localId = strdup("localId");
-       s1.jdl = strdup("jdl");
-       s1.matched_jdl = strdup("matched_jdl");
-       s1.destination = strdup("destination");
-       s1.condor_jdl = strdup("condor_jdl");
-       s1.rsl = strdup("rsl");
-       s1.reason = strdup("reason");
-       s1.location = strdup("location");
-       s1.ce_node = strdup("ce_node");
-       s1.network_server = strdup("network_server");
-       s1.subjob_failed = 1;
-       s1.done_code = EDG_WLL_STAT_FAILED;
-       s1.exit_code = 123;
-       s1.resubmitted = 1;
-       s1.cancelling = 1;
-       s1.cancelReason = strdup("cancelReason");
-       s1.cpuTime = 10;
-       s1.stateEnterTime = some_timeval;
-       s1.lastUpdateTime = some_timeval;
-       s1.expectUpdate = 20;
-       s1.expectFrom = strdup("expectFrom");
-       s1.acl = strdup("acl");
-
-       if (edg_wll_JobStatusToXML(ctx, s1, &message)) {
-               edg_wll_Error(ctx,&et,&ed);
-               CPPUNIT_ASSERT_MESSAGE(std::string("QueryEventsToXML():") + et + " " + ed, 0);
-       }
-       
-       CPPUNIT_ASSERT_MESSAGE("message: ", message);
-
-       if (edg_wll_ParseJobStat(ctx, message, (long) strlen(message), &s2)) {
-               edg_wll_Error(ctx,&et,&ed);
-               CPPUNIT_ASSERT_MESSAGE(std::string("ParseJobStat():") + et + " " + ed, 0);
-       }
-
-       if ((et = compare_states(s1,s2))) {
-               CPPUNIT_ASSERT_MESSAGE(std::string("compare_states():") + et, 0);
-       }
-
-
-
-}
-
-CPPUNIT_TEST_SUITE_REGISTRATION(XMLParseTest);
-
-int main (int ac,const char *av[])
-{
-       CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
-       CppUnit::TextUi::TestRunner runner;
-       
-       runner.addTest(suite);
-       return runner.run() ? 0 : 1;
-}
diff --git a/org.glite.lb/.cvsignore b/org.glite.lb/.cvsignore
deleted file mode 100644 (file)
index 1df717b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-.project
-.cdtproject
\ No newline at end of file
diff --git a/org.glite.lb/LICENSE b/org.glite.lb/LICENSE
deleted file mode 100644 (file)
index 259a91f..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-LICENSE file for EGEE Middleware\r
-================================\r
-\r
-Copyright (c) 2004 on behalf of the EU EGEE Project: \r
-The European Organization for Nuclear Research (CERN), \r
-Istituto Nazionale di Fisica Nucleare (INFN), Italy\r
-Datamat Spa, Italy\r
-Centre National de la Recherche Scientifique (CNRS), France\r
-CS Systeme d'Information (CSSI), France\r
-Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden\r
-Universiteit van Amsterdam (UvA), Netherlands\r
-University of Helsinki (UH.HIP), Finlan\r
-University of Bergen (UiB), Norway\r
-Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are\r
-met: \r
-\r
-1. Redistributions of source code must retain the above copyright\r
-notice, this list of conditions and the following disclaimer.\r
-\r
-2. Redistributions in binary form must reproduce the above copyright\r
-notice, this list of conditions and the following disclaimer in the\r
-documentation and/or other materials provided with the distribution.\r
-\r
-3. The end-user documentation included with the redistribution, if\r
-any, must include the following acknowledgment: "This product includes\r
-software developed by The EU EGEE Project (http://cern.ch/eu-egee/)."\r
-Alternatively, this acknowledgment may appear in the software itself, if\r
-and wherever such third-party acknowledgments normally appear.\r
-\r
-4. The names EGEE and the EU EGEE Project must not be\r
-used to endorse or promote products derived from this software without\r
-prior written permission. For written permission, please contact\r
-<email address>.\r
-\r
-5. You are under no obligation whatsoever to provide anyone with any\r
-bug fixes, patches, or upgrades to the features, functionality or\r
-performance of the Software ("Enhancements") that you may develop over\r
-time; however, if you choose to provide your Enhancements to The EU\r
-EGEE Project, or if you choose to otherwise publish or distribute your\r
-Enhancements, in source code form without contemporaneously requiring\r
-end users of The EU EGEE Proejct to enter into a separate written license\r
-agreement for such Enhancements, then you hereby grant The EU EGEE Project\r
-a non-exclusive, royalty-free perpetual license to install, use, copy,\r
-modify, prepare derivative works, incorporate into the EGEE Middleware\r
-or any other computer software, distribute, and sublicense your\r
-Enhancements or derivative works thereof, in binary and source code\r
-form (if any), whether developed by The EU EGEE Project or third parties.\r
-\r
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL PROJECT OR ITS CONTRIBUTORS BE LIABLE\r
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN\r
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
-This software consists of voluntary contributions made by many\r
-individuals on behalf of the EU EGEE Prject. For more information on The\r
-EU EGEE Project, please see http://cern.ch/eu-egee/. For more information on\r
-EGEE Middleware, please see http://egee-jra1.web.cern.ch/egee-jra1/\r
-\r
-\r
diff --git a/org.glite.lb/build.xml b/org.glite.lb/build.xml
deleted file mode 100755 (executable)
index c8ef9df..0000000
+++ /dev/null
@@ -1,599 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Build file for the GLite Middleware Loggin and Bookkeeping Subsystem
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-       Version info: $Id$
-       Release: $Name$
-
-       Revision history:
-       $Log$
-       Revision 1.43.2.1  2007/03/29 20:05:00  akrenek
-       disable utils temporarily
-
-       Revision 1.43  2007/03/21 13:10:38  akrenek
-       utils -> jp.primary (sync with 3.1)
-
-       Revision 1.42  2006/03/24 08:26:11  akrenek
-       missing utils->client dependency (should fix nightly build)
-
-       Revision 1.41  2006/03/15 17:35:35  akrenek
-       cares
-       
-       Revision 1.40  2006/03/15 17:33:24  akrenek
-       merge of 1.5 branch
-       
-       Revision 1.39  2005/11/27 21:51:18  eronchie
-       Applied fix for bug 13928
-       
-       Revision 1.38  2005/11/22 12:13:47  eronchie
-       Removed one utils
-       
-       Revision 1.37  2005/11/04 14:39:20  akrenek
-       merge in the "lbonly" hack
-       
-       Revision 1.36.4.6  2006/02/06 12:10:00  akrenek
-       make proxy depend on logger explicitely
-       
-       Revision 1.36.4.5  2005/12/02 11:15:33  akrenek
-       resolved logger dependency conflict
-       
-       Revision 1.36.4.4  2005/12/02 10:04:14  jpospi
-       server depends on logger
-       
-       Revision 1.36.4.3  2005/11/28 10:39:08  akrenek
-       merge bug #13928 fix on the pre_cares branch
-       
-       Revision 1.36.4.2  2005/11/24 12:59:36  akrenek
-       server depends on bones
-       
-       Revision 1.36.4.1  2005/11/24 12:32:02  akrenek
-       merged in "lbonly"
-
-       Revision 1.39  2005/11/27 21:51:18  eronchie
-       Applied fix for bug 13928
-       
-       Revision 1.38  2005/11/22 12:13:47  eronchie
-       Removed one utils
-       
-       Revision 1.37  2005/11/04 14:39:20  akrenek
-       merge in the "lbonly" hack
-       
-       Revision 1.36  2005/10/15 13:36:26  akrenek
-       added lb.utils
-       
-       Revision 1.35  2005/10/14 17:19:08  akrenek
-       build also lb.utils
-       
-       Revision 1.34  2005/10/14 11:02:06  akrenek
-       depends on jp.primary
-       
-       Revision 1.33  2005/09/19 15:23:45  akrenek
-       "The gigantic merge"; from release 1.4 branch to HEAD
-       
-       Revision 1.32.2.2  2005/10/31 12:45:10  akrenek
-       conditional disabling of cross-subsystem builds via "lbonly" property
-       
-       Revision 1.32.2.1  2005/08/18 10:36:05  eronchie
-       Added cross-subsystem dependencies feature in org.glite.lb subsystem.
-       Added wms-utils.jobid and security.gsoap-plugin among common dependencies.
-       Added security.voms among server dependencies.
-       At the moment I have not consider gridsite.core component.
-       Once built gridsiste component, run ant in org.glite.lb to build the whole lb
-       and its external gLite dependencies.
-       
-       Revision 1.32  2005/08/03 11:58:25  akrenek
-       Merged the release 1.0 branch
-       
-       Revision 1.31  2005/05/26 15:13:37  zurek
-       inserted module.build.file
-       
-       Revision 1.30  2005/03/17 09:59:31  zsalvet
-       Add proxy target.
-       
-       Revision 1.29  2005/03/16 10:02:52  zsalvet
-       proxy component added
-       
-       Revision 1.28.2.1  2005/02/12 01:38:13  glbuild
-       Changed start time
-       
-       Revision 1.28  2004/11/29 15:16:26  zsalvet
-       Add ws-interface to checkout/build machinery.
-       
-       Revision 1.27  2004/11/29 13:55:02  akrenek
-       added dependence on ws-interface
-       
-       Revision 1.26  2004/10/29 22:53:41  dimeglio
-       Use envset target
-       
-       Revision 1.25  2004/10/28 22:57:36  dimeglio
-       Quoted ant command line parameters
-       
-       Revision 1.24  2004/10/28 18:19:30  dimeglio
-       Added envcheck to individual components
-       
-       Revision 1.23  2004/10/26 15:12:06  dimeglio
-       Fixed spelling error in envchecks
-       
-       Revision 1.22  2004/10/26 13:11:13  dimeglio
-       Added dependency of clean on envchecks
-       
-       Revision 1.21  2004/10/25 20:57:38  dimeglio
-       Use antExec
-       
-       Revision 1.20  2004/10/21 10:37:48  akrenek
-       make server depend on logger due to notification interlogger
-       
-       Revision 1.19  2004/10/15 12:30:01  akrenek
-       build with lb.sever-bones
-       
-       Revision 1.18  2004/09/29 13:35:39  flammer
-       Only update of line formatting.
-       
-       Revision 1.17  2004/09/09 21:05:29  dimeglio
-       Moved tag target to targets-common
-       
-       Revision 1.16  2004/08/27 03:03:12  dimeglio
-       Preserve original timestamp when copying file and overwrite when new
-       
-       Revision 1.15  2004/08/27 02:46:52  dimeglio
-       Added logic to create the tagged dependencies properties file
-       
-       Revision 1.14  2004/08/26 23:48:26  dimeglio
-       Added generation of cruisecontrol config file entry
-       
-       Revision 1.13  2004/08/09 04:56:14  dimeglio
-       Replaced rtag with tag
-       
-       Revision 1.12  2004/08/09 04:36:44  dimeglio
-       Fixed inheritance of do.cvs.tag property
-       
-       Revision 1.11  2004/08/09 03:06:11  dimeglio
-       Fixed inheritance of failonerror property
-       
-       Revision 1.10  2004/08/09 02:35:35  dimeglio
-       Set default value for failonerror
-       
-       Revision 1.9  2004/08/08 19:07:17  dimeglio
-       Added small.memory type of build
-       
-       Revision 1.8  2004/07/29 10:47:46  dimeglio
-       Added server and logger
-       
-       Revision 1.7  2004/07/29 07:39:57  dimeglio
-       Removed local envinfo and envcheck target (must use common ones)
-       
-       Revision 1.6  2004/07/16 16:25:43  flammer
-       Added tags for automated adding of components.
-       
-       Revision 1.5  2004/07/06 17:43:33  flammer
-       Update of classpath definitions, targets & configure file.
-       
-       Revision 1.4  2004/06/23 00:24:03  dimeglio
-       Added common and client modules
-       
-       Revision 1.3  2004/06/22 18:24:35  dimeglio
-       Added client interface module
-       
-       Revision 1.2  2004/06/18 23:05:12  dimeglio
-       Added/upgraded default build scripts
-       
--->
-
-<project name="lb" default="dist">
-
-       <description>
-               Ant build file to build the GLite Logging and Bookkeping Subsystem
-       </description>
-               
-       <!-- =========================================
-                Builds the GLite LB subsystem
-            ========================================= -->
-
-       <!-- Import baseline & user properties -->
-       <import file="../org.glite/project/baseline.properties.xml" />
-
-       <!-- Import subsystem build properties, 
-                             subsystem properties & 
-                             subsystem common properties -->
-       <import file="./project/properties.xml" />
-
-       <!-- Import global build properties and global properties -->
-       <import file="${global.properties.file}" />
-                               
-       <!-- =========================================
-                Load dependencies properties files (order is important) 
-            ========================================= -->
-       <property file="${user.dependencies.file}"/>
-       <property file="${subsystem.dependencies.file}"/>
-       <property file="${global.dependencies.file}"/>  
-
-       <!-- =========================================
-                 Load configure options
-             ========================================= -->
-        <import file="${global.configure.options.file}"/>
-                       
-       <!-- =========================================
-                Import global task definitions
-            ========================================= -->
-       <import file="${global.taskdefs.file}" />
-       
-       <!-- =========================================
-            Import global compiler definitions
-            ========================================= -->
-       <import file="${global.compilerdefs.file}" />
-               
-       <!-- =========================================
-                Import targets 
-            ========================================= -->
-       <import file="${global.targets-common.file}"/>
-       
-       <!-- =========================================
-                Load version file 
-            ========================================= -->
-       <property file="${module.version.file}"/>
-       <property file="${module.build.file}"/>
-                       
-       <!-- ===============================================
-                 Public common targets
-            =============================================== -->
-
-       <target name="localinit" depends="envcheck">
-
-               <echo> Preparing directories ... </echo>
-               
-               <mkdir dir="${stage.bin.dir}" />
-               <mkdir dir="${stage.lib.dir}" />
-               <mkdir dir="${stage.java.dir}" />
-               <mkdir dir="${stage.inc.dir}" />
-               <mkdir dir="${stage.int.dir}" />
-
-               <mkdir dir="${dist.dir}" />
-
-       </target>
-
-       <target name="init" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="init"/>
-               </antcall>
-       </target>
-
-       <target name="checkstyle" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="checkstyle"/>
-               </antcall>
-       </target>
-
-       <target name="compile" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="compile"/>
-               </antcall>
-       </target>
-
-       <target name="compiletest" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="compiletest"/>
-               </antcall>
-       </target>
-
-       <target name="unittest" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="unittest"/>
-               </antcall>
-       </target>
-
-       <target name="unitcoverage" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="unitcoverage"/>
-               </antcall>
-       </target>
-
-       <target name="stage" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="stage"/>
-               </antcall>
-       </target>
-
-       <target name="dist" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="dist"/>
-               </antcall>
-       </target>
-
-       <target name="install" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="install"/>
-               </antcall>
-       </target>
-
-       <target name="doc" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="doc"/>
-               </antcall>
-       </target>
-
-       <target name="all" depends="localinit">
-               <antcall target="buildmodules">
-                       <param name="target" value="all"/>
-               </antcall>
-       </target>
-
-       <target name="clean" depends="envcheck">
-
-               <property name="offline.repository" value="true" />
-               <antcall target="buildmodules">
-                       <param name="target" value="clean"/>
-               </antcall>
-
-               <delete dir="${module.bin.dir}" />
-               <delete dir="${module.lib.dir}" />
-               <delete dir="${module.autosrc.dir}" />
-               <delete dir="${module.autodoc.dir}" />
-               <delete dir="${module.test.reports.dir}" />
-
-       </target>
-
-       <target name="cleanAll" depends="clean"/>
-
-       <!-- ===============================================
-                Private targets
-            =============================================== -->
-
-       <!-- ===============================================
-                Modules proxy targets
-            =============================================== -->
-
-       <!-- component targets definitions tag = do not remove = -->
-
-       <target name="security.gsoap-plugin" unless="lbonly" depends="envset">
-               <if>
-                       <isset property="small.memory"/>
-                       <then>
-                               <exec dir="${security.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="gsoap-plugin -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${security.subsystem.dir}"
-                                       target="gsoap-plugin"
-                                       inheritall="false" >
-                                       <property name="target" value="${target}"/>
-                               </ant>
-                       </else>
-               </if>
-       </target>
-
-       <target name="security.voms-api-c" unless="lbonly" depends="envset">
-               <if>
-                       <isset property="small.memory"/>
-                       <then>
-                               <exec dir="${security.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="voms-api-c -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${security.subsystem.dir}"
-                                       target="voms-api-c"
-                                       inheritall="false" >
-                                       <property name="target" value="${target}"/>
-                               </ant>
-                       </else>
-               </if>
-       </target>
-
-       <target name="wms-utils.jobid" unless="lbonly" depends="envset">
-               <if>
-                       <isset property="small.memory"/>
-                       <then>
-                               <exec dir="${wms-utils.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="jobid -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${wms-utils.subsystem.dir}"
-                                       target="jobid"
-                                       inheritall="false" >
-                                       <property name="target" value="${target}"/>
-                               </ant>
-                       </else>
-               </if>
-       </target>
-
-       <target name="jp.primary" unless="lbonly" depends="envset">
-               <if>
-                       <isset property="small.memory"/>
-                       <then>
-                               <exec dir="${jp.subsystem.dir}" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="primary -Dtarget=${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${jp.subsystem.dir}"
-                                       target="primary"
-                                       inheritall="false" >
-                                       <property name="target" value="${target}"/>
-                               </ant>
-                       </else>
-               </if>
-       </target>
-
-       <if>
-               <isset property="setenvonly"/>
-               <then>
-                       <property name="lbonly" value="yes"/>
-               </then>
-       </if>
-
-       <target name="client-interface" unless="setenvonly" depends="envset">
-               <if>
-                       <isset property="small.memory" />
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.client-interface" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot;"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.client-interface"
-                                    target="${target}"
-                                    inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <target name="ws-interface" unless="setenvonly" depends="envset">
-               <if>
-                       <isset property="small.memory" />
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.ws-interface" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot;"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.ws-interface"
-                                    target="${target}"
-                                    inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <target name="server-bones" unless="setenvonly" depends="envset">
-               <if>
-                       <isset property="small.memory" />
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.server-bones" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot;"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.server-bones"
-                                    target="${target}"
-                                    inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <target name="common" unless="setenvonly" depends="envset, globus, expat, c-ares, wms-utils.jobid, security.gsoap-plugin, client-interface">
-               <if>
-                       <isset property="small.memory" />
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.common" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot;"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.common"
-                                    target="${target}"
-                                    inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <target name="client" unless="setenvonly" depends="envset, globus, expat, c-ares, client-interface, common">
-               <if>
-                       <isset property="small.memory" />
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.client" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot;"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.client"
-                                    target="${target}"
-                                    inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <target name="server" unless="setenvonly" depends="envset, globus, expat, c-ares, mysql, gsoap, security.voms-api-c, jp.primary, client-interface, ws-interface, common, server-bones, logger">
-               <if>
-                       <isset property="small.memory" />
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.server" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot;"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.server"
-                                    target="${target}"
-                                    inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <target name="proxy" unless="setenvonly" depends="envset, globus, expat, c-ares, client-interface, common, server, logger">
-               <if>
-                       <isset property="small.memory" />
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.proxy" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot;"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.proxy"
-                                    target="${target}"
-                                    inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <target name="logger" unless="setenvonly" depends="envset, globus, expat, c-ares, client-interface, common">
-               <if>
-                       <isset property="small.memory" />
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.logger" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot;"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.logger"
-                                    target="${target}"
-                                    inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <target name="utils" unless="setenvonly" depends="envset, globus, expat, c-ares, client, server, jp.primary">
-               <if>
-                       <isset property="small.memory"/>
-                       <then>
-                               <exec dir="${lb.subsystem.dir}.utils" executable="${antExec}" failonerror="${failonerror}">
-                                       <arg line="${target} -Dsmall.memory=true -Dbootstrap=${bootstrap} -Dfailonerror=${failonerror} -Ddo.cvs.tag=${do.cvs.tag}"/>
-                               </exec>
-                       </then>
-                       <else>
-                               <ant dir="${lb.subsystem.dir}.utils"
-                                       target="${target}"
-                                       inheritall="false" />
-                       </else>
-               </if>
-       </target>
-
-       <!-- Main proxy -->
-<!--XXX: until JP from head is included                                             utils, -->
-       <target name="buildmodules" depends="envset,
-                                            client-interface,
-                                            ws-interface,
-                                            client,
-                                            server-bones,
-                                            common,
-                                            server,
-                                            proxy,
-                                            logger">
-               <echo append="true" file="${global.project.dir}/cruisecontrol-stub.xml">
-       &lt;project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/&gt;
-               </echo>
-       </target>
-
-</project>
diff --git a/org.glite.lb/configure b/org.glite.lb/configure
deleted file mode 100755 (executable)
index 89fdb6e..0000000
+++ /dev/null
@@ -1,714 +0,0 @@
-#!/usr/bin/perl
-
-# WARNING: Don't edit this file unless it is the master copy in org.glite.lb
-#
-# For the purpose of standalone builds of lb/jobid/lbjp-common components
-# it is copied on tagging 
-
-# $Header$
-
-use Getopt::Long;
-
-my $pwd = `pwd`; chomp $pwd;
-my $prefix = $pwd.'/stage';
-my $stagedir;
-my $staged;
-my $module;
-my $thrflavour = 'gcc64dbgpthr';
-my $nothrflavour = 'gcc64dbg';
-my $mode = 'build';
-my $help = 0;
-my $listmodules;
-my $version;
-my $output;
-my $lb_tag = '';
-my $lbjp_tag = '';
-my $jp_tag = '';
-my $sec_tag = '';
-my $jobid_tag = '';
-my $libdir = 'lib';
-
-my @nodes = qw/client server logger utils doc ws-test db jpprimary jpindex jpclient/;
-my %enable_nodes;
-my %disable_nodes;
-
-my %extern_prefix = (
-       cares => '/opt/c-ares',
-       classads => '/opt/classads',
-       cppunit => '/usr',
-       expat => '/usr',
-       globus => '/opt/globus',
-       jglobus => '/opt/globus',
-       gsoap => '/usr',
-       mysql => '/usr',
-       'mysql-devel' => '',
-       'mysql-server' => '',
-       voms => '/opt/glite',
-       gridsite => '/opt/glite',
-       lcas => '/opt/glite',
-       ant => '/usr',
-       jdk => '/usr',
-       libtar => '/usr',
-);
-
-my %jar = (
-       'commons-codec' => '/usr/share/java/commons-codec-1.3.jar',
-);
-
-
-my %glite_prefix;
-my %need_externs;
-my %need_externs_type;
-my %need_jars;
-my %extrafull;
-my %extranodmod;
-my %deps;
-my %deps_type;
-my %topbuild;
-
-my %lbmodules = (
-       'lb' => [ qw/client common doc logger server state-machine types utils ws-interface ws-test glite-LB/], 
-       'security' => [qw/gss gsoap-plugin/],
-       'lbjp-common' => [qw/db maildir server-bones trio jp-interface/],
-       'jobid' => [qw/api-c api-cpp/],
-       'jp' => [ qw/client doc index primary server-common ws-interface/ ],
-       );
-
-
-my @opts = (
-       'prefix=s' => \$prefix,
-       'staged=s' => \$staged,
-       'module=s' => \$module,
-       'thrflavour=s' => \$thrflavour,
-       'nothrflavour=s' => \$nothrflavour,
-       'mode=s' => \$mode,
-       'listmodules=s' => \$listmodules,
-       'version=s' => \$version,
-       'output=s' => \$output,
-       'stage=s' => \$stagedir,
-       'lb-tag=s' => \$lb_tag,
-       'lbjp-common-tag=s' => \$lbjp_tag,
-       'jp-tag=s' => \$jp_tag,
-       'security-tag=s' => \$sec_tag,
-       'jobid-tag=s' => \$jobid_tag,
-       'help' => \$help,
-       'libdir=s' => \$libdir,
-);
-
-for (@nodes) {
-       $enable_nodes{$_} = 0;
-       $disable_nodes{$_} = 0;
-       
-       push @opts,"disable-$_",\$disable_nodes{$_};
-       push @opts,"enable-$_",\$enable_nodes{$_};
-}
-
-push @opts,"with-$_=s",\$extern_prefix{$_} for keys %extern_prefix;
-push @opts,"with-$_=s",\$jar{$_} for keys %jar;
-
-my @keeparg = @ARGV;
-
-GetOptions @opts or die "Errors parsing command line\n";
-
-$extern_prefix{'mysql-devel'}=$extern_prefix{mysql} if $extern_prefix{'mysql-devel'} eq '';
-$extern_prefix{'mysql-server'}=$extern_prefix{mysql} if $extern_prefix{'mysql-server'} eq '';
-
-if ($help) { usage(); exit 0; }
-
-if ($listmodules) {
-       my @m = map "org.glite.$listmodules.$_",@{$lbmodules{$listmodules}};
-       print "@m\n";
-       exit 0;
-}
-
-warn "$0: --version and --output make sense only in --mode=etics\n"
-       if ($version || $output) && $mode ne 'etics';
-
-my $en;
-for (keys %enable_nodes) { $en = 1 if $enable_nodes{$_}; }
-
-my $dis;
-for (keys %disable_nodes) { $dis = 1 if $disable_nodes{$_}; }
-
-die "--enable-* and --disable-* are mutually exclusive\n"
-       if $en && $dis;
-
-die "--module cannot be used with --enable-* or --disable-*\n"
-       if $module && ($en || $dis);
-
-die "$module: unknown module\n" if $module && ! grep $module,@{$lbmodules{lb}},@{$lbmodules{security}},{$lbmodules{jp}};
-
-if ($dis) {
-       for (@nodes) {
-               $enable_nodes{$_} = 1 unless $disable_nodes{$_};
-       }
-}
-
-if (!$en && !$dis) { $enable_nodes{$_} = 1 for (@nodes) } ;
-
-for (keys %enable_nodes) { delete $enable_nodes{$_} unless $enable_nodes{$_}; }
-
-$stagedir = $prefix unless $stagedir;
-
-if ($mode eq 'build') {
-       print "Writing config.status\n";
-       open CONF,">config.status" or die "config.status: $!\n";
-       print CONF "$0 @keeparg\n";
-       close CONF;
-}
-
-
-my @modules;
-my %aux;
-
-if ($module) {
-#      push @modules,split(/[,.]+/,$module);
-       push @modules,$module;
-}
-else {
-       @modules = map(($extranodmod{$_} ? $extranodmod{$_} : 'lb.'.$_),(keys %enable_nodes));
-       
-       my $n;
-
-       do {
-               local $"="\n";
-               $n = $#modules;
-               push @modules,(map @{$deps{$_}},@modules);
-
-               undef %aux; @aux{@modules} = (1) x ($#modules+1);
-               @modules = keys %aux;
-       } while ($#modules > $n);
-}
-
-@aux{@modules} = (1) x ($#modules+1);
-delete $aux{$_} for (split /,/,$staged);
-@modules = keys %aux;
-
-mode_build() if $mode eq 'build';
-mode_checkout() if $mode eq 'checkout';
-mode_etics($module) if $mode eq 'etics';
-
-sub mode_build {
-       print "\nBuilding modules: @modules\n";
-       
-       my @ext = map @{$need_externs{$_}},@modules;
-       my @myjars = map @{$need_jars{$_}},@modules;
-       undef %aux; @aux{@ext} = 1;
-       @ext = keys %aux;
-       undef %aux; @aux{@myjars} = (1) x ($#myjars+1);
-       @myjars = keys %aux;
-       
-       print "\nRequired externals:\n";
-       print "\t$_: $extern_prefix{$_}\n" for @ext;
-       print "\t$_: $jar{$_}\n" for @myjars;
-       print "\nThis is a poor-man configure, it's up to you to have sources and externals there\n\n";
-       
-       mkinc($_) for @modules;
-       
-       print "Creating Makefile\n";
-       
-       open MAK,">Makefile" or die "Makefile: $!\n";
-       
-       print MAK "all: @modules\n\nclean:\n";
-       
-       for (@modules) {
-               my $full = full($_);
-               my $build = $topbuild{$_} ? '': '/build';
-               print MAK "\tcd $full$build && \${MAKE} clean\n"
-       }
-       
-       print MAK "\ndistclean:\n";
-       
-       for (@modules) {
-               my $full = full($_);
-               print MAK $topbuild{$_} ?
-                       "\tcd $full$build && \${MAKE} distclean\n" :
-                       "\trm -rf $full$build\n"
-       }
-       
-       print MAK "\n";
-       
-       for (@modules) {
-               my %ldeps; undef %ldeps;  
-               @ldeps{@{$deps{$_}}} = 1;
-               for my $x (split /,/,$staged) { delete $ldeps{$x}; }
-               my @dnames = $module ? () : keys %ldeps;
-       
-               my $full = full($_);
-               my $build = $topbuild{$_} ? '': '/build';
-       
-               print MAK "$_: @dnames\n\tcd $full$build && \${MAKE} && \${MAKE} install\n\n";
-       }
-       
-       close MAK;
-}
-       
-sub mode_checkout() {
-       for (@modules) {
-               my $module = $_;
-               my $tag = "";
-               if ($lb_tag){
-                       for (@{$lbmodules{lb}}){
-                               if ("lb.".$_ eq $module){
-                                       $tag = '-r '.$lb_tag;
-                               }
-                       }       
-               }
-               if ($lbjp_tag){
-                       for (@{$lbmodules{'lbjp-common'}}){
-                               if ("lbjp-common.".$_ eq $module){
-                                        $tag = '-r '.$lbjp_tag;
-                                }
-                       }
-               }
-               if ($jp_tag){
-                       for (@{$lbmodules{'jp'}}){
-                               if ("jp.".$_ eq $module){
-                                        $tag = '-r '.$jp_tag;
-                               }
-                        }
-               }
-               if ($sec_tag){
-                       for (@{$lbmodules{security}}){
-                               if ("security.".$_ eq $module){
-                                        $tag = '-r '.$sec_tag;
-                                }
-                       }
-               }
-               if ($jobid_tag){
-                       for (@{$lbmodules{jobid}}){
-                               if ("jobid.".$_ eq $module){
-                                        $tag = '-r '.$jobid_tag;
-                                }
-                       }
-               }
-               #if (grep {"lb.".$_ eq $module} @{$lbmodules{lb}}){
-               #       print "found";
-               #}
-               $_ = full($_);
-               print "\n*** Checking out $_\n";
-               system("cvs checkout  $tag $_") == 0 or die "cvs checkout $tag $_: $?\n";
-       }
-}
-
-BEGIN{
-%need_externs_aux = (
-       'lb.client' => [ qw/cppunit:B classads/ ],
-       'lb.client-java' => [ qw/ant:B jglobus jdk:B/ ],
-       'lb.common' => [ qw/expat cppunit:B classads/ ],
-       'lb.doc' => [],
-       'lb.logger' => [ qw/cppunit:B/ ],
-       'lb.server' => [ qw/globus_essentials:R globus:B expat cares mysql:R mysql-server:R mysql-devel:B cppunit:B gsoap:B classads voms lcas gridsite/ ],
-       'lb.state-machine' => [ qw/classads/ ],
-       'lb.utils' => [ qw/cppunit:B/ ],
-       'lb.ws-interface' => [],
-       'lb.ws-test' => [ qw/gsoap:B/ ],
-       'lb.types' => [ qw// ],
-       'lb.glite-LB' => [ qw/fetchcrl:R gpt:R gip_release:R gip_service:R bdii:R glite_version:R glite_info_templates:R glue_schema:R yaim:R/ ],
-       'lbjp-common.db' => [ qw/mysql:R mysql-devel:B/ ],
-       'lbjp-common.maildir' => [ qw// ],
-       'lbjp-common.server-bones' => [ qw// ],
-       'lbjp-common.trio' => [ qw/cppunit:B/ ],
-       'lbjp-common.jp-interface' => [ qw/cppunit:B/ ],
-       'security.gss' =>  [ qw/globus_essentials:R globus:B cares cppunit:B/ ],
-       'security.gsoap-plugin' =>  [ qw/cppunit:B globus_essentials:R globus:B cares gsoap:B/ ],
-       'jobid.api-c' =>  [ qw/cppunit:B/ ],
-       'jobid.api-cpp' =>  [ qw/cppunit:B/ ],
-       'jobid.api-java' =>  [ qw/ant:B jdk:B/ ],
-       'jp.client' => [ qw/gsoap libtar globus_essentials:R globus:B/ ],
-        'jp.doc' => [],
-        'jp.index' => [ qw/gsoap globus_essentials:R globus:B/ ],
-        'jp.primary' => [ qw/classads gsoap libtar globus_essentials:R globus:B/ ],
-        'jp.server-common' => [],
-        'jp.ws-interface' => [],
-);
-
-for my $ext (keys %need_externs_aux) {
-       for (@{$need_externs_aux{$ext}}) {
-               /([^:]*)(?::(.*))?/;
-               push @{$need_externs{$ext}},$1;
-               my $type = $2 ? $2 : 'BR';
-               $need_externs_type{$ext}->{$1} = $type;
-       }
-}
-
-%need_jars = (
-       'jobid.api-java' => [ qw/commons-codec/ ],
-);
-
-for my $jar (keys %need_jars) {
-       for (@{$need_jars{$jar}}) {
-               $need_externs_type{$jar}->{$_} = 'BR';  # XXX
-       }
-}
-
-%deps_aux = (
-       'lb.client' => [ qw/
-               lb.types:B lb.common
-               lbjp-common.trio
-               jobid.api-cpp:B jobid.api-c
-               security.gss
-       / ],
-       'lb.client-java' => [ qw/
-               lb.types:B
-               jobid.api-java
-       / ],
-       'lb.common' => [ qw/
-               jobid.api-cpp:B jobid.api-c
-               lb.types:B lbjp-common.trio security.gss
-       / ],
-       'lb.doc' => [ qw/lb.types:B/ ],
-       'lb.logger' => [ qw/
-               lbjp-common.trio
-               jobid.api-c
-               lb.common
-               security.gss
-       / ],
-       'lb.server' => [ qw/
-               lb.ws-interface lb.types:B lb.common lb.state-machine
-               lbjp-common.db lbjp-common.server-bones lbjp-common.trio lbjp-common.maildir
-               jobid.api-c
-               security.gsoap-plugin security.gss
-       / ],
-       'lb.state-machine' => [ qw/lb.types:B lb.common lbjp-common.jp-interface security.gss/ ],
-       'lb.utils' => [ qw/
-               lbjp-common.jp-interface
-               jobid.api-c
-               lbjp-common.trio lbjp-common.maildir
-               lb.client lb.state-machine
-       / ],
-       'lb.ws-test' => [ qw/security.gsoap-plugin lb.ws-interface/ ],
-       'lb.ws-interface' => [ qw/lb.types:B/ ],
-       'lb.types' => [ qw// ],
-       'lb.glite-LB' => [ qw/
-               lb.logger:R lb.server:R lb.utils:R lb.doc:R
-               lb.ws-test:R
-       / ],
-       'lbjp-common.db' => [ qw/lbjp-common.trio/ ],
-       'lbjp-common.maildir' => [ qw// ],
-       'lbjp-common.server-bones' => [ qw// ],
-       'lbjp-common.trio' => [ qw// ],
-       'security.gss' =>  [ qw// ],
-       'security.gsoap-plugin' =>  [ qw/security.gss/ ],
-       'jobid.api-c' =>  [ qw// ],
-       'jobid.api-cpp' =>  [ qw/jobid.api-c/ ],
-       'jobid.api-java' =>  [ qw// ],
-
-       'lbjp-common.jp-interface' => [ qw/lbjp-common.db jobid.api-c/ ],
-
-       'jp.client' => [ qw/
-                jp.ws-interface
-                lbjp-common.jp-interface lbjp-common.maildir
-                jobid.api-c
-                security.gsoap-plugin
-        / ],
-       'jp.doc' => [ qw// ],
-       'jp.index' => [ qw/
-                jp.server-common jp.ws-interface
-                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
-                security.gsoap-plugin
-        / ],
-       'jp.primary' => [ qw/
-                jobid.api-c
-                jp.server-common jp.ws-interface
-                lb.state-machine
-                lbjp-common.jp-interface lbjp-common.trio lbjp-common.db lbjp-common.server-bones
-                security.gsoap-plugin
-        / ],
-       'jp.server-common' => [ qw/ 
-                lbjp-common.jp-interface lbjp-common.db
-        / ],
-       'jp.ws-interface' => [ qw// ],
-);
-
-for my $ext (keys %deps_aux) {
-       for (@{$deps_aux{$ext}}) {
-               /([^:]*)(?::(.*))?/;
-               push @{$deps{$ext}},$1;
-               my $type = $2 ? $2 : 'BR';
-               $deps_type{$ext}->{$1} = $type;
-       }
-}
-
-
-%extrafull = ( gridsite=>'org.gridsite.core');
-
-#( java => 'client-java' );
-%extranodmod = (
-       db => 'lbjp-common.db',
-       jpprimary => 'jp.primary',
-       jpindex => 'jp.index',
-       jpclient => 'jp.client',
-);
-
-my @t = qw/lb.client-java jobid.api-java lb.types/;
-@topbuild{@t} = (1) x ($#t+1);
-}
-
-sub full
-{
-       my $short = shift;
-       return $extrafull{$short} ? $extrafull{$short} : 'org.glite.'.$short;
-}
-
-sub mkinc
-{
-       my %aux;
-       undef %aux;
-       my @m=qw/
-lb.client lb.doc lb.state-machine lb.ws-interface lb.logger lb.types lb.common lb.server lb.utils lb.ws-test lb.client-java
-security.gss security.gsoap-plugin
-jobid.api-c jobid.api-cpp jobid.api-java
-lbjp-common.db lbjp-common.maildir lbjp-common.server-bones lbjp-common.trio lbjp-common.jp-interface
-jp.client jp.doc jp.index jp.primary jp.server-common jp.ws-interface
-/;
-       @aux{@m} = (1) x ($#m+1);
-
-       my $short = shift;
-       my $full = full $short;
-
-       unless ($aux{$short}) {
-               print "Makefile.inc not needed in $full\n";
-               return;
-       }
-
-       my $build = '';
-       
-       unless ($topbuild{$_}) {
-               $build = '/build';
-               unless (-d "$full/build") {
-                       mkdir "$full/build" or die "mkdir $full/build: $!\n";
-               }
-               unlink "$full/build/Makefile";
-               symlink "../Makefile","$full/build/Makefile" or die "symlink ../Makefile $full/build/Makefile: $!\n";
-       }
-
-       open MKINC,">$full$build/Makefile.inc"
-               or die "$full$build/Makefile.inc: $!\n";
-
-       print "Creating $full$build/Makefile.inc\n";
-
-       print MKINC qq{
-PREFIX = $prefix
-stagedir = $stagedir
-thrflavour = $thrflavour
-nothrflavour = $nothrflavour
-libdir = $libdir
-};
-
-       for (@{$need_externs{$short}}) {
-               print MKINC "${_}_prefix = $extern_prefix{$_}\n"
-       }
-
-       for (@{$need_jars{$short}}) {
-               print MKINC "${_}_jar = $jar{$_}\n"
-       }
-
-       my $need_gsoap = 0;
-       for (@{$need_externs{$short}})  { $need_gsoap = 1 if $_ eq 'gsoap'; }
-
-       print MKINC "gsoap_default_version=".gsoap_version()."\n"  if $need_gsoap;
-
-       close MKINC;
-}
-
-my %etics_externs;
-my %etics_projects;
-BEGIN{
-       %etics_externs = (
-               globus_essentials=>'vdt_globus_essentials',
-               globus=>'globus',
-               cares=>'c-ares',
-               voms=>'org.glite.security.voms-api-cpp',
-               gridsite=>'org.gridsite.shared',
-               lcas=>'org.glite.security.lcas',
-               trustmanager=>'org.glite.security.trustmanager',
-               utiljava=>'org.glite.security.util-java',
-               yaim=>'org.glite.yaim.lb',
-               gpt=>'gpt',
-               fetchcrl=>'fetch-crl',
-               gip_release=>'glite-info-provider-release',
-               gip_service=>'glite-info-provider-service',
-               bdii=>'bdii',
-               glite_version=>'glite-version',
-               glite_info_templates=>'glite-info-templates',
-               glue_schema=>'glue-schema',
-       );
-       %etics_projects = (
-               vdt=>[qw/globus globus_essentials/],
-               'org.glite'=>[qw/voms gridsite lcas gpt gip_release gip_service bdii glite_version glite_info_templates glue_schema yaim/],
-       );
-};
-
-sub mode_etics {
-       $fmod = shift;
-
-       die "$0: --module required with --etics\n" unless $fmod;
-       
-       my ($subsys,$module) = split /\./,$fmod;
-
-       my ($major,$minor,$rev,$age);
-
-       if ($version) {
-               $version =~ /([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)-(.+)/;
-               ($major,$minor,$rev,$age) = ($1,$2,$3,$4);
-       }
-       else { 
-               open V,"org.glite.$subsys.$module/project/version.properties"
-                       or die "org.glite.$subsys.$module/project/version.properties: $!\n";
-       
-               while ($_ = <V>) {
-                       chomp;
-                       ($major,$minor,$rev) = ($1,$2,$3) if /module\.version\s*=\s*([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/;
-                       $age = $1 if /module\.age\s*=\s*([[:digit:]]+)/;
-               }
-               close V;
-       }
-
-       my @copts = ();
-       my %ge;
-       @ge{@{$etics_projects{'org.glite'}}} = (1) x ($#{$etics_projects{'org.glite'}}+1);
-
-       for (@{$need_externs{"$subsys.$module"}}) {
-           if ($need_externs_type{"$subsys.$module"}->{$_}=~/B/) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-               push @copts,$ge{$_} ? "--with-$_=\${stageDir}" : "--with-$_=\${$eext.location}";
-           }
-       }
-
-       for (@{$need_jars{"$subsys.$module"}}) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-
-               push @copts,"--with-$_ \${$eext.location}/$_*.jar";
-       }
-
-
-       my $conf = "glite-$subsys-${module}_R_${major}_${minor}_${rev}_${age}";
-       my $file = $output ? $output : "$conf.ini";
-       open C,">$file" or die "$file: $!\n";
-
-       my $buildroot = $topbuild{"$subsys.$module"} ? '' : "build.root = build\n";
-
-       my $confdir = $topbuild{"$subsys.$module"} ? '..' : '../..';
-
-       print STDERR "Writing $file\n";
-       print C qq{
-[Configuration-$conf]
-profile = None
-moduleName = org.glite.$subsys.$module
-displayName = $conf
-description = org.glite.$subsys.$module
-projectName = org.glite
-age = $age
-deploymentType = None
-tag = $conf
-version = $major.$minor.$rev
-path = \${projectName}/\${moduleName}/\${version}/\${platformName}/\${packageName}-\${version}-\${age}.tar.gz
-
-[Platform-default:VcsCommand]
-displayName = None
-description = None
-tag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName}
-branch = None
-commit = None
-checkout = cvs -d \${vcsroot} co -r \${tag} \${moduleName}
-
-[Platform-default:BuildCommand]
-postpublish = None
-packaging = None
-displayName = None
-description = None
-doc = None
-prepublish = None
-publish = None
-compile = make
-init = None
-install = make install
-clean = make clean
-test = make check
-configure = cd $confdir && \${moduleName}/configure --thrflavour=\${globus.thr.flavor} --nothrflavour=\${globus.nothr.flavor} --prefix=\${prefix} --stage=\${stageDir} --libdir=\${libdir} --module $subsys.$module @copts
-checkstyle = None
-
-[Platform-default:Property]
-$buildroot
-
-[Platform-default:DynamicDependency]
-
-};
-       for (@{$need_externs{"$subsys.$module"}},@{$need_jars{"$subsys.$module"}}) {
-               my $eext = $etics_externs{$_} ? $etics_externs{$_} : $_;
-
-               my $proj = 'externals';
-               for my $p (keys %etics_projects) {
-                       for $m (@{$etics_projects{$p}}) {
-                               $proj = $p if $m eq $_;
-                       }
-               }
-
-               my $type = $need_externs_type{"$subsys.$module"}->{$_};
-               print C "$proj|$eext = $type\n";
-       }
-
-       for (@{$deps{"$subsys.$module"}}) {
-               my $type = $deps_type{"$subsys.$module"}->{$_};
-               print C "org.glite|org.glite.$_ = $type\n";
-       }
-
-       close C;
-}
-
-sub gsoap_version {
-       local $_;
-       my $gsoap_version;
-       open S,"$extern_prefix{gsoap}/bin/soapcpp2 -v 2>&1 |" or die "$extern_prefix{gsoap}/bin/soapcpp2: $!\n";
-
-       while ($_ = <S>) {
-               chomp;
-
-               $gsoap_version = $1 if /The gSOAP Stub and Skeleton Compiler for C and C\+\+ ([.[:digit:][:alpha:]]+)$/;
-       }
-       close S;
-       return $gsoap_version;
-}
-
-
-sub usage {
-       my @ext = keys %extern_prefix;
-       my @myjars, keys %jar;
-
-       print STDERR qq{
-usage: $0 options
-
-General options (defaults in []):
-  --prefix=PREFIX              destination directory [./stage]
-  --staged=module,module,...   what is already in PREFIX (specify without org.glite.)
-  --thrflavour=flavour
-  --nothrflavour=flavour       threaded and non-treaded flavours [gcc64dbgpthr,gcc64dbg]
-  --listmodules=subsys          list modules of a subsystem
-  --libdir=libdir              typically [lib,lib64] postfix
-  
-Mode of operation:
-  --mode={checkout|build|etics}        what to do [build]
-  
-What to build:
-  --module=module              build this module only (mostly in-Etics operation)
-  --enable-NODE                        build this "node" (set of modules) only. Available nodes are
-                                       @{$lbmodules{lb}},@{$lbmodules{security}}
-  --disable-NODE               don't build this node
-  --lb-tag=tag                 checkout LB modules with specific tag
-  --jp-tag=tag                 checkout JP modules with specific tag
-  --lbjp-common-tag=tag         checkout lbjp-common modules with specific tag
-  --security-tag=tag           checkout security modules with specific tag
-  --jobid-tag=tag              checkout jobid modules with specific tag
-
-Dependencies:
-  --with-EXTERNAL=PATH         where to look for an external. Required externals
-                               (not all for all modules) are:
-                                       @ext
-  --with-JAR=JAR               where to look for jars. Required jars are:
-                                       @myjars
-                               Summary of what will be used is always printed
-
-};
-
-}
diff --git a/org.glite.lb/deployment/README b/org.glite.lb/deployment/README
deleted file mode 100644 (file)
index 9b104e6..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-deploy_all.diff - against RC31
-deploy_lb, deploy_jp - older patches
diff --git a/org.glite.lb/deployment/deploy_all.diff b/org.glite.lb/deployment/deploy_all.diff
deleted file mode 100644 (file)
index fbfb5c9..0000000
+++ /dev/null
@@ -1,551 +0,0 @@
-Index: org.glite/project/global.dependencies.properties
-===================================================================
-RCS file: /cvs/jra1mw/org.glite/project/global.dependencies.properties,v
-retrieving revision 1.482.2.279.2.61
-diff -u -r1.482.2.279.2.61 global.dependencies.properties
---- org.glite/project/global.dependencies.properties   23 Apr 2007 09:54:21 -0000      1.482.2.279.2.61
-+++ org.glite/project/global.dependencies.properties   24 Apr 2007 08:20:35 -0000
-@@ -2100,6 +2100,24 @@
- ext.globus-sdk.rpm.version = ${ext.vdt.version}
- ext.globus-sdk.rpm.age     = ${ext.vdt.age}
-+# Globus vdt data server - grid ftp server
-+ext.globus-data-server.name           = ${ext.globus.name}
-+ext.globus-data-server.vendor         = ${ext.globus.vendor}
-+ext.globus-data-server.version                = ${ext.globus.version}
-+ext.globus-data-server.platform               = ${platform}
-+ext.globus-data-server.subdir         = ${ext.globus-data-server.name}/${ext.globus-data-server.version}/${ext.globus-data-server.platform}
-+ext.globus-data-server.rep.base               = ${jra1.rep.base}
-+ext.globus-data-server.rep.file               = 
-+ext.globus-data-server.rep.subdir     =
-+ext.globus-data-server.rep.url                = ${ext.globus-data-server.rep.base}/${ext.globus-data-server.subdir}/${ext.globus-data-server.rep.subdir}/${ext.globus-data-server.rep.file}
-+ext.globus-data-server.files          =
-+ext.globus-data-server.download               = http://www.cs.wisc.edu/vdt/releases/1.2.2/installing-rpms.html
-+ext.globus-data-server.homepage               = http://www.cs.wisc.edu/vdt//index.html
-+ext.globus-data-server.description    = The Globus Toolkit(R). This is the version packaged by VDT.
-+ext.globus-data-server.rpm.name       = vdt_globus_data_server
-+ext.globus-data-server.rpm.version    = ${ext.vdt.version}
-+ext.globus-data-server.rpm.age                = 1
-+                                      
- # google-perftools
- ext.google-perftools.name        = google-perftools
- ext.google-perftools.vendor      = google-perftools
-@@ -3855,31 +3873,31 @@
- # System dependencies
- ###################################################################
--org.glite.deployment.version                    = glite-deployment_branch_2_5_0
-+org.glite.deployment.version                    = HEAD
- org.glite.testsuites.version                    = HEAD
--org.glite.version                               = glite_branch_3_1_0
-+org.glite.version                               = HEAD
--#subsystem version tag = do not remove
-+#subsystem version tag = HEAD
- org.glite.slcs.version                                = HEAD
--org.glite.amga.version                          = glite-amga_R_1_0_0_2
-+org.glite.amga.version                          = HEAD
- org.glite.bdii.version                                = HEAD
--org.glite.ce.version                            = glite-ce_R_1_7_13_0
--org.glite.data.version                          = glite-data_R_3_1_17_1
--org.glite.dgas.version                          = glite-dgas_R_3_1_9_1
--org.glite.gpbox.version                         = glite-gpbox_R_1_3_0
-+org.glite.ce.version                            = HEAD
-+org.glite.data.version                          = HEAD
-+org.glite.dgas.version                          = HEAD
-+org.glite.gpbox.version                         = HEAD
- org.glite.info.version                                = HEAD
--org.glite.jdl.version                           = glite-jdl_R_3_1_11_1
--org.glite.jp.version                          = glite-jp_R_1_3_5_1
--org.glite.lb.version                            = glite-lb_R_1_4_1_1
-+org.glite.jdl.version                           = HEAD
-+org.glite.jp.version                          = HEAD
-+org.glite.lb.version                            = HEAD
- org.glite.overlay.version                     = HEAD
--org.glite.rgma.version                          = glite-rgma_R_5_0_66_1
--org.glite.security.version                      = glite-security_R_3_1_35_1
--org.glite.service-discovery.version             = glite-service-discovery_R_2_0_14
--org.glite.templates-latex-style.version         = glite-templates-latex-style_R_1_0_1
--org.glite.wms-ui.version                        = glite-wms-ui_R_3_1_17_1
--org.glite.wms-utils.version                     = glite-wms-utils_R_3_1_8
--org.glite.wms.version                           = glite-wms_R_3_1_56_1
-+org.glite.rgma.version                          = HEAD
-+org.glite.security.version                      = HEAD
-+org.glite.service-discovery.version             = HEAD
-+org.glite.templates-latex-style.version         = HEAD
-+org.glite.wms-ui.version                        = HEAD
-+org.glite.wms-utils.version                     = HEAD
-+org.glite.wms.version                           = HEAD
--org.gridsite.core.version                       = gridsite-core_R_1_1_18_1
-+org.gridsite.core.version                       = HEAD
- org.gridsite.ws.version                         = HEAD
-Index: org.glite.deployment/build.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/build.xml,v
-retrieving revision 1.62
-diff -u -r1.62 build.xml
---- org.glite.deployment/build.xml     22 Aug 2005 17:00:02 -0000      1.62
-+++ org.glite.deployment/build.xml     24 Apr 2007 08:20:35 -0000
-@@ -814,6 +814,39 @@
-               </if>
-       </target>
-+      <target name="jpps" unless="setenvonly" depends="envset,config">
-+              <if>
-+                      <isset property="small.memory"/>
-+                      <then>
-+                              <exec dir="${deployment.subsystem.dir}.jpps" executable="${antExec}" failonerror="${failonerror}">
-+                                      <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot; &quot;-Dbuild.name=${build.name}&quot;"/>
-+                              </exec>
-+                      </then>
-+                      <else>
-+                              <ant dir="${deployment.subsystem.dir}.jpps"
-+                                      target="${target}"
-+                                      inheritall="false" />
-+                      </else>
-+              </if>
-+      </target>
-+
-+
-+      <target name="jpis" unless="setenvonly" depends="envset,config">
-+              <if>
-+                      <isset property="small.memory"/>
-+                      <then>
-+                              <exec dir="${deployment.subsystem.dir}.jpis" executable="${antExec}" failonerror="${failonerror}">
-+                                      <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot; &quot;-Dbuild.name=${build.name}&quot;"/>
-+                              </exec>
-+                      </then>
-+                      <else>
-+                              <ant dir="${deployment.subsystem.dir}.jpis"
-+                                      target="${target}"
-+                                      inheritall="false" />
-+                      </else>
-+              </if>
-+      </target>
-+
-       <target name="io-server" unless="setenvonly" depends="envset,config">
-               <if>
-                       <isset property="small.memory"/>
-@@ -891,6 +924,8 @@
-                                       wn,
-                                       wms,
-                                       lb,
-+                                      jpps,
-+                                      jpis,
-                                       io-server,
-                                       io-client,
-                                       ce,
-Index: org.glite.deployment/project/dependencies.properties
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/project/dependencies.properties,v
-retrieving revision 1.529
-diff -u -r1.529 dependencies.properties
---- org.glite.deployment/project/dependencies.properties       21 Jun 2006 09:29:08 -0000      1.529
-+++ org.glite.deployment/project/dependencies.properties       24 Apr 2007 08:20:35 -0000
-@@ -33,6 +33,8 @@
- org.glite.deployment.wn.version                               = HEAD
- org.glite.deployment.wms.version                              = HEAD
- org.glite.deployment.lb.version                               = HEAD
-+org.glite.deployment.jpps.version                               = HEAD
-+org.glite.deployment.jpis.version                               = HEAD
- org.glite.deployment.io-server.version                        = HEAD
- org.glite.deployment.io-client.version                        = HEAD
- org.glite.deployment.ce.version                               = HEAD
-Index: org.glite.deployment/project/glite.deployment.csf.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/project/glite.deployment.csf.xml,v
-retrieving revision 1.46
-diff -u -r1.46 glite.deployment.csf.xml
---- org.glite.deployment/project/glite.deployment.csf.xml      31 Jul 2006 09:53:53 -0000      1.46
-+++ org.glite.deployment/project/glite.deployment.csf.xml      24 Apr 2007 08:20:35 -0000
-@@ -392,6 +392,14 @@
-                       <equals arg1="${org.glite.deployment.lb.version}" arg2="HEAD" />
-               </condition>
-+              <condition property="jpps.head">
-+                      <equals arg1="${org.glite.deployment.jpps.version}" arg2="HEAD" />
-+              </condition>
-+
-+              <condition property="jpis.head">
-+                      <equals arg1="${org.glite.deployment.jpis.version}" arg2="HEAD" />
-+              </condition>
-+
-               <condition property="io-server.head">
-                       <equals arg1="${org.glite.deployment.io-server.version}" arg2="HEAD" />
-               </condition>
-@@ -835,6 +843,28 @@
-                       tag="${org.glite.deployment.lb.version}" />
-       </target>
-+      <!-- jpps component -->
-+      <target name="jpps" depends="get.jpps.head, get.jpps.tag"/>
-+      <target name="get.jpps.head" if="jpps.head">
-+              <cvs-co package="org.glite.deployment.jpps" />
-+        </target>
-+
-+      <target name="get.jpps.tag" unless="jpps.head">
-+              <cvs-co package="org.glite.deployment.jpps"
-+                      tag="${org.glite.deployment.jpps.version}" />
-+      </target>
-+
-+      <!-- jpis component -->
-+      <target name="jpis" depends="get.jpis.head, get.jpis.tag"/>
-+      <target name="get.jpis.head" if="jpis.head">
-+              <cvs-co package="org.glite.deployment.jpis" />
-+        </target>
-+
-+      <target name="get.jpis.tag" unless="jpis.head">
-+              <cvs-co package="org.glite.deployment.jpis"
-+                      tag="${org.glite.deployment.jpis.version}" />
-+      </target>
-+
-       <!-- io-server component -->
-       <target name="io-server" depends="get.io-server.head, get.io-server.tag"/>
-       <target name="get.io-server.head" if="io-server.head">
-@@ -892,6 +922,8 @@
-                                       wn,
-                                       wms,
-                                       lb,
-+                                      jpis,
-+                                      jpps,
-                                       io-server,
-                                       io-client,
-                                       ce" />
-Index: org.glite.deployment.lb/config/scripts/glite-lb-config.py
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/scripts/glite-lb-config.py,v
-retrieving revision 1.66
-diff -u -r1.66 glite-lb-config.py
---- org.glite.deployment.lb/config/scripts/glite-lb-config.py  13 Mar 2006 15:22:31 -0000      1.66
-+++ org.glite.deployment.lb/config/scripts/glite-lb-config.py  24 Apr 2007 08:20:35 -0000
-@@ -121,6 +121,10 @@
-         if not os.path.exists('/tmp/mysql.sock'):
-             os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock')
-             
-+        #-------------------------------------------------------------------
-+        # start bkserver
-+        #-------------------------------------------------------------------
-+
-         pid = glib.getPID('bkserverd')
-         if pid != 0:
-             print 'The gLite LB Server service is already running. Restarting...'
-@@ -133,7 +137,7 @@
-         pid = glib.getPID('bkserverd')
-         if (pid != 0):
--            print "The gLite LB Server service has been started               ",
-+            print "The gLite LB Server service has been started              ",
-             glib.printOkMessage()
-         else:
-             glib.printErrorMessage("Could not start the gLite LB Server service")
-@@ -142,6 +146,36 @@
-             return 1
-         
-         #-------------------------------------------------------------------
-+        # start jp-importer, if enabled
-+        #-------------------------------------------------------------------
-+
-+        lb_import = 0
-+        if params.has_key('lb.import.enabled'):
-+            if params['lb.import.enabled'] == "true":
-+                lb_import = 1
-+
-+        if lb_import:
-+            pid = glib.getPID('jp-importer')
-+            if pid != 0:
-+                print 'The gLite JP Importer service is already running. Restarting...'
-+                os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION'])
-+            else:
-+                print 'Starting the gLite JP Importer service...'
-+
-+            os.system('%s/etc/init.d/glite-jp-importer start' % os.environ['GLITE_LOCATION'])
-+
-+            pid = glib.getPID('jp-importer')
-+
-+            if (pid != 0):
-+                print "The gLite JP Importer service has been started            ",
-+                glib.printOkMessage()
-+            else:
-+                glib.printErrorMessage("Could not start the gLite JP Importer service")
-+                glib.printErrorMessage("Please verify and re-run the script                        "),
-+                glib.printFailedMessage()
-+                return 1
-+        
-+        #-------------------------------------------------------------------
-         # Start Servicetool
-         #-------------------------------------------------------------------
-@@ -161,6 +195,10 @@
-         if (pid != 0):
-             os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION'])
-+        #-------------------------------------------------------------------
-+        # Book Keeping Server
-+        #-------------------------------------------------------------------
-+
-         pid = glib.getPID('bkserverd')
-         if (pid != 0):
-             print 'Could not stop the LB Server service            ',
-@@ -171,6 +209,25 @@
-             glib.printOkMessage()
-         
-         #-------------------------------------------------------------------
-+        # JP Importer
-+        #-------------------------------------------------------------------
-+
-+        pid = glib.getPID('jp-importer')
-+        if (pid != 0):
-+            os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION'])
-+
-+        pid = glib.getPID('jp-importer')
-+        if (pid != 0):
-+            print 'Could not stop the JP Importer service                  ',
-+            glib.printFailedMessage()
-+            error_level = 1
-+        else:
-+            if params.has_key('lb.import.enabled'):
-+                if params['lb.import.enabled'] == "true":
-+                    print 'The JP Importer service has been stopped                  ',
-+                    glib.printOkMessage()
-+        
-+        #-------------------------------------------------------------------
-         # MySQL
-         #-------------------------------------------------------------------
-@@ -195,6 +252,10 @@
-         if retval != 0:
-             error_level = 1
-+        retval = os.system('%s/etc/init.d/glite-jp-importer status' % os.environ['GLITE_LOCATION'])
-+        if retval != 0:
-+            error_level = 1
-+
-         #-------------------------------------------------------------------
-         # Servicetool
-         #-------------------------------------------------------------------
-@@ -325,7 +386,29 @@
-             print "\n==> MySQL database %s already exist\n" % params['lb.database.name']
-             
-         self.mysql.stop()
--    
-+
-+        # ------------------------------------------------------------------
-+        # export from bkserver to cron
-+        # ------------------------------------------------------------------
-+      if (params['GLITE_LB_PURGE_ENABLED'] == "true") or (params['GLITE_LB_EXPORT_ENABLED'] == "true"):
-+          file = open('%s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'], 'w')
-+          file.write('#! /bin/sh\n')
-+          file.write('. %s\n' % glib.getInstallerExportFile())
-+            file.write('$GLITE_LOCATION/sbin/glite-lb-export.sh\n')
-+          file.close()
-+            os.system('/bin/chmod 0755 %s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'])
-+
-+          file = open('/etc/cron.d/glite-lb-export.cron', 'w')
-+          file.write('# periodically run purge and export jobs from bkserver\n')
-+          file.write('00,30 * * * * %s %s/etc/glite-lb-export-cron-wrapper.sh 1>/dev/null\n' % (params['glite.user.name'], os.environ['GLITE_LOCATION']))
-+          file.close()
-+            os.system('/bin/chmod 0644 /etc/cron.d/glite-lb-export.cron')
-+        else:
-+            os.system('/bin/rm -f /etc/cron.d/glite-lb-export.cron')
-+
-+            # Touch cron spool directory to cause reloading of the crontabs
-+            os.system("/bin/touch /var/spool/cron")
-+
-         #-------------------------------------------------------------------
-         # RGMA servicetool: configure servicetool
-         #-------------------------------------------------------------------
-@@ -411,6 +494,21 @@
-     # Perl
-     glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION']))
-+    # LB export
-+    glib.export('GLITE_LB_PURGE_ENABLED', params['lb.purge.enabled']);
-+    glib.export('GLITE_LB_EXPORT_ENABLED', params['lb.export.enabled']);
-+    glib.export('GLITE_LB_IMPORT_ENABLED', params['lb.import.enabled']);
-+    glib.export('GLITE_LB_EXPORT_JPPS', params['lb.export.jpps']);
-+    glib.export('GLITE_LB_EXPORT_JPREG_MAILDIR', params['lb.export.jpreg']);
-+    glib.export('GLITE_LB_EXPORT_JPDUMP_MAILDIR', params['lb.export.jpdump']);
-+    glib.export('GLITE_LB_EXPORT_DUMPDIR', params['lb.export.dump']);
-+    glib.export('GLITE_LB_EXPORT_DUMPDIR_KEEP', params['lb.export.dump.keep']);
-+    glib.export('GLITE_LB_EXPORT_JOBSDIR', params['lb.export.jobs']);
-+    glib.export('GLITE_LB_EXPORT_JOBSDIR_KEEP', params['lb.export.jobs.keep']);
-+    glib.export('GLITE_LB_EXPORT_PURGEDIR', params['lb.export.purge']);
-+    glib.export('GLITE_LB_EXPORT_PURGEDIR_KEEP', params['lb.export.purge.keep']);
-+    glib.export('GLITE_LB_EXPORT_PURGE_ARGS', '%s' % params['lb.export.purgeargs']);
-+
-     # Set environment
-     glib.setUserEnv()
-     
-Index: org.glite.deployment.lb/config/templates/glite-lb.cfg.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/templates/glite-lb.cfg.xml,v
-retrieving revision 1.21
-diff -u -r1.21 glite-lb.cfg.xml
---- org.glite.deployment.lb/config/templates/glite-lb.cfg.xml  13 Mar 2006 15:19:21 -0000      1.21
-+++ org.glite.deployment.lb/config/templates/glite-lb.cfg.xml  24 Apr 2007 08:20:35 -0000
-@@ -17,9 +17,16 @@
-                       parameter. Leave it empty of comment it out to use the same as 'glite.user.name'"
-                       value="changeme"/>
-               
--          <mysql.root.password
--              description="The mysql root password"
--              value="changeme"/>
-+              <mysql.root.password
-+                      description="The mysql root password"
-+                      value="changeme"/>
-+
-+              <lb.export.jpps
-+                      description="Job Provenance Primary Storage.
-+                              [Example: localhost:8901][Type: string]"
-+                      value="changeme"/>
-+
-+
-       
-               <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-               <!-- Advanced parameters - Change them if you know what you're doing -->
-@@ -55,6 +62,28 @@
-                               [Example: 17M][Type: Integer][Unit: MB]"
-                       value="17M"/>
-+              <lb.purge.enabled
-+                      description="Enables regular purge of LB database. 
-+                              Data are stored in lb.export.purge directory (specify below)
-+                              [Example: true][Type: boolean]"
-+                      value="true"/>
-+
-+              <lb.export.enabled
-+                      description="Enables processing of purged data into lb.export.jpdump
-+                              maildir directories (specify below) and export of job registrations 
-+                              from LB to lb.export.jpreg maildir directories (specify below).
-+                              [Example: true][Type: boolean]"
-+                      value="true"/>
-+
-+              <lb.import.enabled
-+                      description="Enables import of data stored in maildirs to Job Provenance.
-+                              lb.export.enabled must be set to true, to take any real effect.
-+                              [Example: true][Type: boolean]"
-+                      value="true"/>
-+
-+
-+
-+
-               <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-               <!-- System parameters - You should leave these alone -->
-               <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->               
-@@ -67,7 +96,44 @@
-                       <value>destination</value>
-               </lb.index.list>
--                      
-+
-+              <lb.export.jpreg
-+                      description="Spool directory where job registration requests are stored before delivered to JPPS.
-+                              [Type: string]"
-+                      value="/tmp/jpreg"/>
-+
-+              <lb.export.jpdump
-+                      description="Spool directory where dump upload requests are stored before delivered to JPPS.
-+                              [Type: string]"
-+                      value="/tmp/jpdump"/>
-+
-+              <lb.export.purge
-+                      description="Temporary directory for dumps of purged jobs.
-+                              [Type: string]"
-+                      value="/tmp/purge"/>
-+
-+              <lb.export.purge.keep
-+                      description="Directory for dumps of jobs that were already handled (sent to JPPS).
-+                              If empty, processed dumps of purged jobs are deleted.
-+                              [Type: string]"
-+                      value=""/>
-+
-+              <lb.export.jobs
-+                      description="Exported events in file per job form before delivered to JPPS.
-+                              [Type: string]"
-+                      value="/tmp/lb_export"/>
-+
-+              <lb.export.jobs.keep
-+                      description="Keep the already handled exported events in file per job form.
-+                              If empty, processed job files are deleted.
-+                              [Type: string]"
-+                      value=""/>
-+
-+              <lb.export.purgeargs
-+                      description="Arguments for LB purge process (a job in a given terminal state will be exported from the LB after timeouts defined here). See also glite-lb-purge documentation.
-+                              [Example: -c 1h -a 1h -n 1h -o 1d][Type: string]"
-+                      value="--cleared 2d --aborted 2w --cancelled 2w --other 2m"/>
-+
-       </parameters>
- </config>
-Index: org.glite.deployment.lb/project/glite-lb.sdf.xml.template
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/project/glite-lb.sdf.xml.template,v
-retrieving revision 1.38
-diff -u -r1.38 glite-lb.sdf.xml.template
---- org.glite.deployment.lb/project/glite-lb.sdf.xml.template  13 Mar 2006 15:19:21 -0000      1.38
-+++ org.glite.deployment.lb/project/glite-lb.sdf.xml.template  24 Apr 2007 08:20:35 -0000
-@@ -15,7 +15,7 @@
-                                       build="@org.glite.deployment.config.info.build@"
-                                       arch="noarch"/>
-                                       
--                              <component name="glite-LB"
-+                              <component name="glite-lb-config"
-                                       version="@module.version@"
-                                       age="@module.age@"
-                                       build="@module.build@"
-@@ -57,6 +57,12 @@
-                                       build="@org.glite.lb.server-bones.info.build@"
-                                       arch="i386"/>
-                                          
-+                              <component name="glite-lb-client"
-+                                      version="@org.glite.lb.client.info.version@"
-+                                      age="@org.glite.lb.client.info.age@"
-+                                      build="@org.glite.lb.client.info.build@"
-+                                      arch="i386"/>
-+                                         
-                               <component name="glite-wms-utils-jobid"
-                                       version="@org.glite.wms-utils.jobid.info.version@"
-                                       age="@org.glite.wms-utils.jobid.info.age@"
-@@ -105,6 +111,12 @@
-                     build="@org.glite.jp.ws-interface.info.build@"
-                     arch="i386"/>
-+                              <component name="glite-jp-client"
-+                    version="@org.glite.jp.client.info.version@"
-+                    age="@org.glite.jp.client.info.age@"
-+                    build="@org.glite.jp.client.info.build@"
-+                    arch="i386"/>
-+
-                 <component name="gridsite"
-                     version="@org.gridsite.core.info.version@"
-                     age="@org.gridsite.core.info.age@"
-Index: org.glite.deployment.lb/project/properties.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/project/properties.xml,v
-retrieving revision 1.3
-diff -u -r1.3 properties.xml
---- org.glite.deployment.lb/project/properties.xml     13 Mar 2006 15:19:21 -0000      1.3
-+++ org.glite.deployment.lb/project/properties.xml     24 Apr 2007 08:20:35 -0000
-@@ -62,15 +62,15 @@
-                Define extra properties here ...
-                ====================================================== -->
-                
--      <property name="build.package.name" value="glite-LB"/>
-+      <property name="build.package.name" value="glite-lb-config"/>
-       <property name="build.package.summary" value="gLite Logging and Bookkeeping node configuration files" />
-       <property name="build.package.description" value="gLite Logging and Bookkeeping node configuration files" />
-       <property name="build.package.files" value="
- %attr(755,root,root) %{prefix}/etc/config/scripts/glite-lb-config.py\n
- %attr(600,root,root) %{prefix}/etc/config/templates/glite-lb.cfg.xml\n
--%attr(644,root,root) %{prefix}/share/doc/glite-LB/release_notes/release_notes.doc\n
--%attr(644,root,root) %{prefix}/share/doc/glite-LB/release_notes/release_notes.pdf\n
--%attr(644,root,root) %{prefix}/share/doc/glite-LB/release_notes/release_notes.html\n"/>
-+%attr(644,root,root) %{prefix}/share/doc/glite-lb/release_notes/release_notes.doc\n
-+%attr(644,root,root) %{prefix}/share/doc/glite-lb/release_notes/release_notes.pdf\n
-+%attr(644,root,root) %{prefix}/share/doc/glite-lb/release_notes/release_notes.html\n"/>
-       <property name="build.package.obsolete" value="glite-lb-config"/>
- </project>
diff --git a/org.glite.lb/deployment/deploy_jp.diff b/org.glite.lb/deployment/deploy_jp.diff
deleted file mode 100644 (file)
index 76a9fa7..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-This patch was merged to deploy_all.diff, don't use it anymore
-
-Index: org.glite/project/global.dependencies.properties
-===================================================================
-RCS file: /cvs/jra1mw/org.glite/project/global.dependencies.properties,v
-retrieving revision 1.479.2.70.2.3.2.3.2.1
-diff -u -r1.479.2.70.2.3.2.3.2.1 global.dependencies.properties
---- org.glite/project/global.dependencies.properties   9 May 2006 16:17:50 -0000       1.479.2.70.2.3.2.3.2.1
-+++ org.glite/project/global.dependencies.properties   30 Jun 2006 11:13:49 -0000
-@@ -15,7 +15,7 @@
- # Authors: Joachim Flammer <joachim.flammer@cern.ch>          
- #
- # Version info: $Id$
--# Release: $Name$
-+# Release: $Name$
- # 
- # Revision history:
- # $Log$
- # Revision 1.3  2006/06/30 11:30:28  mmulac
- # actualized patches
- # - against org.glite a org.glite.deployment from glite_R_3_0_0
- #
-@@ -1562,7 +1562,26 @@
- ext.globus-sdk.rpm.name    = vdt_globus_sdk
- ext.globus-sdk.rpm.version = ${ext.vdt.version}
- ext.globus-sdk.rpm.age     = 1
--                                      
-+  
-+# Globus vdt data server - grid ftp server
-+ext.globus-data-server.name           = ${ext.globus.name}
-+ext.globus-data-server.vendor         = ${ext.globus.vendor}
-+ext.globus-data-server.version                = ${ext.globus.version}
-+ext.globus-data-server.platform               = ${platform}
-+ext.globus-data-server.subdir         = ${ext.globus-data-server.name}/${ext.globus-data-server.version}/${ext.globus-data-server.platform}
-+ext.globus-data-server.rep.base               = ${jra1.rep.base}
-+ext.globus-data-server.rep.file               =
-+ext.globus-data-server.rep.subdir     =
-+ext.globus-data-server.rep.url                = ${ext.globus-data-server.rep.base}/${ext.globus-data-server.subdir}/${ext.globus-data-server.rep.subdir}/${ext.globus-data-server.rep.file}
-+ext.globus-data-server.files          =
-+ext.globus-data-server.download               = http://www.cs.wisc.edu/vdt/releases/1.2.2/installing-rpms.html
-+ext.globus-data-server.homepage               = http://www.cs.wisc.edu/vdt//index.html
-+ext.globus-data-server.description    = The Globus Toolkit(R). This is the version packaged by VDT.
-+ext.globus-data-server.rpm.name       = vdt_globus_data_server
-+ext.globus-data-server.rpm.version    = ${ext.vdt.version}
-+ext.globus-data-server.rpm.age                = 1
-+
-+                                    
- # GPT
- ext.gpt.name        = gpt
- ext.gpt.vendor      = gpt
-@@ -3266,8 +3285,9 @@
- org.glite.dgas.version                          = glite-dgas_R_1_1_16
- org.glite.gpbox.version                         = glite-gpbox_R_1_0_15
- org.glite.jdl.version                           = glite-jdl_R_1_0_0
--org.glite.jp.version                            = glite-jp_R_1_1_3
--org.glite.lb.version                            = glite-lb_R_1_2_9
-+org.glite.jp.version                            = glite-jp_R_1_3_0
-+org.glite.lb.version                            = glite-lb_R_1_2_11
-+
- org.glite.rgma.version                          = glite-rgma_R_5_0_26
- org.glite.security.version                      = glite-security_R_3_0_15
- org.glite.service-discovery.version             = glite-service-discovery_R_2_0_12
-Index: org.glite.deployment/build.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/build.xml,v
-retrieving revision 1.61.2.2.2.12.2.26
-diff -u -r1.61.2.2.2.12.2.26 build.xml
---- org.glite.deployment/build.xml     24 Apr 2006 13:39:27 -0000      1.61.2.2.2.12.2.26
-+++ org.glite.deployment/build.xml     30 Jun 2006 11:13:49 -0000
-@@ -9,7 +9,7 @@
-       Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>          
-       Version info: $Id$
--      Release: $Name$
-+      Release: $Name$
-       Revision history:
-       $Log$
-       Revision 1.3  2006/06/30 11:30:28  mmulac
-       actualized patches
-       - against org.glite a org.glite.deployment from glite_R_3_0_0
-
-@@ -1619,6 +1619,39 @@
-               </if>
-       </target>
-+      <target name="jpps" unless="setenvonly" depends="envset,config">
-+              <if>
-+                      <isset property="small.memory"/>
-+                      <then>
-+                              <exec dir="${deployment.subsystem.dir}.jpps" executable="${antExec}" failonerror="${failonerror}">
-+                                      <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot; &quot;-Dbuild.name=${build.name}&quot;"/>
-+                              </exec>
-+                      </then>
-+                      <else>
-+                              <ant dir="${deployment.subsystem.dir}.jpps"
-+                                      target="${target}"
-+                                      inheritall="false" />
-+                      </else>
-+              </if>
-+      </target>
-+
-+
-+      <target name="jpis" unless="setenvonly" depends="envset,config">
-+              <if>
-+                      <isset property="small.memory"/>
-+                      <then>
-+                              <exec dir="${deployment.subsystem.dir}.jpis" executable="${antExec}" failonerror="${failonerror}">
-+                                      <arg line="${target} &quot;-Dsmall.memory=true&quot; &quot;-Dbootstrap=${bootstrap}&quot; &quot;-Dfailonerror=${failonerror}&quot; &quot;-Ddo.cvs.tag=${do.cvs.tag}&quot; &quot;-Dbuild.name=${build.name}&quot;"/>
-+                              </exec>
-+                      </then>
-+                      <else>
-+                              <ant dir="${deployment.subsystem.dir}.jpis"
-+                                      target="${target}"
-+                                      inheritall="false" />
-+                      </else>
-+              </if>
-+      </target>
-+
-       <target name="io-server" unless="setenvonly" depends="envset,config">
-               <if>
-                       <isset property="small.memory"/>
-@@ -1730,6 +1763,8 @@
-                                       wn,
-                                       wms,
-                                       lb,
-+                                      jpps,
-+                                      jpis,
-                                       io-server,
-                                       io-client,
-                                       ce,
-Index: org.glite.deployment/project/dependencies.properties
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/project/dependencies.properties,v
-retrieving revision 1.526.2.5.2.127.2.415.2.22
-diff -u -r1.526.2.5.2.127.2.415.2.22 dependencies.properties
---- org.glite.deployment/project/dependencies.properties       9 May 2006 12:33:18 -0000       1.526.2.5.2.127.2.415.2.22
-+++ org.glite.deployment/project/dependencies.properties       30 Jun 2006 11:13:49 -0000
-@@ -80,6 +80,10 @@
-                               
-       org.glite.deployment.lb.version                         = glite-deployment-lb_R_2_2_3
-                               
-+      org.glite.deployment.jpis.version                               = HEAD
-+
-+      org.glite.deployment.jpps.version                               = HEAD
-+
-       org.glite.deployment.glite-WMSLB.version                                = glite-deployment-glite-WMSLB_R_2_4_2
-                               
-       org.glite.deployment.wn.version                         = glite-deployment-wn_R_2_3_7
-Index: org.glite.deployment/project/glite.deployment.csf.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment/project/glite.deployment.csf.xml,v
-retrieving revision 1.44.2.1.2.11.2.24
-diff -u -r1.44.2.1.2.11.2.24 glite.deployment.csf.xml
---- org.glite.deployment/project/glite.deployment.csf.xml      18 Apr 2006 15:42:14 -0000      1.44.2.1.2.11.2.24
-+++ org.glite.deployment/project/glite.deployment.csf.xml      30 Jun 2006 11:13:50 -0000
-@@ -9,7 +9,7 @@
-       Authors: Joachim Flammer <Joachim.Flammer@cern.ch>      
-       Version info: $Id$
--      Release: $Name$
-+      Release: $Name$
-       Revision history:
-       $Log$
-       Revision 1.3  2006/06/30 11:30:28  mmulac
-       actualized patches
-       - against org.glite a org.glite.deployment from glite_R_3_0_0
-
-@@ -667,6 +667,14 @@
-                       <equals arg1="${org.glite.deployment.lb.version}" arg2="HEAD" />
-               </condition>
-+              <condition property="jpps.head">
-+                      <equals arg1="${org.glite.deployment.jpps.version}" arg2="HEAD" />
-+              </condition>
-+
-+              <condition property="jpis.head">
-+                      <equals arg1="${org.glite.deployment.jpis.version}" arg2="HEAD" />
-+              </condition>
-+
-               <condition property="io-server.head">
-                       <equals arg1="${org.glite.deployment.io-server.version}" arg2="HEAD" />
-               </condition>
-@@ -1571,6 +1579,28 @@
-                       tag="${org.glite.deployment.lb.version}" />
-       </target>
-+      <!-- jpps component -->
-+      <target name="jpps" depends="get.jpps.head, get.jpps.tag"/>
-+      <target name="get.jpps.head" if="jpps.head">
-+              <cvs-co package="org.glite.deployment.jpps" />
-+        </target>
-+
-+      <target name="get.jpps.tag" unless="jpps.head">
-+              <cvs-co package="org.glite.deployment.jpps"
-+                      tag="${org.glite.deployment.jpps.version}" />
-+      </target>
-+
-+      <!-- jpis component -->
-+      <target name="jpis" depends="get.jpis.head, get.jpis.tag"/>
-+      <target name="get.jpis.head" if="jpis.head">
-+              <cvs-co package="org.glite.deployment.jpis" />
-+        </target>
-+
-+      <target name="get.jpis.tag" unless="jpis.head">
-+              <cvs-co package="org.glite.deployment.jpis"
-+                      tag="${org.glite.deployment.jpis.version}" />
-+      </target>
-+
-       <!-- io-server component -->
-       <target name="io-server" depends="get.io-server.head, get.io-server.tag"/>
-       <target name="get.io-server.head" if="io-server.head">
-@@ -1667,6 +1697,8 @@
-                                       wn,
-                                       wms,
-                                       lb,
-+                                      jpis,
-+                                      jpps,
-                                       io-server,
-                                       io-client,
-                                       ce" />
diff --git a/org.glite.lb/deployment/deploy_lb.diff b/org.glite.lb/deployment/deploy_lb.diff
deleted file mode 100644 (file)
index d6c74e2..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-This patch was merged to deploy_all.diff, don't use it anymore.
-
-Index: org.glite.deployment.lb/config/scripts/glite-lb-config.py
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/scripts/glite-lb-config.py,v
-retrieving revision 1.65.2.3
-diff -u -r1.65.2.3 glite-lb-config.py
---- org.glite.deployment.lb/config/scripts/glite-lb-config.py  2 May 2006 10:36:16 -0000       1.65.2.3
-+++ org.glite.deployment.lb/config/scripts/glite-lb-config.py  30 Jun 2006 09:29:21 -0000
-@@ -127,7 +127,12 @@
-         if not os.path.exists('/tmp/mysql.sock'):
-             os.symlink('/var/lib/mysql/mysql.sock', '/tmp/mysql.sock')
--            
-+        
-+
-+        #-------------------------------------------------------------------
-+        # start bkserver
-+        #-------------------------------------------------------------------
-+
-         pid = glib.getPID('bkserverd')
-         if pid != 0:
-             print 'The gLite LB Server service is already running. Restarting...'
-@@ -140,7 +145,7 @@
-         pid = glib.getPID('bkserverd')
-         if (pid != 0):
--            print "The gLite LB Server service has been started               ",
-+            print "The gLite LB Server service has been started              ",
-             glib.printOkMessage()
-         else:
-             glib.printErrorMessage("Could not start the gLite LB Server service")
-@@ -149,6 +154,36 @@
-             return 1
-         
-         #-------------------------------------------------------------------
-+        # start jp-importer, if enabled
-+        #-------------------------------------------------------------------
-+
-+        lb_export = 0
-+        if params.has_key('lb.export.enabled'):
-+            if params['lb.export.enabled'] == "true":
-+                lb_export = 1
-+
-+        if lb_export:
-+            pid = glib.getPID('jp-importer')
-+            if pid != 0:
-+                print 'The gLite JP Importer service is already running. Restarting...'
-+                os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION'])
-+            else:
-+                print 'Starting the gLite JP Importer service...'
-+
-+            os.system('%s/etc/init.d/glite-jp-importer start' % os.environ['GLITE_LOCATION'])
-+
-+            pid = glib.getPID('jp-importer')
-+
-+            if (pid != 0):
-+                print "The gLite JP Importer service has been started            ",
-+                glib.printOkMessage()
-+            else:
-+                glib.printErrorMessage("Could not start the gLite JP Importer service")
-+                glib.printErrorMessage("Please verify and re-run the script                        "),
-+                glib.printFailedMessage()
-+                return 1
-+        
-+        #-------------------------------------------------------------------
-         # Start Servicetool
-         #-------------------------------------------------------------------
-@@ -168,6 +203,10 @@
-         if (pid != 0):
-             os.system('%s/etc/init.d/glite-lb-bkserverd stop' % os.environ['GLITE_LOCATION'])
-+        #-------------------------------------------------------------------
-+        # Book Keeping Server
-+        #-------------------------------------------------------------------
-+
-         pid = glib.getPID('bkserverd')
-         if (pid != 0):
-             print 'Could not stop the LB Server service            ',
-@@ -178,6 +217,25 @@
-             glib.printOkMessage()
-         
-         #-------------------------------------------------------------------
-+        # JP Importer
-+        #-------------------------------------------------------------------
-+
-+        pid = glib.getPID('jp-importer')
-+        if (pid != 0):
-+            os.system('%s/etc/init.d/glite-jp-importer stop' % os.environ['GLITE_LOCATION'])
-+
-+        pid = glib.getPID('jp-importer')
-+        if (pid != 0):
-+            print 'Could not stop the JP Importer service                  ',
-+            glib.printFailedMessage()
-+            error_level = 1
-+        else:
-+            if params.has_key('lb.export.enabled'):
-+                if params['lb.export.enabled'] == "true":
-+                    print 'The JP Importer service has been stopped                  ',
-+                    glib.printOkMessage()
-+        
-+        #-------------------------------------------------------------------
-         # MySQL
-         #-------------------------------------------------------------------
-@@ -202,6 +260,10 @@
-         if retval != 0:
-             error_level = 1
-+        retval = os.system('%s/etc/init.d/glite-jp-importer status' % os.environ['GLITE_LOCATION'])
-+        if retval != 0:
-+            error_level = 1
-+
-         #-------------------------------------------------------------------
-         # Servicetool
-         #-------------------------------------------------------------------
-@@ -332,7 +394,27 @@
-             print "\n==> MySQL database %s already exist\n" % params['lb.database.name']
-             
-         self.mysql.stop()
--    
-+
-+        # ------------------------------------------------------------------
-+        # export from bkserver to cron
-+        # ------------------------------------------------------------------
-+      if params['GLITE_LB_EXPORT_ENABLED'] == "true":
-+          file = open('%s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'], 'w')
-+          file.write('#! /bin/sh\n')
-+          file.write('. %s\n' % glib.getInstallerExportFile())
-+            file.write('$GLITE_LOCATION/examples/glite-lb-export.sh\n')
-+          file.close()
-+            os.system('/bin/chmod 0755 %s/etc/glite-lb-export-cron-wrapper.sh' % os.environ['GLITE_LOCATION'])
-+
-+          file = open('/etc/cron.d/glite-lb-export.cron', 'w')
-+          file.write('# periodically run purge and export jobs from bkserver\n')
-+          file.write('00,30 * * * * %s %s/etc/glite-lb-export-cron-wrapper.sh\n' % (params['glite.user.name'], os.environ['GLITE_LOCATION']))
-+          file.close()
-+            os.system('/bin/chmod 0755 /etc/cron.d/glite-lb-export.cron')
-+
-+            # Touch cron spool directory to cause reloading of the crontabs
-+            os.system("/bin/touch /var/spool/cron")
-+
-         #-------------------------------------------------------------------
-         # RGMA servicetool: configure servicetool
-         #-------------------------------------------------------------------
-@@ -418,6 +500,17 @@
-     # Perl
-     glib.addEnvPath("PERL5LIB", "%s/lib/perl:%s/lib/perl5" % (os.environ['GPT_LOCATION'],os.environ['GLITE_LOCATION']))
-+    # LB export
-+    glib.export('GLITE_LB_EXPORT_ENABLED', params['lb.export.enabled']);
-+    glib.export('GLITE_LB_EXPORT_BKSERVER', params['lb.export.bkserver']);
-+    glib.export('GLITE_LB_EXPORT_JPPS', params['lb.export.jpps']);
-+    glib.export('GLITE_LB_EXPORT_JPREG_MAILDIR', params['lb.export.jpreg']);
-+    glib.export('GLITE_LB_EXPORT_JPDUMP_MAILDIR', params['lb.export.jpdump']);
-+    glib.export('GLITE_LB_EXPORT_DUMPDIR', params['lb.export.dump']);
-+    glib.export('GLITE_LB_EXPORT_DUMPDIR_OLD', params['lb.export.dump.old']);
-+    glib.export('GLITE_LB_EXPORT_EXPORTDIR', params['lb.export.export']);
-+    glib.export('GLITE_LB_EXPORT_PURGE_ARGS', '"%s"' % params['lb.export.purgeargs']);
-+
-     # Set environment
-     glib.setUserEnv()
-     
-Index: org.glite.deployment.lb/config/templates/glite-lb.cfg.xml
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/config/templates/glite-lb.cfg.xml,v
-retrieving revision 1.21
-diff -u -r1.21 glite-lb.cfg.xml
---- org.glite.deployment.lb/config/templates/glite-lb.cfg.xml  13 Mar 2006 15:19:21 -0000      1.21
-+++ org.glite.deployment.lb/config/templates/glite-lb.cfg.xml  30 Jun 2006 09:29:21 -0000
-@@ -17,9 +17,16 @@
-                       parameter. Leave it empty of comment it out to use the same as 'glite.user.name'"
-                       value="changeme"/>
-               
--          <mysql.root.password
--              description="The mysql root password"
--              value="changeme"/>
-+              <mysql.root.password
-+                      description="The mysql root password"
-+                      value="changeme"/>
-+
-+              <lb.export.jpps
-+                      description="Job Provenance Primary Storage.
-+                              [Example: localhost:8901][Type: string]"
-+                      value="changeme"/>
-+
-+
-       
-               <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-               <!-- Advanced parameters - Change them if you know what you're doing -->
-@@ -55,6 +62,12 @@
-                               [Example: 17M][Type: Integer][Unit: MB]"
-                       value="17M"/>
-+              <lb.export.enabled
-+                      description="Enables exports to Job Provenance.
-+                              [Example: true][Type: boolean]"
-+                      value="true"/>
-+
-+
-               <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->
-               <!-- System parameters - You should leave these alone -->
-               <!-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -->               
-@@ -67,7 +80,42 @@
-                       <value>destination</value>
-               </lb.index.list>
--                      
-+
-+              <lb.export.bkserver
-+                      description="Book Keeping Server service when differs from default port on localhost.
-+                              [Example: localhost:9000][Type: string]"
-+                      value=""/>
-+
-+              <lb.export.jpreg
-+                      description="Maildir for job registrations.
-+                              [Example: /tmp/jpreg][Type: string]"
-+                      value=""/>
-+
-+              <lb.export.jpdump
-+                      description="Maildir for job dumps.
-+                              [Example: /tmp/jpdump][Type: string]"
-+                      value=""/>
-+
-+              <lb.export.dump
-+                      description="Dump directory for purged jobs.
-+                              [Example: /tmp/dump][Type: string]"
-+                      value=""/>
-+
-+              <lb.export.dump.old
-+                      description="Dump directory for handled purged jobs.
-+                              [Example: /tmp/dump.old][Type: string]"
-+                      value=""/>
-+
-+              <lb.export.export
-+                      description="Exported events divided to file per job.
-+                              [Example: /tmp/lb_export][Type: string]"
-+                      value=""/>
-+
-+              <lb.export.purgeargs
-+                      description="Purge arguments (with timeouts).
-+                              [Example: -a 1h -c 1h -n 1h -o 1d][Type: string]"
-+                      value="-a 1d -c 1d -n 1d -o 7d"/>
-+
-       </parameters>
- </config>
-Index: org.glite.deployment.lb/project/glite-lb.sdf.xml.template
-===================================================================
-RCS file: /cvs/jra1mw/org.glite.deployment.lb/project/glite-lb.sdf.xml.template,v
-retrieving revision 1.38.2.2
-diff -u -r1.38.2.2 glite-lb.sdf.xml.template
---- org.glite.deployment.lb/project/glite-lb.sdf.xml.template  2 May 2006 10:36:19 -0000       1.38.2.2
-+++ org.glite.deployment.lb/project/glite-lb.sdf.xml.template  30 Jun 2006 09:29:21 -0000
-@@ -57,6 +57,12 @@
-                                       build="@org.glite.lb.server-bones.info.build@"
-                                       arch="i386"/>
-                                          
-+                              <component name="glite-lb-client"
-+                                      version="@org.glite.lb.client.info.version@"
-+                                      age="@org.glite.lb.client.info.age@"
-+                                      build="@org.glite.lb.client.info.build@"
-+                                      arch="i386"/>
-+                                         
-                               <component name="glite-wms-utils-jobid"
-                                       version="@org.glite.wms-utils.jobid.info.version@"
-                                       age="@org.glite.wms-utils.jobid.info.age@"
-@@ -105,6 +111,12 @@
-                     build="@org.glite.jp.ws-interface.info.build@"
-                     arch="i386"/>
-+                              <component name="glite-jp-client"
-+                    version="@org.glite.jp.client.info.version@"
-+                    age="@org.glite.jp.client.info.age@"
-+                    build="@org.glite.jp.client.info.build@"
-+                    arch="i386"/>
-+
-                 <component name="gridsite"
-                     version="@org.gridsite.core.info.version@"
-                     age="@org.gridsite.core.info.age@"
diff --git a/org.glite.lb/doc/README.lb4vdt b/org.glite.lb/doc/README.lb4vdt
deleted file mode 100644 (file)
index d07b525..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-These are the instructions how to build LB for VDT:
-
-$ mkdir lb4vdt
-$ cd lb4vdt
-$ export CVSROOT=:pserver:anonymous@jra1mw.cvs.cern.ch:/cvs/jra1mw  
-$ cvs co org.glite.lb                                                     
-
-you may need to edit ./org.glite.lb/lb4vdt/Makefile.inc     
-to specify some paths (some of them should be set automaticaly,  
-e.g. by VDT_LOCATION)
-
-and then (still from the top directory) run
-
-$ ./org.glite.lb/lb4vdt/LB_install.sh 2>&1 | tee log
-
-:)
diff --git a/org.glite.lb/doc/perf_clear_proxy b/org.glite.lb/doc/perf_clear_proxy
deleted file mode 100644 (file)
index 237df95..0000000
+++ /dev/null
@@ -1 +0,0 @@
-CLPR=1; for jobid in  `./stage/sbin/glite-lb-perftest_logjobs -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf|grep https`; do stage/bin/glite-lb-logevent -x -S /tmp/proxy_michal.perfstore.sock -c $SEQCODE -j $jobid -s UserInterface -e Abort --reason Purge; done
diff --git a/org.glite.lb/doc/perf_purge b/org.glite.lb/doc/perf_purge
deleted file mode 100644 (file)
index 4bcc881..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./stage/sbin/glite-lb-purge -j /tmp/perftest_1000.jobids  -m scientific.civ.zcu.cz:10000 -s
diff --git a/org.glite.lb/doc/perf_reg_jobs b/org.glite.lb/doc/perf_reg_jobs
deleted file mode 100644 (file)
index 20923a1..0000000
+++ /dev/null
@@ -1 +0,0 @@
- REG=1; for jobid in  `./stage/sbin/glite-lb-perftest_logjobs -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf|grep https`; do stage/examples/glite-lb-job_reg -j $jobid -s UserInterface ; done
diff --git a/org.glite.lb/doc/perf_results/il_sci_09062006.txt b/org.glite.lb/doc/perf_results/il_sci_09062006.txt
deleted file mode 100644 (file)
index 503966e..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-./shared/egee/jra1-head/stage/sbin/perftest_il.sh 10
--------------------------------------------
-Logging test:
-  - events sent through IPC and/or files
-  - events discarded by IL immediately
--------------------------------------------
-a) events sent only by IPC
-b) events stored to files and sent by IPC
-
-        small_job        big_job         small_dag       big_dag
-a)      154727793        11240340       101479915          621678
-[jobs/day]
-b)       11540156          594389        10416164          402240
-[jobs/day]
------------------------------------
-Interlogger test:
-  - events sent through IPC & files
-  - events discarded in IL
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
-        small_job        big_job         small_dag       big_dag
-a)       14323607          547755        10158371          375594
-[jobs/day]
-b)        6284230          364547         4554967          300055
-[jobs/day]
-c)        7540122          412971         3186381          300417
-[jobs/day]
-x)        9672327          418137         2567653          297477
-[jobs/day]
-d)  this test is not yet implemented
-e)        9650719          410507         3651840          301687
-[jobs/day]
------------------------------------
-Interlogger test:
-  - events sent through IPC & files
-  - events consumed by empty BS
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
-        small_job        big_job         small_dag       big_dag
-a)        2639788          182196         2035014          246654
-[jobs/day]
-b)        1170308           45973          759842           74898
-[jobs/day]
-c)        1060595           42047          921386           76638
-[jobs/day]
-x)        1091863           42247          518302           82129
-[jobs/day]
-d) this test is not yet implemented
-e)        1147040           41790          489257           76627
-[jobs/day]
-
diff --git a/org.glite.lb/doc/perf_results/il_sci_09062006_01.txt b/org.glite.lb/doc/perf_results/il_sci_09062006_01.txt
deleted file mode 100644 (file)
index 04db72b..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 10
--------------------------------------------
-Logging test:
-  - events sent through IPC and/or files
-  - events discarded by IL immediately
--------------------------------------------
-a) events sent only by IPC
-b) events stored to files and sent by IPC
-
-        small_job        big_job         small_dag       big_dag
-a)      149765990        10933663       100162299          619924
-[jobs/day]
-b)       11857056          479615         2753618          277679
-[jobs/day]
------------------------------------
-Interlogger test:
-  - events sent through IPC & files
-  - events discarded in IL
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
-        small_job        big_job         small_dag       big_dag
-a)       13813170          268900         6448242          244203
-[jobs/day]
-b)        4525621          255055         6147103          241153
-[jobs/day]
-c)        9338319          217855         5497442          248429
-[jobs/day]
-x)        9335090          232292         3989195          236341
-[jobs/day]
-d)  this test is not yet implemented
-e)        3283323          216013         7284868          256479
-[jobs/day]
------------------------------------
-Interlogger test:
-  - events sent through IPC & files
-  - events consumed by empty BS
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
-        small_job        big_job         small_dag       big_dag
-a)        4019651           44496          766972           95556
-[jobs/day]
-b)        1366885           47501          564779           90055
-[jobs/day]
-c)        1152594           47656          603774           97465
-[jobs/day]
-x)        1049069           48779          607913           88692
-[jobs/day]
-d) this test is not yet implemented
-e)         942509           46271          523129           91103
-[jobs/day]
-
-
-*************************************************************************
-
-
-[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 100
--------------------------------------------
-Logging test:
-  - events sent through IPC and/or files
-  - events discarded by IL immediately
--------------------------------------------
-a) events sent only by IPC
-b) events stored to files and sent by IPC
-
-        small_job        big_job         small_dag       big_dag
-a)      157966907               0               0          620546
-[jobs/day]
-b)       13833450          558487        10210340          283454
-[jobs/day]
------------------------------------
-Interlogger test:
-  - events sent through IPC & files
-  - events discarded in IL
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
-        small_job        big_job         small_dag       big_dag
-a)       12884330          316703         4447489          151870
-[jobs/day]
-b)        7980713          469667         4641283          244463
-[jobs/day]
-c)        8458472          556919         5657712          253640
-[jobs/day]
-x)        8149836          549678         4765300          257375
-[jobs/day]
-d)  this test is not yet implemented
-e)        9687868          503933         4461079          247092
-[jobs/day]
------------------------------------
-Interlogger test:
-  - events sent through IPC & files
-  - events consumed by empty BS
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
-        small_job        big_job         small_dag       big_dag
-a)        9389344           97159          450483           68610
-[jobs/day]
-b)        1195400           82681          560118           88216
-[jobs/day]
-c)        1351879           88207          830072          102285
-[jobs/day]
-x)        1173835           85897          562648               0
-[jobs/day]
-d) this test is not yet implemented
-e)        1205291           78355          567658           87770
-[jobs/day]
diff --git a/org.glite.lb/doc/perf_results/il_sci_12062006.txt b/org.glite.lb/doc/perf_results/il_sci_12062006.txt
deleted file mode 100644 (file)
index f3a1a79..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-[michal@scientific jra1-head]$ ./stage/sbin/perftest_il.sh 10
--------------------------------------------
-Logging test:
-  - events sent through IPC and/or files
-  - events discarded by IL immediately
--------------------------------------------
-a) events sent only by IPC
-b) events stored to files and sent by IPC
-
-        small_job        big_job         small_dag       big_dag
-a)      153599999        11157889       101479915          539075
-[jobs/day]
-b)       10835893         1059003         2577803          351095
-[jobs/day]
------------------------------------
-Interlogger test:
-  - events sent through IPC & files
-  - events discarded in IL
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
-        small_job        big_job         small_dag       big_dag
-a)       14148626          772362        11498383          376986
-[jobs/day]
-b)        5348851          489142         5558879          292071
-[jobs/day]
-c)        9042670          441000         5911613          287842
-[jobs/day]
-x)        7730298          414784         6579748          289834
-[jobs/day]
-d)  this test is not applicable
-e)        9288325          365701         7189156          299604
-[jobs/day]
------------------------------------
-Interlogger test:
-  - events sent through IPC & files
-  - events consumed by empty BS
------------------------------------
-a) disabled event parsing, the server address (jobid) is hardcoded
-b) disabled event synchronization from files
-c) disabled recovery thread
-x) disabled sync and recovery
-d) lazy bkserver connection close
-e) normal operation
-
-        small_job        big_job         small_dag       big_dag
-a)        2219003          185867         1785164          258615
-[jobs/day]
-b)        1795503           48283          309380           77422
-[jobs/day]
-c)        1201618           39001          850436           74771
-[jobs/day]
-x)        1134249           48039          447017           74244
-[jobs/day]
-d)        5335078          207059         2438095           96295
-[jobs/day]
-e)        1019269           36465          875966           65565
-[jobs/day]
-
-
diff --git a/org.glite.lb/doc/perf_results/ll_michal_21062006.txt b/org.glite.lb/doc/perf_results/ll_michal_21062006.txt
deleted file mode 100644 (file)
index c13457f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-michal:~/shared/egee/jra1-head> ./stage/sbin/perftest_ll.sh 10
-----------------
-Locallogger test
-----------------
-a) glite-lb-logd-perf-nofile --noParse --noIPC
-b) glite-lb-logd-perf-nofile --noIPC
-c) glite-lb-logd-perf --noIPC
-d) glite-lb-logd-perf
-
-Number of jobs: 10
-
-        small_job        big_job         small_dag       big_dag
-a)        14.544066         14.590504         14.681760          9.264801 [events/sec]
-         125660            8404           97577           25821  [jobs/day]
-b)        14.614844         14.408043         14.279216          9.600877 [events/sec]
-         126272            8298           94901           26758  [jobs/day]
-c)         0.000000          0.000000          0.000000          0.000000 [events/sec]
-              0               0               0               0  [jobs/day]
-d)        13.331568         13.530218         13.420780          8.363152 [events/sec]
-         115184            7793           89196           23308  [jobs/day]
diff --git a/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt b/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_22062006.txt
deleted file mode 100644 (file)
index d0a99c5..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
--------------------
-LB chain test
--------------------
-- proxy & interlogger (lazy variant) running at umbar
-- bkserver running at sci
-- test variants:
-  a) 10 jobs
-  b) 100 jobs
-  c) 1000 jobs
-
-
-Results:
-
-   small_job      big_job      small_dag       big_dag
----------------------------------------------------------------
-a)     3.0             x               x               x       [mjobs/day]
-b)     1.0             x               x               x       [mjobs/day]
-c)     0.6             x               x               x       [mjobs/day]
-
-
diff --git a/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt b/org.glite.lb/doc/perf_results/proxy2serv_umbar2sci_23062006.txt
deleted file mode 100644 (file)
index 8097510..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
--------------------
-LB chain test
--------------------
-- proxy & interlogger (lazy variant) running at umbar
-- bkserver running at sci
-- test variants:
-  a) 100 jobs, no background queries
-  b) 1000 jobs, no background queries
-  c) 10000 jobs, no background queries
-  d) 100 jobs, 10 parallel queries
-  e) 1000 jobs, 10 parallel queries, perf interlogger
-  f) 1000 jobs, 10 parallel queries, normal interlogger
-- in d)-f) the server was queried by 10 independent clients for states 
-  of all jobs periodically with random sleep between queries (0-5sec)
-
-Results:
-
-   small_job      big_job      small_dag       big_dag
----------------------------------------------------------------
-a)     1.0             x               x               x       [mjobs/day]
-b)     0.6             x               x               x       [mjobs/day]
-c)     0.5             x               x               x       [mjobs/day]
-d)     0.8             x               x               x       [mjobs/day]
-e)     0.45            x               x               x       [mjobs/day]
-f)     0.4             x               x               x       [mjobs/day]
diff --git a/org.glite.lb/doc/perf_results/proxy_sci_09062006.txt b/org.glite.lb/doc/perf_results/proxy_sci_09062006.txt
deleted file mode 100644 (file)
index efa1a41..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-----------------------------------
-LB Proxy test
-----------------------------------
-Events are consumed:
-1) before parsing
-2) after parsing, before storing into database
-3) after storing into db, before computing state
-4) after computing state, before sending to IL
-5) by IL
-
-        small_job        big_job         small_dag       big_dag
-1)  43005186.489600    2852512.156800   31859581.824000    502823.721600
-[jobs/day]
-2)  37764713.548800    2438483.961600   26108871.523200    340065.648000
-[jobs/day]
-3)   1754530.243200     272980.540800    2051218.684800         0.000000
-[jobs/day]
-4)   1267110.000000     176052.182400    1506470.486400         0.000000
-[jobs/day]
-5)    329471.452800      48787.747200     318152.275200         0.000000
-[jobs/day]
diff --git a/org.glite.lb/doc/perf_run_interlogd b/org.glite.lb/doc/perf_run_interlogd
deleted file mode 100644 (file)
index 00d60ed..0000000
+++ /dev/null
@@ -1 +0,0 @@
- ./stage/bin/glite-lb-interlogd -d -s /tmp/perftest_michal.sock --file-prefix=/tmp/perftest_michal.log --lazy
diff --git a/org.glite.lb/doc/perf_run_proxy b/org.glite.lb/doc/perf_run_proxy
deleted file mode 100644 (file)
index 5d88382..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./stage/bin/glite-lb-proxy -d --silent -p /tmp/proxy_michal.perf --proxy-il-sock /tmp/perftest_michal.sock --proxy-il-fprefix /tmp/perftest_michal.log
diff --git a/org.glite.lb/doc/perf_run_server b/org.glite.lb/doc/perf_run_server
deleted file mode 100644 (file)
index b11eb79..0000000
+++ /dev/null
@@ -1 +0,0 @@
-./stage/bin/glite-lb-bkserverd -d --perf-sink=4 -p 10000 -w 10003  -S /tmp/purge_michal -D /tmp/dump_michal --silent
diff --git a/org.glite.lb/doc/perf_run_test b/org.glite.lb/doc/perf_run_test
deleted file mode 100644 (file)
index 2e31b83..0000000
+++ /dev/null
@@ -1 +0,0 @@
-TEST=1; ./stage/sbin/glite-lb-perftest_logjobs -d proxy -m scientific.civ.zcu.cz:10000 -f stage/examples/perftest/perf_simple_avg_events.log -n 1000 -p /tmp/perftest_michal.log -s /tmp/proxy_michal.perf
diff --git a/org.glite.lb/etics-tag-consistency.pl b/org.glite.lb/etics-tag-consistency.pl
deleted file mode 100755 (executable)
index 3ffbeac..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/perl
-
-use Getopt::Std;
-use Switch;
-
-$TMPDIR=$ENV{'TMPDIR'};
-$GLITE_LB_LOCATION="./org.glite.lb";
-
-if ($TMPDIR eq "") {$TMPDIR="/tmp";}
-
-getopts('ch');
-
-$usage = qq{
-usage: $0 [-h] subsystem.name [subsystem.name] [...]
-
-       This script checks the consistency of tags in CVS and version.properties
-
-       -c      also verify etics configurations
-       -h      Display this help
-
-};
-
-       # **********************************
-       # Interpret cmdline options
-       # **********************************
-
-       if (defined $opt_h) {die $usage};
-       die $usage unless @ARGV[0];
-
-       if (defined $opt_c) {
-               printf ("\n\nYou have selected the -c option. Note that etics may require authetication.\n If you cannot see any progress in the script, it is probably waiting for your password. ;-)\n\n"); 
-       }
-
-       # **********************************
-       # Iterate through subsystems
-       # **********************************
-
-       foreach $subsystem (@ARGV) {
-
-               #Clean possible trailing '/' (even multiple occurrences :-) from subsystem name
-               $subsystem=~s/\/+$//;
-
-               printf("$subsystem\n");
-
-               $subsystem=~/\.([^\.]+?)$/;
-
-               @modules=split(/\s+/, `PATH=\$PATH:./:./org.glite.lb configure --listmodules $1`);
-
-               unshift (@modules, $subsystem);
-
-               foreach $module (@modules) {
-
-                       printf("  %-30s", $module);
-
-
-                       if (open VP, "$module/project/version.properties") {
-
-                               while ($_ = <VP>) {
-                                       chomp;
-
-                                       if(/module\.version\s*=\s*(\d*)\.(\d*)\.(\d*)/) {
-                                               $current_major=$1;
-                                               $current_minor=$2;
-                                               $current_revision=$3;
-                                       }
-                                       if(/module\.age\s*=\s*(\S+)/) {
-                                               $current_age=$1;
-                                       }
-                               }
-                               close (VP);
-
-                               $current_prefix=$module;
-                               $current_prefix=~s/^org\.//;
-                               $current_prefix=~s/\./-/g;
-                               $current_prefix="$current_prefix" . "_R_";
-                               $current_tag="$current_prefix" . "$current_major" . "_$current_minor" . "_$current_revision" . "_$current_age";
-
-                               if ($module eq $subsystem) { $subsystem_tag = $current_tag; }
-
-                               printf("\t $current_major.$current_minor.$current_revision-$current_age");
-
-                               unless (system("cvs log -h $module/project/version.properties | grep -E \"\\W$current_tag\\W\" > /dev/null"))
-                                       { printf ("\t mod. OK"); }
-                               else {
-                                       printf(STDERR "\nERROR: Tag $current_tag does not exist in module $module!\n"); 
-                               }
-                               if ($module ne $subsystem ) {
-                                       unless (system("cvs log -h $module/project/version.properties | grep -E \"\\W$subsystem_tag\\W\" > /dev/null"))
-                                               { printf ("\t subsys. OK"); }
-                                       else {
-                                               printf(STDERR "\nERROR: Tag $subsystem_tag does not exist in module $module!\n"); 
-                                       }
-
-                                       unless (-e "$module/project/ChangeLog") {
-                                               printf(STDERR "\nERROR: The ChangeLog file for module $module does not exist!\n");
-                                       }
-                               }
-
-                               unless (-e "$module/configure") {
-                                       printf(STDERR "\nERROR: The configure script for module $module does not exist!\n");
-                               }
-
-                               if (defined $opt_c) {
-                                       unless (system("etics-list-configuration $module | grep \"$current_tag\" &> /dev/null"))
-                                               { printf ("\t etics OK"); }
-                                       else {
-                                               printf(STDERR "\nERROR: Configuration $current_tag for module $module does not exist!\n"); 
-                                       }
-                               }
-
-                               printf("\n");
-
-                       }
-                       else {
-                               printf(STDERR "\nERROR: The version.properties file for module $module does not exist!\n"); 
-                       }
-               }
-       }
diff --git a/org.glite.lb/etics-tag-with-subsystems.pl b/org.glite.lb/etics-tag-with-subsystems.pl
deleted file mode 100755 (executable)
index bd5e113..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-#!/usr/bin/perl
-
-use Getopt::Std;
-use Switch;
-
-$TMPDIR=$ENV{'TMPDIR'};
-
-if ($TMPDIR eq "") {$TMPDIR="/tmp";}
-
-getopts('c:h');
-
-$module = shift;
-
-chomp($module);
-
-$usage = qq{
-usage: $0 [-c <current configuration>] module.name
-
-        -c      Use this configuration (\d+\.\d+\.\d+-\S+) rather than parsing version.properties
-        -h      Display this help
-
-};
-        if (defined $opt_h) {die $usage};
-       die $usage unless $module;
-
-        #Clean possible trailing '/' (even multiple occurrences :-) from module name
-        $module=~s/\/+$//;
-        if (defined $opt_c) {
-
-                # **********************************
-                # Parse the tag supplied by the user 
-                # **********************************
-
-                if ($opt_c=~/(\d+)\.(\d+)\.(\d+)-(\S+?)/) {
-                                $current_major=$1;
-                                $current_minor=$2;
-                                $current_revision=$3;
-                                $current_age=$4;
-                }
-                else {die ("tag not specified properly")};
-
-        }
-       else {
-               # **********************************
-               # Determine the most recent tag and its components
-               # **********************************
-
-               open VP, "$module/project/version.properties" or die "$module/project/version.properties: $?\n";
-
-               while ($_ = <VP>) {
-                       chomp;
-
-                       if(/module\.version\s*=\s*(\d*)\.(\d*)\.(\d*)/) {
-                               $current_major=$1;
-                               $current_minor=$2;
-                               $current_revision=$3;
-                       }
-                       if(/module\.age\s*=\s*(\S+)/) {
-                               $current_age=$1;
-                       }
-               }
-               close (VP);
-
-               $current_prefix=$module;
-               $current_prefix=~s/^org\.//;
-               $current_prefix=~s/\./-/g;
-               $current_prefix="$current_prefix" . "_R_";
-               $current_tag="$current_prefix" . "$current_major" . "_$current_minor" . "_$current_revision" . "_$current_age";
-       }
-
-       # According to the documentation, symbolic names in the 'cvs log' output are sorted by age so this should be OK
-       #$current_tag=`cvs log -h $module/Makefile | grep \"_R_\" | head -n 1`;
-       #$current_tag=~s/^\s//;
-       #$current_tag=~s/:.*?$//;
-       #chomp($current_tag);
-
-       #$current_tag=~/(.*_R_)(\d*?)_(\d*?)_(\d*?)_(.*)/;
-       #$current_prefix=$1;
-       #$current_major=$2;
-       #$current_minor=$3;
-       #$current_revision=$4;
-       #$current_age=$5;
-
-       $module=~/\.([^\.]+?)$/;        
-
-       @modules=split(/\s+/, `PATH=\$PATH:./:./org.glite.lb configure --listmodules $1`);
-
-       my $incmajor=0;
-       my $incminor=0;
-       my $increvision=0;
-       my $incage=0;
-
-
-       # **********************************
-       # Iterate through modules and find out what has changed
-       # **********************************
-
-       foreach $m (@modules) {
-               printf("\n***$m\n");
-
-               $old_major=-1; $old_minor=-1; $old_revision=-1; $old_age=-1;
-               $new_major=-1; $new_minor=-1; $new_revision=-1; $new_age=-1;
-
-               foreach $l (`cvs diff -r $current_prefix$current_major\_$current_minor\_$current_revision\_$current_age $m/project/version.properties | grep -E "module\.age|module\.version"`) {
-                       chomp($l);
-                       printf("$l\n");
-
-                       if($l=~/<\s*module\.version\s*=\s*(\d*)\.(\d*)\.(\d*)/) {
-                               $old_major=$1;
-                               $old_minor=$2;
-                               $old_revision=$3;
-                       } 
-                       elsif($l=~/<\s*module\.age\s*=\s*(\S+)/) {
-                               $old_age=$1;
-                       }
-                       elsif($l=~/>\s*module\.version\s*=\s*(\d*)\.(\d*)\.(\d*)/) {
-                               $new_major=$1;
-                               $new_minor=$2;
-                               $new_revision=$3;
-                       } 
-                       elsif($l=~/>\s*module\.age\s*=\s*(\S+)/) {
-                               $new_age=$1;
-                       }
-               }
-
-               
-
-               if ($old_major != $new_major) {
-                       $incmajor++;
-                       printf("Major change ($old_major -> $new_major)");
-               }
-               elsif ($old_minor != $new_minor) {
-                       $incminor++;
-                       printf("Minor change ($old_minor -> $new_minor)");
-               }
-               elsif ($old_revision != $new_revision) {
-                       $increvision++;
-                       printf("Revision change ($old_revision -> $new_revision)");
-               }
-               elsif ($old_age != $new_age) {
-                       $incage++;
-                       printf("Age change ($old_age -> $new_age)");
-               }
-               printf("\n");
-               
-       }
-
-       printf("Current tag: $current_tag\n\tprefix: $current_prefix\n\t major: $current_major\n\t minor: $current_minor\n\t   rev: $current_revision\n\t   age: $current_age\n");
-
-       # **********************************
-       # Generate the new tag name
-       # **********************************
-
-       if($incmajor > 0) {
-               $major=$current_major+1;
-               $minor=0;
-               $revision=0;
-               $age=1;}
-       elsif($incminor > 0) {
-               $major=$current_major;
-               $minor=$current_minor+1;
-               $revision=0;
-               $age=1;}
-       elsif($increvision > 0) {
-               $major=$current_major;
-               $minor=$current_minor;
-               $revision=$current_revision+1;
-               $age=1;} 
-       elsif($incage > 0) {
-               $major=$current_major;
-               $minor=$current_minor;
-               $revision=$current_revision;
-               $age=$current_age+1;} 
-       else {
-               printf("No change in either version component.\nAbort by pressing Ctrl+C or enter new age manually.\nUse a number or a word: ");
-               $major=$current_major;
-               $minor=$current_minor;
-               $revision=$current_revision;
-               $age=<STDIN>;}
-
-       chomp($age);
-
-       $tag="$current_prefix" . "$major" . "_$minor" . "_$revision" . "_$age";
-
-       printf("\nNew tag: $tag\n\n");
-
-       die "This tag already exists; reported by assertion" unless system("cvs log -h $module/Makefile | grep \"$tag\"");
-
-       # **********************************
-       # Create the execution script
-       # **********************************
-
-       open EXEC, ">", "$TMPDIR/tag-with-subsystems-$module.$major.$minor.$revision-$age.sh" or die $!;
-
-       printf (EXEC "#This script registers tags for the $module module, version $major.$minor.$revision-$age\n#Generated automatically by $0\n\n"); 
-
-
-       # **********************************
-       # Update version.properties
-       # **********************************
-        open V, "$module/project/version.properties" or die "$module/project/version.properties: $?\n";
-
-       printf(EXEC "#Generate new version.properties\ncat >$module/project/version.properties <<EOF\n");
-        while ($_ = <V>) {
-                chomp;
-
-               $_=~s/module\.version\s*=\s*[.0-9]+/module\.version=$major.$minor.$revision/;
-                $_=~s/module\.age\s*=\s*(\S+)/module\.age=$age/;
-
-               printf(EXEC "$_\n");
-        }
-        close V;
-       printf(EXEC "EOF\n\n");
-       printf(EXEC "cvs commit -m \"Modified to reflect version $major.$minor.$revision-$age\" $module/project/version.properties\n\n");
-
-
-       $cwd=`pwd`;
-       chomp($cwd);
-
-       printf(EXEC "#Register the new tag\ncd $module\ncvs tag \"$tag\"\n");
-       foreach $m (@modules) {
-               printf (EXEC "cd \"$cwd/$m\"\ncvs tag \"$tag\"\n");
-       }
-       printf(EXEC "cd \"$cwd\"\n");
-       
-
-
-       # **********************************
-       # Etics configuration prepare / modify / upload
-       # **********************************
-
-#      $currentconfig="$module_$module" . "_R_$current_major" . "_$current_minor" . "_$current_revision" . "_$current_age";
-#      $currentconfig=~s/^org.//;
-#      $currentconfig=~s/\./-/g;
-       $newconfig="$module_$module" . "_R_$major" . "_$minor" . "_$revision" . "_$age";
-       $newconfig=~s/^org.//;
-       $newconfig=~s/\./-/g;
-
-
-       printf("\nNew configuration:\t$newconfig\n\nPreparing...\n");
-
-       open NEWCONF, ">", "$TMPDIR/$newconfig.ini.$$" or die $!;
-
-       printf (NEWCONF "[Configuration-$newconfig]\nprofile = None\nmoduleName = $module\ndisplayName = $newconfig\ndescription = None\nprojectName = org.glite\nage = $age\ntag = $tag\nversion = $major.$minor.$revision\npath = None\n\n");
-
-#      printf (NEWCONF "[Platform-default:VcsCommand]\ndisplayName = None\ndescription = HEAD CVS commands\ntag = cvs -d \${vcsroot} tag -R \${tag} \${moduleName}\nbranch = None\ncommit = None\ncheckout = cvs -d \${vcsroot} co -r \${tag} \${moduleName}\n\n");
-
-#      printf (NEWCONF "[Platform-default:Environment]\nHOME = \${workspaceDir}");
-
-       printf (NEWCONF "\n\n[Hierarchy]\n");
-
-       foreach $m (@modules) {
-               open MOD, "$m/project/version.properties" or die "$m/project/version.properties: $?\n";
-
-               $m_major=0; $m_minor=0; $m_revision=0; $m_age=0;
-
-               while ($_ = <MOD>) {
-                       chomp;
-
-                       if(/module\.version\s*=\s*(\d*)\.(\d*)\.(\d*)/) {
-                               $m_major=$1;
-                               $m_minor=$2;
-                               $m_revision=$3;
-                       }
-                       if(/module\.age\s*=\s*(\S+)/) {
-                               $m_age=$1;
-                       }
-               }
-
-               $modconfig="$m_$m" . "_R_$m_major" . "_$m_minor" . "_$m_revision" . "_$m_age";
-               $modconfig=~s/^org.//;
-               $modconfig=~s/\./-/g;
-
-#              system("echo $m = $modconfig >> $TMPDIR/$newconfig.ini.$$");
-               printf(NEWCONF "$m = $modconfig\n");
-
-               close (MOD);
-        }
-
-       close(NEWCONF);
-
-       printf(EXEC "\n#Add new configuration\netics-configuration add -i $TMPDIR/$newconfig.ini.$$ -c $newconfig $module\n");
-       printf(EXEC "etics-commit\n");
-
-
-       # **********************************
-       # Final bows
-       # **********************************
-
-       close(EXEC);
-
-       system("chmod +x \"$TMPDIR/tag-with-subsystems-$module.$major.$minor.$revision-$age.sh\"");
-
-       printf("\n\n---------\nFinished!\n\nExecution script written in:\t$TMPDIR/tag-with-subsystems-$module.$major.$minor.$revision-$age.sh\nNew configuration written in:\t$TMPDIR/$newconfig.ini.$$\n\n");
-
diff --git a/org.glite.lb/etics-tag.pl b/org.glite.lb/etics-tag.pl
deleted file mode 100755 (executable)
index e5f2fe9..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-#!/usr/bin/perl
-
-use Getopt::Std;
-use Switch;
-
-$TMPDIR=$ENV{'TMPDIR'};
-$GLITE_LB_LOCATION="./org.glite.lb";
-
-if ($TMPDIR eq "") {$TMPDIR="/tmp";}
-
-getopts('i:c:m:gh');
-
-$module = shift;
-
-$usage = qq{
-usage: $0 [-i maj|min|rev|age|none|<sigle_word_age>] [-g] [-c <current configuration> ] module.name
-
-       -i      What to increment ('maj'or version, 'min'or version, 'rev'ision, 'age')
-               Should you fail to specify the -i option the script will open up a cvs diff
-               output and ask you to specify what to increment interactively.
-               'none' means no change -- this basically just generates a configuration.
-       -g      Generate old configuration for comparison
-       -c      Use this configuration (\d+\.\d+\.\d+-\S+) rather than parsing version.properties
-       -m      Use this as a CVS commit message instead of the script's default.
-       -h      Display this help
-
-};
-
-       # **********************************
-       # Interpret cmdline options
-       # **********************************
-
-       if (defined $opt_h) {die $usage};
-       die $usage unless $module;
-
-       #Clean possible trailing '/' (even multiple occurrences :-) from module name
-       $module=~s/\/+$//;
-
-       switch ($opt_i) {
-               case "maj" {$increment="j"}
-               case "min" {$increment="i"}
-               case "rev" {$increment="r"}
-               case "age" {$increment="a"}
-               case "none" {$increment="n"}
-               else {$increment=$opt_i};
-       }
-       
-
-       if (defined $opt_c) {
-       
-               # **********************************
-               # Parse the tag supplied by the user 
-               # **********************************
-
-               if ($opt_c=~/(\d+)\.(\d+)\.(\d+)-(\S+?)/) {
-                               $current_major=$1;
-                               $current_minor=$2;
-                               $current_revision=$3;
-                               $current_age=$4;
-               }
-               else {die ("tag not stated properly")};
-
-       }
-       else {
-
-               # **********************************
-               # Determine the most recent tag and its components from version.properties 
-               # **********************************
-
-               open VP, "$module/project/version.properties" or die "$module/project/version.properties: $?\n";
-
-               while ($_ = <VP>) {
-                       chomp;
-
-                       if(/module\.version\s*=\s*(\d*)\.(\d*)\.(\d*)/) {
-                               $current_major=$1;
-                               $current_minor=$2;
-                               $current_revision=$3;
-                       }
-                       if(/module\.age\s*=\s*(\S+)/) {
-                               $current_age=$1;
-                       }
-               }
-               close (VP);
-
-               $current_prefix=$module;
-               $current_prefix=~s/^org\.//;
-               $current_prefix=~s/\./-/g;
-               $current_prefix="$current_prefix" . "_R_";
-               $current_tag="$current_prefix" . "$current_major" . "_$current_minor" . "_$current_revision" . "_$current_age";
-       }
-
-       # According to the documentation, symbolic names in the 'cvs log' output are sorted by age so this should be OK
-       #$current_tag=`cvs log -h $module/Makefile | grep \"_R_\" | head -n 1`;
-       #$current_tag=~s/^\s//;
-       #$current_tag=~s/:.*?$//;
-       #chomp($current_tag);
-
-       #$current_tag=~/(.*_R_)(\d*?)_(\d*?)_(\d*?)_(.*)/;
-       #$current_prefix=$1;
-       #$current_major=$2;
-       #$current_minor=$3;
-       #$current_revision=$4;
-       #$current_age=$5;
-
-       printf("Current tag: $current_tag\n\tprefix: $current_prefix\n\t major: $current_major\n\t minor: $current_minor\n\t   rev: $current_revision\n\t   age: $current_age\n");
-
-       # **********************************
-       # Compare the last tag with the current source
-       # **********************************
-
-       unless (defined $increment) {
-               printf("Diffing...\n");
-
-               system("cvs diff -r $current_tag $module | less");
-       }
-
-       # **********************************
-       # Generate the new tag name
-       # **********************************
-
-       printf("\nWhich component do you wish to increment?\n\n\t'j'\tmaJor\n\t'i'\tmInor\n\t'r'\tRevision\n\t'a'\tAge\n\t\'n'\tNo change\n\tfree type\tUse what I have typed (single word) as a new age name (original: $current_age)\n\nType in your choice: ");
-
-       unless (defined $increment) {
-               $increment=<STDIN>;
-       }
-
-       chomp($increment);
-
-       switch ($increment) {
-               case "j" {
-                       $major=$current_major+1;
-                       $minor=0;
-                       $revision=0;
-                       $age=1;}
-               case "i" {
-                       $major=$current_major;
-                       $minor=$current_minor+1;
-                       $revision=0;
-                       $age=1;}
-               case "r" {
-                       $major=$current_major;
-                       $minor=$current_minor;
-                       $revision=$current_revision+1;
-                       $age=1;} 
-               case "a" {
-                       $major=$current_major;
-                       $minor=$current_minor;
-                       $revision=$current_revision;
-                       $age=$current_age+1;} 
-               case "n" {
-                       $major=$current_major;
-                       $minor=$current_minor;
-                       $revision=$current_revision;
-                       $age=$current_age;} 
-               else {
-                       $major=$current_major;
-                       $minor=$current_minor;
-                       $revision=$current_revision;
-                       $age=$increment;}
-       }
-       $tag="$current_prefix" . "$major" . "_$minor" . "_$revision" . "_$age";
-
-       printf("\nNew tag: $tag\n\n");
-
-       die "This tag already exists; reported by assertion" unless (($increment eq 'n') || system("cvs log -h $module/Makefile | grep \"$tag\""));
-
-       # **********************************
-       # Create the execution script
-       # **********************************
-
-       open EXEC, ">", "$TMPDIR/etics-tag-$module.$major.$minor.$revision-$age.sh" or die $!;
-
-       printf (EXEC "#This script registers tags for the $module module, version $major.$minor.$revision-$age\n#Generated automatically by $0\n\n"); 
-
-
-       # **********************************
-       # Update the ChangeLog
-       # **********************************
-
-       if (-r "$module/project/ChangeLog") { # ChangeLog exists (where expected). Proceed.
-
-               $tmpChangeLog="$TMPDIR/$module.ChangeLog.$$";
-
-               system("cp $module/project/ChangeLog $tmpChangeLog");
-
-               unless ($increment eq "n") {system("echo $major.$minor.$revision-$age >> $tmpChangeLog");}
-
-               $ChangeLogRet=system("vim $tmpChangeLog");
-
-               printf("Modified ChangeLog ready, ret code: $ChangeLogRet\n");
-
-               if (defined $opt_m) {$commit_message=$opt_m;}
-               else {$commit_message="Appended the description of changes regarding version $major.$minor.$revision-$age";}
-
-               printf(EXEC "#Update and commit the ChangeLog\ncp $tmpChangeLog $module/project/ChangeLog\ncvs commit -m \"$commit_message\" $module/project/ChangeLog\n\n");
-
-       }       
-
-       unless ($increment eq "n") {
-               # **********************************
-               # Update version.properties
-               # **********************************
-               open V, "$module/project/version.properties" or die "$module/project/version.properties: $?\n";
-
-               printf(EXEC "#Generate new version.properties\ncat >$module/project/version.properties <<EOF\n");
-               while ($_ = <V>) {
-                       chomp;
-
-                       $_=~s/module\.version\s*=\s*[.0-9]+/module\.version=$major.$minor.$revision/;
-                       $_=~s/module\.age\s*=\s*(\S+)/module\.age=$age/;
-
-                       $_=~s/\$/\\\$/g;
-                       printf(EXEC "$_\n");
-               }
-               close V;
-               printf(EXEC "EOF\n\n");
-
-
-               if (defined $opt_m) {$commit_message=$opt_m;}
-               else {$commit_message="Modified to reflect version $major.$minor.$revision-$age";}
-
-
-               printf(EXEC "cvs commit -m \"$commit_message\" $module/project/version.properties\n\n");
-       }
-
-
-       # **********************************
-       # Update configure
-       # **********************************
-       
-       printf(EXEC "#Update and commit the \"configure\" script\ncp $GLITE_LB_LOCATION/configure $module/\ncvs commit -m \"The most recent version copied. Do not modify this instance (RW in $GLITE_LB_LOCATION).\" $module/configure\n\n");
-
-       unless ($increment eq "n") {
-               # **********************************
-               # Run CVS Tag
-               # **********************************
-
-               $cwd=`pwd`;
-               chomp($cwd);
-
-               printf(EXEC "#Register the new tag\ncd $module\ncvs tag \"$tag\"\ncd \"$cwd\"\n");
-       }
-
-       # **********************************
-       # Etics configuration prepare / modify / upload
-       # **********************************
-
-       $currentconfig="$module_$module" . "_R_$current_major" . "_$current_minor" . "_$current_revision" . "_$current_age";
-       $currentconfig=~s/^org.//;
-       $currentconfig=~s/\./-/g;
-       $newconfig="$module_$module" . "_R_$major" . "_$minor" . "_$revision" . "_$age";
-       $newconfig=~s/^org.//;
-       $newconfig=~s/\./-/g;
-
-       $module=~/([^\.]+?)\.([^\.]+?)$/;
-       $subsysname=$1;
-       $modulename=$2;
-
-       printf("Module=$module\nname=$modulename\nsubsys=$subsysname\n");
-       system("$GLITE_LB_LOCATION/configure --mode=etics --module $subsysname.$modulename --output $TMPDIR/$newconfig.ini.$$ --version $major.$minor.$revision-$age");
-
-#      printf("\nCurrent configuration:\t$currentconfig\nNew configuration:\t$newconfig\n\nPreparing...\n");
-#
-       if (defined $opt_g) {
-               system("etics-configuration prepare -o $TMPDIR/$currentconfig.ini.$$ -c $currentconfig $module");
-       }
-
-#      open OLDCONF, "$TMPDIR/$currentconfig.ini.$$" or die $!; 
-#      open NEWCONF, ">", "$TMPDIR/$newconfig.ini.$$" or die $!;
-
-#       while ($_ = <OLDCONF>) {
-#                chomp;
-
-##                $_=~s/module\.age\s*=\s*(\S+)/module\.age=$age/;
-#              $_=~s/$currentconfig/$newconfig/;
-#              $_=~s/^\s*version\s*=\s*[.0-9]+/version = $major.$minor.$revision/;
-#                $_=~s/^\s*age\s*=\s*\S+/age = $age/;
-
-#              printf(NEWCONF "$_\n");
-#        }
-
-#      close(OLDCONF);
-#      close(NEWCONF);
-
-       if ($increment eq "n") { # There was no version change and the configuration should already exist
-               printf(EXEC "\n#Add new configuration\netics-configuration modify -i $TMPDIR/$newconfig.ini.$$ -c $newconfig $module\n"); }
-       else { # New configuration needs to be created
-       printf(EXEC "\n#Add new configuration\netics-configuration add -i $TMPDIR/$newconfig.ini.$$ -c $newconfig $module\n"); }
-       printf(EXEC "etics-commit\n");
-
-
-       # **********************************
-       # Final bows
-       # **********************************
-
-       close(EXEC);
-
-       system("chmod +x \"$TMPDIR/etics-tag-$module.$major.$minor.$revision-$age.sh\"");
-
-       printf("\n\n---------\nFinished!\n\nExecution script written in:\t$TMPDIR/etics-tag-$module.$major.$minor.$revision-$age.sh\nChangeLog candidate written in:\t$tmpChangeLog\n");
-       printf("Old configuration stored in:\t$TMPDIR/$currentconfig.ini.$$\n") if (defined $opt_g);
-       printf("New configuration written in:\t$TMPDIR/$newconfig.ini.$$\n\n");
-
diff --git a/org.glite.lb/lb4vdt/LB_install.sh b/org.glite.lb/lb4vdt/LB_install.sh
deleted file mode 100755 (executable)
index 93924c9..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-#!/bin/sh
-
-set -e
-
-#OFFLINE=true
-TOPDIR=${PWD}
-
-export LB4VDTDIR=${TOPDIR}/org.glite.lb/lb4vdt
-export STAGEDIR=${TOPDIR}/stage
-mkdir -p ${STAGEDIR}
-
-if [ ! -f ${LB4VDTDIR}/Makefile.inc ]; then
-   echo "Error: There is no ${LB4VDTDIR}/Makefile.inc. Exiting."
-   exit 1
-fi
-
-if [ -z "${CVSROOT}" ]; then
-       export CVSROOT=:pserver:anonymous@jra1mw.cvs.cern.ch:/cvs/jra1mw
-#      export CVSROOT=:ext:jpospi@jra1mw.cvs.cern.ch:/cvs/jra1mw
-       echo "Using CVSROOT=${CVSROOT}"
-fi
-
-dep_modules="org.glite.wms-utils.jobid
-org.gridsite.core"
-
-modules="org.glite.security.gsoap-plugin
-org.glite.lb.client-interface
-org.glite.lb.common
-org.glite.lb.client
-org.glite.lb.logger
-org.glite.lb.ws-interface
-org.glite.lb.server-bones
-org.glite.lb.server
-org.glite.lb.proxy"
-#org.glite.lb.utils
-
-for i in $dep_modules; 
-do 
-    echo "*********************************************************"
-    echo "*  Module $i"
-    echo "*********************************************************"
-    cd ${TOPDIR}
-    if [ -n "${OFFLINE}" ]; then
-        echo "Working offline"
-    else
-        echo "Getting sources from CVS"
-        cvs co -A $i;
-    fi 
-    if [ -d $i -a -f ${LB4VDTDIR}/patches/$i.patch -a ! -f .$i.patched ]; then
-        echo "Patching $i"
-        patch -p0 < ${LB4VDTDIR}/patches/$i.patch
-       touch .$i.patched
-    fi
-    if [ -d $i ]; then
-       touch .$i.timestamp
-        if  [ -f ${LB4VDTDIR}/scripts/$i.build ]; then
-       echo "Building"
-            sh -x ${LB4VDTDIR}/scripts/$i.build 
-        fi
-       cd ${TOPDIR}
-       find ${STAGEDIR} -newer .$i.timestamp > .$i.filelist
-    else
-        echo "WARNING: directory $i not found"
-    fi
-done
-
-for i in $modules; 
-do 
-    echo "*********************************************************"
-    echo "*  Module $i"
-    echo "*********************************************************"
-    cd ${TOPDIR}
-    if [ -n "${OFFLINE}" ]; then
-        echo "Working offline"
-    else
-        echo "Getting sources from CVS"
-        cvs co -A $i; 
-    fi 
-    if [ -d $i -a -f ${LB4VDTDIR}/patches/$i.patch -a ! -f .$i.patched ]; then
-        echo "Patching $i"
-        patch -p0 < ${LB4VDTDIR}/patches/$i.patch
-       touch .$i.patched
-    fi
-    if [ -d $i ]; then
-       touch .$i.timestamp
-        echo "Entering directory ${TOPDIR}/$i"
-        cd ${TOPDIR}/$i
-        echo "Copying supporting files"
-        cp -rv ${TOPDIR}/org.glite.lb/project/{at3,*.T,*.pm} ./project/    
-        mkdir -p build
-        echo "Entering directory ${TOPDIR}/$i/build"
-        cd build 
-        ln -fsv ../Makefile 
-#        ln -fsv ../../Makefile.inc Makefile.inc
-        ln -fsv ${LB4VDTDIR}/Makefile.inc 
-        echo "Building"    
-       make LB_STANDALONE=yes
-        make stage LB_STANDALONE=yes
-       cd ${TOPDIR}
-       find ${STAGEDIR} -newer .$i.timestamp > .$i.filelist
-    else
-        echo "WARNING: directory $i not found"
-    fi
-    echo "Done"    
-done
-
-cd ${TOPDIR}
-echo "Creating filelists"
-cat .org.glite.wms-utils.jobid.filelist .org.gridsite.core.filelist .org.glite.security.gsoap-plugin.filelist .org.glite.lb.common.filelist | sort | uniq > LB-common.filelist
-cat .org.glite.lb.client-interface.filelist .org.glite.lb.client.filelist | sort | uniq > LB-client.filelist
-cat .org.glite.lb.logger.filelist | sort | uniq > LB-logger.filelist
-cat .org.glite.lb.logger.filelist .org.glite.lb.server-bones.filelist .org.glite.lb.proxy.filelist | sort | uniq > LB-proxy.filelist
-cat .org.glite.lb.ws-interface.filelist .org.glite.lb.server-bones.filelist .org.glite.lb.server.filelist | sort | uniq > LB-server.filelist
diff --git a/org.glite.lb/lb4vdt/Makefile.inc b/org.glite.lb/lb4vdt/Makefile.inc
deleted file mode 100644 (file)
index c9c3072..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#
-# common setting
-#
-
-#vdt_location=/home/honik/egee/vdt-1.5.0
-vdt_location=${VDT_LOCATION}
-
-# missing packages could be for example downloaded to repository from
-# http://eticssoft.web.cern.ch/eticssoft/repository/externals
-
-repository=/home/honik/egee/repository/externals/
-platform=slc3_ia32_gcc323
-
-
-#
-# external dependencies that are already part of VDT (vdt-1.5.0):
-#
-
-#classads_prefix=${repository}/classads/0.9.8/${platform}
-classads_prefix=${vdt_location}/classads
-
-#globus_prefix=${repository}/globus/2.4.3-VDT-1.2.5/${platform}
-globus_prefix=${vdt_location}/globus
-
-#expat_prefix=/usr
-expat_prefix=${vdt_location}/expat
-
-#mysql_prefix=${repository}/mysql-devel/4.1.11/${platform}
-mysql_prefix=${vdt_location}/mysql
-mysql_version=4.1.21
-
-voms_prefix=${vdt_location}/glite
-#voms_prefix=/home/honik/egee/glite/stage
-
-
-#
-# external dependencies that are NOT (yet) part of VDT (vdt-1.5.0):
-#
-
-#cares_prefix=${repository}/c-ares/1.3.0/${platform}
-cares_prefix=/software/cares-1.3
-
-# probably not needed (used "only" for unit tests - 'make check'):
-#cppunit_prefix=${repository}/cppunit/1.10.2/${platform}
-cppunit_prefix=/software/cppunit-1.10.2
-
-# probably not needed:
-#gridsite_prefix=${stagedir}
-
-gsoap_default_version=2.7.6b
-gsoap_versions=${gsoap_default_version}
-#gsoap_prefix=${repository}/gsoap/${gsoap_default_version}/${platform}
-gsoap_prefix=/software/gsoap-${gsoap_default_version}
-
-
-#
-# some other defaults:
-#
-
-#PREFIX=${vdt_location}/glite
-PREFIX=/tmp/lb4vdt
-globalprefix=glite
-lbprefix=lb
-
-builddir=build
-distdir=${STAGEDIR}/../dist
-stagedir=${STAGEDIR}
-top_srcdir=..
-
-#thrflavour=gcc64dbgpthr
-#nothrflavour=gcc64dbg
-thrflavour=gcc32dbgpthr
-nothrflavour=gcc32dbg
-
-# needed by org.glite.lb.client:
-glite_location=${stagedir}
-
diff --git a/org.glite.lb/lb4vdt/scripts/org.gridsite.core.build b/org.glite.lb/lb4vdt/scripts/org.gridsite.core.build
deleted file mode 100644 (file)
index 38258c5..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/sh
-
-set -e
-
-TOPDIR=${PWD}
-source ${LB4VDTDIR}/Makefile.inc
-cd org.gridsite.core/src
-make build-lib OPENSSL_FLAGS=-I${globus_prefix}/include/${nothrflavour} OPENSSL_LIBS=-L${globus_prefix}/lib FLAVOR_EXT=_${nothrflavour}
-make install-lib prefix=${STAGEDIR} 
-cd ${TOPDIR}
-
diff --git a/org.glite.lb/project/build.number b/org.glite.lb/project/build.number
deleted file mode 100644 (file)
index cc27364..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#Fri Aug 18 12:35:01 CEST 2006
-module.build=0242
diff --git a/org.glite.lb/project/build.properties b/org.glite.lb/project/build.properties
deleted file mode 100644 (file)
index a57c085..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-ext.gsoap.version=2.7.6b
-ext.gsoap.rep.file=gSOAP-2.7.6b.tar.gz
diff --git a/org.glite.lb/project/glite.lb.csf.xml b/org.glite.lb/project/glite.lb.csf.xml
deleted file mode 100644 (file)
index 7d77350..0000000
+++ /dev/null
@@ -1,398 +0,0 @@
-<?xml version="1.0"?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       gLite Middleware Logging and Bookkeping Configuration Specification File
-       
-       Authors: Alberto Di Meglio <alberto.di.meglio@cern.ch>  
-                Joachim Flammer <Joachim.Flammer@cern.ch>      
-                Ales Krenek <ljocha@ics.muni.cz>
-       Version info: $Id$
-       Release: $Name$
-
-       Revision history:
-       $Log$
-       Revision 1.16  2006/03/15 17:33:24  akrenek
-       merge of 1.5 branch
-       
-       Revision 1.15  2005/11/27 21:51:18  eronchie
-       Applied fix for bug 13928
-       
-       Revision 1.14  2005/10/15 20:14:55  jpospi
-       remove duplicate lb.utils section
-       
-       Revision 1.13.2.1.2.1  2005/11/28 10:39:08  akrenek
-       merge bug #13928 fix on the pre_cares branch
-       
-       Revision 1.13.2.1  2005/10/17 16:27:48  akrenek
-       merged in the duplicate utils targed patch
-       
-       Revision 1.15  2005/11/27 21:51:18  eronchie
-       Applied fix for bug 13928
-       
-       Revision 1.14  2005/10/15 20:14:55  jpospi
-       remove duplicate lb.utils section
-       
-       Revision 1.13  2005/10/15 13:36:26  akrenek
-       added lb.utils
-       
-       Revision 1.12  2005/03/16 10:02:52  zsalvet
-       proxy component added
-       
-       Revision 1.11  2004/12/01 18:01:55  zsalvet
-       LB here, not R-GMA
-       
-       Revision 1.10  2004/11/29 16:01:21  zsalvet
-       Evaluate component.{head,tag} conditions before use of get.* targets.
-       
-       Revision 1.9  2004/11/29 15:16:26  zsalvet
-       Add ws-interface to checkout/build machinery.
-       
-       Revision 1.8  2004/10/18 22:55:14  dimeglio
-       Added oscheck to various targets
-       
-       Revision 1.7  2004/10/15 12:30:01  akrenek
-       build with lb.sever-bones
-       
-       Revision 1.6  2004/08/27 10:03:41  zurek
-       typo problem
-       
-       Revision 1.5  2004/08/27 09:13:11  zurek
-       changing thee order for build
-       
-       Revision 1.4  2004/07/29 10:47:46  dimeglio
-       Added server and logger
-       
-       Revision 1.3  2004/07/16 16:25:43  flammer
-       Added tags for automated adding of components.
-       
-       Revision 1.2  2004/06/23 00:22:11  dimeglio
-       Added client and client-interface components
-       
-       Revision 1.1  2004/06/18 23:05:53  dimeglio
-       Added/upgraded default build scripts
-       
--->
-
-
-<project name="GLite Middleware Logging and Bookkeping CSF" default="all">
-
-       <!-- ===============================================
-                 Determine workspace directory 
-                =============================================== -->
-
-       <!-- Relative workspace root directory -->
-       <property name="workspace.dir" value="../.." />
-       
-       <!-- ===============================================
-                Load properties
-                =============================================== -->
-
-       <!-- load baseline and user properties -->
-       <import file="${workspace.dir}/org.glite/project/baseline.properties.xml" />
-
-       <!-- define build properties file location since we are already in project dir -->
-       <property name="subsystem.build.properties.file" value="./build.properties" />
-
-       <!-- Load subsystem-specific property file -->
-       <property file="./properties.xml"/>
-
-       <!-- load global properties -->
-       <import file="${global.properties.file}" />
-
-       <!-- ===============================================
-                Load dependencies 
-                =============================================== -->
-
-       <!-- Load user dependencies file -->
-       <property file="${user.dependencies.file}" />
-               
-       <!-- Load subsystem dependencies file -->
-       <property file="./dependencies.properties" />
-
-       <!-- Load global dependencies file -->
-       <property file="${global.dependencies.file}" />
-
-       <!-- ===============================================
-                Load targets
-                =============================================== -->
-       <import file="${global.targets-envchecks.file}" />
-       <import file="${global.targets-external-dependencies.file}" />  
-
-       <!-- ===============================================
-                Evaluate CVS tags
-                =============================================== -->
-
-       <target name="evaluate.cvs.tags" description="Figure out if we need tagged CVS checkout">
-               <condition property="glite.head">
-                       <and>
-                               <equals arg1="${org.glite.version}" arg2="HEAD" />
-                               <or>
-                                       <istrue value="${update}" />
-                                       <not>
-                                               <available file="${global.dependencies.file}" type="file" />
-                                       </not>
-                               </or>
-                       </and>
-               </condition>
-               <condition property="glite.tag">
-                       <and>
-                               <not>
-                                       <equals arg1="${org.glite.version}" arg2="HEAD" />
-                               </not>
-                               <or>
-                                       <istrue value="${update}" />
-                                       <not>
-                                               <available file="${global.dependencies.file}" type="file" />
-                                       </not>
-                               </or>
-                       </and>
-               </condition>
-               <condition property="glite-lb.head">
-                       <and>
-                               <equals arg1="${org.glite.lb.version}" arg2="HEAD" />
-                               <istrue value="${update}" />
-                       </and>
-               </condition>
-               <condition property="glite-lb.tag">
-                       <and>
-                               <not>
-                                       <equals arg1="${org.glite.lb.version}" arg2="HEAD" />
-                               </not>
-                               <istrue value="${update}" />
-                       </and>
-               </condition>
-       
-               <!-- condition property tag = do not remove = -->
-
-               <condition property="utils.head">
-                       <equals arg1="${org.glite.lb.utils.version}" arg2="HEAD" />
-               </condition>
-
-               <condition property="common.head">
-                       <equals arg1="${org.glite.lb.common.version}" arg2="HEAD" />
-               </condition>
-
-               <condition property="server-bones.head">
-                       <equals arg1="${org.glite.lb.server-bones.version}" arg2="HEAD" />
-               </condition>
-
-               <condition property="client-interface.head">
-                       <equals arg1="${org.glite.lb.client-interface.version}" arg2="HEAD" />
-               </condition>
-
-               <condition property="ws-interface.head">
-                       <equals arg1="${org.glite.lb.ws-interface.version}" arg2="HEAD" />
-               </condition>
-
-               <condition property="client.head">
-                       <equals arg1="${org.glite.lb.client.version}" arg2="HEAD" />
-               </condition>
-
-               <condition property="server.head">
-                       <equals arg1="${org.glite.lb.server.version}" arg2="HEAD" />
-               </condition>
-
-               <condition property="proxy.head">
-                       <equals arg1="${org.glite.lb.proxy.version}" arg2="HEAD" />
-               </condition>
-
-               <condition property="logger.head">
-                       <equals arg1="${org.glite.lb.logger.version}" arg2="HEAD" />
-               </condition>
-
-       </target>
-
-       <presetdef name="cvs-co">
-               <cvs command="checkout" dest="${workspace.dir}" />
-       </presetdef>
-
-       <!-- =====================================================
-                Self-update if required
-                ===================================================== -->
-               
-       <!-- Update main GLite module -->
-       <target name="org.glite" depends="evaluate.cvs.tags, get.glite.head, get.glite.tag"/>
-       <target name="get.glite.head" if="glite.head">
-               <cvs-co package="org.glite" />
-       </target>
-       <target name="get.glite.tag" if="glite.tag">
-               <cvs-co package="org.glite"
-                       tag="${org.glite.version}" />
-       </target>
-
-       <!-- Update the current module -->
-       <target name="org.glite.lb" depends="evaluate.cvs.tags, get.glite-lb.head, get.glite-lb.tag"/>
-       <target name="get.glite-lb.head" if="glite-lb.head">
-               <cvs-co package="org.glite.lb" />
-               <fail>The org.glite and org.glite.lb modules have been updated, please rerun the configuration file</fail>
-       </target>
-       <target name="get.glite-lb.tag" if="glite-lb.tag">
-               <cvs-co package="org.glite.lb"
-                       tag="${org.glite.lb.version}" />
-               <fail>The org.glite and org.glite.lb modules have been updated, please rerun the configuration file</fail>
-       </target>
-
-       <!-- *****************************************************-->
-       <!-- Development tools                                    -->
-       <!-- *****************************************************-->
-       
-       <!-- All development tools -->
-       <target name="devtools" depends="oscheck,
-                                       evaluate.cvs.tags,
-                                       junitcheck,
-                                       junit,
-                                       chkstyle,
-                                       jalopy,
-                                       ant-contrib,
-                                       cpptasks,
-                                       egee-ant-ext"
-                       description="Get development tools into repository."/>          
-
-       <!-- =====================================================
-                External libraries
-                ===================================================== -->
-       
-       <!--  All external libraries -->
-       <target name="external" depends="oscheck, 
-                                       evaluate.cvs.tags, 
-                                       classads, 
-                                       globus"
-                       description="Install external packages"/>
-       
-       <!-- =====================================================
-                GLite Middleware LB modules
-                ===================================================== -->
-
-       <!-- component targets tag = do not remove = -->
-
-       <!-- common -->
-       <target name="common" depends="evaluate.cvs.tags, get.common.head, get.common.tag"/>
-       <target name="get.common.head" if="common.head">
-               <cvs-co package="org.glite.lb.common" />
-       </target>
-       <target name="get.common.tag" unless="common.head">
-               <cvs-co package="org.glite.lb.common"
-                       tag="${org.glite.lb.common.version}" />
-       </target>
-
-       <!-- server-bones -->
-       <target name="server-bones" depends="evaluate.cvs.tags, get.server-bones.head, get.server-bones.tag"/>
-       <target name="get.server-bones.head" if="server-bones.head">
-               <cvs-co package="org.glite.lb.server-bones" />
-       </target>
-       <target name="get.server-bones.tag" unless="server-bones.head">
-               <cvs-co package="org.glite.lb.server-bones"
-                       tag="${org.glite.lb.server-bones.version}" />
-       </target>
-
-       <!-- client-interface -->
-       <target name="client-interface" depends="evaluate.cvs.tags, get.client-interface.head, get.client-interface.tag"/>
-       <target name="get.client-interface.head" if="client-interface.head">
-               <cvs-co package="org.glite.lb.client-interface" />
-       </target>
-       <target name="get.client-interface.tag" unless="client-interface.head">
-               <cvs-co package="org.glite.lb.client-interface"
-                       tag="${org.glite.lb.client-interface.version}" />
-       </target>
-
-       <!-- WS interface -->
-       <target name="ws-interface" depends="evaluate.cvs.tags, get.ws-interface.head, get.ws-interface.tag"/>
-       <target name="get.ws-interface.head" if="ws-interface.head">
-               <cvs-co package="org.glite.lb.ws-interface" />
-       </target>
-       <target name="get.ws-interface.tag" unless="ws-interface.head">
-               <cvs-co package="org.glite.lb.ws-interface"
-                       tag="${org.glite.lb.ws-interface.version}" />
-       </target>
-
-       <!-- client -->
-       <target name="client" depends="evaluate.cvs.tags, get.client.head, get.client.tag"/>
-       <target name="get.client.head" if="client.head">
-               <cvs-co package="org.glite.lb.client" />
-       </target>
-       <target name="get.client.tag" unless="client.head">
-               <cvs-co package="org.glite.lb.client"
-                       tag="${org.glite.lb.client.version}" />
-       </target>
-
-       <!-- server -->
-       <target name="server" depends="evaluate.cvs.tags, get.server.head, get.server.tag"/>
-       <target name="get.server.head" if="server.head">
-               <cvs-co package="org.glite.lb.server" />
-       </target>
-       <target name="get.server.tag" unless="server.head">
-               <cvs-co package="org.glite.lb.server"
-                       tag="${org.glite.lb.server.version}" />
-       </target>
-
-       <!-- proxy -->
-       <target name="proxy" depends="evaluate.cvs.tags, get.proxy.head, get.proxy.tag"/>
-       <target name="get.proxy.head" if="proxy.head">
-               <cvs-co package="org.glite.lb.proxy" />
-       </target>
-       <target name="get.proxy.tag" unless="proxy.head">
-               <cvs-co package="org.glite.lb.proxy"
-                       tag="${org.glite.lb.proxy.version}" />
-       </target>
-
-       <!-- logger -->
-       <target name="logger" depends="evaluate.cvs.tags, get.logger.head, get.logger.tag"/>
-       <target name="get.logger.head" if="logger.head">
-               <cvs-co package="org.glite.lb.logger" />
-       </target>
-       <target name="get.logger.tag" unless="logger.head">
-               <cvs-co package="org.glite.lb.logger"
-                       tag="${org.glite.lb.logger.version}" />
-       </target>
-
-       <!-- utils -->
-       <target name="utils" depends="get.utils.head, get.utils.tag"/>
-       <target name="get.utils.head" if="utils.head">
-               <cvs-co package="org.glite.lb.utils" />
-       </target>
-       <target name="get.utils.tag" unless="utils.head">
-               <cvs-co package="org.glite.lb.utils"
-                       tag="${org.glite.lb.utils.version}" />
-       </target>
-
-       <!-- All project modules -->
-       <target name="project" depends="utils,
-                                       client-interface,
-                                       ws-interface,
-                                       common,
-                                       server-bones,
-                                       client,
-                                       server,
-                                       proxy,
-                                       logger"/>
-
-
-       <!-- ====================================================
-                Checkout all
-                ==================================================== -->
-       
-       <!-- All libraries -->
-       <target name="all" depends="oscheck,evaluate.cvs.tags, defaultenvchecks, org.glite, org.glite.lb, devtools, external, project" />               
-
-       <!-- ====================================================
-                Print dependecies to console
-                ==================================================== -->
-       
-       <target name="dependencies">
-               <concat>
-                       <fileset dir="." includes="dependencies.properties" />
-               </concat>
-       </target>               
-
-</project>
diff --git a/org.glite.lb/project/package.description b/org.glite.lb/project/package.description
deleted file mode 100644 (file)
index 7fd54e7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-gLite Logging and Bookkeeping (LB) is a Grid service that keeps a short-term trace of Grid jobs as they are processed by individual Grid components. 
diff --git a/org.glite.lb/project/package.summary b/org.glite.lb/project/package.summary
deleted file mode 100644 (file)
index cb27971..0000000
+++ /dev/null
@@ -1 +0,0 @@
-gLite Logging and Bookkeeping
diff --git a/org.glite.lb/project/properties.xml b/org.glite.lb/project/properties.xml
deleted file mode 100755 (executable)
index 0d0291a..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Common build properties file for the gLite LB modules
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-                        Alberto Di Meglio <alberto.di.meglio@cern.ch>          
-       Version info: $Id$
-       Release: $Name$
-
-       Revision history:
-       $Log$
--->
-
-<project name="Logging and Bookkeping subsystem common properties">
-
-       <!-- Include build properties to allow overwriting 
-            of properties for subsystem                    -->
-       <property name="subsystem.build.properties.file" value="./project/build.properties" />
-       <property file="${subsystem.build.properties.file}" />  
-
-       <!-- ======================================================
-          Define subsystem properties
-                ====================================================== -->
-       
-       <!-- Subsystem name -->
-       <property name="subsystem.name" value="${lb.subsystem.name}"/>
-       
-       <!-- Subsystem prefix -->
-       <property name="subsystem.prefix" value="${lb.subsystem.prefix}"/>
-       
-       <!-- ======================================================
-          Define general subsystem properties
-                ====================================================== -->
-               
-       <!-- Include common subsystem properties -->
-       <import file="${subsystem.general.properties.file}" />
-       
-       <!-- ======================================================
-                Define extra properties here ...
-                ====================================================== -->
-                       
-               
-</project>
\ No newline at end of file
diff --git a/org.glite.lb/project/run-workspace b/org.glite.lb/project/run-workspace
deleted file mode 100644 (file)
index 03a3381..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-cd ../..
-
-cvs co org.glite
-cvs co org.glite.lb
-                                                                                                                                                             
-cd org.glite.lb/project
-ant -f glite.lb.csf.xml
-
diff --git a/org.glite.lb/project/taskdefs.xml b/org.glite.lb/project/taskdefs.xml
deleted file mode 100755 (executable)
index 251f790..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-       Copyright (c) 2004 on behalf of the EU EGEE Project: 
-       The European Organization for Nuclear Research (CERN), 
-       Istituto Nazionale di Fisica Nucleare (INFN), Italy
-       Datamat Spa, Italy
-       Centre National de la Recherche Scientifique (CNRS), France
-       CS Systeme d'Information (CSSI), France
-       Royal Institute of Technology, Center for Parallel Computers (KTH-PDC), Sweden
-       Universiteit van Amsterdam (UvA), Netherlands
-       University of Helsinki (UH.HIP), Finland
-       University of Bergen (UiB), Norway
-       Council for the Central Laboratory of the Research Councils (CCLRC), United Kingdom
-
-       Common Ant task definition file for the gLite Logging and Bookeeping modules
-       
-       Authors: Ales Krenek <ljocha@ics.muni.cz>
-                        Alberto Di Meglio <alberto.di.meglio@cern.ch>          
-       Version info: $Id$
-       Release: $Name$
-
-       Revision history:
-       $Log$
--->
-
-<project name="Logging and Bookeeping subsystem common tasks and types definitions">
-       
-       <!-- ======================================================
-                Subsystem task definitions
-                ====================================================== -->
-       
-</project>
\ No newline at end of file
diff --git a/org.glite.lb/project/version.properties b/org.glite.lb/project/version.properties
deleted file mode 100644 (file)
index 9f3167f..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-# : /cvs/glite/org.glite.lb/project/version.properties,v 1.164 2008/01/09 15:35:55 mmulac Exp $
-module.version=2.0.5
-module.age=7