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
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
+++ /dev/null
-# 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/
+++ /dev/null
-<?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&B local logger" />
- <property name="build.package.description" value="
-Daemons installed on any EGEE machine producing Logging & Bookkeeping
-(L&B)
events. They are responsible for non-blocking accept of
-an event, persistent
storage, and reliable transfer to bookkeeping server." />
-
-</project>
+++ /dev/null
-<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>
+++ /dev/null
-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
+++ /dev/null
-#!/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
+++ /dev/null
-#!/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
-
-};
-
-}
+++ /dev/null
-.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.
+++ /dev/null
-.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.
+++ /dev/null
-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
-
+++ /dev/null
-#Fri Aug 18 12:30:51 CEST 2006
-module.build=0243
+++ /dev/null
-<?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>
+++ /dev/null
-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.
+++ /dev/null
-gLite Logging and Bookkeeping local-logger and inter-logger
+++ /dev/null
-<?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>
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure.properties.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-# $Header$
-module.version=2.0.5
-module.age=1
+++ /dev/null
-#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
+++ /dev/null
-#include "Connection.H"
-
-Connection::Factory::~Factory() {
-}
+++ /dev/null
-#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
+++ /dev/null
-#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)
-{
-}
+++ /dev/null
-#ifndef _EXCEPTION_H
-#define _EXCEPTION_H
-
-class Exception {
-};
-
-class FatalException {
-};
-
-
-#define E_ASSERT(a) if(!(a)) { throw new FatalException; }
-
-#endif
+++ /dev/null
-#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
+++ /dev/null
-#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->
-}
+++ /dev/null
-#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
+++ /dev/null
-#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()
-{
-}
+++ /dev/null
-
-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
+++ /dev/null
-#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
+++ /dev/null
-#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
+++ /dev/null
-#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();
-}
-
+++ /dev/null
-#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
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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
+++ /dev/null
-#include "PluginManager.H"
-
-PluginManager::Plugin::~Plugin() {
-}
-
-
+++ /dev/null
-#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
+++ /dev/null
-#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
+++ /dev/null
-#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
+++ /dev/null
-#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?
-}
+++ /dev/null
-#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
+++ /dev/null
-#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;
- }
- }
-}
-
+++ /dev/null
-#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
+++ /dev/null
-#include "Transport.H"
-
-Transport::~Transport()
-{
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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 );
+++ /dev/null
-#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 );
+++ /dev/null
-#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 );
+++ /dev/null
-#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 );
+++ /dev/null
-#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 ;
-}
+++ /dev/null
-#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);
-}
-
+++ /dev/null
-#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, ¬if_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);
-}
-
+++ /dev/null
-#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);
-}
-
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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
+++ /dev/null
-#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 */
-}
+++ /dev/null
-#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
+++ /dev/null
-#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
-
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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__ */
+++ /dev/null
-#!/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;
-
+++ /dev/null
-#!/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
+++ /dev/null
-#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(¬ifid_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: */
+++ /dev/null
-#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: */
+++ /dev/null
-#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: */
+++ /dev/null
-#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);
- }
-}
+++ /dev/null
-#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 */
-
-
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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, ¬if_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;
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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
-};
+++ /dev/null
-extern "C" {
-#include "interlogd.h"
-}
-
-class IlTestBase {
-public:
- static const char *msg;
- static const char *msg_enc;
- static const struct server_msg smsg;
-};
+++ /dev/null
-#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 );
+++ /dev/null
-#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 );
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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);
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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"
+++ /dev/null
-#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);
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
+++ /dev/null
-# 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
-
+++ /dev/null
-<?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&B bookkeeping server" />
- <property name="build.package.description" value=" The daemon
-installed at the Logging & Bookkeeping (L&B) server
-machine.
It is responsible for accepting events from locallogger,
-storing them in RDBMS,
and performing queries on client requests
-(job status, job log etc.).
Also includes purge utilities
-to remove (and optionally archive) inactive
data from
-the database and to change database index configuration." />
-
-</project>
+++ /dev/null
-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;
-
-
+++ /dev/null
-[
- JobIndices = {
- [ type = "system"; name = "owner" ],
- [ type = "system"; name = "location" ],
- [ type = "system"; name = "destination" ],
- [ type = "system"; name = "lastUpdateTime" ]
- }
-]
+++ /dev/null
-# 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"
-
+++ /dev/null
-#!/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
+++ /dev/null
-#!/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
-
-};
-
-}
+++ /dev/null
-.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.
+++ /dev/null
-.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.
+++ /dev/null
-.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.
+++ /dev/null
-/*
-
-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, "	", 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, "
", 5))
- return soap->error;
- s = t;
- }
- break;
- case 13:
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "
", 5))
- return soap->error;
- s = t;
- break;
- case '&':
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5))
- return soap->error;
- s = t;
- break;
- case '<':
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4))
- return soap->error;
- s = t;
- break;
- case '>':
- if (!flag)
- { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4))
- return soap->error;
- s = t;
- }
- break;
- case '"':
- if (flag)
- { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 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 = "	";
- else
- t = "\t";
- break;
- case 10:
- if (flag || !(soap->mode & SOAP_XML_CANONICAL))
- t = "
";
- else
- t = "\n";
- break;
- case 13:
- t = "
";
- break;
- case '&':
- t = "&";
- break;
- case '<':
- t = "<";
- break;
- case '>':
- if (flag)
- t = ">";
- else
- t = ">";
- break;
- case '"':
- if (flag)
- t = """;
- 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
-
+++ /dev/null
-/*
-
-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, "	", 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, "
", 5))
- return soap->error;
- s = t;
- }
- break;
- case 13:
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "
", 5))
- return soap->error;
- s = t;
- break;
- case '&':
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5))
- return soap->error;
- s = t;
- break;
- case '<':
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4))
- return soap->error;
- s = t;
- break;
- case '>':
- if (!flag)
- { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4))
- return soap->error;
- s = t;
- }
- break;
- case '"':
- if (flag)
- { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 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 = "	";
- else
- t = "\t";
- break;
- case 10:
- if (flag || !(soap->mode & SOAP_XML_CANONICAL))
- t = "
";
- else
- t = "\n";
- break;
- case 13:
- t = "
";
- break;
- case '&':
- t = "&";
- break;
- case '<':
- t = "<";
- break;
- case '>':
- if (flag)
- t = ">";
- else
- t = ">";
- break;
- case '"':
- if (flag)
- t = """;
- 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
-
+++ /dev/null
-/*
-
-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, "	", 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, "
", 5))
- return soap->error;
- s = t;
- }
- break;
- case 13:
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "
", 5))
- return soap->error;
- s = t;
- break;
- case '&':
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5))
- return soap->error;
- s = t;
- break;
- case '<':
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4))
- return soap->error;
- s = t;
- break;
- case '>':
- if (!flag)
- { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4))
- return soap->error;
- s = t;
- }
- break;
- case '"':
- if (flag)
- { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 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 = "	";
- else
- t = "\t";
- break;
- case 10:
- if (flag || !(soap->mode & SOAP_XML_CANONICAL))
- t = "
";
- else
- t = "\n";
- break;
- case 13:
- t = "
";
- break;
- case '&':
- t = "&";
- break;
- case '<':
- t = "<";
- break;
- case '>':
- if (flag)
- t = ">";
- else
- t = ">";
- break;
- case '"':
- if (flag)
- t = """;
- 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
-
+++ /dev/null
-/*
-
-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, "	", 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, "
", 5))
- return soap->error;
- s = t;
- }
- break;
- case 13:
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "
", 5))
- return soap->error;
- s = t;
- break;
- case '&':
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "&", 5))
- return soap->error;
- s = t;
- break;
- case '<':
- if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, "<", 4))
- return soap->error;
- s = t;
- break;
- case '>':
- if (!flag)
- { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, ">", 4))
- return soap->error;
- s = t;
- }
- break;
- case '"':
- if (flag)
- { if (soap_send_raw(soap, s, t - s - 1) || soap_send_raw(soap, """, 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 = "	";
- else
- t = "\t";
- break;
- case 10:
- if (flag || !(soap->mode & SOAP_XML_CANONICAL))
- t = "
";
- else
- t = "\n";
- break;
- case 13:
- t = "
";
- break;
- case '&':
- t = "&";
- break;
- case '<':
- t = "<";
- break;
- case '>':
- if (flag)
- t = ">";
- else
- t = ">";
- break;
- case '"':
- if (flag)
- t = """;
- 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
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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 */
+++ /dev/null
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int pretty_print(char *jdl, char **formated_print);
-
-#ifdef __cplusplus
-}
-#endif
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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 */
+++ /dev/null
-#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 */
+++ /dev/null
-MultiStruct.pm
-StructField.pm
-at3
-events.T
-status.T
-types.T
+++ /dev/null
-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
+++ /dev/null
-#Fri Aug 18 12:32:02 CEST 2006
-module.build=0245
+++ /dev/null
-<?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>
+++ /dev/null
-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).
+++ /dev/null
-gLite Logging and Bookkeeping server
+++ /dev/null
-<?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
+++ /dev/null
-tar_exclude
-CVS
-build.xml
-build
-build.properties
-properties.xml
-configure-options.xml
-.cvsignore
-.project
-.cdtproject
+++ /dev/null
-# : /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
+++ /dev/null
-#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);
-}
-
+++ /dev/null
-#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,¬if_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);
-}
-
+++ /dev/null
-#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;
-}
-
+++ /dev/null
-#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 */
-
+++ /dev/null
-#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);
-}
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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, ®_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);
-}
+++ /dev/null
-#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;
- }
-}
-
-
+++ /dev/null
-#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
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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);
- }
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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,
- ®_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, ""));
-}
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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);
-}
+++ /dev/null
-%{
-#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;
-
+++ /dev/null
-%{
-#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");
-}
-
-
+++ /dev/null
-#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);
-
-}
-
-
+++ /dev/null
-#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*/
+++ /dev/null
-#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);
-}
-
-
+++ /dev/null
-#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;
-}
-
+++ /dev/null
-#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("<")+1)*sizeof(*html) );
- strcpy(html+j, "<");
- j += strlen("<");
- }
- else if (xml[i] == '>'){
- html = realloc(html, (j+strlen(">")+1)*sizeof(*html) );
- strcpy(html+j, ">");
- j += strlen(">");
- }
- 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: "<anonymous>"
- );
- 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;
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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, ¬ifs) < 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, ¬if) < 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, ¬ifids);
- 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, ¬ifId,
- &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);
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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;
-}
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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;
-}
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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;
-}
-
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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
+++ /dev/null
-#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++;
- }
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
+++ /dev/null
-#!/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
+++ /dev/null
-#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;
-}
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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);
-}
-
-
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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);
- }
-
-}
+++ /dev/null
-#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);
-}
-
+++ /dev/null
-#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 */
+++ /dev/null
-#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]);
- }
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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
+++ /dev/null
-#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);
- }
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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);
- }
-}
+++ /dev/null
-lb = http://glite.org/wsdl/services/lb
-lbt = http://glite.org/wsdl/types/lb
-lbe = http://glite.org/wsdl/elements/lb
+++ /dev/null
-#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 */
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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 */
+++ /dev/null
-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
-
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-# 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;
+++ /dev/null
-#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;
-}
+++ /dev/null
-.project
-.cdtproject
\ No newline at end of file
+++ /dev/null
-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
+++ /dev/null
-<?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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}""/>
- </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">
- <project name="${subsystem.name}" type="post-subsystem" packageName="${global.prefix}-${subsystem.prefix}"/>
- </echo>
- </target>
-
-</project>
+++ /dev/null
-#!/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
-
-};
-
-}
+++ /dev/null
-deploy_all.diff - against RC31
-deploy_lb, deploy_jp - older patches
+++ /dev/null
-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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}" "-Dbuild.name=${build.name}""/>
-+ </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}" "-Dbuild.name=${build.name}""/>
-+ </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>
+++ /dev/null
-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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}" "-Dbuild.name=${build.name}""/>
-+ </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} "-Dsmall.memory=true" "-Dbootstrap=${bootstrap}" "-Dfailonerror=${failonerror}" "-Ddo.cvs.tag=${do.cvs.tag}" "-Dbuild.name=${build.name}""/>
-+ </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" />
+++ /dev/null
-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@"
+++ /dev/null
-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
-
-:)
+++ /dev/null
-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
+++ /dev/null
-./stage/sbin/glite-lb-purge -j /tmp/perftest_1000.jobids -m scientific.civ.zcu.cz:10000 -s
+++ /dev/null
- 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
+++ /dev/null
-./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]
-
+++ /dev/null
-[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]
+++ /dev/null
-[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]
-
-
+++ /dev/null
-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]
+++ /dev/null
--------------------
-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]
-
-
+++ /dev/null
--------------------
-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]
+++ /dev/null
-----------------------------------
-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]
+++ /dev/null
- ./stage/bin/glite-lb-interlogd -d -s /tmp/perftest_michal.sock --file-prefix=/tmp/perftest_michal.log --lazy
+++ /dev/null
-./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
+++ /dev/null
-./stage/bin/glite-lb-bkserverd -d --perf-sink=4 -p 10000 -w 10003 -S /tmp/purge_michal -D /tmp/dump_michal --silent
+++ /dev/null
-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
+++ /dev/null
-#!/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");
- }
- }
- }
-
+++ /dev/null
-#!/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");
-
+++ /dev/null
-#!/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");
-
+++ /dev/null
-#!/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
+++ /dev/null
-#
-# 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}
-
+++ /dev/null
-#!/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}
-
+++ /dev/null
-#Fri Aug 18 12:35:01 CEST 2006
-module.build=0242
+++ /dev/null
-ext.gsoap.version=2.7.6b
-ext.gsoap.rep.file=gSOAP-2.7.6b.tar.gz
+++ /dev/null
-<?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>
+++ /dev/null
-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.
+++ /dev/null
-gLite Logging and Bookkeeping
+++ /dev/null
-<?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
+++ /dev/null
-#!/bin/sh
-
-cd ../..
-
-cvs co org.glite
-cvs co org.glite.lb
-
-cd org.glite.lb/project
-ant -f glite.lb.csf.xml
-
+++ /dev/null
-<?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
+++ /dev/null
-# : /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